kmcom-nuxt-layers 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/rules/nuxt-layers.md +23 -0
- package/.claude/rules/typescript.md +16 -0
- package/.claude/rules/vue-components.md +34 -0
- package/.claude/settings.local.json +81 -0
- package/.editorconfig +27 -0
- package/.github/workflows/npm-publish.yml +33 -0
- package/.oxlintrc.json +10 -0
- package/.prettierignore +87 -0
- package/CLAUDE.md +71 -0
- package/apps/playground/README.md +75 -0
- package/apps/playground/app/app.config.ts +10 -0
- package/apps/playground/app/app.vue +12 -0
- package/apps/playground/app/components/AmbientBackground.client.vue +795 -0
- package/apps/playground/app/components/ShaderDemoCanvas.client.vue +636 -0
- package/apps/playground/app/components/ShaderImageDemo.client.vue +211 -0
- package/apps/playground/app/pages/ambient.vue +387 -0
- package/apps/playground/app/pages/content.vue +200 -0
- package/apps/playground/app/pages/core.vue +560 -0
- package/apps/playground/app/pages/forms.vue +645 -0
- package/apps/playground/app/pages/index.vue +257 -0
- package/apps/playground/app/pages/layout.vue +591 -0
- package/apps/playground/app/pages/locomotive-scroll.vue +738 -0
- package/apps/playground/app/pages/motion.vue +848 -0
- package/apps/playground/app/pages/shader.vue +1701 -0
- package/apps/playground/app/pages/theme.vue +115 -0
- package/apps/playground/app/pages/ui.vue +656 -0
- package/apps/playground/content/blog/hello-world.md +127 -0
- package/apps/playground/content/blog/second-post.md +99 -0
- package/apps/playground/content/blog/third-post.md +33 -0
- package/apps/playground/content/gallery/autumn-collection.md +57 -0
- package/apps/playground/content/gallery/summer-collection.md +52 -0
- package/apps/playground/content/pages/index.md +132 -0
- package/apps/playground/content/portfolio/project-one.md +90 -0
- package/apps/playground/content/portfolio/project-two.md +96 -0
- package/apps/playground/content.config.ts +93 -0
- package/apps/playground/nuxt.config.ts +99 -0
- package/apps/playground/package.json +17 -0
- package/apps/playground/public/favicon.ico +0 -0
- package/apps/playground/public/robots.txt +2 -0
- package/apps/playground/tsconfig.json +25 -0
- package/eslint.config.mjs +223 -0
- package/eslint.configCOPY.mjs +216 -0
- package/eslintconfigCURRENT.mjs +244 -0
- package/eslintconfigOLD.mjs +178 -0
- package/files for claude/Scroller.vue +31 -0
- package/files for claude/TextMarquee.vue +255 -0
- package/files for claude/gsap.client.ts +18 -0
- package/files for claude/gsap.ts +10 -0
- package/files for claude/scroll.ts +28 -0
- package/layers/content/app/assets/css/main.css +1 -0
- package/layers/content/app/components/Blog/Article.vue +29 -0
- package/layers/content/app/components/Blog/Card.vue +40 -0
- package/layers/content/app/components/Blog/List.vue +35 -0
- package/layers/content/app/components/Gallery/AmbientImage.vue +52 -0
- package/layers/content/app/components/Gallery/Card.vue +39 -0
- package/layers/content/app/components/Gallery/Detail.vue +76 -0
- package/layers/content/app/components/Gallery/Grid.vue +48 -0
- package/layers/content/app/components/Gallery/ImageDetail.vue +92 -0
- package/layers/content/app/components/Gallery/Lightbox.vue +102 -0
- package/layers/content/app/components/NuxtContent/Detail.vue +53 -0
- package/layers/content/app/components/NuxtContent/List.vue +21 -0
- package/layers/content/app/components/NuxtContent/Renderer.vue +14 -0
- package/layers/content/app/components/NuxtContent/Surround.vue +15 -0
- package/layers/content/app/components/NuxtContent/Toc.vue +18 -0
- package/layers/content/app/components/Portfolio/Card.vue +39 -0
- package/layers/content/app/components/Portfolio/ColorPalette.vue +39 -0
- package/layers/content/app/components/Portfolio/Detail.vue +49 -0
- package/layers/content/app/components/Portfolio/List.vue +44 -0
- package/layers/content/app/components/Portfolio/Typography.vue +37 -0
- package/layers/content/app/components/content/Figure.vue +31 -0
- package/layers/content/app/composables/useBlogPost.ts +3 -0
- package/layers/content/app/composables/useBlogPosts.ts +23 -0
- package/layers/content/app/composables/useCollectionItem.ts +5 -0
- package/layers/content/app/composables/useCollectionSurround.ts +9 -0
- package/layers/content/app/composables/useContentPage.ts +3 -0
- package/layers/content/app/composables/useGalleryItem.ts +3 -0
- package/layers/content/app/composables/useGalleryItems.ts +19 -0
- package/layers/content/app/composables/usePortfolioItem.ts +3 -0
- package/layers/content/app/composables/usePortfolioItems.ts +23 -0
- package/layers/content/app/pages/blog/[slug].vue +10 -0
- package/layers/content/app/pages/blog/index.vue +15 -0
- package/layers/content/app/pages/gallery/[slug]/[imageId].vue +11 -0
- package/layers/content/app/pages/gallery/[slug]/index.vue +10 -0
- package/layers/content/app/pages/gallery/index.vue +15 -0
- package/layers/content/app/pages/portfolio/[slug].vue +10 -0
- package/layers/content/app/pages/portfolio/index.vue +15 -0
- package/layers/content/app/types/content.ts +84 -0
- package/layers/content/app.config.ts +12 -0
- package/layers/content/content.config.ts +93 -0
- package/layers/content/nuxt.config.ts +31 -0
- package/layers/content/package.json +31 -0
- package/layers/content/tsconfig.json +6 -0
- package/layers/core/app/assets/css/base.css +88 -0
- package/layers/core/app/assets/css/layout.css +36 -0
- package/layers/core/app/assets/css/main.css +7 -0
- package/layers/core/app/assets/css-backup.zip +0 -0
- package/layers/core/app/components/ErrorBoundary.vue +102 -0
- package/layers/core/app/components/LoadingScreen.vue +137 -0
- package/layers/core/app/composables/useBrowser.ts +161 -0
- package/layers/core/app/composables/useCache.ts +138 -0
- package/layers/core/app/composables/useDevice.ts +36 -0
- package/layers/core/app/composables/useEnv.ts +23 -0
- package/layers/core/app/composables/useErrorLog.ts +158 -0
- package/layers/core/app/composables/useFeatures.ts +269 -0
- package/layers/core/app/composables/useLoading.ts +109 -0
- package/layers/core/app/composables/useNetworkInfo.ts +83 -0
- package/layers/core/app/composables/usePWAInfo.ts +104 -0
- package/layers/core/app/composables/useRendering.ts +97 -0
- package/layers/core/app/composables/useScreen.ts +95 -0
- package/layers/core/app/composables/useScrollGuard.ts +266 -0
- package/layers/core/app/error.vue +103 -0
- package/layers/core/app/layouts/default.vue +4 -0
- package/layers/core/app/pages/[...slug].vue +168 -0
- package/layers/core/app/pages/diagnostics.vue +228 -0
- package/layers/core/app/plugins/error-handler.ts +47 -0
- package/layers/core/app/plugins/feature-detection.client.ts +32 -0
- package/layers/core/app/plugins/init.ts +188 -0
- package/layers/core/app/plugins/loading.client.ts +54 -0
- package/layers/core/app/plugins/scroll-guard.client.ts +53 -0
- package/layers/core/app/types/detection.ts +117 -0
- package/layers/core/app/types/index.ts +10 -0
- package/layers/core/app/types/loading.ts +47 -0
- package/layers/core/app/types/runtime-config.ts +31 -0
- package/layers/core/app/types/scroll-guard.ts +25 -0
- package/layers/core/app/utils/helpers.ts +246 -0
- package/layers/core/app/utils/index.ts +8 -0
- package/layers/core/app/utils/regex.ts +6 -0
- package/layers/core/app.config.ts +193 -0
- package/layers/core/nuxt.config.ts +84 -0
- package/layers/core/package.json +25 -0
- package/layers/core/tailwind.config.js +28 -0
- package/layers/core/tsconfig.json +6 -0
- package/layers/forms/app/components/Form/Contact.vue +78 -0
- package/layers/forms/app/components/Form/Field.vue +85 -0
- package/layers/forms/app/composables/useFormSchema.ts +35 -0
- package/layers/forms/app/config/fields.ts +104 -0
- package/layers/forms/app/types/fields.ts +60 -0
- package/layers/forms/app.config.ts +12 -0
- package/layers/forms/nuxt.config.ts +17 -0
- package/layers/forms/package.json +17 -0
- package/layers/forms/tsconfig.json +6 -0
- package/layers/layout/.nuxtrc +1 -0
- package/layers/layout/CLAUDE.MD +186 -0
- package/layers/layout/GRID_SYSTEM.md +993 -0
- package/layers/layout/README.md +73 -0
- package/layers/layout/app/assets/css/layout/grids.css +180 -0
- package/layers/layout/app/assets/css/main.css +1 -0
- package/layers/layout/app/components/Layout/Grid/Debug.vue +79 -0
- package/layers/layout/app/components/Layout/Grid/Item.vue +180 -0
- package/layers/layout/app/components/Layout/Page/Container.vue +100 -0
- package/layers/layout/app/components/Layout/Page/Header.vue +33 -0
- package/layers/layout/app/components/Layout/Section/Gallery.vue +68 -0
- package/layers/layout/app/components/Layout/Section/Hero.vue +71 -0
- package/layers/layout/app/components/Layout/Section/Split.vue +56 -0
- package/layers/layout/app/components/Layout/Section/index.vue +39 -0
- package/layers/layout/app/composables/GridPlacement.ts +31 -0
- package/layers/layout/app/composables/useGridConfig.ts +27 -0
- package/layers/layout/app/types/layouts.ts +37 -0
- package/layers/layout/app.config.ts +97 -0
- package/layers/layout/nuxt.config.ts +14 -0
- package/layers/layout/package.json +14 -0
- package/layers/layout/tailwind.config.js +28 -0
- package/layers/layout/tsconfig.json +6 -0
- package/layers/motion/README.md +107 -0
- package/layers/motion/TASKS.MD +16 -0
- package/layers/motion/app/assets/css/main.css +111 -0
- package/layers/motion/app/components/Motion/Marquee.vue +171 -0
- package/layers/motion/app/components/Motion/Parallax.vue +75 -0
- package/layers/motion/app/components/Motion/ScrollLink.vue +49 -0
- package/layers/motion/app/components/Motion/ScrollProgress.vue +127 -0
- package/layers/motion/app/components/Motion/ScrollStats.vue +102 -0
- package/layers/motion/app/components/Motion/Staggered.vue +73 -0
- package/layers/motion/app/components/Motion/TextReveal.vue +101 -0
- package/layers/motion/app/components/Motion/Transition.vue +89 -0
- package/layers/motion/app/components/Motion/VelocityEffect.vue +139 -0
- package/layers/motion/app/components/Motion/index.vue +16 -0
- package/layers/motion/app/composables/useGsap.ts +21 -0
- package/layers/motion/app/composables/useMotion.ts +137 -0
- package/layers/motion/app/composables/useSmoothScroll.ts +154 -0
- package/layers/motion/app/plugins/gsap.client.ts +15 -0
- package/layers/motion/app/plugins/locomotive-scroll.client.ts +49 -0
- package/layers/motion/app/utils/gsapAnimations.ts +122 -0
- package/layers/motion/app.config.ts +30 -0
- package/layers/motion/nuxt.config.ts +19 -0
- package/layers/motion/package.json +17 -0
- package/layers/motion/tsconfig.json +6 -0
- package/layers/shader/AGENTS.MD +195 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/.prettierignore +6 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/.prettierrc +18 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/LICENSE +21 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/README.md +100 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/index.html +13 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/jsconfig.json +30 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/package.json +18 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/pnpm-lock.yaml +633 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/public/vite.svg +1 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/components/sketch/webgpu_sketch.js +128 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/components/sketches_dropdown/index.css +87 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/components/sketches_dropdown/sketches_dropdown.js +169 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/index.css +25 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/main.js +93 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/router.js +43 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/sketches/flare-1.js +68 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/sketches/noise/dawn-1.js +56 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/distortion/bulge_distortion.js +35 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/distortion/swirl_distortion.js +35 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/distortion/wave_distortion.js +43 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/noise/common.js +145 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/noise/curl_noise_3d.js +53 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/noise/curl_noise_4d.js +55 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/noise/fbm.js +163 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/noise/perlin_noise_3d.js +70 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/noise/simplex_noise_3d.js +59 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/noise/simplex_noise_4d.js +72 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/noise/turbulence.js +41 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/patterns/canvas_weave_pattern.js +26 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/patterns/grain_texture_pattern.js +10 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/patterns/led_pattern.js +45 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/patterns/pixellation_pattern.js +15 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/patterns/speckled_noise_pattern.js +34 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/patterns/vignette_pattern.js +21 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/post_processing/bulge_distortion_effect.js +27 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/post_processing/chromatic_aberration_effect.js +45 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/post_processing/crt_scanline_effect.js +45 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/post_processing/dither_effect.js +126 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/post_processing/grain_texture_effect.js +21 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/post_processing/halftone_effect.js +44 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/post_processing/led_effect.js +31 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/post_processing/pixellation_effect.js +29 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/post_processing/swirl_distortion_effect.js +25 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/post_processing/vignette_effect.js +22 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/post_processing/wave_distortion_effect.js +27 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/utils/color/cosine_palette.js +15 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/utils/color/tonemapping.js +151 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/utils/function/bloom.js +13 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/utils/function/bloom_edge_pattern.js +20 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/utils/function/domain_index.js +11 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/utils/function/median3.js +22 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/utils/function/repeating_pattern.js +13 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/utils/function/screen_aspect_uv.js +14 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/utils/lighting.js +60 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/utils/math/complex.js +86 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/utils/math/coordinates.js +119 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/utils/sdf/operations.js +24 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/utils/sdf/shapes.js +182 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/utils/math.js +33 -0
- package/layers/shader/additional-modular-tsl-shaders-for-claude/vite.config.js +23 -0
- package/layers/shader/app/assets/css/main.css +41 -0
- package/layers/shader/app/components/Effect/Bloom.vue +8 -0
- package/layers/shader/app/components/Effect/ChromaticAberration.vue +8 -0
- package/layers/shader/app/components/Effect/PostProcessing.vue +20 -0
- package/layers/shader/app/components/Material/AmbientAurora.vue +172 -0
- package/layers/shader/app/components/Material/AmbientFlow.vue +175 -0
- package/layers/shader/app/components/Material/AmbientGradientMesh.vue +173 -0
- package/layers/shader/app/components/Material/AmbientNebula.vue +181 -0
- package/layers/shader/app/components/Material/AmbientOcean.vue +161 -0
- package/layers/shader/app/components/Material/Fresnel.vue +89 -0
- package/layers/shader/app/components/Material/Gradient.vue +185 -0
- package/layers/shader/app/components/Material/Image.vue +232 -0
- package/layers/shader/app/components/Material/Node.vue +79 -0
- package/layers/shader/app/components/Material/Noise.vue +141 -0
- package/layers/shader/app/components/Mesh/Plane.vue +27 -0
- package/layers/shader/app/components/Shader/Background.vue +159 -0
- package/layers/shader/app/components/Shader/Canvas.vue +97 -0
- package/layers/shader/app/components/Shader/Debug.vue +66 -0
- package/layers/shader/app/components/WebGPUCanvas.client.vue +245 -0
- package/layers/shader/app/composables/useAmbientMaterials.ts +452 -0
- package/layers/shader/app/composables/useMousePosition.ts +94 -0
- package/layers/shader/app/composables/useRendererCapabilities.ts +111 -0
- package/layers/shader/app/composables/useShader.ts +148 -0
- package/layers/shader/app/composables/useShaderTime.ts +146 -0
- package/layers/shader/app/composables/useTSLNodes.ts +112 -0
- package/layers/shader/app/composables/useUniforms.ts +188 -0
- package/layers/shader/app/plugins/shader.client.ts +30 -0
- package/layers/shader/app/shaders/common/blend.ts +255 -0
- package/layers/shader/app/shaders/common/effects.ts +299 -0
- package/layers/shader/app/shaders/common/grain.ts +453 -0
- package/layers/shader/app/shaders/common/index.ts +22 -0
- package/layers/shader/app/shaders/common/lighting.ts +146 -0
- package/layers/shader/app/shaders/common/math.ts +250 -0
- package/layers/shader/app/shaders/common/noise.ts +823 -0
- package/layers/shader/app/shaders/common/noiseHelpers.ts +114 -0
- package/layers/shader/app/shaders/common/palette.ts +319 -0
- package/layers/shader/app/shaders/common/patterns.ts +216 -0
- package/layers/shader/app/shaders/common/sdf.ts +224 -0
- package/layers/shader/app/shaders/common/shapes.ts +366 -0
- package/layers/shader/app/shaders/common/tonemapping.ts +172 -0
- package/layers/shader/app/shaders/common/uv.ts +396 -0
- package/layers/shader/app/shaders/createMaterial.ts +314 -0
- package/layers/shader/app/shaders/index.ts +282 -0
- package/layers/shader/app/shaders/layers/aurora.ts +146 -0
- package/layers/shader/app/shaders/layers/index.ts +19 -0
- package/layers/shader/app/shaders/layers/meshGradient.ts +152 -0
- package/layers/shader/app/shaders/layers/paperShading.ts +148 -0
- package/layers/shader/app/shaders/layers/shaderGradient.ts +152 -0
- package/layers/shader/app/shaders/layers/stripe.ts +137 -0
- package/layers/shader/app/shaders/types.ts +12 -0
- package/layers/shader/app/types/index.ts +4 -0
- package/layers/shader/app/types/materials.ts +45 -0
- package/layers/shader/app/types/renderer.ts +50 -0
- package/layers/shader/app/types/tsl.ts +39 -0
- package/layers/shader/app/types/uniforms.ts +21 -0
- package/layers/shader/app/utils/tsl/animation.ts +251 -0
- package/layers/shader/app/utils/tsl/color.ts +189 -0
- package/layers/shader/app/utils/tsl/index.ts +84 -0
- package/layers/shader/app/utils/tsl/math.ts +111 -0
- package/layers/shader/app/utils/tsl/noise.ts +195 -0
- package/layers/shader/app/utils/tsl/patterns.ts +183 -0
- package/layers/shader/app/utils/tsl/uv.ts +145 -0
- package/layers/shader/app.config.ts +18 -0
- package/layers/shader/modular-tsl-shaders-for-claude/common/blend.tsl +1 -0
- package/layers/shader/modular-tsl-shaders-for-claude/common/noise.tsl +1 -0
- package/layers/shader/modular-tsl-shaders-for-claude/common/shapes.tsl +1 -0
- package/layers/shader/modular-tsl-shaders-for-claude/common/vertexFresnel.tsl +9 -0
- package/layers/shader/modular-tsl-shaders-for-claude/common/vertexPlane.tsl +6 -0
- package/layers/shader/modular-tsl-shaders-for-claude/effects/background.tsl +1 -0
- package/layers/shader/modular-tsl-shaders-for-claude/effects/gradient.tsl +1 -0
- package/layers/shader/modular-tsl-shaders-for-claude/effects/gradientLegend.tsl +1 -0
- package/layers/shader/modular-tsl-shaders-for-claude/effects/simpleGradient.tsl +1 -0
- package/layers/shader/modular-tsl-shaders-for-claude/layers/aurora.ts +1 -0
- package/layers/shader/modular-tsl-shaders-for-claude/layers/fragmentsTech.ts +1 -0
- package/layers/shader/modular-tsl-shaders-for-claude/layers/fresnel.ts +1 -0
- package/layers/shader/modular-tsl-shaders-for-claude/layers/linearGradient.ts +1 -0
- package/layers/shader/modular-tsl-shaders-for-claude/layers/meshGradient.ts +1 -0
- package/layers/shader/modular-tsl-shaders-for-claude/layers/noise.ts +1 -0
- package/layers/shader/modular-tsl-shaders-for-claude/layers/paperShading.ts +1 -0
- package/layers/shader/modular-tsl-shaders-for-claude/layers/radial.ts +1 -0
- package/layers/shader/modular-tsl-shaders-for-claude/layers/shaderGradient.ts +1 -0
- package/layers/shader/modular-tsl-shaders-for-claude/layers/stripe.ts +1 -0
- package/layers/shader/modular-tsl-shaders-for-claude/materials/createMaterial.ts +1 -0
- package/layers/shader/modular-tsl-shaders-for-claude/utils/glslUtils.ts +1 -0
- package/layers/shader/modular-tsl-shaders-for-claude/utils/palette.ts +1 -0
- package/layers/shader/nuxt.config.ts +48 -0
- package/layers/shader/package.json +17 -0
- package/layers/shader/tsconfig.json +6 -0
- package/layers/theme/app/assets/css/theme.css +47 -0
- package/layers/theme/app/components/ThemePicker/AccentButton.vue +51 -0
- package/layers/theme/app/components/ThemePicker/Colors.vue +22 -0
- package/layers/theme/app/components/ThemePicker/Menu.vue +108 -0
- package/layers/theme/app/components/ThemePicker/MenuButton.vue +9 -0
- package/layers/theme/app/composables/useThemePreferences.ts +158 -0
- package/layers/theme/app/plugins/theme.client.ts +5 -0
- package/layers/theme/app/types/theme.ts +34 -0
- package/layers/theme/app.config.ts +14 -0
- package/layers/theme/nuxt.config.ts +46 -0
- package/layers/theme/package.json +14 -0
- package/layers/theme/server/plugins/theme-fouc.ts +51 -0
- package/layers/theme/tsconfig.json +7 -0
- package/layers/ui/CLAUDE.MD +325 -0
- package/layers/ui/app/assets/css/main.css +4 -0
- package/layers/ui/app/components/Links/Group.vue +38 -0
- package/layers/ui/app/components/Links/Named.vue +32 -0
- package/layers/ui/app/components/Media/Picture.vue +41 -0
- package/layers/ui/app/components/Site/Title.vue +15 -0
- package/layers/ui/app/components/Typography/CodeBlock.vue +37 -0
- package/layers/ui/app/components/Typography/Headline.vue +73 -0
- package/layers/ui/app/components/Typography/QuoteBlock.vue +13 -0
- package/layers/ui/app/components/Typography/TextStroke.vue +109 -0
- package/layers/ui/app/components/Typography/index.vue +49 -0
- package/layers/ui/app/composables/color.ts +36 -0
- package/layers/ui/app/composables/picture.ts +145 -0
- package/layers/ui/app/composables/typography.ts +77 -0
- package/layers/ui/app/layouts/default.vue +4 -0
- package/layers/ui/app/pages/index.vue +236 -0
- package/layers/ui/app/types/breakpoints.ts +179 -0
- package/layers/ui/app/types/colors.ts +29 -0
- package/layers/ui/app/types/media.ts +185 -0
- package/layers/ui/app/types/typography.ts +108 -0
- package/layers/ui/app/utils/regex.ts +6 -0
- package/layers/ui/app.config.ts +12 -0
- package/layers/ui/nuxt.config.ts +38 -0
- package/layers/ui/package.json +14 -0
- package/layers/ui/tsconfig.json +6 -0
- package/package.json +128 -0
- package/playgroundOLD/app.config.ts +5 -0
- package/playgroundOLD/nuxt.config.ts +12 -0
- package/pnpm-workspace.yaml +6 -0
- package/prettier.config.cjs +19 -0
- package/stylelint.config.mjs +111 -0
- package/turbo.json +16 -0
|
@@ -0,0 +1,993 @@
|
|
|
1
|
+
# Swiss Grid System - Layout Layer Documentation
|
|
2
|
+
|
|
3
|
+
## Table of Contents
|
|
4
|
+
|
|
5
|
+
1. [Overview](#overview)
|
|
6
|
+
2. [Philosophy & Design Principles](#philosophy--design-principles)
|
|
7
|
+
3. [Architecture](#architecture)
|
|
8
|
+
4. [Core Concepts](#core-concepts)
|
|
9
|
+
5. [Components Reference](#components-reference)
|
|
10
|
+
6. [Configuration & Customization](#configuration--customization)
|
|
11
|
+
7. [Using with Nuxt Layers](#using-with-nuxt-layers)
|
|
12
|
+
8. [Examples](#examples)
|
|
13
|
+
9. [Best Practices](#best-practices)
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## Overview
|
|
18
|
+
|
|
19
|
+
The **ui-layout-layer** implements a Swiss Grid System inspired by Josef Müller-Brockmann's typographic grid systems. It uses modern CSS Grid with **subgrid** to create a precise, responsive, and mathematically consistent layout system for Nuxt applications.
|
|
20
|
+
|
|
21
|
+
### Key Features
|
|
22
|
+
|
|
23
|
+
- **Responsive Grid Density**: 6 columns (mobile) → 12 columns (tablet) → 18 columns (desktop)
|
|
24
|
+
- **Vertical Rhythm**: 12-row sections spanning 100vh with consistent baseline grid
|
|
25
|
+
- **CSS Subgrid**: Precise alignment across component hierarchy
|
|
26
|
+
- **Layered Z-Index System**: Semantic layering (back, mid, front, top)
|
|
27
|
+
- **Configurable Presets**: Pre-built responsive layouts for common patterns
|
|
28
|
+
- **Container Queries**: @container support for component-level responsiveness
|
|
29
|
+
- **Debug Mode**: Visual grid overlay (Cmd/Ctrl+G)
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## Philosophy & Design Principles
|
|
34
|
+
|
|
35
|
+
### Swiss Design Roots
|
|
36
|
+
|
|
37
|
+
The grid system follows Swiss/International Typographic Style principles:
|
|
38
|
+
|
|
39
|
+
1. **Mathematical Precision**: Grid-based layouts with exact column/row placement
|
|
40
|
+
2. **Hierarchy through Scale**: Z-index layering and responsive density changes
|
|
41
|
+
3. **Rhythm & Harmony**: Baseline grid (0.25rem units) maintains vertical rhythm
|
|
42
|
+
4. **Functional Clarity**: Components are named for their purpose, not appearance
|
|
43
|
+
5. **Modular Composition**: Small, reusable components compose into complex layouts
|
|
44
|
+
|
|
45
|
+
### Why CSS Subgrid?
|
|
46
|
+
|
|
47
|
+
Traditional grid systems require duplicating grid definitions at every level. **Subgrid** allows child grids to inherit parent grid lines, ensuring:
|
|
48
|
+
|
|
49
|
+
- Pixel-perfect alignment across nesting levels
|
|
50
|
+
- Single source of truth for grid configuration
|
|
51
|
+
- No "grid within grid" positioning calculations
|
|
52
|
+
- Simplified component APIs
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## Architecture
|
|
57
|
+
|
|
58
|
+
### Component Hierarchy
|
|
59
|
+
|
|
60
|
+
```
|
|
61
|
+
MastMain (root grid container)
|
|
62
|
+
└── LayoutSection (subgrid, 12 rows)
|
|
63
|
+
└── LayoutGridItem (positioned on inherited grid lines)
|
|
64
|
+
└── Your Content
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### CSS Utilities
|
|
68
|
+
|
|
69
|
+
The system provides three core CSS utilities (defined in `app/assets/css/layout/grids.css`):
|
|
70
|
+
|
|
71
|
+
1. **`mastmain`** - Root grid container
|
|
72
|
+
2. **`basesection`** - Full-viewport section using subgrid
|
|
73
|
+
3. **`prose-rhythm`** - Typography vertical rhythm utilities
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## Core Concepts
|
|
78
|
+
|
|
79
|
+
### 1. Responsive Grid Density
|
|
80
|
+
|
|
81
|
+
The grid adapts its column count based on viewport width:
|
|
82
|
+
|
|
83
|
+
| Breakpoint | Width | Columns | CSS Variable |
|
|
84
|
+
|------------|-------|---------|--------------|
|
|
85
|
+
| Mobile | < 768px | 6 | `--grid-cols: 6` |
|
|
86
|
+
| Tablet | ≥ 768px | 12 | `--grid-cols: 12` |
|
|
87
|
+
| Desktop | ≥ 1280px | 18 | `--grid-cols: 18` |
|
|
88
|
+
|
|
89
|
+
**Breakpoints** are defined in `grids.css`:
|
|
90
|
+
- Tablet: `48rem` (768px)
|
|
91
|
+
- Desktop: `80rem` (1280px)
|
|
92
|
+
|
|
93
|
+
### 2. Vertical Grid (12 Rows)
|
|
94
|
+
|
|
95
|
+
Each section spans **12 rows** that together fill **100vh**:
|
|
96
|
+
|
|
97
|
+
```css
|
|
98
|
+
--grid-rows-per-section: 12;
|
|
99
|
+
--section-height: 100vh;
|
|
100
|
+
--grid-row-height: calc(
|
|
101
|
+
(var(--section-height) - (var(--grid-rows-per-section) - 1) * var(--grid-gap)) /
|
|
102
|
+
var(--grid-rows-per-section)
|
|
103
|
+
);
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
On mobile (`width < 48rem`), sections grow beyond 12 rows if content requires it.
|
|
107
|
+
|
|
108
|
+
### 3. Gap & Padding
|
|
109
|
+
|
|
110
|
+
- **Gap between columns/rows**: `clamp(0.75rem, 1.5vw, 1.5rem)` (12px → 24px)
|
|
111
|
+
- **Outer padding (gutters)**: `clamp(1rem, 2.5vw, 2rem)` (16px → 32px)
|
|
112
|
+
|
|
113
|
+
These are responsive and scale smoothly with viewport size.
|
|
114
|
+
|
|
115
|
+
### 4. Baseline Rhythm
|
|
116
|
+
|
|
117
|
+
Typography and spacing snap to a **0.25rem (4px)** baseline grid:
|
|
118
|
+
|
|
119
|
+
```css
|
|
120
|
+
--rhythm: 0.25rem;
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Utilities:
|
|
124
|
+
- `leading-rhythm-4` through `leading-rhythm-8` (line-height)
|
|
125
|
+
- `space-rhythm-1` through `space-rhythm-8` (margin-block)
|
|
126
|
+
- `prose-rhythm` (auto-apply rhythm to prose content)
|
|
127
|
+
|
|
128
|
+
### 5. Layering System
|
|
129
|
+
|
|
130
|
+
Four semantic z-index layers defined in `app.config.ts`:
|
|
131
|
+
|
|
132
|
+
```ts
|
|
133
|
+
layers: {
|
|
134
|
+
back: 0, // Background images, decorative elements
|
|
135
|
+
mid: 10, // Default content layer
|
|
136
|
+
front: 20, // Overlays, modals
|
|
137
|
+
top: 30, // Tooltips, dropdowns
|
|
138
|
+
}
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
Use via `layer` prop on `<LayoutGridItem>`.
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
## Components Reference
|
|
146
|
+
|
|
147
|
+
### `<LayoutSection>`
|
|
148
|
+
|
|
149
|
+
**File**: `app/components/Layout/Section/index.vue`
|
|
150
|
+
|
|
151
|
+
Full-viewport section using CSS subgrid. Inherits parent grid lines.
|
|
152
|
+
|
|
153
|
+
**Props**:
|
|
154
|
+
- `fullHeight?: boolean` - Force `min-h-svh` (default: `false`)
|
|
155
|
+
- `fullWidth?: boolean` - Break outside grid gutters for edge-to-edge content (default: `false`)
|
|
156
|
+
|
|
157
|
+
**CSS Utility**: `basesection`
|
|
158
|
+
|
|
159
|
+
**Usage**:
|
|
160
|
+
```vue
|
|
161
|
+
<LayoutSection full-height>
|
|
162
|
+
<LayoutGridItem>Content</LayoutGridItem>
|
|
163
|
+
</LayoutSection>
|
|
164
|
+
|
|
165
|
+
<!-- Full-bleed section (breaks outside grid padding) -->
|
|
166
|
+
<LayoutSection full-width>
|
|
167
|
+
<div class="bg-black text-white p-8">
|
|
168
|
+
Edge-to-edge content with no gutters
|
|
169
|
+
</div>
|
|
170
|
+
</LayoutSection>
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
---
|
|
174
|
+
|
|
175
|
+
### `<LayoutGridItem>`
|
|
176
|
+
|
|
177
|
+
**File**: `app/components/Layout/Grid/Item.vue`
|
|
178
|
+
|
|
179
|
+
Positions content on the parent section's grid using `grid-column` and `grid-row`.
|
|
180
|
+
|
|
181
|
+
**Props**:
|
|
182
|
+
|
|
183
|
+
| Prop | Type | Description |
|
|
184
|
+
|------|------|-------------|
|
|
185
|
+
| `as` | `string` | HTML element (default: `'div'`) |
|
|
186
|
+
| `preset` | `string` | Named preset: `'hero'`, `'centered'`, `'fullWidth'`, `'sidebar'`, `'content'` |
|
|
187
|
+
| `colStart` | `number \| ResponsiveValue<number>` | Starting column (1-18) |
|
|
188
|
+
| `colSpan` | `number \| ResponsiveValue<number>` | Columns to span (default: 1) |
|
|
189
|
+
| `rowStart` | `number \| ResponsiveValue<number>` | Starting row (1-12) |
|
|
190
|
+
| `rowSpan` | `number \| ResponsiveValue<number>` | Rows to span (default: 1) |
|
|
191
|
+
| `align` | `'start' \| 'center' \| 'end' \| 'stretch'` | Vertical alignment |
|
|
192
|
+
| `justify` | `'start' \| 'center' \| 'end' \| 'stretch'` | Horizontal alignment |
|
|
193
|
+
| `z` | `number` | Explicit z-index |
|
|
194
|
+
| `layer` | `'back' \| 'mid' \| 'front' \| 'top'` | Semantic layer |
|
|
195
|
+
| `bleed` | `'left' \| 'right' \| 'both'` | Edge bleed (ignores padding) |
|
|
196
|
+
| `aspect` | `'1/1' \| '4/3' \| '16/9'` etc. | Aspect ratio |
|
|
197
|
+
|
|
198
|
+
**ResponsiveValue Type**:
|
|
199
|
+
```ts
|
|
200
|
+
interface ResponsiveValue<T> {
|
|
201
|
+
default: T
|
|
202
|
+
md?: T
|
|
203
|
+
lg?: T
|
|
204
|
+
}
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
**Examples**:
|
|
208
|
+
```vue
|
|
209
|
+
<!-- Using preset -->
|
|
210
|
+
<LayoutGridItem preset="hero">
|
|
211
|
+
<h1>Hero Content</h1>
|
|
212
|
+
</LayoutGridItem>
|
|
213
|
+
|
|
214
|
+
<!-- Responsive positioning -->
|
|
215
|
+
<LayoutGridItem
|
|
216
|
+
:col-start="{ default: 1, md: 2, lg: 4 }"
|
|
217
|
+
:col-span="{ default: 6, md: 10, lg: 12 }"
|
|
218
|
+
align="center"
|
|
219
|
+
layer="front"
|
|
220
|
+
>
|
|
221
|
+
Content
|
|
222
|
+
</LayoutGridItem>
|
|
223
|
+
|
|
224
|
+
<!-- Full-bleed background -->
|
|
225
|
+
<LayoutGridItem bleed="both" layer="back">
|
|
226
|
+
<NuxtImg src="/bg.jpg" class="size-full object-cover" />
|
|
227
|
+
</LayoutGridItem>
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
---
|
|
231
|
+
|
|
232
|
+
### `<LayoutGridDebug>`
|
|
233
|
+
|
|
234
|
+
**File**: `app/components/Layout/Grid/Debug.vue`
|
|
235
|
+
|
|
236
|
+
Visual grid overlay for development. Toggle with **Cmd+G** (Mac) or **Ctrl+G** (Windows/Linux).
|
|
237
|
+
|
|
238
|
+
**Props**:
|
|
239
|
+
- `gap?: string` - Gap between columns (default: `clamp(0.75rem, 1.5vw, 1.5rem)`)
|
|
240
|
+
- `color?: string` - Overlay color (default: `rgba(255, 0, 0, 0.1)`)
|
|
241
|
+
|
|
242
|
+
**Usage**:
|
|
243
|
+
```vue
|
|
244
|
+
<LayoutGridDebug />
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
Automatically adapts to responsive grid density (6/12/18 columns).
|
|
248
|
+
|
|
249
|
+
---
|
|
250
|
+
|
|
251
|
+
### `<LayoutSectionHero>`
|
|
252
|
+
|
|
253
|
+
**File**: `app/components/Layout/Section/Hero.vue`
|
|
254
|
+
|
|
255
|
+
Pre-configured hero section with slots for background, main content, and footer.
|
|
256
|
+
|
|
257
|
+
**Props**:
|
|
258
|
+
- `fullHeight?: boolean` - Force `100svh` (default: `true`)
|
|
259
|
+
|
|
260
|
+
**Slots**:
|
|
261
|
+
- `background` - Full-bleed background layer (z: 0)
|
|
262
|
+
- `default` - Centered content (z: 10)
|
|
263
|
+
- `footer` - Bottom-aligned content (z: 10)
|
|
264
|
+
|
|
265
|
+
**Example**:
|
|
266
|
+
```vue
|
|
267
|
+
<LayoutSectionHero>
|
|
268
|
+
<template #background>
|
|
269
|
+
<NuxtImg src="/hero.jpg" class="size-full object-cover" />
|
|
270
|
+
</template>
|
|
271
|
+
|
|
272
|
+
<h1>Welcome</h1>
|
|
273
|
+
<p>Subtitle text</p>
|
|
274
|
+
|
|
275
|
+
<template #footer>
|
|
276
|
+
<UButton to="/get-started">Get Started</UButton>
|
|
277
|
+
</template>
|
|
278
|
+
</LayoutSectionHero>
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
---
|
|
282
|
+
|
|
283
|
+
### `<PageContainer>`
|
|
284
|
+
|
|
285
|
+
**File**: `app/components/Layout/Page/Container.vue`
|
|
286
|
+
|
|
287
|
+
Unified page wrapper integrating Swiss Grid or Nuxt UI's `<UPage>` layout.
|
|
288
|
+
|
|
289
|
+
**Props**:
|
|
290
|
+
- `title: string` - Page title (required, sets `<title>` and header)
|
|
291
|
+
- `description?: string` - Meta description for SEO
|
|
292
|
+
- `showHeader?: boolean` - Show visible page header (default: `true`)
|
|
293
|
+
- `headerPreset?: string` - Grid preset for header (default: `'centered'`)
|
|
294
|
+
- `layout?: 'grid' | 'upage'` - Layout mode (default: `'grid'`)
|
|
295
|
+
|
|
296
|
+
**Example**:
|
|
297
|
+
```vue
|
|
298
|
+
<PageContainer
|
|
299
|
+
title="About Us"
|
|
300
|
+
description="Learn about our company"
|
|
301
|
+
header-preset="hero"
|
|
302
|
+
>
|
|
303
|
+
<LayoutSection>
|
|
304
|
+
<LayoutGridItem preset="centered">
|
|
305
|
+
<p>Page content</p>
|
|
306
|
+
</LayoutGridItem>
|
|
307
|
+
</LayoutSection>
|
|
308
|
+
</PageContainer>
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
---
|
|
312
|
+
|
|
313
|
+
## Configuration & Customization
|
|
314
|
+
|
|
315
|
+
### App Config (`app.config.ts`)
|
|
316
|
+
|
|
317
|
+
The grid system is fully configurable via `app.config.ts`:
|
|
318
|
+
|
|
319
|
+
```ts
|
|
320
|
+
export default defineAppConfig({
|
|
321
|
+
layoutLayer: {
|
|
322
|
+
ui: {
|
|
323
|
+
grid: {
|
|
324
|
+
// Core settings
|
|
325
|
+
columns: { default: 6, md: 12, lg: 18 },
|
|
326
|
+
rowsPerSection: 12,
|
|
327
|
+
rhythm: '0.25rem',
|
|
328
|
+
|
|
329
|
+
// Z-index layers
|
|
330
|
+
layers: {
|
|
331
|
+
back: 0,
|
|
332
|
+
mid: 10,
|
|
333
|
+
front: 20,
|
|
334
|
+
top: 30,
|
|
335
|
+
},
|
|
336
|
+
|
|
337
|
+
// Preset layouts
|
|
338
|
+
presets: {
|
|
339
|
+
hero: {
|
|
340
|
+
colStart: { default: 1, md: 2, lg: 4 },
|
|
341
|
+
colSpan: { default: 6, md: 10, lg: 12 },
|
|
342
|
+
rowSpan: 12,
|
|
343
|
+
},
|
|
344
|
+
centered: {
|
|
345
|
+
colStart: { default: 1, md: 2, lg: 5 },
|
|
346
|
+
colSpan: { default: 6, md: 10, lg: 10 },
|
|
347
|
+
rowSpan: 12,
|
|
348
|
+
},
|
|
349
|
+
fullWidth: {
|
|
350
|
+
colStart: 1,
|
|
351
|
+
colSpan: { default: 6, md: 12, lg: 18 },
|
|
352
|
+
},
|
|
353
|
+
sidebar: {
|
|
354
|
+
colStart: { default: 1, md: 1, lg: 1 },
|
|
355
|
+
colSpan: { default: 6, md: 4, lg: 4 },
|
|
356
|
+
},
|
|
357
|
+
content: {
|
|
358
|
+
colStart: { default: 1, md: 5, lg: 5 },
|
|
359
|
+
colSpan: { default: 6, md: 8, lg: 14 },
|
|
360
|
+
},
|
|
361
|
+
},
|
|
362
|
+
},
|
|
363
|
+
},
|
|
364
|
+
},
|
|
365
|
+
})
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
### Type Definitions (`app/types/layouts.ts`)
|
|
369
|
+
|
|
370
|
+
```ts
|
|
371
|
+
export interface ResponsiveValue<T> {
|
|
372
|
+
default: T
|
|
373
|
+
sm?: T
|
|
374
|
+
md?: T
|
|
375
|
+
lg?: T
|
|
376
|
+
xl?: T
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
export interface GridLayers {
|
|
380
|
+
back: number
|
|
381
|
+
mid: number
|
|
382
|
+
front: number
|
|
383
|
+
top: number
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
export interface GridPresetsItem {
|
|
387
|
+
colStart: number | ResponsiveValue<number>
|
|
388
|
+
colSpan: number | ResponsiveValue<number>
|
|
389
|
+
rowStart?: number | ResponsiveValue<number>
|
|
390
|
+
rowSpan?: number
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
export interface GridConfig {
|
|
394
|
+
columns: ResponsiveValue<number>
|
|
395
|
+
rowsPerSection: number
|
|
396
|
+
rhythm: string
|
|
397
|
+
layers: GridLayers
|
|
398
|
+
presets: GridPresets
|
|
399
|
+
}
|
|
400
|
+
```
|
|
401
|
+
|
|
402
|
+
---
|
|
403
|
+
|
|
404
|
+
## Using with Nuxt Layers
|
|
405
|
+
|
|
406
|
+
### Extending the Layer
|
|
407
|
+
|
|
408
|
+
In your consuming Nuxt project:
|
|
409
|
+
|
|
410
|
+
**1. Install the layer:**
|
|
411
|
+
```bash
|
|
412
|
+
npm install @your-org/ui-layout-layer
|
|
413
|
+
```
|
|
414
|
+
|
|
415
|
+
**2. Extend in `nuxt.config.ts`:**
|
|
416
|
+
```ts
|
|
417
|
+
export default defineNuxtConfig({
|
|
418
|
+
extends: ['@your-org/ui-layout-layer'],
|
|
419
|
+
})
|
|
420
|
+
```
|
|
421
|
+
|
|
422
|
+
**3. (Optional) Override grid configuration:**
|
|
423
|
+
|
|
424
|
+
Create your own `app.config.ts`:
|
|
425
|
+
|
|
426
|
+
```ts
|
|
427
|
+
export default defineAppConfig({
|
|
428
|
+
layoutLayer: {
|
|
429
|
+
ui: {
|
|
430
|
+
grid: {
|
|
431
|
+
// Override columns
|
|
432
|
+
columns: { default: 4, md: 8, lg: 12 },
|
|
433
|
+
|
|
434
|
+
// Add custom presets
|
|
435
|
+
presets: {
|
|
436
|
+
...useAppConfig().layoutLayer?.ui?.grid?.presets,
|
|
437
|
+
myCustomPreset: {
|
|
438
|
+
colStart: { default: 1, md: 3, lg: 5 },
|
|
439
|
+
colSpan: { default: 4, md: 6, lg: 8 },
|
|
440
|
+
},
|
|
441
|
+
},
|
|
442
|
+
},
|
|
443
|
+
},
|
|
444
|
+
},
|
|
445
|
+
})
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
### Using Components in Your Project
|
|
449
|
+
|
|
450
|
+
Components are auto-imported via Nuxt's component discovery:
|
|
451
|
+
|
|
452
|
+
```vue
|
|
453
|
+
<template>
|
|
454
|
+
<LayoutSection>
|
|
455
|
+
<LayoutGridItem preset="hero">
|
|
456
|
+
<h1>My Page</h1>
|
|
457
|
+
</LayoutGridItem>
|
|
458
|
+
</LayoutSection>
|
|
459
|
+
</template>
|
|
460
|
+
```
|
|
461
|
+
|
|
462
|
+
### Creating Custom Layout Components
|
|
463
|
+
|
|
464
|
+
Extend the base components in your project:
|
|
465
|
+
|
|
466
|
+
```vue
|
|
467
|
+
<!-- ~/components/MyCustomSection.vue -->
|
|
468
|
+
<template>
|
|
469
|
+
<LayoutSection full-height>
|
|
470
|
+
<LayoutGridItem bleed="both" layer="back">
|
|
471
|
+
<div class="gradient-background" />
|
|
472
|
+
</LayoutGridItem>
|
|
473
|
+
|
|
474
|
+
<LayoutGridItem preset="centered">
|
|
475
|
+
<slot />
|
|
476
|
+
</LayoutGridItem>
|
|
477
|
+
</LayoutSection>
|
|
478
|
+
</template>
|
|
479
|
+
```
|
|
480
|
+
|
|
481
|
+
### Root Layout Setup
|
|
482
|
+
|
|
483
|
+
In your project's `app.vue` or layout file, ensure the root grid is initialized:
|
|
484
|
+
|
|
485
|
+
```vue
|
|
486
|
+
<template>
|
|
487
|
+
<div class="mastmain">
|
|
488
|
+
<NuxtPage />
|
|
489
|
+
</div>
|
|
490
|
+
</template>
|
|
491
|
+
|
|
492
|
+
<style>
|
|
493
|
+
/* Import layer CSS */
|
|
494
|
+
@import '@your-org/ui-layout-layer/app/assets/css/main.css';
|
|
495
|
+
</style>
|
|
496
|
+
```
|
|
497
|
+
|
|
498
|
+
Or use auto-import via `nuxt.config.ts`:
|
|
499
|
+
|
|
500
|
+
```ts
|
|
501
|
+
export default defineNuxtConfig({
|
|
502
|
+
css: ['@your-org/ui-layout-layer/app/assets/css/main.css'],
|
|
503
|
+
})
|
|
504
|
+
```
|
|
505
|
+
|
|
506
|
+
---
|
|
507
|
+
|
|
508
|
+
## Examples
|
|
509
|
+
|
|
510
|
+
### Example 1: Simple Centered Page
|
|
511
|
+
|
|
512
|
+
```vue
|
|
513
|
+
<template>
|
|
514
|
+
<PageContainer title="About" description="About our company">
|
|
515
|
+
<LayoutSection>
|
|
516
|
+
<LayoutGridItem preset="centered">
|
|
517
|
+
<h1>About Us</h1>
|
|
518
|
+
<p>We build great products.</p>
|
|
519
|
+
</LayoutGridItem>
|
|
520
|
+
</LayoutSection>
|
|
521
|
+
</PageContainer>
|
|
522
|
+
</template>
|
|
523
|
+
```
|
|
524
|
+
|
|
525
|
+
---
|
|
526
|
+
|
|
527
|
+
### Example 2: Hero Section with Background
|
|
528
|
+
|
|
529
|
+
```vue
|
|
530
|
+
<template>
|
|
531
|
+
<LayoutSectionHero>
|
|
532
|
+
<template #background>
|
|
533
|
+
<NuxtImg
|
|
534
|
+
src="/hero-bg.jpg"
|
|
535
|
+
class="size-full object-cover"
|
|
536
|
+
alt=""
|
|
537
|
+
/>
|
|
538
|
+
</template>
|
|
539
|
+
|
|
540
|
+
<div class="text-center">
|
|
541
|
+
<h1 class="text-5xl font-bold">Welcome to Our Site</h1>
|
|
542
|
+
<p class="text-xl mt-4">Building the future, one line at a time</p>
|
|
543
|
+
</div>
|
|
544
|
+
|
|
545
|
+
<template #footer>
|
|
546
|
+
<UButton size="xl" to="/signup">Get Started</UButton>
|
|
547
|
+
</template>
|
|
548
|
+
</LayoutSectionHero>
|
|
549
|
+
</template>
|
|
550
|
+
```
|
|
551
|
+
|
|
552
|
+
---
|
|
553
|
+
|
|
554
|
+
### Example 3: Two-Column Layout
|
|
555
|
+
|
|
556
|
+
```vue
|
|
557
|
+
<template>
|
|
558
|
+
<LayoutSection>
|
|
559
|
+
<!-- Sidebar -->
|
|
560
|
+
<LayoutGridItem
|
|
561
|
+
:col-start="{ default: 1, md: 1, lg: 1 }"
|
|
562
|
+
:col-span="{ default: 6, md: 4, lg: 5 }"
|
|
563
|
+
:row-span="12"
|
|
564
|
+
>
|
|
565
|
+
<aside>
|
|
566
|
+
<nav>Navigation items</nav>
|
|
567
|
+
</aside>
|
|
568
|
+
</LayoutGridItem>
|
|
569
|
+
|
|
570
|
+
<!-- Main content -->
|
|
571
|
+
<LayoutGridItem
|
|
572
|
+
:col-start="{ default: 1, md: 5, lg: 6 }"
|
|
573
|
+
:col-span="{ default: 6, md: 8, lg: 13 }"
|
|
574
|
+
:row-span="12"
|
|
575
|
+
>
|
|
576
|
+
<main>
|
|
577
|
+
<h1>Main Content</h1>
|
|
578
|
+
<p>Article text...</p>
|
|
579
|
+
</main>
|
|
580
|
+
</LayoutGridItem>
|
|
581
|
+
</LayoutSection>
|
|
582
|
+
</template>
|
|
583
|
+
```
|
|
584
|
+
|
|
585
|
+
---
|
|
586
|
+
|
|
587
|
+
### Example 4: Gallery with Overlapping Items
|
|
588
|
+
|
|
589
|
+
```vue
|
|
590
|
+
<template>
|
|
591
|
+
<LayoutSection>
|
|
592
|
+
<!-- Background image -->
|
|
593
|
+
<LayoutGridItem
|
|
594
|
+
:col-start="1"
|
|
595
|
+
:col-span="{ default: 6, md: 8, lg: 10 }"
|
|
596
|
+
:row-start="2"
|
|
597
|
+
:row-span="6"
|
|
598
|
+
layer="back"
|
|
599
|
+
>
|
|
600
|
+
<NuxtImg src="/image1.jpg" class="size-full object-cover" />
|
|
601
|
+
</LayoutGridItem>
|
|
602
|
+
|
|
603
|
+
<!-- Overlapping foreground image -->
|
|
604
|
+
<LayoutGridItem
|
|
605
|
+
:col-start="{ default: 3, md: 7, lg: 9 }"
|
|
606
|
+
:col-span="{ default: 4, md: 6, lg: 8 }"
|
|
607
|
+
:row-start="5"
|
|
608
|
+
:row-span="6"
|
|
609
|
+
layer="front"
|
|
610
|
+
>
|
|
611
|
+
<NuxtImg src="/image2.jpg" class="size-full object-cover shadow-xl" />
|
|
612
|
+
</LayoutGridItem>
|
|
613
|
+
|
|
614
|
+
<!-- Text overlay -->
|
|
615
|
+
<LayoutGridItem
|
|
616
|
+
:col-start="{ default: 2, md: 3, lg: 4 }"
|
|
617
|
+
:col-span="{ default: 4, md: 5, lg: 6 }"
|
|
618
|
+
:row-start="8"
|
|
619
|
+
:row-span="3"
|
|
620
|
+
layer="top"
|
|
621
|
+
align="center"
|
|
622
|
+
>
|
|
623
|
+
<div class="bg-white p-6">
|
|
624
|
+
<h2>Featured Work</h2>
|
|
625
|
+
</div>
|
|
626
|
+
</LayoutGridItem>
|
|
627
|
+
</LayoutSection>
|
|
628
|
+
</template>
|
|
629
|
+
```
|
|
630
|
+
|
|
631
|
+
---
|
|
632
|
+
|
|
633
|
+
### Example 5: Using Presets with Overrides
|
|
634
|
+
|
|
635
|
+
```vue
|
|
636
|
+
<template>
|
|
637
|
+
<LayoutSection>
|
|
638
|
+
<!-- Use preset but override row position -->
|
|
639
|
+
<LayoutGridItem
|
|
640
|
+
preset="hero"
|
|
641
|
+
:row-start="3"
|
|
642
|
+
:row-span="8"
|
|
643
|
+
>
|
|
644
|
+
<h1>Custom positioned hero content</h1>
|
|
645
|
+
</LayoutGridItem>
|
|
646
|
+
</LayoutSection>
|
|
647
|
+
</template>
|
|
648
|
+
```
|
|
649
|
+
|
|
650
|
+
---
|
|
651
|
+
|
|
652
|
+
## Best Practices
|
|
653
|
+
|
|
654
|
+
### 1. Always Use ResponsiveValue for Positioning
|
|
655
|
+
|
|
656
|
+
Instead of hardcoding values, use responsive objects:
|
|
657
|
+
|
|
658
|
+
```vue
|
|
659
|
+
<!-- ❌ Don't -->
|
|
660
|
+
<LayoutGridItem :col-start="2" :col-span="10">
|
|
661
|
+
|
|
662
|
+
<!-- ✅ Do -->
|
|
663
|
+
<LayoutGridItem
|
|
664
|
+
:col-start="{ default: 1, md: 2, lg: 4 }"
|
|
665
|
+
:col-span="{ default: 6, md: 10, lg: 12 }"
|
|
666
|
+
>
|
|
667
|
+
```
|
|
668
|
+
|
|
669
|
+
### 2. Leverage Presets for Consistency
|
|
670
|
+
|
|
671
|
+
Define common layouts as presets in `app.config.ts`:
|
|
672
|
+
|
|
673
|
+
```ts
|
|
674
|
+
presets: {
|
|
675
|
+
articleHeader: {
|
|
676
|
+
colStart: { default: 1, md: 3, lg: 5 },
|
|
677
|
+
colSpan: { default: 6, md: 8, lg: 10 },
|
|
678
|
+
rowStart: 2,
|
|
679
|
+
rowSpan: 3,
|
|
680
|
+
},
|
|
681
|
+
}
|
|
682
|
+
```
|
|
683
|
+
|
|
684
|
+
Then use:
|
|
685
|
+
```vue
|
|
686
|
+
<LayoutGridItem preset="articleHeader">
|
|
687
|
+
```
|
|
688
|
+
|
|
689
|
+
### 3. Use Semantic Layer Names
|
|
690
|
+
|
|
691
|
+
Instead of manual z-index values:
|
|
692
|
+
|
|
693
|
+
```vue
|
|
694
|
+
<!-- ❌ Don't -->
|
|
695
|
+
<LayoutGridItem :z="5">
|
|
696
|
+
|
|
697
|
+
<!-- ✅ Do -->
|
|
698
|
+
<LayoutGridItem layer="back">
|
|
699
|
+
```
|
|
700
|
+
|
|
701
|
+
### 4. Bleed Only When Necessary
|
|
702
|
+
|
|
703
|
+
Full-bleed is great for backgrounds but should be used sparingly for content:
|
|
704
|
+
|
|
705
|
+
```vue
|
|
706
|
+
<!-- Background image: full bleed -->
|
|
707
|
+
<LayoutGridItem bleed="both" layer="back">
|
|
708
|
+
<img src="/bg.jpg" />
|
|
709
|
+
</LayoutGridItem>
|
|
710
|
+
|
|
711
|
+
<!-- Content: respect grid gutters -->
|
|
712
|
+
<LayoutGridItem preset="centered">
|
|
713
|
+
<p>Readable content</p>
|
|
714
|
+
</LayoutGridItem>
|
|
715
|
+
```
|
|
716
|
+
|
|
717
|
+
### 5. Enable Grid Debug During Development
|
|
718
|
+
|
|
719
|
+
Add to your layout:
|
|
720
|
+
|
|
721
|
+
```vue
|
|
722
|
+
<template>
|
|
723
|
+
<div class="mastmain">
|
|
724
|
+
<NuxtPage />
|
|
725
|
+
<LayoutGridDebug v-if="isDev" />
|
|
726
|
+
</div>
|
|
727
|
+
</template>
|
|
728
|
+
|
|
729
|
+
<script setup>
|
|
730
|
+
const isDev = process.dev
|
|
731
|
+
</script>
|
|
732
|
+
```
|
|
733
|
+
|
|
734
|
+
Or use Cmd/Ctrl+G to toggle dynamically.
|
|
735
|
+
|
|
736
|
+
### 6. Maintain Vertical Rhythm in Typography
|
|
737
|
+
|
|
738
|
+
Use rhythm utilities for consistent spacing:
|
|
739
|
+
|
|
740
|
+
```vue
|
|
741
|
+
<div class="prose-rhythm">
|
|
742
|
+
<h1>Heading</h1>
|
|
743
|
+
<p>Paragraph with automatic rhythm spacing.</p>
|
|
744
|
+
<p>Another paragraph.</p>
|
|
745
|
+
</div>
|
|
746
|
+
```
|
|
747
|
+
|
|
748
|
+
### 7. Container Queries for Component-Level Responsiveness
|
|
749
|
+
|
|
750
|
+
`LayoutGridItem` includes `@container` support:
|
|
751
|
+
|
|
752
|
+
```vue
|
|
753
|
+
<LayoutGridItem preset="sidebar">
|
|
754
|
+
<div class="@container/item">
|
|
755
|
+
<p class="text-sm @lg:text-base">Responsive to grid item width</p>
|
|
756
|
+
</div>
|
|
757
|
+
</LayoutGridItem>
|
|
758
|
+
```
|
|
759
|
+
|
|
760
|
+
### 8. Mobile-First Responsive Values
|
|
761
|
+
|
|
762
|
+
Always provide `default` (mobile) values first:
|
|
763
|
+
|
|
764
|
+
```ts
|
|
765
|
+
// ✅ Mobile-first
|
|
766
|
+
colStart: { default: 1, md: 3, lg: 5 }
|
|
767
|
+
|
|
768
|
+
// ❌ Missing default
|
|
769
|
+
colStart: { md: 3, lg: 5 } // Will error
|
|
770
|
+
```
|
|
771
|
+
|
|
772
|
+
### 9. Avoid Deep Nesting
|
|
773
|
+
|
|
774
|
+
The grid is flat by design. Avoid nesting `<LayoutSection>` inside `<LayoutGridItem>`:
|
|
775
|
+
|
|
776
|
+
```vue
|
|
777
|
+
<!-- ❌ Don't nest sections -->
|
|
778
|
+
<LayoutSection>
|
|
779
|
+
<LayoutGridItem>
|
|
780
|
+
<LayoutSection>...</LayoutSection>
|
|
781
|
+
</LayoutGridItem>
|
|
782
|
+
</LayoutSection>
|
|
783
|
+
|
|
784
|
+
<!-- ✅ Use sibling sections -->
|
|
785
|
+
<LayoutSection>...</LayoutSection>
|
|
786
|
+
<LayoutSection>...</LayoutSection>
|
|
787
|
+
```
|
|
788
|
+
|
|
789
|
+
### 10. Test Across Breakpoints
|
|
790
|
+
|
|
791
|
+
Always test your layouts at:
|
|
792
|
+
- Mobile: < 768px (6 columns)
|
|
793
|
+
- Tablet: 768px - 1279px (12 columns)
|
|
794
|
+
- Desktop: ≥ 1280px (18 columns)
|
|
795
|
+
|
|
796
|
+
Use responsive design mode in browser DevTools or the grid debug overlay.
|
|
797
|
+
|
|
798
|
+
---
|
|
799
|
+
|
|
800
|
+
## Composables
|
|
801
|
+
|
|
802
|
+
### `useGridConfig()`
|
|
803
|
+
|
|
804
|
+
**File**: `app/composables/useGridConfig.ts`
|
|
805
|
+
|
|
806
|
+
Access grid configuration from `app.config.ts`:
|
|
807
|
+
|
|
808
|
+
```ts
|
|
809
|
+
const { config, getPreset, layers } = useGridConfig()
|
|
810
|
+
|
|
811
|
+
const heroPreset = getPreset('hero')
|
|
812
|
+
// { colStart: { default: 1, md: 2, lg: 4 }, ... }
|
|
813
|
+
|
|
814
|
+
const allLayers = layers.value
|
|
815
|
+
// { back: 0, mid: 10, front: 20, top: 30 }
|
|
816
|
+
```
|
|
817
|
+
|
|
818
|
+
**Returns**:
|
|
819
|
+
- `config` - Computed full grid config
|
|
820
|
+
- `getPreset(name: string)` - Get preset by name
|
|
821
|
+
- `layers` - Computed z-index layer values
|
|
822
|
+
|
|
823
|
+
---
|
|
824
|
+
|
|
825
|
+
## Tailwind Configuration
|
|
826
|
+
|
|
827
|
+
The layer includes a `tailwind.config.js` with safelist patterns for dynamic grid classes:
|
|
828
|
+
|
|
829
|
+
```js
|
|
830
|
+
safelist: [
|
|
831
|
+
{
|
|
832
|
+
pattern: /^(md|lg):(col|row)-(start|span)-[0-9]+$/,
|
|
833
|
+
},
|
|
834
|
+
],
|
|
835
|
+
```
|
|
836
|
+
|
|
837
|
+
This ensures responsive grid utility classes are always generated, even when used with dynamic values.
|
|
838
|
+
|
|
839
|
+
---
|
|
840
|
+
|
|
841
|
+
## Browser Support
|
|
842
|
+
|
|
843
|
+
- **CSS Grid**: All modern browsers
|
|
844
|
+
- **CSS Subgrid**: Chrome 117+, Safari 16+, Firefox 71+
|
|
845
|
+
- **Container Queries**: Chrome 105+, Safari 16+, Firefox 110+
|
|
846
|
+
|
|
847
|
+
For older browsers, consider:
|
|
848
|
+
- Progressive enhancement (grid gracefully degrades)
|
|
849
|
+
- Polyfills (e.g., `css-grid-polyfill` for IE11)
|
|
850
|
+
- Feature detection (`@supports (grid-template-columns: subgrid)`)
|
|
851
|
+
|
|
852
|
+
---
|
|
853
|
+
|
|
854
|
+
## Troubleshooting
|
|
855
|
+
|
|
856
|
+
### Grid Items Not Aligning
|
|
857
|
+
|
|
858
|
+
**Problem**: Items don't align to grid lines.
|
|
859
|
+
|
|
860
|
+
**Solution**: Ensure parent has `mastmain` or `basesection` utility class:
|
|
861
|
+
```vue
|
|
862
|
+
<div class="mastmain">
|
|
863
|
+
<LayoutSection>...</LayoutSection>
|
|
864
|
+
</div>
|
|
865
|
+
```
|
|
866
|
+
|
|
867
|
+
### Responsive Values Not Working
|
|
868
|
+
|
|
869
|
+
**Problem**: `md:` or `lg:` classes not applying.
|
|
870
|
+
|
|
871
|
+
**Solution**: Check Tailwind safelist includes grid patterns (see `tailwind.config.js`).
|
|
872
|
+
|
|
873
|
+
### Section Not Full Height
|
|
874
|
+
|
|
875
|
+
**Problem**: Section doesn't fill viewport.
|
|
876
|
+
|
|
877
|
+
**Solution**: Use `full-height` prop:
|
|
878
|
+
```vue
|
|
879
|
+
<LayoutSection full-height>
|
|
880
|
+
```
|
|
881
|
+
|
|
882
|
+
### Grid Overflow on Mobile
|
|
883
|
+
|
|
884
|
+
**Problem**: Content overflows horizontally on mobile.
|
|
885
|
+
|
|
886
|
+
**Solution**: Ensure all `<LayoutGridItem>` have mobile-friendly `colSpan`:
|
|
887
|
+
```vue
|
|
888
|
+
<LayoutGridItem :col-span="{ default: 6, md: 10, lg: 12 }">
|
|
889
|
+
```
|
|
890
|
+
|
|
891
|
+
### Preset Not Found
|
|
892
|
+
|
|
893
|
+
**Problem**: `getPreset('myPreset')` returns `undefined`.
|
|
894
|
+
|
|
895
|
+
**Solution**: Verify preset exists in `app.config.ts`:
|
|
896
|
+
```ts
|
|
897
|
+
presets: {
|
|
898
|
+
myPreset: { ... }
|
|
899
|
+
}
|
|
900
|
+
```
|
|
901
|
+
|
|
902
|
+
---
|
|
903
|
+
|
|
904
|
+
## Advanced Customization
|
|
905
|
+
|
|
906
|
+
### Custom Breakpoints
|
|
907
|
+
|
|
908
|
+
Override breakpoints by extending the CSS:
|
|
909
|
+
|
|
910
|
+
```css
|
|
911
|
+
/* Your project's CSS */
|
|
912
|
+
@import '@your-org/ui-layout-layer/app/assets/css/main.css';
|
|
913
|
+
|
|
914
|
+
@utility mastmain {
|
|
915
|
+
/* Override tablet breakpoint to 64rem (1024px) */
|
|
916
|
+
@media (width >= 64rem) {
|
|
917
|
+
:root {
|
|
918
|
+
--grid-cols: 12;
|
|
919
|
+
}
|
|
920
|
+
}
|
|
921
|
+
}
|
|
922
|
+
```
|
|
923
|
+
|
|
924
|
+
### Dynamic Grid Configuration
|
|
925
|
+
|
|
926
|
+
Use runtime config to dynamically adjust grid:
|
|
927
|
+
|
|
928
|
+
```ts
|
|
929
|
+
// nuxt.config.ts
|
|
930
|
+
export default defineNuxtConfig({
|
|
931
|
+
runtimeConfig: {
|
|
932
|
+
public: {
|
|
933
|
+
gridColumns: {
|
|
934
|
+
default: 6,
|
|
935
|
+
md: 12,
|
|
936
|
+
lg: 18,
|
|
937
|
+
},
|
|
938
|
+
},
|
|
939
|
+
},
|
|
940
|
+
})
|
|
941
|
+
```
|
|
942
|
+
|
|
943
|
+
Access in component:
|
|
944
|
+
```ts
|
|
945
|
+
const config = useRuntimeConfig()
|
|
946
|
+
const columns = config.public.gridColumns
|
|
947
|
+
```
|
|
948
|
+
|
|
949
|
+
### Adding New Presets Programmatically
|
|
950
|
+
|
|
951
|
+
```ts
|
|
952
|
+
// composables/useCustomPresets.ts
|
|
953
|
+
export function useCustomPresets() {
|
|
954
|
+
const { config } = useGridConfig()
|
|
955
|
+
|
|
956
|
+
const addPreset = (name: string, preset: GridPresetsItem) => {
|
|
957
|
+
if (config.value) {
|
|
958
|
+
config.value.presets[name] = preset
|
|
959
|
+
}
|
|
960
|
+
}
|
|
961
|
+
|
|
962
|
+
return { addPreset }
|
|
963
|
+
}
|
|
964
|
+
```
|
|
965
|
+
|
|
966
|
+
---
|
|
967
|
+
|
|
968
|
+
## Resources
|
|
969
|
+
|
|
970
|
+
- [CSS Subgrid on MDN](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_grid_layout/Subgrid)
|
|
971
|
+
- [Container Queries Guide](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_containment/Container_queries)
|
|
972
|
+
- [Josef Müller-Brockmann Grid Systems](https://www.amazon.com/Grid-Systems-Graphic-Design-Communication/dp/3721201450)
|
|
973
|
+
- [Nuxt Layers Documentation](https://nuxt.com/docs/getting-started/layers)
|
|
974
|
+
- [Tailwind CSS Grid Documentation](https://tailwindcss.com/docs/grid-template-columns)
|
|
975
|
+
|
|
976
|
+
---
|
|
977
|
+
|
|
978
|
+
## Contributing
|
|
979
|
+
|
|
980
|
+
When contributing to the grid system:
|
|
981
|
+
|
|
982
|
+
1. Maintain backwards compatibility
|
|
983
|
+
2. Document all new presets in `app.config.ts`
|
|
984
|
+
3. Update types in `app/types/layouts.ts`
|
|
985
|
+
4. Add examples to this documentation
|
|
986
|
+
5. Test across all breakpoints (6/12/18 columns)
|
|
987
|
+
6. Ensure mobile-first responsive design
|
|
988
|
+
|
|
989
|
+
---
|
|
990
|
+
|
|
991
|
+
## License
|
|
992
|
+
|
|
993
|
+
This layer is part of the Nuxt UI ecosystem. Refer to the project's LICENSE file for details.
|