kmcom-nuxt-layers 2.7.5 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (773) hide show
  1. package/docs/FALLOW-COMPLEXITY-DUPLICATION-AUDIT.md +0 -1
  2. package/docs/LAYOUT.md +34 -61
  3. package/docs/MIGRATION.md +1 -1
  4. package/docs/UPAGE-GRID-INTEGRATION.md +6 -6
  5. package/docs/layout-shift-causes.md +1 -1
  6. package/docs/superpowers/plans/2026-09-03-layout-layer-fluid-rebuild.md +1850 -0
  7. package/docs/superpowers/plans/2026-09-03-vue-element-system.md +1019 -0
  8. package/docs/superpowers/plans/2026-09-04-grid-layer.md +977 -0
  9. package/docs/superpowers/specs/2026-08-30-layer-taxonomy-tier-0-1-design.md +533 -0
  10. package/docs/superpowers/specs/2026-08-30-layer-taxonomy-tier-2-design.md +154 -0
  11. package/docs/superpowers/specs/2026-08-30-layer-taxonomy-tier-3-design.md +109 -0
  12. package/docs/superpowers/specs/2026-08-30-layer-taxonomy-tier-4-design.md +124 -0
  13. package/docs/superpowers/specs/2026-08-30-layer-taxonomy-tier-5-design.md +121 -0
  14. package/docs/superpowers/specs/2026-08-30-layer-taxonomy-tier-6-design.md +77 -0
  15. package/docs/superpowers/specs/2026-08-30-layer-taxonomy-tier-7-design.md +73 -0
  16. package/docs/superpowers/specs/2026-08-31-swiss-grid-layer-design.md +190 -0
  17. package/docs/superpowers/specs/2026-09-03-layout-layer-fluid-rebuild-design.md +312 -0
  18. package/docs/superpowers/specs/2026-09-03-vue-element-system-design.md +342 -0
  19. package/docs/superpowers/specs/2026-09-04-grid-layer-design.md +236 -0
  20. package/layers/content/app/app.config.ts +10 -2
  21. package/layers/content/app/components/Blog/ItemPage.vue +21 -0
  22. package/layers/content/app/components/Blog/Page.vue +25 -0
  23. package/layers/content/app/components/Gallery/ImagePage.vue +5 -1
  24. package/layers/content/app/components/Gallery/Page.vue +4 -1
  25. package/layers/content/app/components/Gallery/SlugPage.vue +5 -1
  26. package/layers/content/app/components/Portfolio/ItemPage.vue +4 -1
  27. package/layers/content/app/components/Portfolio/List.vue +14 -2
  28. package/layers/content/app/components/Portfolio/Page.vue +4 -1
  29. package/layers/content/app/composables/useBlogPosts.ts +6 -19
  30. package/layers/content/app/composables/useCollectionItems.ts +63 -0
  31. package/layers/content/app/composables/useGalleryItems.ts +1 -16
  32. package/layers/content/app/types/content.ts +9 -0
  33. package/layers/content/package.json +3 -0
  34. package/layers/core/app/app.config.ts +34 -17
  35. package/layers/core/app/app.vue +1 -0
  36. package/layers/core/app/assets/css/core.css +30 -1
  37. package/layers/core/app/assets/css/layout.css +0 -7
  38. package/layers/core/app/assets/css/tokens/breakpoints.css +13 -0
  39. package/layers/core/app/assets/css/tokens/container.css +36 -0
  40. package/layers/core/app/assets/css/tokens/spacing-fluid.css +25 -0
  41. package/layers/core/app/components/AppContainer.vue +32 -0
  42. package/layers/core/app/components/Element.test.ts +90 -0
  43. package/layers/core/app/components/Element.vue +78 -0
  44. package/layers/core/app/components/ElementTw.test.ts +64 -0
  45. package/layers/core/app/components/ElementTw.vue +86 -0
  46. package/layers/core/app/components/LoadingScreen.vue +0 -15
  47. package/layers/core/app/composables/useElementGrid.test.ts +33 -0
  48. package/layers/core/app/composables/useElementGrid.ts +29 -0
  49. package/layers/core/app/composables/useElementInteraction.test.ts +27 -0
  50. package/layers/core/app/composables/useElementInteraction.ts +17 -0
  51. package/layers/core/app/composables/useElementLayout.test.ts +41 -0
  52. package/layers/core/app/composables/useElementLayout.ts +26 -0
  53. package/layers/core/app/composables/useElementSizing.test.ts +39 -0
  54. package/layers/core/app/composables/useElementSizing.ts +25 -0
  55. package/layers/core/app/composables/useElementStyle.ts +65 -0
  56. package/layers/core/app/composables/useElementSurface.test.ts +33 -0
  57. package/layers/core/app/composables/useElementSurface.ts +21 -0
  58. package/layers/core/app/composables/useErrorLog.ts +6 -4
  59. package/layers/core/app/composables/useLayoutAttrs.test.ts +47 -0
  60. package/layers/core/app/composables/useLayoutAttrs.ts +94 -0
  61. package/layers/core/app/composables/useLoading.ts +3 -1
  62. package/layers/core/app/error.vue +27 -57
  63. package/layers/core/app/pages/[...slug].vue +1 -29
  64. package/layers/core/app/plugins/loading.client.ts +0 -6
  65. package/layers/core/app/types/element.ts +25 -0
  66. package/layers/core/app/types/index.ts +0 -1
  67. package/layers/core/app/types/notFound.ts +24 -0
  68. package/layers/core/app/types/responsive.ts +15 -0
  69. package/layers/core/app/types/responsive.type-test.ts +22 -0
  70. package/layers/core/app/types/runtime-config.ts +1 -17
  71. package/layers/core/app/types/tokens.ts +29 -0
  72. package/layers/core/app/utils/index.ts +4 -2
  73. package/layers/core/app/utils/scrollGuardClamp.test.ts +36 -0
  74. package/layers/core/app/utils/scrollGuardClamp.ts +22 -0
  75. package/layers/core/app/utils/styleToTailwindClasses.test.ts +31 -0
  76. package/layers/core/app/utils/styleToTailwindClasses.ts +16 -0
  77. package/layers/core/nuxt.config.ts +15 -11
  78. package/layers/core/package.json +2 -1
  79. package/layers/{auth → data/auth}/nuxt.config.ts +1 -1
  80. package/layers/{auth → data/auth}/package.json +1 -1
  81. package/layers/{baseline → data/auth}/tsconfig.json +1 -1
  82. package/layers/{database → data/database}/nuxt.config.ts +1 -1
  83. package/layers/{database → data/database}/package.json +1 -1
  84. package/layers/{database → data/database}/tsconfig.json +1 -1
  85. package/layers/{forms/app/types/app-config.d.ts → data/forms/app/app.config.ts} +4 -0
  86. package/layers/{forms → data/forms}/package.json +1 -1
  87. package/layers/{forms → data/forms}/server/api/forms/status.get.ts +3 -1
  88. package/layers/{animations → data/forms}/tsconfig.json +1 -1
  89. package/layers/{mailer → data/mailer}/nuxt.config.ts +11 -1
  90. package/layers/{mailer → data/mailer}/package.json +1 -1
  91. package/layers/{auth → data/mailer}/tsconfig.json +1 -1
  92. package/layers/data/metadata/app/composables/useMetadataItem.ts +18 -0
  93. package/layers/data/metadata/app/composables/useMetadataSearch.ts +37 -0
  94. package/layers/{metadata → data/metadata}/nuxt.config.ts +1 -1
  95. package/layers/{metadata → data/metadata}/package.json +1 -1
  96. package/layers/{metadata → data/metadata}/providers/comicvine/nuxt.config.ts +1 -1
  97. package/layers/{metadata → data/metadata}/providers/comicvine/package.json +1 -1
  98. package/layers/data/metadata/providers/comicvine/tsconfig.json +7 -0
  99. package/layers/{metadata → data/metadata}/providers/google-books/nuxt.config.ts +1 -1
  100. package/layers/{metadata → data/metadata}/providers/google-books/package.json +1 -1
  101. package/layers/{metadata → data/metadata}/providers/google-books/server/utils/metadata-google-books/client.ts +10 -2
  102. package/layers/data/metadata/providers/google-books/tsconfig.json +7 -0
  103. package/layers/{metadata → data/metadata}/providers/openlibrary/package.json +1 -1
  104. package/layers/{metadata → data/metadata}/providers/openlibrary/server/utils/metadata-openlibrary/client.ts +23 -11
  105. package/layers/data/metadata/providers/openlibrary/tsconfig.json +7 -0
  106. package/layers/{metadata → data/metadata}/providers/themoviedb/nuxt.config.ts +1 -1
  107. package/layers/{metadata → data/metadata}/providers/themoviedb/package.json +1 -1
  108. package/layers/{metadata → data/metadata}/providers/themoviedb/tsconfig.json +1 -1
  109. package/layers/{metadata → data/metadata}/server/utils/metadata/search.ts +11 -4
  110. package/layers/data/metadata/tsconfig.json +7 -0
  111. package/layers/{feeds → delivery/feeds}/app/components/Feeds/Index.vue +6 -2
  112. package/layers/{feeds → delivery/feeds}/app/components/Feeds/RouteCard.vue +2 -0
  113. package/layers/{feeds → delivery/feeds}/app/plugins/feed-head.ts +6 -2
  114. package/layers/{feeds → delivery/feeds}/app/utils/feed-catalog.ts +8 -6
  115. package/layers/{feeds → delivery/feeds}/nuxt.config.ts +1 -1
  116. package/layers/{feeds → delivery/feeds}/package.json +1 -1
  117. package/layers/{feeds → delivery/feeds}/server/utils/feed-config.ts +1 -1
  118. package/layers/{feeds → delivery/feeds}/server/utils/feed-service.ts +2 -1
  119. package/layers/delivery/feeds/tsconfig.json +7 -0
  120. package/layers/{scripts → delivery/scripts}/app/composables/useAnalytics.ts +3 -1
  121. package/layers/{scripts → delivery/scripts}/app/composables/useGtm.ts +8 -2
  122. package/layers/{scripts → delivery/scripts}/app/composables/useScriptsConsent.ts +4 -1
  123. package/layers/{scripts → delivery/scripts}/app/utils/scriptClients.ts +19 -0
  124. package/layers/{scripts → delivery/scripts}/nuxt.config.ts +7 -2
  125. package/layers/{scripts → delivery/scripts}/package.json +3 -2
  126. package/layers/delivery/scripts/tsconfig.json +7 -0
  127. package/layers/delivery/seo/app/composables/useSeoConfig.ts +8 -0
  128. package/layers/{seo → delivery/seo}/app/utils/seoConfig.test.ts +2 -2
  129. package/layers/{seo → delivery/seo}/app/utils/seoConfig.ts +2 -2
  130. package/layers/{seo → delivery/seo}/nuxt.config.ts +1 -1
  131. package/layers/{seo → delivery/seo}/package.json +1 -1
  132. package/layers/delivery/seo/tsconfig.json +7 -0
  133. package/layers/design-system/theming/app/app.config.ts +35 -0
  134. package/layers/design-system/theming/app/assets/css/tokens.css +67 -0
  135. package/layers/{theme → design-system/theming}/app/components/ThemePicker/AccentButton.vue +3 -22
  136. package/layers/{theme → design-system/theming}/app/components/ThemePicker/Colors.vue +3 -4
  137. package/layers/{theme → design-system/theming}/app/composables/useAccentColor.ts +5 -2
  138. package/layers/{theme → design-system/theming}/app/composables/useThemeContrast.ts +1 -1
  139. package/layers/{theme → design-system/theming}/app/composables/useThemeMotion.ts +1 -1
  140. package/layers/{theme → design-system/theming}/app/composables/useThemeTransparency.ts +1 -1
  141. package/layers/{theme → design-system/theming}/app/plugins/theme.client.ts +2 -1
  142. package/layers/design-system/theming/app/types/designSystem.ts +102 -0
  143. package/layers/design-system/theming/app/types/semanticColor.ts +20 -0
  144. package/layers/design-system/theming/app/types/theme.ts +12 -0
  145. package/layers/design-system/theming/app/utils/accentPalette.ts +28 -0
  146. package/layers/design-system/theming/app/utils/themeAdapter.ts +20 -0
  147. package/layers/design-system/theming/nuxt.config.ts +52 -0
  148. package/layers/{ui → design-system/theming}/package.json +5 -6
  149. package/layers/{theme → design-system/theming}/server/plugins/theme-fouc.ts +2 -0
  150. package/layers/{theme → design-system/theming}/server/utils/accent-css.ts +2 -2
  151. package/layers/{theme → design-system/theming}/tsconfig.json +1 -1
  152. package/layers/{typography → design-system/typography}/app/assets/css/typography.css +9 -0
  153. package/layers/design-system/typography/app/components/Typography/CodeBlock.vue +65 -0
  154. package/layers/{typography → design-system/typography}/app/components/Typography/Headline.vue +16 -31
  155. package/layers/{typography/app/components/Typography/HeadlineScreen.vue → design-system/typography/app/components/Typography/QuoteBlock.vue} +27 -29
  156. package/layers/design-system/typography/app/components/Typography/RepeatText.vue +147 -0
  157. package/layers/{typography → design-system/typography}/app/components/Typography/index.vue +6 -4
  158. package/layers/design-system/typography/app/composables/repeatFill.ts +51 -0
  159. package/layers/{typography → design-system/typography}/app/composables/typography.ts +4 -0
  160. package/layers/{typography → design-system/typography}/app/types/typography.ts +8 -0
  161. package/layers/{typography → design-system/typography}/nuxt.config.ts +1 -1
  162. package/layers/design-system/typography/tsconfig.json +7 -0
  163. package/layers/{visual → design-system/visual}/app/app.config.ts +2 -2
  164. package/layers/{visual → design-system/visual}/app/components/Accent/Blob.vue +1 -1
  165. package/layers/{visual → design-system/visual}/app/components/Accent/Scene.vue +2 -3
  166. package/layers/{visual → design-system/visual}/app/components/Gradient/Background.vue +2 -2
  167. package/layers/{visual → design-system/visual}/app/components/Gradient/Text.vue +2 -2
  168. package/layers/{visual → design-system/visual}/app/composables/gradient.ts +1 -1
  169. package/layers/design-system/visual/app/types/breakpoints.ts +67 -0
  170. package/layers/{visual → design-system/visual}/app/types/media.ts +0 -11
  171. package/layers/{visual → design-system/visual}/nuxt.config.ts +1 -1
  172. package/layers/design-system/visual/tsconfig.json +7 -0
  173. package/layers/{animations → motion/animations}/app/components/Motion/Marquee.vue +0 -7
  174. package/layers/{animations → motion/animations}/app/components/Motion/Staggered.vue +4 -1
  175. package/layers/{animations → motion/animations}/nuxt.config.ts +1 -2
  176. package/layers/motion/animations/tsconfig.json +7 -0
  177. package/layers/motion/{package.json → motion/package.json} +1 -1
  178. package/layers/motion/{tsconfig.json → motion/tsconfig.json} +1 -1
  179. package/layers/motion/page-transitions/app/assets/css/page-transitions.css +30 -0
  180. package/layers/{page-transitions → motion/page-transitions}/app/composables/usePageTransition.ts +14 -2
  181. package/layers/{page-transitions → motion/page-transitions}/app/plugins/page-transitions.client.ts +5 -2
  182. package/layers/{page-transitions → motion/page-transitions}/nuxt.config.ts +3 -1
  183. package/layers/motion/page-transitions/tsconfig.json +7 -0
  184. package/layers/motion/scroll/app/app.config.ts +13 -0
  185. package/layers/{scroll → motion/scroll}/app/composables/useSmoothScroll.ts +2 -1
  186. package/layers/{scroll → motion/scroll}/app/plugins/locomotive-scroll.client.ts +2 -1
  187. package/layers/{scroll → motion/scroll}/nuxt.config.ts +1 -1
  188. package/layers/motion/scroll/tsconfig.json +7 -0
  189. package/layers/{transitions → motion/transitions}/nuxt.config.ts +1 -1
  190. package/layers/motion/transitions/tsconfig.json +7 -0
  191. package/layers/{canvas → render/canvas}/app/composables/useRendererCapabilities.ts +0 -8
  192. package/layers/{canvas → render/canvas}/app/composables/useShaderTime.ts +0 -12
  193. package/layers/{canvas → render/canvas}/nuxt.config.ts +1 -4
  194. package/layers/{canvas → render/canvas}/package.json +3 -2
  195. package/layers/{canvas → render/canvas}/tsconfig.json +1 -1
  196. package/layers/render/shader/app/app.config.ts +21 -0
  197. package/layers/{shader → render/shader}/app/shaders/layers/paperShading.ts +1 -1
  198. package/layers/{shader → render/shader}/package.json +1 -1
  199. package/layers/render/shader/tsconfig.json +7 -0
  200. package/layers/structure/grid/app/app.config.ts +92 -0
  201. package/layers/structure/grid/app/assets/css/grid.css +38 -0
  202. package/layers/structure/grid/app/composables/useGridTracks.test.ts +94 -0
  203. package/layers/structure/grid/app/composables/useGridTracks.ts +74 -0
  204. package/layers/structure/grid/app/types/tracks.test.ts +32 -0
  205. package/layers/structure/grid/app/types/tracks.ts +18 -0
  206. package/layers/structure/grid/app/utils/placement.test.ts +19 -0
  207. package/layers/structure/grid/app/utils/placement.ts +15 -0
  208. package/layers/structure/grid/nuxt.config.ts +22 -0
  209. package/layers/{theme → structure/grid}/package.json +3 -3
  210. package/layers/structure/layout/app/app.config.ts +116 -0
  211. package/layers/{layout → structure/layout}/app/assets/css/layout/grids.css +11 -6
  212. package/layers/structure/layout/app/assets/css/layout.css +1 -0
  213. package/layers/structure/layout/app/components/HStack.vue +41 -0
  214. package/layers/{layout → structure/layout}/app/components/Layout/Grid/Debug.vue +5 -3
  215. package/layers/{layout → structure/layout}/app/components/Layout/Grid/Item.vue +4 -10
  216. package/layers/{layout → structure/layout}/app/components/Layout/Main.vue +3 -3
  217. package/layers/{layout → structure/layout}/app/components/Layout/Page/Header.vue +1 -1
  218. package/layers/{layout → structure/layout}/app/components/Layout/Page/index.vue +3 -3
  219. package/layers/{layout → structure/layout}/app/components/Layout/Section/index.vue +1 -1
  220. package/layers/structure/layout/app/components/Spacer.vue +21 -0
  221. package/layers/structure/layout/app/components/VStack.vue +37 -0
  222. package/layers/structure/layout/app/components/ZStack.vue +28 -0
  223. package/layers/structure/layout/app/layouts/default.vue +5 -0
  224. package/layers/{layout → structure/layout}/app/types/layouts.ts +2 -3
  225. package/layers/{layout → structure/layout}/app/utils/gridPlacementStyle.test.ts +7 -42
  226. package/layers/{layout → structure/layout}/app/utils/gridPlacementStyle.ts +4 -18
  227. package/layers/{layout → structure/layout}/nuxt.config.ts +1 -1
  228. package/layers/{layout → structure/layout}/package.json +1 -1
  229. package/layers/structure/layout/tsconfig.json +7 -0
  230. package/layers/{navigation → structure/navigation}/app/app.config.ts +4 -6
  231. package/layers/structure/navigation/app/components/Mast/Header.vue +11 -0
  232. package/layers/{navigation → structure/navigation}/app/components/Mast/Nav.vue +1 -1
  233. package/layers/structure/navigation/app/composables/mastNav.ts +15 -0
  234. package/layers/{navigation → structure/navigation}/app/utils/createModal.ts +22 -3
  235. package/layers/{navigation → structure/navigation}/nuxt.config.ts +1 -1
  236. package/layers/structure/navigation/tsconfig.json +7 -0
  237. package/layers/{routing → structure/routing}/app/app.config.ts +11 -2
  238. package/layers/{routing → structure/routing}/nuxt.config.ts +1 -1
  239. package/layers/{routing → structure/routing}/package.json +1 -1
  240. package/layers/structure/routing/tsconfig.json +7 -0
  241. package/package.json +56 -56
  242. package/docs/fallow-refactor/layers-ui.md +0 -27
  243. package/layers/animations/app/types/animations.ts +0 -8
  244. package/layers/animations/app/types/index.ts +0 -1
  245. package/layers/baseline/nuxt.config.ts +0 -24
  246. package/layers/baseline/package.json +0 -14
  247. package/layers/content/app/components/Blog/Card.vue +0 -43
  248. package/layers/content/app/components/Gallery/AmbientImage.vue +0 -44
  249. package/layers/content/app/components/Gallery/Card.vue +0 -43
  250. package/layers/content/app/components/NuxtContent/Renderer.vue +0 -14
  251. package/layers/content/app/components/Portfolio/Card.vue +0 -43
  252. package/layers/content/app/composables/createPortfolioComposables.ts +0 -50
  253. package/layers/content/app/composables/useBlogPost.ts +0 -3
  254. package/layers/content/app/composables/useGalleryItem.ts +0 -3
  255. package/layers/content/app/composables/usePortfolioItem.ts +0 -3
  256. package/layers/content/app/composables/usePortfolioItems.ts +0 -26
  257. package/layers/content/app/types/app-config.d.ts +0 -14
  258. package/layers/core/app/assets/css-backup.zip +0 -0
  259. package/layers/core/app/composables/useEnv.ts +0 -23
  260. package/layers/core/app/composables/useScrollGuard.ts +0 -243
  261. package/layers/core/app/plugins/feature-detection.client.ts +0 -34
  262. package/layers/core/app/plugins/init.ts +0 -192
  263. package/layers/core/app/plugins/scroll-guard.client.ts +0 -56
  264. package/layers/core/app/types/app-config.d.ts +0 -63
  265. package/layers/core/app/types/scroll-guard.ts +0 -25
  266. package/layers/core/app/utils/helpers.test.ts +0 -55
  267. package/layers/core/app/utils/helpers.ts +0 -248
  268. package/layers/core/app/utils/regex.test.ts +0 -31
  269. package/layers/feeds/tsconfig.json +0 -7
  270. package/layers/forms/app/app.config.ts +0 -3
  271. package/layers/forms/tsconfig.json +0 -7
  272. package/layers/layout/app/app.config.ts +0 -180
  273. package/layers/layout/app/assets/css/layout/modes/fluid.css +0 -109
  274. package/layers/layout/app/assets/css/layout.css +0 -2
  275. package/layers/layout/app/components/Layout/Container.vue +0 -46
  276. package/layers/layout/app/components/Layout/Page/Container.vue +0 -103
  277. package/layers/layout/app/components/Layout/Section/Grid.vue +0 -46
  278. package/layers/layout/app/components/Layout/Section/Sidebar.vue +0 -84
  279. package/layers/layout/app/components/Layout/Section/Stack.vue +0 -63
  280. package/layers/layout/app/components/Layout/Section/Title.vue +0 -33
  281. package/layers/layout/app/composables/GridPlacement.ts +0 -31
  282. package/layers/layout/app/types/app-config.d.ts +0 -14
  283. package/layers/layout/tsconfig.json +0 -7
  284. package/layers/mailer/server/types.d.ts +0 -11
  285. package/layers/mailer/tsconfig.json +0 -7
  286. package/layers/metadata/app/composables/useMetadataItem.ts +0 -15
  287. package/layers/metadata/app/composables/useMetadataSearch.ts +0 -29
  288. package/layers/metadata/providers/comicvine/tsconfig.json +0 -7
  289. package/layers/metadata/providers/google-books/tsconfig.json +0 -7
  290. package/layers/metadata/providers/openlibrary/tsconfig.json +0 -7
  291. package/layers/metadata/tsconfig.json +0 -7
  292. package/layers/motion/app/components/Motion/index.vue +0 -16
  293. package/layers/navigation/app/components/Mast/Header.vue +0 -18
  294. package/layers/navigation/app/components/Mast/Main.vue +0 -7
  295. package/layers/navigation/app/composables/mastNav.ts +0 -26
  296. package/layers/navigation/app/utils/regex.ts +0 -6
  297. package/layers/navigation/tsconfig.json +0 -7
  298. package/layers/page-transitions/tsconfig.json +0 -7
  299. package/layers/routing/app/types/app-config.d.ts +0 -7
  300. package/layers/routing/tsconfig.json +0 -7
  301. package/layers/scripts/app/types/index.ts +0 -1
  302. package/layers/scripts/app/types/scripts.ts +0 -14
  303. package/layers/scripts/tsconfig.json +0 -7
  304. package/layers/scroll/app/app.config.ts +0 -31
  305. package/layers/scroll/tsconfig.json +0 -7
  306. package/layers/seo/app/composables/useSeoConfig.ts +0 -7
  307. package/layers/seo/tsconfig.json +0 -7
  308. package/layers/shader/app/app.config.ts +0 -9
  309. package/layers/shader/app/types/app-config.d.ts +0 -7
  310. package/layers/shader/tsconfig.json +0 -7
  311. package/layers/starter/app/app.config.ts +0 -10
  312. package/layers/starter/app/components/StarterDesignSystem.vue +0 -1913
  313. package/layers/starter/app/components/StarterHome.vue +0 -441
  314. package/layers/starter/nuxt.config.ts +0 -15
  315. package/layers/starter/package.json +0 -10
  316. package/layers/theme/app/app.config.ts +0 -3
  317. package/layers/theme/app/types/app-config.d.ts +0 -10
  318. package/layers/theme/app/types/theme.ts +0 -23
  319. package/layers/theme/nuxt.config.ts +0 -74
  320. package/layers/transitions/tsconfig.json +0 -7
  321. package/layers/typography/app/components/Typography/CodeBlock.vue +0 -41
  322. package/layers/typography/app/components/Typography/QuoteBlock.vue +0 -23
  323. package/layers/typography/tsconfig.json +0 -7
  324. package/layers/ui/app/assets/css/ui.css +0 -4
  325. package/layers/ui/app/layouts/default.vue +0 -8
  326. package/layers/ui/nuxt.config.ts +0 -22
  327. package/layers/ui/tsconfig.json +0 -7
  328. package/layers/visual/app/types/breakpoints.ts +0 -179
  329. package/layers/visual/tsconfig.json +0 -7
  330. /package/layers/{auth → data/auth}/app/middleware/auth.ts +0 -0
  331. /package/layers/{auth → data/auth}/server/routes/auth/github.get.ts +0 -0
  332. /package/layers/{database → data/database}/server/utils/drizzle.ts +0 -0
  333. /package/layers/{database → data/database}/server/utils/sql.ts +0 -0
  334. /package/layers/{forms → data/forms}/app/components/Form/Contact.vue +0 -0
  335. /package/layers/{forms → data/forms}/app/components/Form/Field.vue +0 -0
  336. /package/layers/{forms → data/forms}/app/composables/useFormSchema.ts +0 -0
  337. /package/layers/{forms → data/forms}/app/composables/useFormsFetch.ts +0 -0
  338. /package/layers/{forms → data/forms}/app/config/fields.ts +0 -0
  339. /package/layers/{forms → data/forms}/app/types/fields.ts +0 -0
  340. /package/layers/{forms → data/forms}/app/types/index.ts +0 -0
  341. /package/layers/{forms → data/forms}/app/utils/contact-schema.test.ts +0 -0
  342. /package/layers/{forms → data/forms}/app/utils/contact-schema.ts +0 -0
  343. /package/layers/{forms → data/forms}/app/utils/fieldProps.test.ts +0 -0
  344. /package/layers/{forms → data/forms}/app/utils/fieldProps.ts +0 -0
  345. /package/layers/{forms → data/forms}/nuxt.config.ts +0 -0
  346. /package/layers/{forms → data/forms}/server/api/contact.post.ts +0 -0
  347. /package/layers/{mailer → data/mailer}/app/types/index.ts +0 -0
  348. /package/layers/{mailer → data/mailer}/app/types/mailer.ts +0 -0
  349. /package/layers/{mailer → data/mailer}/server/utils/config.ts +0 -0
  350. /package/layers/{mailer → data/mailer}/server/utils/email.ts +0 -0
  351. /package/layers/{mailer → data/mailer}/server/utils/hooks.ts +0 -0
  352. /package/layers/{metadata → data/metadata}/providers/comicvine/server/plugins/comicvine-register.ts +0 -0
  353. /package/layers/{metadata → data/metadata}/providers/comicvine/server/utils/metadata-comicvine/client.ts +0 -0
  354. /package/layers/{metadata → data/metadata}/providers/comicvine/server/utils/metadata-comicvine/normalise.test.ts +0 -0
  355. /package/layers/{metadata → data/metadata}/providers/comicvine/server/utils/metadata-comicvine/normalise.ts +0 -0
  356. /package/layers/{metadata → data/metadata}/providers/comicvine/server/utils/metadata-comicvine/provider.ts +0 -0
  357. /package/layers/{metadata → data/metadata}/providers/comicvine/server/utils/metadata-comicvine/types.ts +0 -0
  358. /package/layers/{metadata → data/metadata}/providers/google-books/server/plugins/google-books-register.ts +0 -0
  359. /package/layers/{metadata → data/metadata}/providers/google-books/server/utils/metadata-google-books/client.test.ts +0 -0
  360. /package/layers/{metadata → data/metadata}/providers/google-books/server/utils/metadata-google-books/normalise.test.ts +0 -0
  361. /package/layers/{metadata → data/metadata}/providers/google-books/server/utils/metadata-google-books/normalise.ts +0 -0
  362. /package/layers/{metadata → data/metadata}/providers/google-books/server/utils/metadata-google-books/provider.ts +0 -0
  363. /package/layers/{metadata → data/metadata}/providers/google-books/server/utils/metadata-google-books/types.ts +0 -0
  364. /package/layers/{metadata → data/metadata}/providers/openlibrary/nuxt.config.ts +0 -0
  365. /package/layers/{metadata → data/metadata}/providers/openlibrary/server/plugins/openlibrary-register.ts +0 -0
  366. /package/layers/{metadata → data/metadata}/providers/openlibrary/server/utils/metadata-openlibrary/client.test.ts +0 -0
  367. /package/layers/{metadata → data/metadata}/providers/openlibrary/server/utils/metadata-openlibrary/normalise.test.ts +0 -0
  368. /package/layers/{metadata → data/metadata}/providers/openlibrary/server/utils/metadata-openlibrary/normalise.ts +0 -0
  369. /package/layers/{metadata → data/metadata}/providers/openlibrary/server/utils/metadata-openlibrary/provider.ts +0 -0
  370. /package/layers/{metadata → data/metadata}/providers/openlibrary/server/utils/metadata-openlibrary/types.ts +0 -0
  371. /package/layers/{metadata → data/metadata}/providers/themoviedb/server/plugins/tmdb-register.ts +0 -0
  372. /package/layers/{metadata → data/metadata}/providers/themoviedb/server/utils/metadata-tmdb/client.test.ts +0 -0
  373. /package/layers/{metadata → data/metadata}/providers/themoviedb/server/utils/metadata-tmdb/client.ts +0 -0
  374. /package/layers/{metadata → data/metadata}/providers/themoviedb/server/utils/metadata-tmdb/normalise.test.ts +0 -0
  375. /package/layers/{metadata → data/metadata}/providers/themoviedb/server/utils/metadata-tmdb/normalise.ts +0 -0
  376. /package/layers/{metadata → data/metadata}/providers/themoviedb/server/utils/metadata-tmdb/provider.ts +0 -0
  377. /package/layers/{metadata → data/metadata}/providers/themoviedb/server/utils/metadata-tmdb/types.ts +0 -0
  378. /package/layers/{metadata → data/metadata}/server/api/metadata/lookup.get.ts +0 -0
  379. /package/layers/{metadata → data/metadata}/server/api/metadata/providers.get.ts +0 -0
  380. /package/layers/{metadata → data/metadata}/server/api/metadata/search.get.ts +0 -0
  381. /package/layers/{metadata → data/metadata}/server/api/metadata/status.get.ts +0 -0
  382. /package/layers/{metadata → data/metadata}/server/api/metadata/sync.post.ts +0 -0
  383. /package/layers/{metadata → data/metadata}/server/utils/metadata/cache.test.ts +0 -0
  384. /package/layers/{metadata → data/metadata}/server/utils/metadata/cache.ts +0 -0
  385. /package/layers/{metadata → data/metadata}/server/utils/metadata/errors.ts +0 -0
  386. /package/layers/{metadata → data/metadata}/server/utils/metadata/provider-registry.test.ts +0 -0
  387. /package/layers/{metadata → data/metadata}/server/utils/metadata/provider-registry.ts +0 -0
  388. /package/layers/{metadata → data/metadata}/server/utils/metadata/search.test.ts +0 -0
  389. /package/layers/{feeds → delivery/feeds}/app/app.config.ts +0 -0
  390. /package/layers/{feeds → delivery/feeds}/app/assets/css/feeds.css +0 -0
  391. /package/layers/{feeds → delivery/feeds}/public/feed/style.css +0 -0
  392. /package/layers/{feeds → delivery/feeds}/server/routes/feed/[collection]/atom/all.get.ts +0 -0
  393. /package/layers/{feeds → delivery/feeds}/server/routes/feed/[collection]/atom.get.ts +0 -0
  394. /package/layers/{feeds → delivery/feeds}/server/routes/feed/[collection]/json/all.get.ts +0 -0
  395. /package/layers/{feeds → delivery/feeds}/server/routes/feed/[collection]/json.get.ts +0 -0
  396. /package/layers/{feeds → delivery/feeds}/server/routes/feed/[collection]/rss/all.get.ts +0 -0
  397. /package/layers/{feeds → delivery/feeds}/server/routes/feed/[collection]/rss.get.ts +0 -0
  398. /package/layers/{feeds → delivery/feeds}/server/routes/feed/atom/all.get.ts +0 -0
  399. /package/layers/{feeds → delivery/feeds}/server/routes/feed/atom.get.ts +0 -0
  400. /package/layers/{feeds → delivery/feeds}/server/routes/feed/demo.get.ts +0 -0
  401. /package/layers/{feeds → delivery/feeds}/server/routes/feed/index.get.ts +0 -0
  402. /package/layers/{feeds → delivery/feeds}/server/routes/feed/json/all.get.ts +0 -0
  403. /package/layers/{feeds → delivery/feeds}/server/routes/feed/json.get.ts +0 -0
  404. /package/layers/{feeds → delivery/feeds}/server/routes/feed/rss/all.get.ts +0 -0
  405. /package/layers/{feeds → delivery/feeds}/server/routes/feed/rss.get.ts +0 -0
  406. /package/layers/{feeds → delivery/feeds}/server/routes/feed/style.xsl.get.ts +0 -0
  407. /package/layers/{feeds → delivery/feeds}/server/utils/cache.ts +0 -0
  408. /package/layers/{feeds → delivery/feeds}/server/utils/content-adapter.test.ts +0 -0
  409. /package/layers/{feeds → delivery/feeds}/server/utils/content-adapter.ts +0 -0
  410. /package/layers/{feeds → delivery/feeds}/server/utils/feed-author.test.ts +0 -0
  411. /package/layers/{feeds → delivery/feeds}/server/utils/feed-author.ts +0 -0
  412. /package/layers/{feeds → delivery/feeds}/server/utils/feed-config.test.ts +0 -0
  413. /package/layers/{feeds → delivery/feeds}/server/utils/feed-xml.ts +0 -0
  414. /package/layers/{feeds → delivery/feeds}/server/utils/formats/atom.ts +0 -0
  415. /package/layers/{feeds → delivery/feeds}/server/utils/formats/json.ts +0 -0
  416. /package/layers/{feeds → delivery/feeds}/server/utils/formats/rss.ts +0 -0
  417. /package/layers/{feeds → delivery/feeds}/server/utils/formats.test.ts +0 -0
  418. /package/layers/{feeds → delivery/feeds}/server/utils/types.ts +0 -0
  419. /package/layers/{scripts → delivery/scripts}/app/app.config.ts +0 -0
  420. /package/layers/{baseline → delivery/scripts}/app/components/BaselineStatus.vue +0 -0
  421. /package/layers/{scripts → delivery/scripts}/app/composables/useScriptLoader.ts +0 -0
  422. /package/layers/{scripts → delivery/scripts}/app/composables/useYoutubeEmbed.ts +0 -0
  423. /package/layers/{baseline → delivery/scripts}/app/plugins/baseline-status.client.ts +0 -0
  424. /package/layers/{seo → delivery/seo}/app/app.config.ts +0 -0
  425. /package/layers/{theme → design-system/theming}/app/assets/css/theme.css +0 -0
  426. /package/layers/{theme → design-system/theming}/app/components/ThemePicker/Menu.vue +0 -0
  427. /package/layers/{theme → design-system/theming}/app/components/ThemePicker/MenuButton.vue +0 -0
  428. /package/layers/{theme → design-system/theming}/app/composables/useTheme.ts +0 -0
  429. /package/layers/{theme → design-system/theming}/app/composables/useThemePreferenceModels.ts +0 -0
  430. /package/layers/{theme → design-system/theming}/app/composables/useThemePreferences.ts +0 -0
  431. /package/layers/{theme → design-system/theming}/app/types/index.ts +0 -0
  432. /package/layers/{theme → design-system/theming}/server/utils/accent-css.test.ts +0 -0
  433. /package/layers/{theme → design-system/theming}/server/utils/fouc-config.test.ts +0 -0
  434. /package/layers/{theme → design-system/theming}/server/utils/fouc-config.ts +0 -0
  435. /package/layers/{typography → design-system/typography}/app/components/Typography/TextStroke.vue +0 -0
  436. /package/layers/{typography → design-system/typography}/app/composables/color.ts +0 -0
  437. /package/layers/{typography → design-system/typography}/app/types/colors.ts +0 -0
  438. /package/layers/{typography → design-system/typography}/app/types/index.ts +0 -0
  439. /package/layers/{typography → design-system/typography}/package.json +0 -0
  440. /package/layers/{visual → design-system/visual}/app/assets/css/visual.css +0 -0
  441. /package/layers/{visual → design-system/visual}/app/components/Base/Modal.vue +0 -0
  442. /package/layers/{visual → design-system/visual}/app/components/Media/Picture.vue +0 -0
  443. /package/layers/{visual → design-system/visual}/app/components/Progress/Bar.vue +0 -0
  444. /package/layers/{visual → design-system/visual}/app/components/Progress/Circular.vue +0 -0
  445. /package/layers/{visual → design-system/visual}/app/components/Tint/Overlay.vue +0 -0
  446. /package/layers/{visual → design-system/visual}/app/composables/accent.ts +0 -0
  447. /package/layers/{visual → design-system/visual}/app/composables/picture.ts +0 -0
  448. /package/layers/{visual → design-system/visual}/app/composables/tint.ts +0 -0
  449. /package/layers/{visual → design-system/visual}/app/types/accent.ts +0 -0
  450. /package/layers/{visual → design-system/visual}/app/types/gradient.ts +0 -0
  451. /package/layers/{visual → design-system/visual}/app/types/index.ts +0 -0
  452. /package/layers/{visual → design-system/visual}/app/types/tint.ts +0 -0
  453. /package/layers/{visual → design-system/visual}/app/utils/colorTokens.test.ts +0 -0
  454. /package/layers/{visual → design-system/visual}/app/utils/colorTokens.ts +0 -0
  455. /package/layers/{visual → design-system/visual}/app/utils/gradientStyle.test.ts +0 -0
  456. /package/layers/{visual → design-system/visual}/app/utils/gradientStyle.ts +0 -0
  457. /package/layers/{visual → design-system/visual}/app/utils/responsiveSizes.test.ts +0 -0
  458. /package/layers/{visual → design-system/visual}/app/utils/responsiveSizes.ts +0 -0
  459. /package/layers/{visual → design-system/visual}/package.json +0 -0
  460. /package/layers/{animations → motion/animations}/app/components/Motion/CountUp.vue +0 -0
  461. /package/layers/{animations → motion/animations}/app/components/Motion/Cursor.vue +0 -0
  462. /package/layers/{animations → motion/animations}/app/components/Motion/Magnetic.vue +0 -0
  463. /package/layers/{animations → motion/animations}/app/components/Motion/MarqueeText.vue +0 -0
  464. /package/layers/{animations → motion/animations}/app/components/Motion/TextReveal.vue +0 -0
  465. /package/layers/{animations → motion/animations}/app/components/Motion/Tilt.vue +0 -0
  466. /package/layers/{animations → motion/animations}/app/components/Motion/VelocityEffect.vue +0 -0
  467. /package/layers/{animations → motion/animations}/app/composables/useCountUp.ts +0 -0
  468. /package/layers/{animations → motion/animations}/app/composables/useCursorFollower.ts +0 -0
  469. /package/layers/{animations → motion/animations}/app/composables/useMagneticElement.ts +0 -0
  470. /package/layers/{animations → motion/animations}/app/composables/useMarqueeCopies.ts +0 -0
  471. /package/layers/{animations → motion/animations}/app/composables/useMarqueeVelocity.ts +0 -0
  472. /package/layers/{animations → motion/animations}/app/composables/useTiltEffect.ts +0 -0
  473. /package/layers/{animations → motion/animations}/app/utils/pointerMotion.ts +0 -0
  474. /package/layers/{animations → motion/animations}/package.json +0 -0
  475. /package/layers/motion/{nuxt.config.ts → motion/nuxt.config.ts} +0 -0
  476. /package/layers/{page-transitions → motion/page-transitions}/app/app.config.ts +0 -0
  477. /package/layers/{page-transitions → motion/page-transitions}/package.json +0 -0
  478. /package/layers/{scroll → motion/scroll}/app/components/Motion/HorizontalScroll.vue +0 -0
  479. /package/layers/{scroll → motion/scroll}/app/components/Motion/Parallax.vue +0 -0
  480. /package/layers/{scroll → motion/scroll}/app/components/Motion/PinnedSection.vue +0 -0
  481. /package/layers/{scroll → motion/scroll}/app/components/Motion/ScrollLink.vue +0 -0
  482. /package/layers/{scroll → motion/scroll}/app/components/Motion/ScrollProgress.vue +0 -0
  483. /package/layers/{scroll → motion/scroll}/app/components/Motion/ScrollScene.vue +0 -0
  484. /package/layers/{scroll → motion/scroll}/app/components/Motion/ScrollStats.vue +0 -0
  485. /package/layers/{scroll → motion/scroll}/app/components/Motion/ScrollStep.vue +0 -0
  486. /package/layers/{scroll → motion/scroll}/app/composables/useGsap.ts +0 -0
  487. /package/layers/{scroll → motion/scroll}/app/composables/useScrollSteps.ts +0 -0
  488. /package/layers/{scroll → motion/scroll}/app/composables/useSectionProgress.ts +0 -0
  489. /package/layers/{scroll → motion/scroll}/app/types/index.ts +0 -0
  490. /package/layers/{scroll → motion/scroll}/app/types/scroll.ts +0 -0
  491. /package/layers/{scroll → motion/scroll}/app/utils/scroll.ts +0 -0
  492. /package/layers/{scroll → motion/scroll}/package.json +0 -0
  493. /package/layers/{transitions → motion/transitions}/app/assets/css/transitions.css +0 -0
  494. /package/layers/{transitions → motion/transitions}/app/components/Motion/Transition.vue +0 -0
  495. /package/layers/{transitions → motion/transitions}/package.json +0 -0
  496. /package/layers/{canvas → render/canvas}/app/components/ShaderCanvas.vue +0 -0
  497. /package/layers/{canvas → render/canvas}/app/types/index.ts +0 -0
  498. /package/layers/{canvas → render/canvas}/app/types/renderer.ts +0 -0
  499. /package/layers/{shader → render/shader}/app/assets/css/shader.css +0 -0
  500. /package/layers/{shader → render/shader}/app/components/Effect/Bloom.vue +0 -0
  501. /package/layers/{shader → render/shader}/app/components/Effect/ChromaticAberration.vue +0 -0
  502. /package/layers/{shader → render/shader}/app/components/Effect/PostProcessing.vue +0 -0
  503. /package/layers/{shader → render/shader}/app/components/Material/AmbientAurora.client.vue +0 -0
  504. /package/layers/{shader → render/shader}/app/components/Material/AmbientFlow.client.vue +0 -0
  505. /package/layers/{shader → render/shader}/app/components/Material/AmbientGradientMesh.client.vue +0 -0
  506. /package/layers/{shader → render/shader}/app/components/Material/AmbientNebula.client.vue +0 -0
  507. /package/layers/{shader → render/shader}/app/components/Material/AmbientOcean.client.vue +0 -0
  508. /package/layers/{shader → render/shader}/app/components/Material/Fresnel.client.vue +0 -0
  509. /package/layers/{shader → render/shader}/app/components/Material/Gradient.client.vue +0 -0
  510. /package/layers/{shader → render/shader}/app/components/Material/Image.client.vue +0 -0
  511. /package/layers/{shader → render/shader}/app/components/Material/Node.client.vue +0 -0
  512. /package/layers/{shader → render/shader}/app/components/Material/Noise.client.vue +0 -0
  513. /package/layers/{shader → render/shader}/app/components/Mesh/Plane.vue +0 -0
  514. /package/layers/{shader → render/shader}/app/components/Node/Color.client.vue +0 -0
  515. /package/layers/{shader → render/shader}/app/components/Node/Fresnel.client.vue +0 -0
  516. /package/layers/{shader → render/shader}/app/components/Node/Gradient.client.vue +0 -0
  517. /package/layers/{shader → render/shader}/app/components/Node/Mix.client.vue +0 -0
  518. /package/layers/{shader → render/shader}/app/components/Node/Noise.client.vue +0 -0
  519. /package/layers/{shader → render/shader}/app/components/Pipeline/ACESTonemap.client.vue +0 -0
  520. /package/layers/{shader → render/shader}/app/components/Pipeline/AddBlend.client.vue +0 -0
  521. /package/layers/{shader → render/shader}/app/components/Pipeline/AgedFilm.client.vue +0 -0
  522. /package/layers/{shader → render/shader}/app/components/Pipeline/Aurora.client.vue +0 -0
  523. /package/layers/{shader → render/shader}/app/components/Pipeline/BilinearGradient.client.vue +0 -0
  524. /package/layers/{shader → render/shader}/app/components/Pipeline/BillowNoise.client.vue +0 -0
  525. /package/layers/{shader → render/shader}/app/components/Pipeline/BrightnessContrast.client.vue +0 -0
  526. /package/layers/{shader → render/shader}/app/components/Pipeline/CellularNoise.client.vue +0 -0
  527. /package/layers/{shader → render/shader}/app/components/Pipeline/ChannelMixer.client.vue +0 -0
  528. /package/layers/{shader → render/shader}/app/components/Pipeline/ChebyshevNoiseField.client.vue +0 -0
  529. /package/layers/{shader → render/shader}/app/components/Pipeline/Checkerboard.client.vue +0 -0
  530. /package/layers/{shader → render/shader}/app/components/Pipeline/ChromaticAberration.client.vue +0 -0
  531. /package/layers/{shader → render/shader}/app/components/Pipeline/ChromaticScreenWaves.client.vue +0 -0
  532. /package/layers/{shader → render/shader}/app/components/Pipeline/Circle.client.vue +0 -0
  533. /package/layers/{shader → render/shader}/app/components/Pipeline/Clouds.client.vue +0 -0
  534. /package/layers/{shader → render/shader}/app/components/Pipeline/ColorBurnBlend.client.vue +0 -0
  535. /package/layers/{shader → render/shader}/app/components/Pipeline/ColorDodgeBlend.client.vue +0 -0
  536. /package/layers/{shader → render/shader}/app/components/Pipeline/ColourRamp.client.vue +0 -0
  537. /package/layers/{shader → render/shader}/app/components/Pipeline/ComplexPlaneField.client.vue +0 -0
  538. /package/layers/{shader → render/shader}/app/components/Pipeline/ConicGradient.client.vue +0 -0
  539. /package/layers/{shader → render/shader}/app/components/Pipeline/CosinePalette.client.vue +0 -0
  540. /package/layers/{shader → render/shader}/app/components/Pipeline/CoverageAlpha.client.vue +0 -0
  541. /package/layers/{shader → render/shader}/app/components/Pipeline/Cross.client.vue +0 -0
  542. /package/layers/{shader → render/shader}/app/components/Pipeline/CurlNoise.client.vue +0 -0
  543. /package/layers/{shader → render/shader}/app/components/Pipeline/DarkenBlend.client.vue +0 -0
  544. /package/layers/{shader → render/shader}/app/components/Pipeline/DayNightCycle.client.vue +0 -0
  545. /package/layers/{shader → render/shader}/app/components/Pipeline/Desaturate.client.vue +0 -0
  546. /package/layers/{shader → render/shader}/app/components/Pipeline/DiagonalGradient.client.vue +0 -0
  547. /package/layers/{shader → render/shader}/app/components/Pipeline/DiamondGradient.client.vue +0 -0
  548. /package/layers/{shader → render/shader}/app/components/Pipeline/DifferenceBlend.client.vue +0 -0
  549. /package/layers/{shader → render/shader}/app/components/Pipeline/DivideBlend.client.vue +0 -0
  550. /package/layers/{shader → render/shader}/app/components/Pipeline/DomainWarpedNoise.client.vue +0 -0
  551. /package/layers/{shader → render/shader}/app/components/Pipeline/Dots.client.vue +0 -0
  552. /package/layers/{shader → render/shader}/app/components/Pipeline/DuoTone.client.vue +0 -0
  553. /package/layers/{shader → render/shader}/app/components/Pipeline/ExclusionBlend.client.vue +0 -0
  554. /package/layers/{shader → render/shader}/app/components/Pipeline/ExponentialFog.client.vue +0 -0
  555. /package/layers/{shader → render/shader}/app/components/Pipeline/Exposure.client.vue +0 -0
  556. /package/layers/{shader → render/shader}/app/components/Pipeline/FBMNoise.client.vue +0 -0
  557. /package/layers/{shader → render/shader}/app/components/Pipeline/FilmBurn.client.vue +0 -0
  558. /package/layers/{shader → render/shader}/app/components/Pipeline/FilmGrain.client.vue +0 -0
  559. /package/layers/{shader → render/shader}/app/components/Pipeline/FisheyeRay.client.vue +0 -0
  560. /package/layers/{shader → render/shader}/app/components/Pipeline/Flame.client.vue +0 -0
  561. /package/layers/{shader → render/shader}/app/components/Pipeline/FocalGradient.client.vue +0 -0
  562. /package/layers/{shader → render/shader}/app/components/Pipeline/Gamma.client.vue +0 -0
  563. /package/layers/{shader → render/shader}/app/components/Pipeline/GodRays.client.vue +0 -0
  564. /package/layers/{shader → render/shader}/app/components/Pipeline/GradientNoise.client.vue +0 -0
  565. /package/layers/{shader → render/shader}/app/components/Pipeline/Grain.client.vue +0 -0
  566. /package/layers/{shader → render/shader}/app/components/Pipeline/Grid.client.vue +0 -0
  567. /package/layers/{shader → render/shader}/app/components/Pipeline/Halation.client.vue +0 -0
  568. /package/layers/{shader → render/shader}/app/components/Pipeline/Halftone.client.vue +0 -0
  569. /package/layers/{shader → render/shader}/app/components/Pipeline/HardLightBlend.client.vue +0 -0
  570. /package/layers/{shader → render/shader}/app/components/Pipeline/Haze.client.vue +0 -0
  571. /package/layers/{shader → render/shader}/app/components/Pipeline/Hexagon.client.vue +0 -0
  572. /package/layers/{shader → render/shader}/app/components/Pipeline/Hue.client.vue +0 -0
  573. /package/layers/{shader → render/shader}/app/components/Pipeline/Invert.client.vue +0 -0
  574. /package/layers/{shader → render/shader}/app/components/Pipeline/LensFlare.client.vue +0 -0
  575. /package/layers/{shader → render/shader}/app/components/Pipeline/LightenBlend.client.vue +0 -0
  576. /package/layers/{shader → render/shader}/app/components/Pipeline/LinearGradient.client.vue +0 -0
  577. /package/layers/{shader → render/shader}/app/components/Pipeline/LinearGradient4.client.vue +0 -0
  578. /package/layers/{shader → render/shader}/app/components/Pipeline/LinearToSRGB.client.vue +0 -0
  579. /package/layers/{shader → render/shader}/app/components/Pipeline/Marble.client.vue +0 -0
  580. /package/layers/{shader → render/shader}/app/components/Pipeline/MixBlend.client.vue +0 -0
  581. /package/layers/{shader → render/shader}/app/components/Pipeline/MonochromeTint.client.vue +0 -0
  582. /package/layers/{shader → render/shader}/app/components/Pipeline/MultiplyBlend.client.vue +0 -0
  583. /package/layers/{shader → render/shader}/app/components/Pipeline/NoisyGradient.client.vue +0 -0
  584. /package/layers/{shader → render/shader}/app/components/Pipeline/NoisyGradientBlend.client.vue +0 -0
  585. /package/layers/{shader → render/shader}/app/components/Pipeline/OverlayBlend.client.vue +0 -0
  586. /package/layers/{shader → render/shader}/app/components/Pipeline/PaperTexture.client.vue +0 -0
  587. /package/layers/{shader → render/shader}/app/components/Pipeline/Polygon.client.vue +0 -0
  588. /package/layers/{shader → render/shader}/app/components/Pipeline/Posterise.client.vue +0 -0
  589. /package/layers/{shader → render/shader}/app/components/Pipeline/RadialGradient.client.vue +0 -0
  590. /package/layers/{shader → render/shader}/app/components/Pipeline/RayAutoOrbit.client.vue +0 -0
  591. /package/layers/{shader → render/shader}/app/components/Pipeline/RayMouseOrbit.client.vue +0 -0
  592. /package/layers/{shader → render/shader}/app/components/Pipeline/RayRotateX.client.vue +0 -0
  593. /package/layers/{shader → render/shader}/app/components/Pipeline/RayRotateY.client.vue +0 -0
  594. /package/layers/{shader → render/shader}/app/components/Pipeline/RayRotateZ.client.vue +0 -0
  595. /package/layers/{shader → render/shader}/app/components/Pipeline/RayTiltBasis.client.vue +0 -0
  596. /package/layers/{shader → render/shader}/app/components/Pipeline/RaymarchTunnel.client.vue +0 -0
  597. /package/layers/{shader → render/shader}/app/components/Pipeline/Rectangle.client.vue +0 -0
  598. /package/layers/{shader → render/shader}/app/components/Pipeline/ReinhardTonemap.client.vue +0 -0
  599. /package/layers/{shader → render/shader}/app/components/Pipeline/RidgedNoise.client.vue +0 -0
  600. /package/layers/{shader → render/shader}/app/components/Pipeline/Ring.client.vue +0 -0
  601. /package/layers/{shader → render/shader}/app/components/Pipeline/RingField.client.vue +0 -0
  602. /package/layers/{shader → render/shader}/app/components/Pipeline/RisographGrain.client.vue +0 -0
  603. /package/layers/{shader → render/shader}/app/components/Pipeline/RotatedGradientBlend.client.vue +0 -0
  604. /package/layers/{shader → render/shader}/app/components/Pipeline/SDFColourMask.client.vue +0 -0
  605. /package/layers/{shader → render/shader}/app/components/Pipeline/SDFRadialMask.client.vue +0 -0
  606. /package/layers/{shader → render/shader}/app/components/Pipeline/SRGBToLinear.client.vue +0 -0
  607. /package/layers/{shader → render/shader}/app/components/Pipeline/Saturation.client.vue +0 -0
  608. /package/layers/{shader → render/shader}/app/components/Pipeline/Scanlines.client.vue +0 -0
  609. /package/layers/{shader → render/shader}/app/components/Pipeline/ScreenBlend.client.vue +0 -0
  610. /package/layers/{shader → render/shader}/app/components/Pipeline/ShaderDebugger.client.vue +0 -0
  611. /package/layers/{shader → render/shader}/app/components/Pipeline/SimplexNoise.client.vue +0 -0
  612. /package/layers/{shader → render/shader}/app/components/Pipeline/SkyAtmosphere.client.vue +0 -0
  613. /package/layers/{shader → render/shader}/app/components/Pipeline/SoftLightBlend.client.vue +0 -0
  614. /package/layers/{shader → render/shader}/app/components/Pipeline/SolidColour.client.vue +0 -0
  615. /package/layers/{shader → render/shader}/app/components/Pipeline/SplitTone.client.vue +0 -0
  616. /package/layers/{shader → render/shader}/app/components/Pipeline/Star.client.vue +0 -0
  617. /package/layers/{shader → render/shader}/app/components/Pipeline/Starfield.client.vue +0 -0
  618. /package/layers/{shader → render/shader}/app/components/Pipeline/Stripes.client.vue +0 -0
  619. /package/layers/{shader → render/shader}/app/components/Pipeline/SubtractBlend.client.vue +0 -0
  620. /package/layers/{shader → render/shader}/app/components/Pipeline/TanhTonemap.client.vue +0 -0
  621. /package/layers/{shader → render/shader}/app/components/Pipeline/Threshold.client.vue +0 -0
  622. /package/layers/{shader → render/shader}/app/components/Pipeline/Tint.client.vue +0 -0
  623. /package/layers/{shader → render/shader}/app/components/Pipeline/Triangle.client.vue +0 -0
  624. /package/layers/{shader → render/shader}/app/components/Pipeline/UVAspectCorrect.client.vue +0 -0
  625. /package/layers/{shader → render/shader}/app/components/Pipeline/UVBreath.client.vue +0 -0
  626. /package/layers/{shader → render/shader}/app/components/Pipeline/UVBulge.client.vue +0 -0
  627. /package/layers/{shader → render/shader}/app/components/Pipeline/UVClamp.client.vue +0 -0
  628. /package/layers/{shader → render/shader}/app/components/Pipeline/UVColumnOffset.client.vue +0 -0
  629. /package/layers/{shader → render/shader}/app/components/Pipeline/UVFlipX.client.vue +0 -0
  630. /package/layers/{shader → render/shader}/app/components/Pipeline/UVFlipXY.client.vue +0 -0
  631. /package/layers/{shader → render/shader}/app/components/Pipeline/UVFlipY.client.vue +0 -0
  632. /package/layers/{shader → render/shader}/app/components/Pipeline/UVFractBand.client.vue +0 -0
  633. /package/layers/{shader → render/shader}/app/components/Pipeline/UVMousePull.client.vue +0 -0
  634. /package/layers/{shader → render/shader}/app/components/Pipeline/UVNoiseRotate.client.vue +0 -0
  635. /package/layers/{shader → render/shader}/app/components/Pipeline/UVNoiseWarp.client.vue +0 -0
  636. /package/layers/{shader → render/shader}/app/components/Pipeline/UVOrbit.client.vue +0 -0
  637. /package/layers/{shader → render/shader}/app/components/Pipeline/UVParallax.client.vue +0 -0
  638. /package/layers/{shader → render/shader}/app/components/Pipeline/UVPixelate.client.vue +0 -0
  639. /package/layers/{shader → render/shader}/app/components/Pipeline/UVPulse.client.vue +0 -0
  640. /package/layers/{shader → render/shader}/app/components/Pipeline/UVRipple.client.vue +0 -0
  641. /package/layers/{shader → render/shader}/app/components/Pipeline/UVRotate.client.vue +0 -0
  642. /package/layers/{shader → render/shader}/app/components/Pipeline/UVScale.client.vue +0 -0
  643. /package/layers/{shader → render/shader}/app/components/Pipeline/UVScroll.client.vue +0 -0
  644. /package/layers/{shader → render/shader}/app/components/Pipeline/UVScrollX.client.vue +0 -0
  645. /package/layers/{shader → render/shader}/app/components/Pipeline/UVScrollY.client.vue +0 -0
  646. /package/layers/{shader → render/shader}/app/components/Pipeline/UVShear.client.vue +0 -0
  647. /package/layers/{shader → render/shader}/app/components/Pipeline/UVSineWarpXY.client.vue +0 -0
  648. /package/layers/{shader → render/shader}/app/components/Pipeline/UVSwapAxes.client.vue +0 -0
  649. /package/layers/{shader → render/shader}/app/components/Pipeline/UVTile.client.vue +0 -0
  650. /package/layers/{shader → render/shader}/app/components/Pipeline/UVTwirl.client.vue +0 -0
  651. /package/layers/{shader → render/shader}/app/components/Pipeline/UVWarp.client.vue +0 -0
  652. /package/layers/{shader → render/shader}/app/components/Pipeline/VHSBleed.client.vue +0 -0
  653. /package/layers/{shader → render/shader}/app/components/Pipeline/ValueNoise.client.vue +0 -0
  654. /package/layers/{shader → render/shader}/app/components/Pipeline/Vibrance.client.vue +0 -0
  655. /package/layers/{shader → render/shader}/app/components/Pipeline/Vignette.client.vue +0 -0
  656. /package/layers/{shader → render/shader}/app/components/Pipeline/VoronoiEdges.client.vue +0 -0
  657. /package/layers/{shader → render/shader}/app/components/Pipeline/Water.client.vue +0 -0
  658. /package/layers/{shader → render/shader}/app/components/Pipeline/WaveBendLayer.client.vue +0 -0
  659. /package/layers/{shader → render/shader}/app/components/Pipeline/WaveColourLayer.client.vue +0 -0
  660. /package/layers/{shader → render/shader}/app/components/Pipeline/WhiteBalance.client.vue +0 -0
  661. /package/layers/{shader → render/shader}/app/components/Pipeline/Wood.client.vue +0 -0
  662. /package/layers/{shader → render/shader}/app/components/Preset/Aurora.client.vue +0 -0
  663. /package/layers/{shader → render/shader}/app/components/Preset/Flow.client.vue +0 -0
  664. /package/layers/{shader → render/shader}/app/components/Preset/GradientMesh.client.vue +0 -0
  665. /package/layers/{shader → render/shader}/app/components/Preset/Nebula.client.vue +0 -0
  666. /package/layers/{shader → render/shader}/app/components/Preset/Ocean.client.vue +0 -0
  667. /package/layers/{shader → render/shader}/app/components/Preset/ThemeAurora.client.vue +0 -0
  668. /package/layers/{shader → render/shader}/app/components/Preset/ThemeBubble.client.vue +0 -0
  669. /package/layers/{shader → render/shader}/app/components/Preset/ThemeFlow.client.vue +0 -0
  670. /package/layers/{shader → render/shader}/app/components/Preset/ThemeGradient.client.vue +0 -0
  671. /package/layers/{shader → render/shader}/app/components/Preset/ThemeLavaLamp.client.vue +0 -0
  672. /package/layers/{shader → render/shader}/app/components/Preset/ThemePlasma.client.vue +0 -0
  673. /package/layers/{shader → render/shader}/app/components/Preset/ThemeWave.client.vue +0 -0
  674. /package/layers/{shader → render/shader}/app/components/Shader/Background.client.vue +0 -0
  675. /package/layers/{shader → render/shader}/app/components/Shader/Debug.vue +0 -0
  676. /package/layers/{shader → render/shader}/app/components/Shader/Host.client.vue +0 -0
  677. /package/layers/{shader → render/shader}/app/components/Shader/Material.client.vue +0 -0
  678. /package/layers/{shader → render/shader}/app/components/Shader/Pipeline.client.vue +0 -0
  679. /package/layers/{shader → render/shader}/app/components/Shader/PipelineContext.vue +0 -0
  680. /package/layers/{shader → render/shader}/app/components/Shader/Runtime.client.vue +0 -0
  681. /package/layers/{shader → render/shader}/app/composables/useAmbientMaterials.ts +0 -0
  682. /package/layers/{shader → render/shader}/app/composables/useCSSColourUniform.ts +0 -0
  683. /package/layers/{shader → render/shader}/app/composables/useCSSFloatUniform.ts +0 -0
  684. /package/layers/{shader → render/shader}/app/composables/useMousePosition.ts +0 -0
  685. /package/layers/{shader → render/shader}/app/composables/useShader.ts +0 -0
  686. /package/layers/{shader → render/shader}/app/composables/useShaderColor.ts +0 -0
  687. /package/layers/{shader → render/shader}/app/composables/useShaderFloat.ts +0 -0
  688. /package/layers/{shader → render/shader}/app/composables/useShaderGraph.ts +0 -0
  689. /package/layers/{shader → render/shader}/app/composables/useShaderMixBlend.ts +0 -0
  690. /package/layers/{shader → render/shader}/app/composables/useShaderPerf.ts +0 -0
  691. /package/layers/{shader → render/shader}/app/composables/useShaderPipeline.ts +0 -0
  692. /package/layers/{shader → render/shader}/app/composables/useShaderRuntime.ts +0 -0
  693. /package/layers/{shader → render/shader}/app/composables/useShaderVec2.ts +0 -0
  694. /package/layers/{shader → render/shader}/app/composables/useSunDirectionUniform.ts +0 -0
  695. /package/layers/{shader → render/shader}/app/composables/useTSLNodes.ts +0 -0
  696. /package/layers/{shader → render/shader}/app/composables/useThemeColors.ts +0 -0
  697. /package/layers/{shader → render/shader}/app/composables/useThemePreset.ts +0 -0
  698. /package/layers/{shader → render/shader}/app/composables/useUniformWatchers.ts +0 -0
  699. /package/layers/{shader → render/shader}/app/composables/useUniforms.ts +0 -0
  700. /package/layers/{shader → render/shader}/app/plugins/shader.client.ts +0 -0
  701. /package/layers/{shader → render/shader}/app/shaders/common/blend.ts +0 -0
  702. /package/layers/{shader → render/shader}/app/shaders/common/complex.ts +0 -0
  703. /package/layers/{shader → render/shader}/app/shaders/common/effects.ts +0 -0
  704. /package/layers/{shader → render/shader}/app/shaders/common/grain.ts +0 -0
  705. /package/layers/{shader → render/shader}/app/shaders/common/index.ts +0 -0
  706. /package/layers/{shader → render/shader}/app/shaders/common/lighting.ts +0 -0
  707. /package/layers/{shader → render/shader}/app/shaders/common/math.ts +0 -0
  708. /package/layers/{shader → render/shader}/app/shaders/common/nodes.ts +0 -0
  709. /package/layers/{shader → render/shader}/app/shaders/common/noise.ts +0 -0
  710. /package/layers/{shader → render/shader}/app/shaders/common/noiseHelpers.ts +0 -0
  711. /package/layers/{shader → render/shader}/app/shaders/common/palette.ts +0 -0
  712. /package/layers/{shader → render/shader}/app/shaders/common/patterns.ts +0 -0
  713. /package/layers/{shader → render/shader}/app/shaders/common/sdf.ts +0 -0
  714. /package/layers/{shader → render/shader}/app/shaders/common/shapes.ts +0 -0
  715. /package/layers/{shader → render/shader}/app/shaders/common/tonemapping.ts +0 -0
  716. /package/layers/{shader → render/shader}/app/shaders/common/uv.ts +0 -0
  717. /package/layers/{shader → render/shader}/app/shaders/createMaterial.ts +0 -0
  718. /package/layers/{shader → render/shader}/app/shaders/index.ts +0 -0
  719. /package/layers/{shader → render/shader}/app/shaders/layers/aurora.ts +0 -0
  720. /package/layers/{shader → render/shader}/app/shaders/layers/index.ts +0 -0
  721. /package/layers/{shader → render/shader}/app/shaders/layers/meshGradient.ts +0 -0
  722. /package/layers/{shader → render/shader}/app/shaders/layers/shaderGradient.ts +0 -0
  723. /package/layers/{shader → render/shader}/app/shaders/layers/stripe.ts +0 -0
  724. /package/layers/{shader → render/shader}/app/shaders/types.ts +0 -0
  725. /package/layers/{shader → render/shader}/app/types/index.ts +0 -0
  726. /package/layers/{shader → render/shader}/app/types/materials.ts +0 -0
  727. /package/layers/{shader → render/shader}/app/types/renderer.ts +0 -0
  728. /package/layers/{shader → render/shader}/app/types/tsl.ts +0 -0
  729. /package/layers/{shader → render/shader}/app/types/uniforms.ts +0 -0
  730. /package/layers/{shader → render/shader}/app/utils/tsl/animation.ts +0 -0
  731. /package/layers/{shader → render/shader}/app/utils/tsl/color.ts +0 -0
  732. /package/layers/{shader → render/shader}/app/utils/tsl/index.ts +0 -0
  733. /package/layers/{shader → render/shader}/app/utils/tsl/math.ts +0 -0
  734. /package/layers/{shader → render/shader}/app/utils/tsl/noise.ts +0 -0
  735. /package/layers/{shader → render/shader}/app/utils/tsl/oklch.ts +0 -0
  736. /package/layers/{shader → render/shader}/app/utils/tsl/patterns.ts +0 -0
  737. /package/layers/{shader → render/shader}/app/utils/tsl/tween.ts +0 -0
  738. /package/layers/{shader → render/shader}/app/utils/tsl/uv.ts +0 -0
  739. /package/layers/{shader → render/shader}/nuxt.config.ts +0 -0
  740. /package/layers/{layout → structure/layout}/app/components/Layout/Section/Gallery.vue +0 -0
  741. /package/layers/{layout → structure/layout}/app/components/Layout/Section/Hero.vue +0 -0
  742. /package/layers/{layout → structure/layout}/app/components/Layout/Section/Split.vue +0 -0
  743. /package/layers/{layout → structure/layout}/app/composables/useGridConfig.ts +0 -0
  744. /package/layers/{layout → structure/layout}/app/types/index.ts +0 -0
  745. /package/layers/{layout → structure/layout}/tailwind.config.js +0 -0
  746. /package/layers/{navigation → structure/navigation}/app/assets/css/navigation.css +0 -0
  747. /package/layers/{navigation → structure/navigation}/app/components/Links/Group.vue +0 -0
  748. /package/layers/{navigation → structure/navigation}/app/components/Links/Named.vue +0 -0
  749. /package/layers/{navigation → structure/navigation}/app/components/Mast/Footer.vue +0 -0
  750. /package/layers/{navigation → structure/navigation}/app/components/Mast/NavModal.vue +0 -0
  751. /package/layers/{navigation → structure/navigation}/app/components/Site/Subtitle.vue +0 -0
  752. /package/layers/{navigation → structure/navigation}/app/components/Site/Title.vue +0 -0
  753. /package/layers/{navigation → structure/navigation}/app/composables/toast.ts +0 -0
  754. /package/layers/{navigation → structure/navigation}/app/composables/useSite.ts +0 -0
  755. /package/layers/{navigation → structure/navigation}/app/types/index.ts +0 -0
  756. /package/layers/{navigation → structure/navigation}/app/types/nav.ts +0 -0
  757. /package/layers/{core → structure/navigation}/app/utils/regex.ts +0 -0
  758. /package/layers/{navigation → structure/navigation}/app/utils/site.test.ts +0 -0
  759. /package/layers/{navigation → structure/navigation}/app/utils/site.ts +0 -0
  760. /package/layers/{navigation → structure/navigation}/package.json +0 -0
  761. /package/layers/{routing → structure/routing}/app/composables/useFeatureFlags.ts +0 -0
  762. /package/layers/{routing → structure/routing}/app/composables/useMaintenance.ts +0 -0
  763. /package/layers/{routing → structure/routing}/app/composables/useRoutingConfig.ts +0 -0
  764. /package/layers/{routing → structure/routing}/app/middleware/01.maintenance.global.ts +0 -0
  765. /package/layers/{routing → structure/routing}/app/middleware/02.governance.global.ts +0 -0
  766. /package/layers/{routing → structure/routing}/app/plugins/feature-flags.client.ts +0 -0
  767. /package/layers/{routing → structure/routing}/app/plugins/scroll-routing.client.ts +0 -0
  768. /package/layers/{routing → structure/routing}/app/types/index.ts +0 -0
  769. /package/layers/{routing → structure/routing}/app/types/route-meta.d.ts +0 -0
  770. /package/layers/{routing → structure/routing}/app/types/routing.ts +0 -0
  771. /package/layers/{routing → structure/routing}/app/utils/resolveRoute.test.ts +0 -0
  772. /package/layers/{routing → structure/routing}/app/utils/resolveRoute.ts +0 -0
  773. /package/layers/{routing → structure/routing}/server/api/feature-flags.get.ts +0 -0
@@ -1,8 +1,12 @@
1
1
  <script setup lang="ts">
2
+ import type { ContentLayerConfig } from '#layers/content/app/types/content'
3
+
2
4
  const { slug } = defineProps<{
3
5
  slug: string
4
6
  }>()
5
- const { contentLayer } = useAppConfig()
7
+
8
+ const appConfig = useAppConfig()
9
+ const contentLayer = appConfig.contentLayer as ContentLayerConfig | undefined
6
10
  if (contentLayer?.sections?.gallery === false) {
7
11
  throw createError({ statusCode: 404, statusMessage: 'Not Found' })
8
12
  }
@@ -1,11 +1,14 @@
1
1
  <script setup lang="ts">
2
+ import type { ContentLayerConfig } from '#layers/content/app/types/content'
2
3
  import type { PageCollections } from '@nuxt/content'
3
4
 
4
5
  const { slug, collection = 'portfolio' } = defineProps<{
5
6
  slug: string
6
7
  collection?: keyof PageCollections
7
8
  }>()
8
- const { contentLayer } = useAppConfig()
9
+
10
+ const appConfig = useAppConfig()
11
+ const contentLayer = appConfig.contentLayer as ContentLayerConfig | undefined
9
12
  if (contentLayer?.sections?.portfolio === false) {
10
13
  throw createError({ statusCode: 404, statusMessage: 'Not Found' })
11
14
  }
@@ -8,8 +8,20 @@
8
8
  collection?: keyof Collections
9
9
  }>()
10
10
 
11
- const { useItems } = createPortfolioComposables(collection)
12
- const { data: items, status } = await useItems(options)
11
+ const { featured, tags, limit } = options
12
+ const { data: items, status } = await useCollectionItems(collection, {
13
+ tags,
14
+ limit,
15
+ sortKey: 'year',
16
+ sortDirection: 'desc',
17
+ filter: featured !== undefined ? (item) => fieldFeatured(item) === featured : undefined,
18
+ })
19
+
20
+ function fieldFeatured(item: unknown): boolean {
21
+ return typeof item === 'object' && item !== null && 'featured' in item
22
+ ? Boolean((item as { featured?: boolean }).featured)
23
+ : false
24
+ }
13
25
 
14
26
  // Items may come from any collection — normalize the portfolio-style
15
27
  // metadata so the template works on a single shape
@@ -1,5 +1,8 @@
1
1
  <script setup lang="ts">
2
- const { contentLayer } = useAppConfig()
2
+ import type { ContentLayerConfig } from '#layers/content/app/types/content'
3
+
4
+ const appConfig = useAppConfig()
5
+ const contentLayer = appConfig.contentLayer as ContentLayerConfig | undefined
3
6
  if (contentLayer?.sections?.portfolio === false) {
4
7
  throw createError({ statusCode: 404, statusMessage: 'Not Found' })
5
8
  }
@@ -3,24 +3,11 @@ import type { BlogQueryOptions } from '../types/content'
3
3
  export function useBlogPosts(options: BlogQueryOptions = {}) {
4
4
  const { excludeDrafts = true, tags, limit } = options
5
5
 
6
- const key = `blog-posts:${excludeDrafts}:${(tags ?? []).slice().sort().join(',')}:${limit ?? ''}`
7
- return useContentData(key, async () => {
8
- let posts = (await queryCollection('blog').all()).sort((a, b) =>
9
- (b.date ?? '').localeCompare(a.date ?? '')
10
- )
11
-
12
- if (excludeDrafts) {
13
- posts = posts.filter((post) => !post.draft)
14
- }
15
-
16
- if (tags?.length) {
17
- posts = posts.filter((post) => post.tags?.some((tag: string) => tags.includes(tag)))
18
- }
19
-
20
- if (limit) {
21
- posts = posts.slice(0, limit)
22
- }
23
-
24
- return posts
6
+ return useCollectionItems('blog', {
7
+ tags,
8
+ limit,
9
+ sortKey: 'date',
10
+ sortDirection: 'desc',
11
+ filter: excludeDrafts ? (post) => !('draft' in post && post.draft) : undefined,
25
12
  })
26
13
  }
@@ -0,0 +1,63 @@
1
+ import type { Collections } from '@nuxt/content'
2
+
3
+ type AnyCollectionItem = Collections[keyof Collections]
4
+
5
+ export type CollectionItemsOptions = {
6
+ tags?: string[] | undefined
7
+ limit?: number | undefined
8
+ /** Frontmatter field to sort by (e.g. 'date', 'year'). Duck-typed — missing on an item sorts last. */
9
+ sortKey?: string | undefined
10
+ sortDirection?: 'asc' | 'desc' | undefined
11
+ /** Extra domain-specific predicate (e.g. exclude drafts, require featured). */
12
+ filter?: ((item: AnyCollectionItem) => boolean) | undefined
13
+ }
14
+
15
+ function fieldValue(item: AnyCollectionItem, key: string): unknown {
16
+ return key in item ? (item as unknown as Record<string, unknown>)[key] : undefined
17
+ }
18
+
19
+ function itemTags(item: AnyCollectionItem): string[] {
20
+ return 'tags' in item ? ((item.tags as string[] | undefined) ?? []) : []
21
+ }
22
+
23
+ /**
24
+ * Generic collection list query — sort, filter, limit — shared by
25
+ * `useBlogPosts`, `useGalleryItems`, and `Portfolio/List.vue`'s arbitrary
26
+ * `collection` prop. Single implementation, thin per-domain wrappers.
27
+ */
28
+ export function useCollectionItems<K extends keyof Collections>(
29
+ collectionName: K,
30
+ options: CollectionItemsOptions = {}
31
+ ) {
32
+ const { tags, limit, sortKey, sortDirection = 'desc', filter } = options
33
+ const cacheKey = `${collectionName}-items:${sortKey ?? ''}:${(tags ?? []).slice().sort().join(',')}:${limit ?? ''}`
34
+
35
+ // fallow-ignore-next-line complexity
36
+ return useContentData(cacheKey, async () => {
37
+ let items = (await queryCollection(collectionName).all()) as AnyCollectionItem[]
38
+
39
+ if (sortKey) {
40
+ // fallow-ignore-next-line complexity
41
+ items = items.slice().sort((a, b) => {
42
+ const av = fieldValue(a, sortKey)
43
+ const bv = fieldValue(b, sortKey)
44
+ if (av === bv) return 0
45
+ const cmp = (av ?? '') > (bv ?? '') ? 1 : -1
46
+ return sortDirection === 'desc' ? -cmp : cmp
47
+ })
48
+ }
49
+
50
+ if (filter) items = items.filter(filter)
51
+
52
+ if (tags?.length) {
53
+ items = items.filter((item) => itemTags(item).some((tag) => tags.includes(tag)))
54
+ }
55
+
56
+ if (limit) items = items.slice(0, limit)
57
+
58
+ // Cast back to the specific collection's item type — the sort/filter/tag
59
+ // machinery above is generic across all collections, but callers always
60
+ // know their own `K` and expect e.g. BlogCollectionItem[], not the union.
61
+ return items as unknown as Array<Collections[K]>
62
+ })
63
+ }
@@ -2,21 +2,6 @@ import type { GalleryQueryOptions } from '../types/content'
2
2
 
3
3
  export function useGalleryItems(options: GalleryQueryOptions = {}) {
4
4
  const { tags, limit } = options
5
- const key = `gallery-items:${(tags ?? []).slice().sort().join(',')}:${limit ?? ''}`
6
5
 
7
- return useContentData(key, async () => {
8
- let items = (await queryCollection('gallery').all()).sort((a, b) =>
9
- (b.date ?? '').localeCompare(a.date ?? '')
10
- )
11
-
12
- if (tags?.length) {
13
- items = items.filter((item) => Boolean(item.tags?.some((tag: string) => tags.includes(tag))))
14
- }
15
-
16
- if (limit !== undefined) {
17
- items = items.slice(0, limit)
18
- }
19
-
20
- return items
21
- })
6
+ return useCollectionItems('gallery', { tags, limit, sortKey: 'date', sortDirection: 'desc' })
22
7
  }
@@ -4,6 +4,15 @@ export type ContentAuthor = {
4
4
  avatar?: string
5
5
  } & Author
6
6
 
7
+ export type ContentLayerConfig = {
8
+ name?: string
9
+ sections?: {
10
+ blog?: boolean
11
+ portfolio?: boolean
12
+ gallery?: boolean
13
+ }
14
+ }
15
+
7
16
  export type GalleryImage = {
8
17
  src: string
9
18
  alt: string
@@ -20,5 +20,8 @@
20
20
  "better-sqlite3": "catalog:",
21
21
  "zod": "catalog:conflicts_zod_h4_3_6",
22
22
  "zod-to-json-schema": "catalog:conflicts_zod-to-json-schema_h3_25_1"
23
+ },
24
+ "optionalDependencies": {
25
+ "nuxt-studio": "^1.7.0"
23
26
  }
24
27
  }
@@ -1,4 +1,7 @@
1
- export default {
1
+ import type { NotFoundConfig } from './types/notFound'
2
+ import type { SiteConfig } from './types/site'
3
+
4
+ export default defineAppConfig({
2
5
  coreLayer: {
3
6
  // 404 Page defaults (all optional)
4
7
  notFound: {
@@ -53,21 +56,35 @@ export default {
53
56
  // External error service token/key
54
57
  externalToken: '',
55
58
  },
56
-
57
- // Horizontal scroll guard configuration
58
- scrollGuard: {
59
- // Master toggle - set to false to disable completely
60
- enabled: false,
61
- // CSS selectors for elements allowed to overflow intentionally
62
- excludeSelectors: ['.carousel', '.overflow-intent'],
63
- // Enable automatic clamping of overflowing elements
64
- strict: true,
65
- // Duration (ms) for element width clamp animations
66
- transitionDuration: 200,
67
- // Debounce delay (ms) for resize re-scans
68
- resizeDebounce: 150,
69
- // Temporarily highlight overflowing elements with a red outline
70
- debug: false,
71
- },
72
59
  },
60
+ })
61
+
62
+ declare module '@nuxt/schema' {
63
+ interface AppConfigInput {
64
+ /** Shared site metadata — consumed by feeds, SEO, and any layer needing canonical site info. */
65
+ site?: SiteConfig
66
+ coreLayer?: {
67
+ /** Project name */
68
+ name?: string
69
+
70
+ /** 404 Not Found page configuration */
71
+ notFound?: NotFoundConfig
72
+
73
+ loading?: {
74
+ enabled?: boolean
75
+ minDuration?: number
76
+ maxDuration?: number
77
+ background?: string
78
+ textColor?: string
79
+ zIndex?: number
80
+ }
81
+
82
+ errors?: {
83
+ logToConsole?: boolean
84
+ logToExternal?: boolean
85
+ externalUrl?: string
86
+ externalToken?: string
87
+ }
88
+ }
89
+ }
73
90
  }
@@ -1,5 +1,6 @@
1
1
  <template>
2
2
  <UApp>
3
+ <NuxtLoadingIndicator />
3
4
  <NuxtLayout>
4
5
  <NuxtPage />
5
6
  </NuxtLayout>
@@ -3,6 +3,20 @@
3
3
  and the resulting HMR layout shift on first load. */
4
4
  @custom-variant dark (&:where([data-theme-mode="dark"], [data-theme-mode="dark"] *));
5
5
 
6
+ /* Explicit cascade-layer priority (low -> high). Tailwind's own
7
+ `@import 'tailwindcss'` and `@nuxt/ui` already register into this same
8
+ `theme`/`base`/`components`/`utilities` order internally — this statement
9
+ pins that order explicitly rather than relying on Tailwind/Nuxt UI's own
10
+ internal default, so a future re-ordering of the @import statements below,
11
+ or a change to how Tailwind/Nuxt UI register their layers, can't silently
12
+ change which of these four layers wins over another.
13
+ This only fixes ordering BETWEEN the four named layers — it does NOT
14
+ control precedence WITHIN a layer. base.css registers into `base` and
15
+ layout.css into `components`, the same layers Nuxt UI's own CSS uses;
16
+ between project rules and Nuxt UI rules inside the same layer, plain
17
+ source/import order still decides the winner. */
18
+ @layer theme, base, components, utilities;
19
+
6
20
  @import 'tailwindcss';
7
21
  @import '@nuxt/ui';
8
22
 
@@ -16,10 +30,25 @@
16
30
 
17
31
  @import '#layers/core/app/assets/css/layout.css';
18
32
  @import '#layers/core/app/assets/css/base.css';
33
+ @import '#layers/core/app/assets/css/tokens/breakpoints.css';
34
+ @import '#layers/core/app/assets/css/tokens/spacing-fluid.css';
35
+ @import '#layers/core/app/assets/css/tokens/container.css';
19
36
 
20
37
  /* Relative path, not the '#layers/typography' alias — that alias only exists
21
38
  when the typography layer is in a consumer's `extends`. This file is a CSS
22
39
  import (needed so Tailwind treats it as part of this one build root, see
23
40
  typography.css's header comment), and must resolve even for consumers that
24
41
  only extend core, since it lives in the same single published package. */
25
- @import '../../../../typography/app/assets/css/typography.css';
42
+ @import '../../../../design-system/typography/app/assets/css/typography.css';
43
+
44
+ /* Same relative-path requirement as typography.css above. tokens.css defines
45
+ an `@theme static` block (radius/shadow/duration) — per the CSS
46
+ single-build-root rule, that only merges into Tailwind's theme if Tailwind's
47
+ own PostCSS pipeline actually processes the file via @import from this one
48
+ root. It previously was NOT imported here — only registered as a standalone
49
+ stylesheet via theming/nuxt.config.ts's `css:` array — so its @theme block
50
+ was silently inert: the browser just ignores the unrecognized at-rule, and
51
+ every rounded-, shadow-, duration- utility fell back to Tailwind's stock
52
+ defaults instead of this file's values. Confirmed via compiled dev output:
53
+ the custom --shadow-sm value never appeared; Tailwind's built-in default did. */
54
+ @import '../../../../design-system/theming/app/assets/css/tokens.css';
@@ -1,9 +1,4 @@
1
1
  @layer components {
2
- table {
3
- border-color: inherit;
4
- border-collapse: collapse;
5
- }
6
-
7
2
  th {
8
3
  vertical-align: top;
9
4
  padding: 0;
@@ -20,8 +15,6 @@
20
15
  margin: 1rem 0;
21
16
  border: 0;
22
17
  border-top: 1px solid #ccc;
23
- height: 0;
24
- color: inherit;
25
18
  }
26
19
 
27
20
  img,
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Single source of truth for breakpoint values — matches Tailwind's defaults
3
+ * and layers/visual's BREAKPOINT_VALUES. layers/layout's grid density
4
+ * breakpoints (48rem/80rem, its own tablet/desktop thresholds) are a
5
+ * separate, structural concept and are not repointed here — see
6
+ * nuxt-declarative-layout-system-spec.md §14/§20.
7
+ */
8
+ :root {
9
+ --breakpoint-sm: 40rem; /* 640px */
10
+ --breakpoint-md: 48rem; /* 768px */
11
+ --breakpoint-lg: 64rem; /* 1024px */
12
+ --breakpoint-xl: 80rem; /* 1280px */
13
+ }
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Container size utilities — used by the shared <AppContainer> component
3
+ * (layers/core/app/components/AppContainer.vue).
4
+ */
5
+ .container-content {
6
+ box-sizing: border-box;
7
+ container-type: inline-size;
8
+ margin-inline: auto;
9
+ width: 100%;
10
+ max-width: 65ch;
11
+ }
12
+
13
+ .container-wide {
14
+ box-sizing: border-box;
15
+ container-type: inline-size;
16
+ margin-inline: auto;
17
+ width: 100%;
18
+ max-width: clamp(var(--breakpoint-lg), 85vw, 90rem);
19
+ }
20
+
21
+ .container-fluid {
22
+ box-sizing: border-box;
23
+ container-type: inline-size;
24
+ width: 100%;
25
+ max-width: 100%;
26
+ }
27
+
28
+ .container-full {
29
+ box-sizing: border-box;
30
+ container-type: inline-size;
31
+ margin-inline: calc(var(--grid-padding, clamp(1rem, 2.5vw, 2rem)) * -1);
32
+
33
+ /* Escape parent padding to reach the viewport edge */
34
+ width: 100vw;
35
+ max-width: 100vw;
36
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Fluid spacing scale — clamp() + cqi container-relative variant, same
3
+ * pattern as layers/typography's fluid type scale (see typography.css).
4
+ * Backs the `Spacing` token (layers/core/app/types/tokens.ts) consumed by
5
+ * useLayoutAttrs(). --fluid-space-none is 0, not clamp() — no scaling needed.
6
+ */
7
+ :root {
8
+ --fluid-space-none: 0px;
9
+ --fluid-space-xs: clamp(0.5rem, 0.46rem + 0.2vi, 0.625rem);
10
+ --fluid-space-sm: clamp(0.75rem, 0.7rem + 0.25vi, 1rem);
11
+ --fluid-space-md: clamp(1rem, 0.9rem + 0.5vi, 1.5rem);
12
+ --fluid-space-lg: clamp(1.5rem, 1.3rem + 1vi, 2.5rem);
13
+ --fluid-space-xl: clamp(2rem, 1.7rem + 1.5vi, 3.5rem);
14
+ --fluid-space-2xl: clamp(3rem, 2.4rem + 3vi, 5rem);
15
+ --fluid-space-3xl: clamp(4rem, 3rem + 5vi, 7rem);
16
+
17
+ /* Container-relative counterparts (cqi) — opt-in inside a `container-type` ancestor. */
18
+ --fluid-space-xs-cq: clamp(0.5rem, 0.46rem + 2cqi, 0.625rem);
19
+ --fluid-space-sm-cq: clamp(0.75rem, 0.65rem + 2.5cqi, 1rem);
20
+ --fluid-space-md-cq: clamp(1rem, 0.8rem + 5cqi, 1.5rem);
21
+ --fluid-space-lg-cq: clamp(1.5rem, 1.1rem + 10cqi, 2.5rem);
22
+ --fluid-space-xl-cq: clamp(2rem, 1.4rem + 15cqi, 3.5rem);
23
+ --fluid-space-2xl-cq: clamp(3rem, 2rem + 25cqi, 5rem);
24
+ --fluid-space-3xl-cq: clamp(4rem, 2.5rem + 37.5cqi, 7rem);
25
+ }
@@ -0,0 +1,32 @@
1
+ <script setup lang="ts">
2
+ /**
3
+ * AppContainer — constrained content width wrapper.
4
+ *
5
+ * | size | max-width | use case |
6
+ * |---------|-----------|------------------------------------|
7
+ * | content | 65ch | Long-form prose, articles |
8
+ * | wide | clamp(64rem, 85vw, 90rem) | Cards, media-rich sections |
9
+ * | fluid | 100% | Full bleed within grid padding |
10
+ * | full | 100vw | True full-bleed (escapes padding) |
11
+ */
12
+
13
+ import type { ContainerSize } from '#layers/core/types/tokens'
14
+
15
+ const { size = 'wide', tag = 'div' } = defineProps<{
16
+ size?: ContainerSize
17
+ tag?: string
18
+ }>()
19
+
20
+ const sizeClass: Record<ContainerSize, string> = {
21
+ content: 'container-content',
22
+ wide: 'container-wide',
23
+ fluid: 'container-fluid',
24
+ full: 'container-full',
25
+ }
26
+ </script>
27
+
28
+ <template>
29
+ <component :is="tag" :class="sizeClass[size]">
30
+ <slot />
31
+ </component>
32
+ </template>
@@ -0,0 +1,90 @@
1
+ import { defineComponent, h } from 'vue'
2
+ import { mount } from '@vue/test-utils'
3
+ import { describe, expect, it } from 'vitest'
4
+
5
+ import Element from './Element.vue'
6
+
7
+ // Stands in for a real component (e.g. UBadge) whose own `color` prop is
8
+ // semantic, not a raw CSS value — the same name Element uses for its own
9
+ // raw-CSS text colour passthrough.
10
+ const ColorPropStub = defineComponent({
11
+ props: { color: { type: String, default: undefined } },
12
+ setup(props) {
13
+ return () => h('div', { 'data-received-color': props.color }, 'stub')
14
+ },
15
+ })
16
+
17
+ describe('Element', () => {
18
+ it('renders as a div by default', () => {
19
+ const wrapper = mount(Element)
20
+ expect(wrapper.element.tagName).toBe('DIV')
21
+ })
22
+
23
+ it('renders as the tag passed via the as prop', () => {
24
+ const wrapper = mount(Element, { props: { as: 'section' } })
25
+ expect(wrapper.element.tagName).toBe('SECTION')
26
+ })
27
+
28
+ it('renders slot content', () => {
29
+ const wrapper = mount(Element, { slots: { default: 'hello' } })
30
+ expect(wrapper.text()).toBe('hello')
31
+ })
32
+
33
+ it('merges layout, sizing, and surface styles into one style attribute', () => {
34
+ const wrapper = mount(Element, {
35
+ props: {
36
+ flex: true,
37
+ w: '80px',
38
+ bg: 'var(--ui-bg-elevated)',
39
+ },
40
+ })
41
+ const style = wrapper.attributes('style') ?? ''
42
+ expect(style).toContain('display: flex')
43
+ expect(style).toContain('width: 80px')
44
+ expect(style).toContain('background: var(--ui-bg-elevated)')
45
+ })
46
+
47
+ it('applies container-axis grid styles', () => {
48
+ const wrapper = mount(Element, {
49
+ props: { grid: true, cols: 12 },
50
+ })
51
+ const style = wrapper.attributes('style') ?? ''
52
+ expect(style).toContain('display: grid')
53
+ expect(style).toContain('grid-template-columns: repeat(12, 1fr)')
54
+ expect(style).not.toContain('grid-column')
55
+ expect(style).not.toContain('grid-row')
56
+ })
57
+
58
+ it('gives hidden priority over grid so display: none is not overwritten', () => {
59
+ const wrapper = mount(Element, {
60
+ props: { grid: true, hidden: true },
61
+ })
62
+ const style = wrapper.attributes('style') ?? ''
63
+ expect(style).toContain('display: none')
64
+ expect(style).not.toContain('display: grid')
65
+ })
66
+
67
+ it('reaches margin and padding through useLayoutAttrs', () => {
68
+ const wrapper = mount(Element, {
69
+ props: { m: 'md', p: 'lg' },
70
+ })
71
+ const style = wrapper.attributes('style') ?? ''
72
+ expect(style).toContain('margin: var(--fluid-space-md)')
73
+ expect(style).toContain('padding: var(--fluid-space-lg)')
74
+ })
75
+
76
+ it('passes componentProps to the resolved component, past a colliding prop name', () => {
77
+ const wrapper = mount(Element, {
78
+ props: {
79
+ as: ColorPropStub,
80
+ color: 'crimson',
81
+ componentProps: { color: 'error' },
82
+ },
83
+ })
84
+ // Element's own `color` still resolves to raw CSS text colour...
85
+ expect(wrapper.attributes('style') ?? '').toContain('color: crimson')
86
+ // ...while the stub's semantic `color` prop comes from componentProps, not
87
+ // from Element's own `color`.
88
+ expect(wrapper.attributes('data-received-color')).toBe('error')
89
+ })
90
+ })
@@ -0,0 +1,78 @@
1
+ <script setup lang="ts">
2
+ import { useElementStyle } from '../composables/useElementStyle'
3
+ import type { ElementProps } from '../types/element'
4
+
5
+ const {
6
+ as = 'div',
7
+ componentProps,
8
+ block,
9
+ flex,
10
+ grid: gridMode,
11
+ hidden,
12
+ cols,
13
+ rows,
14
+ gap,
15
+ align,
16
+ justify,
17
+ p,
18
+ px,
19
+ py,
20
+ m,
21
+ mx,
22
+ my,
23
+ w,
24
+ h,
25
+ minW,
26
+ maxW,
27
+ minH,
28
+ maxH,
29
+ aspect,
30
+ bg,
31
+ color,
32
+ border,
33
+ radius,
34
+ shadow,
35
+ cursor,
36
+ select,
37
+ pointer,
38
+ } = defineProps<ElementProps>()
39
+
40
+ const style = useElementStyle(() => ({
41
+ block,
42
+ flex,
43
+ grid: gridMode,
44
+ hidden,
45
+ cols,
46
+ rows,
47
+ gap,
48
+ align,
49
+ justify,
50
+ p,
51
+ px,
52
+ py,
53
+ m,
54
+ mx,
55
+ my,
56
+ w,
57
+ h,
58
+ minW,
59
+ maxW,
60
+ minH,
61
+ maxH,
62
+ aspect,
63
+ bg,
64
+ color,
65
+ border,
66
+ radius,
67
+ shadow,
68
+ cursor,
69
+ select,
70
+ pointer,
71
+ }))
72
+ </script>
73
+
74
+ <template>
75
+ <component :is="as" v-bind="componentProps" :style>
76
+ <slot />
77
+ </component>
78
+ </template>