kmcom-nuxt-layers 1.6.18 → 1.6.21

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 (60) hide show
  1. package/layers/content/app/components/Blog/Article.vue +9 -5
  2. package/layers/content/app/components/Blog/Card.vue +11 -8
  3. package/layers/content/app/components/Blog/List.vue +12 -11
  4. package/layers/content/app/components/Gallery/Card.vue +6 -1
  5. package/layers/content/app/components/Gallery/Detail.vue +10 -6
  6. package/layers/content/app/components/Gallery/ImageDetail.vue +9 -3
  7. package/layers/content/app/components/NuxtContent/Detail.vue +7 -3
  8. package/layers/content/app/components/NuxtContent/Toc.vue +3 -1
  9. package/layers/content/app/components/Portfolio/Card.vue +5 -1
  10. package/layers/content/app/components/Portfolio/Detail.vue +32 -11
  11. package/layers/content/app/components/Portfolio/List.vue +4 -2
  12. package/layers/content/app/composables/useCollectionItem.ts +3 -1
  13. package/layers/content/app/composables/useCollectionSurround.ts +4 -6
  14. package/layers/content/app/types/content.ts +1 -1
  15. package/layers/content/package.json +1 -0
  16. package/layers/core/app/app.vue +1 -0
  17. package/layers/core/app/composables/useCache.ts +7 -8
  18. package/layers/core/app/composables/useScrollGuard.ts +0 -12
  19. package/layers/core/app/plugins/init.ts +4 -3
  20. package/layers/core/package.json +1 -0
  21. package/layers/core/tsconfig.json +2 -1
  22. package/layers/forms/app/components/Form/Contact.vue +1 -5
  23. package/layers/forms/app/components/Form/Field.vue +34 -22
  24. package/layers/forms/package.json +1 -0
  25. package/layers/layout/app/components/Layout/Page/Container.vue +7 -1
  26. package/layers/layout/app/components/Layout/Page/index.vue +4 -1
  27. package/layers/layout/package.json +1 -0
  28. package/layers/motion/app/components/Motion/Marquee.vue +12 -16
  29. package/layers/motion/app/components/Motion/Parallax.vue +1 -1
  30. package/layers/motion/app/components/Motion/Staggered.vue +1 -1
  31. package/layers/motion/app/components/Motion/Transition.vue +0 -13
  32. package/layers/motion/app/composables/useSmoothScroll.ts +1 -1
  33. package/layers/motion/package.json +1 -0
  34. package/layers/routing/app/middleware/02.governance.global.ts +2 -0
  35. package/layers/routing/app/plugins/feature-flags.client.ts +1 -0
  36. package/layers/routing/nuxt.config.ts +8 -4
  37. package/layers/routing/package.json +4 -1
  38. package/layers/shader/app/composables/useShader.ts +1 -1
  39. package/layers/shader/app/utils/tsl/noise.ts +0 -5
  40. package/layers/shader/nuxt.config.ts +1 -1
  41. package/layers/shader/package.json +3 -0
  42. package/layers/theme/package.json +1 -0
  43. package/layers/ui/app/app.config.ts +37 -6
  44. package/layers/ui/app/components/Accent/Scene.vue +14 -1
  45. package/layers/ui/app/components/Mast/NavModal.vue +3 -2
  46. package/layers/ui/app/components/Progress/Bar.vue +11 -1
  47. package/layers/ui/app/components/Typography/CodeBlock.vue +5 -4
  48. package/layers/ui/app/components/Typography/Headline.vue +11 -3
  49. package/layers/ui/app/components/Typography/QuoteBlock.vue +5 -1
  50. package/layers/ui/app/components/Typography/TextStroke.vue +0 -2
  51. package/layers/ui/app/components/Typography/index.vue +1 -1
  52. package/layers/ui/app/composables/gradient.ts +1 -1
  53. package/layers/ui/app/composables/mastNav.ts +0 -1
  54. package/layers/ui/app/composables/toast.ts +4 -4
  55. package/layers/ui/app/composables/useSite.ts +6 -6
  56. package/layers/ui/app/types/accent.ts +1 -1
  57. package/layers/ui/app/types/app-config.d.ts +5 -0
  58. package/layers/ui/app/utils/createModal.ts +4 -4
  59. package/layers/ui/package.json +1 -0
  60. package/package.json +8 -8
@@ -142,12 +142,16 @@ function handleMouseLeave() {
142
142
  <template>
143
143
  <div
144
144
  ref="containerRef"
145
- class="motion-marquee"
145
+ class="motion-marquee width-full overflow-hidden"
146
146
  :class="{ 'is-paused': isPaused }"
147
147
  @mouseenter="handleMouseEnter"
148
148
  @mouseleave="handleMouseLeave"
149
149
  >
150
- <div ref="contentRef" class="motion-marquee__content" :style="{ gap }">
150
+ <div
151
+ ref="contentRef"
152
+ class="motion-marquee__content flex will-change-transform w-max"
153
+ :style="{ gap }"
154
+ >
151
155
  <slot />
152
156
  <!-- Duplicate for seamless loop -->
153
157
  <slot />
@@ -155,17 +159,9 @@ function handleMouseLeave() {
155
159
  </div>
156
160
  </template>
157
161
 
158
- <style scoped>
159
- .motion-marquee {
160
- width: 100%;
161
- overflow: hidden;
162
- }
163
-
164
- /* stylelint-disable-next-line selector-class-pattern */
165
- .motion-marquee__content {
166
- display: flex;
167
- will-change: transform;
168
- /* stylelint-disable-next-line plugin/no-unsupported-browser-features */
169
- width: max-content;
170
- }
171
- </style>
162
+ <!-- <style scoped>
163
+ /* .motion-marquee { width: 100%; overflow: hidden; } */ /* stylelint-disable-next-line
164
+ selector-class-pattern */ /* .motion-marquee__content { */ /* display: flex; */ /* will-change:
165
+ transform; */ /* stylelint-disable-next-line plugin/no-unsupported-browser-features */ /* width:
166
+ max-content; */ /* } */
167
+ </style> -->
@@ -36,7 +36,7 @@ const props = withDefaults(
36
36
  }
37
37
  )
38
38
 
39
- const { gsap, ScrollTrigger } = useGsap()
39
+ const { gsap } = useGsap()
40
40
 
41
41
  const containerRef = ref<HTMLElement | null>(null)
42
42
  const contentRef = ref<HTMLElement | null>(null)
@@ -50,7 +50,7 @@ onMounted(() => {
50
50
  <template>
51
51
  <div class="motion-staggered">
52
52
  <slot
53
- v-for="(item, index) in slots.default?.()"
53
+ v-for="(_, index) in slots.default?.()"
54
54
  :key="index"
55
55
  :ref="(el: HTMLElement | null) => setItemRef(el, index)"
56
56
  :class="{ animated: animatedItems[index] }"
@@ -43,20 +43,7 @@ onMounted(() => {
43
43
  }, 50)
44
44
  })
45
45
 
46
- // Methods
47
- const enter = (el: Element) => {
48
- // Handle enter transition
49
- ;(el as HTMLElement).style.opacity = '0'
50
- setTimeout(() => {
51
- ;(el as HTMLElement).style.opacity = '1'
52
- }, 10)
53
- }
54
46
 
55
- const leave = (el: Element, done: () => void) => {
56
- // Handle leave transition
57
- ;(el as HTMLElement).style.opacity = '0'
58
- setTimeout(done, props.duration)
59
- }
60
47
  </script>
61
48
 
62
49
  <template>
@@ -81,7 +81,7 @@ export function useSmoothScroll() {
81
81
  duration: options?.duration ?? 1.2,
82
82
  immediate: options?.immediate ?? false,
83
83
  lock: options?.lock ?? false,
84
- onComplete: options?.onComplete,
84
+ ...(options?.onComplete !== undefined && { onComplete: options.onComplete }),
85
85
  })
86
86
  } else {
87
87
  // Native fallback
@@ -4,6 +4,7 @@
4
4
  "type": "module",
5
5
  "main": "./nuxt.config.ts",
6
6
  "scripts": {
7
+ "typecheck": "vue-tsc --noEmit -p ../../tsconfig.typecheck.json",
7
8
  "dev": "nuxi dev .playground",
8
9
  "dev:prepare": "nuxt prepare .playground",
9
10
  "build": "nuxt build .playground",
@@ -1,3 +1,5 @@
1
+ import { useFeatures } from '../composables/useFeatures'
2
+
1
3
  export default defineNuxtRouteMiddleware((to) => {
2
4
  const { config, isStrictMode, isLayerDefaultDeny } = useRoutingConfig()
3
5
  const { resolve } = useFeatures()
@@ -1,4 +1,5 @@
1
1
  import type { FeatureValue } from '../types/routing'
2
+ import { useFeatures } from '../composables/useFeatures'
2
3
 
3
4
  export default defineNuxtPlugin(async () => {
4
5
  const { config } = useRoutingConfig()
@@ -1,4 +1,8 @@
1
- import type { NuxtPage } from '@nuxt/schema'
1
+ interface RoutePage {
2
+ file?: string
3
+ meta?: Record<string, unknown>
4
+ children?: RoutePage[]
5
+ }
2
6
 
3
7
  export default defineNuxtConfig({
4
8
  $meta: { name: 'routing' },
@@ -10,9 +14,9 @@ export default defineNuxtConfig({
10
14
  compatibilityDate: '2026-01-30',
11
15
 
12
16
  hooks: {
13
- 'pages:extend'(pages) {
17
+ 'pages:extend'(pages: unknown[]) {
14
18
  const cwd = process.cwd()
15
- const tag = (list: NuxtPage[]) => {
19
+ const tag = (list: RoutePage[]) => {
16
20
  for (const page of list) {
17
21
  if (page.file && !page.file.startsWith(cwd)) {
18
22
  page.meta ??= {}
@@ -21,7 +25,7 @@ export default defineNuxtConfig({
21
25
  if (page.children) tag(page.children)
22
26
  }
23
27
  }
24
- tag(pages)
28
+ tag(pages as unknown as RoutePage[])
25
29
  },
26
30
  },
27
31
  })
@@ -2,5 +2,8 @@
2
2
  "name": "@layers/routing",
3
3
  "version": "0.1.0",
4
4
  "type": "module",
5
- "main": "./nuxt.config.ts"
5
+ "main": "./nuxt.config.ts",
6
+ "scripts": {
7
+ "typecheck": "vue-tsc --noEmit -p ../../tsconfig.typecheck.json"
8
+ }
6
9
  }
@@ -143,6 +143,6 @@ export function useBasicShader(
143
143
  export function useStandardShader(config?: NodeMaterialConfig) {
144
144
  return useShader({
145
145
  type: 'standard',
146
- config,
146
+ ...(config !== undefined && { config }),
147
147
  })
148
148
  }
@@ -4,11 +4,6 @@ import type { FBMOptions, TSLNode } from '../../types'
4
4
  /**
5
5
  * Hash function for noise generation
6
6
  */
7
- const hash21 = Fn(([p]: [TSLNode]) => {
8
- const p3 = fract(p.mul(vec2(443.8975, 397.2973)))
9
- const shifted = p3.add(dot(p3, p3.add(19.19)))
10
- return fract(shifted.x.mul(shifted.y))
11
- })
12
7
 
13
8
  const hash22 = Fn(([p]: [TSLNode]) => {
14
9
  const p3 = fract(p.mul(vec2(443.8975, 397.2973)))
@@ -76,7 +76,7 @@ export default {}
76
76
  return {
77
77
  name: 'three-webgpu-ssr-stub',
78
78
  enforce: 'pre',
79
- transform(code, id, options) {
79
+ transform(_code, id, options) {
80
80
  // Only intercept in SSR context
81
81
  if (!options?.ssr) return null
82
82
  // In three r182+, three/webgpu → three.webgpu.js, three/tsl → three.tsl.js
@@ -3,6 +3,9 @@
3
3
  "version": "0.0.1",
4
4
  "type": "module",
5
5
  "main": "./nuxt.config.ts",
6
+ "scripts": {
7
+ "typecheck": "vue-tsc --noEmit -p ../../tsconfig.typecheck.json"
8
+ },
6
9
  "dependencies": {
7
10
  "@tresjs/cientos": "^5.2.5",
8
11
  "@tresjs/core": "^5.3.3",
@@ -4,6 +4,7 @@
4
4
  "type": "module",
5
5
  "main": "./nuxt.config.ts",
6
6
  "scripts": {
7
+ "typecheck": "vue-tsc --noEmit -p ../../tsconfig.typecheck.json",
7
8
  "dev": "nuxi dev .playground",
8
9
  "dev:prepare": "nuxt prepare .playground",
9
10
  "build": "nuxt build .playground",
@@ -1,13 +1,44 @@
1
- export default {
1
+ type MastNavLink = {
2
+ id: string
3
+ label: string
4
+ to:
5
+ | string
6
+ | {
7
+ name: string
8
+ params?: Record<string, string | number>
9
+ query?: Record<string, string | number>
10
+ }
11
+ }
12
+
13
+ export default defineAppConfig({
14
+ site: {
15
+ title: '',
16
+ subtitle: '',
17
+ description: '',
18
+ },
2
19
  mastNav: {
3
- links: [],
20
+ links: [] as MastNavLink[],
4
21
  scrollBehaviour: 'router',
5
22
  },
6
23
  uiLayer: {
7
24
  gradients: {
8
- brand: { shape: 'linear', direction: 'to-br', from: { color: 'primary', shade: 500 }, to: { color: 'secondary', shade: 600 } },
9
- subtle: { shape: 'linear', direction: 'to-b', from: { color: 'primary', shade: 100, opacity: 50 }, to: { color: 'transparent' } },
10
- hero: { shape: 'radial', from: { color: 'primary', shade: 400, opacity: 40 }, to: { color: 'transparent' } },
25
+ brand: {
26
+ shape: 'linear',
27
+ direction: 'to-br',
28
+ from: { color: 'primary', shade: 500 },
29
+ to: { color: 'secondary', shade: 600 },
30
+ },
31
+ subtle: {
32
+ shape: 'linear',
33
+ direction: 'to-b',
34
+ from: { color: 'primary', shade: 100, opacity: 50 },
35
+ to: { color: 'transparent' },
36
+ },
37
+ hero: {
38
+ shape: 'radial',
39
+ from: { color: 'primary', shade: 400, opacity: 40 },
40
+ to: { color: 'transparent' },
41
+ },
11
42
  },
12
43
  accentScenes: {
13
44
  hero: {
@@ -35,4 +66,4 @@ export default {
35
66
  },
36
67
  },
37
68
  },
38
- }
69
+ })
@@ -29,7 +29,20 @@ const resolvedBlobs = computed((): BlobConfig[] => {
29
29
  <template>
30
30
  <component :is="tag" class="relative overflow-clip isolate">
31
31
  <div class="absolute inset-0 pointer-events-none" aria-hidden="true">
32
- <AccentBlob v-for="(blob, i) in resolvedBlobs" :key="i" v-bind="blob" />
32
+ <AccentBlob
33
+ v-for="(blob, i) in resolvedBlobs"
34
+ :key="i"
35
+ :x="blob.x"
36
+ :y="blob.y"
37
+ v-bind="{
38
+ ...(blob.size !== undefined && { size: blob.size }),
39
+ ...(blob.blur !== undefined && { blur: blob.blur }),
40
+ ...(blob.opacity !== undefined && { opacity: blob.opacity }),
41
+ ...(blob.color !== undefined && { color: blob.color }),
42
+ ...(blob.shade !== undefined && { shade: blob.shade }),
43
+ ...(blob.customColor !== undefined && { customColor: blob.customColor }),
44
+ }"
45
+ />
33
46
  </div>
34
47
  <div class="relative z-10">
35
48
  <slot />
@@ -5,7 +5,8 @@ const emit = defineEmits<{
5
5
  'close': []
6
6
  }>()
7
7
 
8
- const { links, scrollBehaviour } = useAppConfig().mastNav
8
+ type NavLink = { id: string; label: string; to: string | { name: string; params?: Record<string, string | number>; query?: Record<string, string | number> } }
9
+ const { links, scrollBehaviour } = useAppConfig().mastNav as { links: NavLink[]; scrollBehaviour: string }
9
10
  const activeSection = useState<string>('activeSection', () => '')
10
11
  const route = useRoute()
11
12
  const { close: closeNav } = useMastNav()
@@ -16,7 +17,7 @@ function dismiss() {
16
17
  closeNav()
17
18
  }
18
19
 
19
- function handleNav(link: { id: string; to: string | { name: string; params?: Record<string, unknown>; query?: Record<string, unknown> } }) {
20
+ function handleNav(link: NavLink) {
20
21
  if (scrollBehaviour === 'smooth-scroll' && route.name === 'index') {
21
22
  try { useSmoothScroll().scrollTo(`#${link.id}`) }
22
23
  catch {}
@@ -18,8 +18,18 @@ const {
18
18
  }>()
19
19
 
20
20
  const modelValue = computed(() => (progress != null ? progress * 100 : undefined))
21
+
22
+ const progressProps = computed(() => ({
23
+ ...(modelValue.value !== undefined && { modelValue: modelValue.value }),
24
+ ...(color !== undefined && { color: color as 'primary' | 'neutral' }),
25
+ ...(size !== undefined && { size }),
26
+ ...(orientation !== undefined && { orientation }),
27
+ ...(status !== undefined && { status }),
28
+ ...(animation !== undefined && { animation }),
29
+ ...(inverted !== undefined && { inverted }),
30
+ }))
21
31
  </script>
22
32
 
23
33
  <template>
24
- <UProgress :model-value="modelValue" :color :size :orientation :status :animation :inverted />
34
+ <UProgress v-bind="progressProps" />
25
35
  </template>
@@ -13,7 +13,6 @@ const props = withDefaults(
13
13
  class?: string
14
14
  }>(),
15
15
  {
16
- language: undefined,
17
16
  class: '',
18
17
  color: 'default',
19
18
  }
@@ -24,11 +23,13 @@ const colorClass = useColor(props.color, 'text')
24
23
  <template>
25
24
  <Typography
26
25
  tag="pre"
27
- v-bind="$attrs"
28
- :size="props.size"
26
+ v-bind="{
27
+ ...$attrs,
28
+ ...(props.size !== undefined && { size: props.size }),
29
+ ...(props.language !== undefined && { 'data-language': props.language }),
30
+ }"
29
31
  class="overflow-x-auto"
30
32
  :class="[props.class]"
31
- :data-language="props.language"
32
33
  >
33
34
  <Typography
34
35
  tag="code"
@@ -57,7 +57,16 @@ const sizeClass = computed(() => {
57
57
  return sizes[props.level]
58
58
  })
59
59
 
60
- const { classes } = useTypography(props)
60
+ const { classes } = useTypography({
61
+ weight: props.weight,
62
+ width: props.width,
63
+ slant: props.slant,
64
+ leading: props.leading,
65
+ tracking: props.tracking,
66
+ align: props.align,
67
+ transform: props.transform,
68
+ ...(props.size !== undefined && { size: props.size }),
69
+ })
61
70
  const colorClass = useColor(props.color, 'text')
62
71
  </script>
63
72
 
@@ -71,9 +80,8 @@ const colorClass = useColor(props.color, 'text')
71
80
  :tracking="props.tracking"
72
81
  :align="props.align"
73
82
  :transform="props.transform"
74
- :size="props.size"
75
83
  :class="[sizeClass, classes, colorClass, props.class]"
76
- v-bind="$attrs"
84
+ v-bind="{ ...(props.size !== undefined && { size: props.size }), ...$attrs }"
77
85
  >
78
86
  <slot />
79
87
  </Typography>
@@ -10,7 +10,11 @@ const colorClass = useColor(props.color, 'text')
10
10
  </script>
11
11
 
12
12
  <template>
13
- <Typography tag="blockquote" :size="props.size" :class="colorClass" v-bind="$attrs">
13
+ <Typography
14
+ tag="blockquote"
15
+ :class="colorClass"
16
+ v-bind="{ ...(props.size !== undefined && { size: props.size }), ...$attrs }"
17
+ >
14
18
  <slot />
15
19
  </Typography>
16
20
  </template>
@@ -1,6 +1,4 @@
1
1
  <script lang="ts" setup>
2
- import { usePreferredContrast } from '@vueuse/core'
3
-
4
2
  const id = useId()
5
3
  const contrast = usePreferredContrast()
6
4
 
@@ -32,7 +32,7 @@ const props = withDefaults(
32
32
  {
33
33
  tag: 'p',
34
34
  weight: 'font-normal',
35
- width: 'normal',
35
+ width: 'font-stretch-normal',
36
36
  slant: 'normal',
37
37
  leading: 'leading-normal',
38
38
  tracking: 'tracking-normal',
@@ -60,7 +60,7 @@ export function useGradient(
60
60
 
61
61
  let resolved: GradientConfig
62
62
  if (typeof raw === 'string') {
63
- const preset = (appConfig.uiLayer as Record<string, unknown> | undefined)?.gradients as
63
+ const preset = (appConfig.uiLayer as Record<string, unknown> | undefined)?.['gradients'] as
64
64
  | Record<string, GradientConfig>
65
65
  | undefined
66
66
  resolved = preset?.[raw] ?? DEFAULT_CONFIG
@@ -1,4 +1,3 @@
1
- import { createSharedComposable } from '@vueuse/core'
2
1
  import MastNavModal from '../components/Mast/NavModal.vue'
3
2
 
4
3
  function _useMastNav() {
@@ -8,15 +8,15 @@ export function useAppToast() {
8
8
 
9
9
  return {
10
10
  success: (title: string, opts?: ToastOptions) =>
11
- toast.add({ title, icon: 'lucide:check-circle', color: 'success', ...opts }),
11
+ toast.add({ title, icon: 'lucide:check-circle', color: 'success' as 'primary', ...opts }),
12
12
 
13
13
  error: (title: string, opts?: ToastOptions) =>
14
- toast.add({ title, icon: 'lucide:x-circle', color: 'error', ...opts }),
14
+ toast.add({ title, icon: 'lucide:x-circle', color: 'error' as 'primary', ...opts }),
15
15
 
16
16
  info: (title: string, opts?: ToastOptions) =>
17
- toast.add({ title, icon: 'lucide:info', color: 'info', ...opts }),
17
+ toast.add({ title, icon: 'lucide:info', color: 'info' as 'primary', ...opts }),
18
18
 
19
19
  warning: (title: string, opts?: ToastOptions) =>
20
- toast.add({ title, icon: 'lucide:triangle-alert', color: 'warning', ...opts }),
20
+ toast.add({ title, icon: 'lucide:triangle-alert', color: 'warning' as 'primary', ...opts }),
21
21
  }
22
22
  }
@@ -1,13 +1,13 @@
1
1
  import { splitSpaces } from '../utils/regex'
2
2
 
3
3
  export function useSite() {
4
- const config = useAppConfig().site
4
+ const config = useAppConfig().site ?? {}
5
5
 
6
6
  return {
7
- title: config.title as string,
8
- titleWords: splitSpaces(config.title as string) as string[],
9
- subtitle: config.subtitle as string,
10
- subtitleWords: splitSpaces(config.subtitle as string) as string[],
11
- description: config.description as string,
7
+ title: (config.title ?? '') as string,
8
+ titleWords: splitSpaces((config.title ?? '') as string) as string[],
9
+ subtitle: (config.subtitle ?? '') as string,
10
+ subtitleWords: splitSpaces((config.subtitle ?? '') as string) as string[],
11
+ description: (config.description ?? '') as string,
12
12
  }
13
13
  }
@@ -9,7 +9,7 @@ export interface BlobConfig {
9
9
  opacity?: number
10
10
  color?: AccentBlobColor
11
11
  shade?: 50 | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 | 950
12
- customColor?: string
12
+ customColor?: string | undefined
13
13
  }
14
14
 
15
15
  export interface AccentSceneConfig {
@@ -1,5 +1,10 @@
1
1
  declare module '@nuxt/schema' {
2
2
  interface AppConfigInput {
3
+ site?: {
4
+ title?: string
5
+ subtitle?: string
6
+ description?: string
7
+ }
3
8
  mastNav?: {
4
9
  links?: Array<{
5
10
  id: string
@@ -1,4 +1,3 @@
1
- import { createSharedComposable } from '@vueuse/core'
2
1
  import type { Component } from 'vue'
3
2
 
4
3
  /**
@@ -24,11 +23,12 @@ export function createModal<P extends Record<string, unknown>>(component: Compon
24
23
  if (import.meta.server) return { open: () => {}, close: () => {}, patch: () => {} }
25
24
 
26
25
  const overlay = useOverlay()
27
- const modal = overlay.create<P>(component)
26
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
27
+ const modal = overlay.create(component as any)
28
28
  return {
29
- open: (props?: Partial<P>) => modal.open(props),
29
+ open: (props?: Partial<P>) => modal.open(props as never),
30
30
  close: () => modal.close(),
31
- patch: (props: Partial<P>) => modal.patch(props),
31
+ patch: (props: Partial<P>) => modal.patch(props as never),
32
32
  }
33
33
  })
34
34
  }
@@ -4,6 +4,7 @@
4
4
  "version": "0.0.1",
5
5
  "main": "./nuxt.config.ts",
6
6
  "scripts": {
7
+ "typecheck": "vue-tsc --noEmit -p ../../tsconfig.typecheck.json",
7
8
  "dev": "nuxi dev .playground",
8
9
  "dev:ui": "UI_STANDALONE=true nuxi dev",
9
10
  "dev:prepare": "nuxt prepare .playground",
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "kmcom-nuxt-layers",
3
3
  "private": false,
4
- "version": "1.6.18",
4
+ "version": "1.6.21",
5
5
  "description": "Composable Nuxt 4 layers for building scalable Vue applications",
6
6
  "files": [
7
7
  "layers/*/nuxt.config.ts",
@@ -41,7 +41,7 @@
41
41
  "tailwindcss": "^4.2.4",
42
42
  "three": "^0.183.2",
43
43
  "v-gsap-nuxt": ">=1.0.0",
44
- "zod": "^4.3.6"
44
+ "zod": "^4.4.3"
45
45
  },
46
46
  "peerDependenciesMeta": {
47
47
  "@nuxtjs/device": {
@@ -107,8 +107,8 @@
107
107
  "@perplex-digital/stylelint-config": "^17.4.0",
108
108
  "@pinia/nuxt": "^0.11.3",
109
109
  "@types/node": "^25.6.0",
110
- "@typescript-eslint/eslint-plugin": "^8.59.1",
111
- "@typescript-eslint/parser": "^8.59.1",
110
+ "@typescript-eslint/eslint-plugin": "^8.59.2",
111
+ "@typescript-eslint/parser": "^8.59.2",
112
112
  "@vue/eslint-config-typescript": "^14.7.0",
113
113
  "@vueuse/core": "^14.3.0",
114
114
  "@vueuse/nuxt": "^14.3.0",
@@ -124,7 +124,7 @@
124
124
  "eslint-plugin-prettier": "^5.5.5",
125
125
  "eslint-plugin-unicorn": "^64.0.0",
126
126
  "eslint-plugin-unused-imports": "^4.4.1",
127
- "eslint-plugin-vue": "^10.9.0",
127
+ "eslint-plugin-vue": "^10.9.1",
128
128
  "npm-check-updates": "^21.0.3",
129
129
  "nuxt": "latest",
130
130
  "pinia": "^3.0.4",
@@ -144,14 +144,14 @@
144
144
  "stylelint-no-unsupported-browser-features": "^8.1.1",
145
145
  "stylelint-prettier": "^5.0.3",
146
146
  "tailwindcss": "^4.2.4",
147
- "turbo": "^2.9.8",
147
+ "turbo": "^2.9.9",
148
148
  "typescript": "^6.0.3",
149
149
  "vite-plugin-checker": "^0.13.0",
150
150
  "vitest": "^4.1.5",
151
151
  "vue": "latest",
152
152
  "vue-tsc": "^3.2.8",
153
- "zod": "^4.3.6",
154
- "zod-to-json-schema": "^3.25.1"
153
+ "zod": "^4.4.3",
154
+ "zod-to-json-schema": "^3.25.2"
155
155
  },
156
156
  "browserslist": [
157
157
  "last 2 Chrome major versions",