nuxt-hero 0.1.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 (48) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +212 -0
  3. package/dist/module.d.mts +19 -0
  4. package/dist/module.json +12 -0
  5. package/dist/module.mjs +322 -0
  6. package/dist/runtime/assets/hero.css +1 -0
  7. package/dist/runtime/components/navigation/HeroNavigation.d.vue.ts +18 -0
  8. package/dist/runtime/components/navigation/HeroNavigation.vue +68 -0
  9. package/dist/runtime/components/navigation/HeroNavigation.vue.d.ts +18 -0
  10. package/dist/runtime/components/navigation/HeroPagination.d.vue.ts +22 -0
  11. package/dist/runtime/components/navigation/HeroPagination.vue +50 -0
  12. package/dist/runtime/components/navigation/HeroPagination.vue.d.ts +22 -0
  13. package/dist/runtime/components/slider/HeroSlide.d.vue.ts +66 -0
  14. package/dist/runtime/components/slider/HeroSlide.vue +124 -0
  15. package/dist/runtime/components/slider/HeroSlide.vue.d.ts +66 -0
  16. package/dist/runtime/components/slider/index.d.vue.ts +69 -0
  17. package/dist/runtime/components/slider/index.vue +200 -0
  18. package/dist/runtime/components/slider/index.vue.d.ts +69 -0
  19. package/dist/runtime/components/video/HeroSlideVideo.d.vue.ts +39 -0
  20. package/dist/runtime/components/video/HeroSlideVideo.vue +116 -0
  21. package/dist/runtime/components/video/HeroSlideVideo.vue.d.ts +39 -0
  22. package/dist/runtime/components/video/HeroVideoControls.d.vue.ts +12 -0
  23. package/dist/runtime/components/video/HeroVideoControls.vue +87 -0
  24. package/dist/runtime/components/video/HeroVideoControls.vue.d.ts +12 -0
  25. package/dist/runtime/components/video/HeroVideoScrubber.d.vue.ts +64 -0
  26. package/dist/runtime/components/video/HeroVideoScrubber.vue +50 -0
  27. package/dist/runtime/components/video/HeroVideoScrubber.vue.d.ts +64 -0
  28. package/dist/runtime/composables/_autoplay.d.ts +25 -0
  29. package/dist/runtime/composables/_autoplay.js +72 -0
  30. package/dist/runtime/composables/_gsap.d.ts +60 -0
  31. package/dist/runtime/composables/_gsap.js +135 -0
  32. package/dist/runtime/composables/_hls.d.ts +35 -0
  33. package/dist/runtime/composables/_hls.js +88 -0
  34. package/dist/runtime/composables/_slides.d.ts +26 -0
  35. package/dist/runtime/composables/_slides.js +40 -0
  36. package/dist/runtime/composables/_swiper.d.ts +23 -0
  37. package/dist/runtime/composables/_swiper.js +52 -0
  38. package/dist/runtime/composables/_video.d.ts +30 -0
  39. package/dist/runtime/composables/_video.js +89 -0
  40. package/dist/runtime/composables/useHeroSlider.d.ts +24 -0
  41. package/dist/runtime/composables/useHeroSlider.js +131 -0
  42. package/dist/runtime/hero-swiper-modules.d.ts +4 -0
  43. package/dist/runtime/types.d.ts +221 -0
  44. package/dist/runtime/types.js +0 -0
  45. package/dist/runtime/utils.d.ts +22 -0
  46. package/dist/runtime/utils.js +50 -0
  47. package/dist/types.d.mts +9 -0
  48. package/package.json +94 -0
@@ -0,0 +1,131 @@
1
+ import { computed, toValue, watch } from "vue";
2
+ import { useElementHover } from "@vueuse/core";
3
+ import { createSwiperState } from "./_swiper.js";
4
+ import { createSlideState } from "./_slides.js";
5
+ import { createAutoplayState } from "./_autoplay.js";
6
+ import { createVideoState } from "./_video.js";
7
+ function resolveElement(source) {
8
+ const raw = toValue(source);
9
+ if (!raw) return null;
10
+ if (raw.$el) return raw.$el;
11
+ if (raw instanceof HTMLElement) return raw;
12
+ return null;
13
+ }
14
+ export function useHeroSlider(containerRef, slides, options = {}) {
15
+ const {
16
+ swiperOptions = {},
17
+ enterAnimation = "",
18
+ leaveAnimation = "",
19
+ showPagination,
20
+ showNavigation,
21
+ showProgress,
22
+ showVideoControls
23
+ } = options;
24
+ const mergedSwiperOptions = computed(() => {
25
+ const { autoplay: autoplay2, ...userOpts } = swiperOptions;
26
+ return {
27
+ slidesPerView: 1,
28
+ spaceBetween: 0,
29
+ grabCursor: true,
30
+ ...userOpts,
31
+ autoplay: false
32
+ };
33
+ });
34
+ const isMultiSlide = computed(() => {
35
+ const spv = mergedSwiperOptions.value.slidesPerView;
36
+ return spv === "auto" || typeof spv === "number" && spv > 1;
37
+ });
38
+ const videoEnabled = true;
39
+ const swiper = createSwiperState(slides);
40
+ const slideState = createSlideState(
41
+ slides,
42
+ swiper.activeIndex,
43
+ swiper.previousIndex,
44
+ { showPagination, showNavigation, showProgress, showVideoControls },
45
+ videoEnabled,
46
+ enterAnimation,
47
+ leaveAnimation
48
+ );
49
+ const resolvedContainer = computed(() => resolveElement(containerRef));
50
+ const isHovered = useElementHover(resolvedContainer);
51
+ const autoplay = createAutoplayState(
52
+ swiper.advanceSlide,
53
+ slideState.isActiveSlideVideo,
54
+ isHovered,
55
+ options
56
+ );
57
+ const video = createVideoState(swiper.activeIndex, videoEnabled);
58
+ const autoplayProgress = computed(() => {
59
+ const controls = video.activeControls.value;
60
+ if (controls && controls.duration.value > 0) {
61
+ return Math.min(controls.currentTime.value / controls.duration.value, 1);
62
+ }
63
+ return autoplay.autoplayProgress.value;
64
+ });
65
+ if (videoEnabled) {
66
+ watch(
67
+ () => video.videoEnded.value,
68
+ (ended) => {
69
+ if (!ended) return;
70
+ if (!autoplay.autoplayEnabled) return;
71
+ if (slideState.activeSlideConfig.value.videoLoop) return;
72
+ if (!isHovered.value) {
73
+ swiper.advanceSlide();
74
+ }
75
+ }
76
+ );
77
+ }
78
+ function onSlideChange() {
79
+ swiper.onSlideChange();
80
+ autoplay.onSlideChange();
81
+ }
82
+ return {
83
+ // Navigation
84
+ next: swiper.next,
85
+ prev: swiper.prev,
86
+ goTo: swiper.goTo,
87
+ // Slide state
88
+ activeIndex: swiper.activeIndex,
89
+ snapIndex: swiper.snapIndex,
90
+ totalSnaps: swiper.totalSnaps,
91
+ activeSlide: slideState.activeSlide,
92
+ activeSlideConfig: slideState.activeSlideConfig,
93
+ isActiveSlideVideo: slideState.isActiveSlideVideo,
94
+ isMultiSlide,
95
+ animationClass: (index) => isMultiSlide.value ? "" : slideState.animationClass(index),
96
+ // Autoplay
97
+ autoplayEnabled: autoplay.autoplayEnabled,
98
+ autoplayProgress,
99
+ autoplayRemaining: autoplay.autoplayRemaining,
100
+ autoplayDelay: autoplay.autoplayDelay,
101
+ autoplayPaused: autoplay.autoplayPaused,
102
+ autoplayPause: autoplay.autoplayPause,
103
+ autoplayResume: autoplay.autoplayResume,
104
+ autoplayReset: autoplay.autoplayReset,
105
+ autoplaySetDelay: autoplay.autoplaySetDelay,
106
+ // Video
107
+ videoPlaying: video.videoPlaying,
108
+ videoCurrentTime: video.videoCurrentTime,
109
+ videoDuration: video.videoDuration,
110
+ videoBuffered: video.videoBuffered,
111
+ videoVolume: video.videoVolume,
112
+ videoMuted: video.videoMuted,
113
+ videoWaiting: video.videoWaiting,
114
+ videoEnded: video.videoEnded,
115
+ videoToggle: video.videoToggle,
116
+ videoSeek: video.videoSeek,
117
+ videoScrubStart: video.videoScrubStart,
118
+ videoScrubEnd: video.videoScrubEnd,
119
+ videoSetVolume: video.videoSetVolume,
120
+ videoToggleMute: video.videoToggleMute,
121
+ // Hover
122
+ isHovered,
123
+ // Swiper options (merged)
124
+ mergedSwiperOptions,
125
+ // Internal bindings
126
+ onSwiper: swiper.onSwiper,
127
+ onSlideChange,
128
+ registerSlideVideo: video.registerSlideVideo,
129
+ unregisterSlideVideo: video.unregisterSlideVideo
130
+ };
131
+ }
@@ -0,0 +1,4 @@
1
+ declare module '#hero/swiper-modules' {
2
+ import type { SwiperModule } from 'swiper/types'
3
+ export const swiperModules: SwiperModule[]
4
+ }
@@ -0,0 +1,221 @@
1
+ import type { SwiperOptions } from 'swiper/types';
2
+ import type { useMediaControls } from '@vueuse/core';
3
+ import type { ComputedRef, MaybeRefOrGetter, Ref } from 'vue';
4
+ /** Extracted from VueUse's useMediaControls second parameter */
5
+ export type MediaControlsOptions = NonNullable<Parameters<typeof useMediaControls>[1]>;
6
+ export type SwiperEffect = 'fade' | 'cube' | 'coverflow' | 'creative' | 'cards' | 'flip';
7
+ export interface HeroFeatures {
8
+ navigation?: boolean;
9
+ pagination?: boolean;
10
+ mousewheel?: boolean;
11
+ keyboard?: boolean;
12
+ a11y?: boolean;
13
+ freeMode?: boolean;
14
+ thumbs?: boolean;
15
+ grid?: boolean;
16
+ zoom?: boolean;
17
+ scrollbar?: boolean;
18
+ controller?: boolean;
19
+ virtual?: boolean;
20
+ hashNavigation?: boolean;
21
+ history?: boolean;
22
+ effects?: SwiperEffect[];
23
+ /** GSAP scroll-based parallax (ScrollTrigger) */
24
+ parallax?: boolean;
25
+ /** Swiper slide-transition parallax module */
26
+ swiperParallax?: boolean;
27
+ /** Video backgrounds + useMediaControls */
28
+ video?: boolean;
29
+ /** HLS streaming (lazy hls.js import). Requires video: true */
30
+ hls?: boolean;
31
+ }
32
+ export interface SlideAnimation {
33
+ /** animate.css class for content entering. e.g. 'animate__fadeInUp' */
34
+ enter?: string;
35
+ /** animate.css class for content leaving. e.g. 'animate__fadeOutDown' */
36
+ leave?: string;
37
+ }
38
+ export interface SlideConfig {
39
+ /** Show pagination dots when this slide is active. Default: inherited from HeroSliderProps */
40
+ showPagination?: boolean;
41
+ /** Show navigation arrows when this slide is active. Default: inherited from HeroSliderProps */
42
+ showNavigation?: boolean;
43
+ /** Show progress bar / video scrubber when this slide is active. Default: inherited from HeroSliderProps */
44
+ showProgress?: boolean;
45
+ /** Show video controls when this slide is active (video slides only). Default: inherited from HeroSliderProps */
46
+ showVideoControls?: boolean;
47
+ /** Loop video playback. When false, auto-advances to next slide on video end. Default: false */
48
+ videoLoop?: boolean;
49
+ /** VueUse useMediaControls options passed through to the video element. @see https://vueuse.org/core/useMediaControls/ */
50
+ mediaControlsOptions?: MediaControlsOptions;
51
+ }
52
+ /** Resolved slide config with boolean defaults applied */
53
+ export interface ResolvedSlideConfig {
54
+ showPagination: boolean;
55
+ showNavigation: boolean;
56
+ showProgress: boolean;
57
+ showVideoControls: boolean;
58
+ videoLoop: boolean;
59
+ mediaControlsOptions?: MediaControlsOptions;
60
+ }
61
+ export interface HeroSlide {
62
+ /** Background image or video URL (auto-detected from extension) */
63
+ bgSrc: string;
64
+ /** Dark-mode alternative (falls back to bgSrc) */
65
+ bgDarkSrc?: string;
66
+ /** Thumbnail for pagination tooltip / navigation preview */
67
+ thumbSrc?: string;
68
+ /** Slide title (used in nav-slit preview) */
69
+ title?: string;
70
+ /** Poster frame for video backgrounds */
71
+ poster?: string;
72
+ /** Per-slide animation config (overrides global enterAnimation/leaveAnimation) */
73
+ animation?: SlideAnimation;
74
+ /** Per-slide display & media config (overrides global HeroSliderProps defaults) */
75
+ config?: SlideConfig;
76
+ /** Any extra data the consumer needs in the slot */
77
+ [key: string]: unknown;
78
+ }
79
+ export type OverlayPatternType = 'lines' | 'dots' | 'gradient' | 'custom';
80
+ export interface OverlayPattern {
81
+ /** Pattern type */
82
+ type: OverlayPatternType;
83
+ /** Pattern opacity (0-1). Default: 0.15 */
84
+ opacity?: number;
85
+ /** Pattern color. Default: 'black' */
86
+ color?: string;
87
+ /** Custom CSS background-image value (only for type: 'custom') */
88
+ css?: string;
89
+ }
90
+ export interface ParallaxConfig {
91
+ /** Enable parallax on background image/video. Default: true */
92
+ bg?: boolean;
93
+ /** Enable parallax on content container. Default: true */
94
+ content?: boolean;
95
+ /** Parallax speed multiplier. Default: 0.125 */
96
+ speed?: number;
97
+ /** Minimum opacity percentage (0-1). Default: 0.7 */
98
+ minOpacity?: number;
99
+ }
100
+ export interface HeroSliderUI {
101
+ /** Root wrapper element */
102
+ root?: string;
103
+ /** Swiper container */
104
+ swiper?: string;
105
+ /** Each SwiperSlide */
106
+ slide?: string;
107
+ /** Slide inner container (.hero-slide) */
108
+ container?: string;
109
+ /** Slide background layer (.hero-slide-bg) */
110
+ bg?: string;
111
+ /** UI controls overlay layer (pagination, navigation, progress) */
112
+ controls?: string;
113
+ /** Autoplay progress bar track */
114
+ progress?: string;
115
+ }
116
+ export interface HeroSliderProps {
117
+ /** Array of slides */
118
+ slides: HeroSlide[];
119
+ /** Composable return value — makes HeroSlider a controlled component */
120
+ slider: UseHeroSliderReturn;
121
+ /** Default animation class for content entering */
122
+ enterAnimation?: string;
123
+ /** Default animation class for content leaving */
124
+ leaveAnimation?: string;
125
+ /** Stacked overlay patterns on top of each slide background */
126
+ overlayPatterns?: OverlayPattern[];
127
+ /** Parallax config - pass false to disable, true for defaults, object for fine control */
128
+ parallax?: MaybeRefOrGetter<boolean | ParallaxConfig>;
129
+ /** @nuxt/image preset name for slide backgrounds */
130
+ imagePreset?: string;
131
+ /** Wrapper element tag. Default: 'div' */
132
+ as?: string;
133
+ /** Class overrides for internal elements (Nuxt UI-style) */
134
+ ui?: HeroSliderUI;
135
+ }
136
+ export interface UseHeroSliderOptions {
137
+ /**
138
+ * Swiper configuration passed through to the `<Swiper>` component.
139
+ *
140
+ * Every standard Swiper option is accepted — `slidesPerView`, `spaceBetween`,
141
+ * `centeredSlides`, `loop`, `effect`, `speed`, `breakpoints`, etc.
142
+ *
143
+ * **Autoplay:** The `autoplay.delay` value configures the built-in progress
144
+ * timer (default 5000ms). Swiper's native autoplay is always disabled;
145
+ * the composable manages slide advancement and progress tracking internally.
146
+ *
147
+ * **Mousewheel:** Set `mousewheel: true` (or an options object) and the
148
+ * Mousewheel Swiper module is auto-registered — no manual import needed.
149
+ *
150
+ * **Vertical direction:** Set `direction: 'vertical'` and the UI adapts:
151
+ * - Pagination moves to the side (right in LTR, left in RTL)
152
+ * - Navigation: prev on top, next on bottom
153
+ * - Progress bar renders vertically on the side
154
+ */
155
+ swiperOptions?: SwiperOptions;
156
+ enterAnimation?: string;
157
+ leaveAnimation?: string;
158
+ /** Show pagination dots. Default: true. Can be overridden per-slide via slide.config */
159
+ showPagination?: boolean;
160
+ /** Show navigation arrows. Default: true. Can be overridden per-slide via slide.config */
161
+ showNavigation?: boolean;
162
+ /** Show progress bar / video scrubber. Default: true. Can be overridden per-slide via slide.config */
163
+ showProgress?: boolean;
164
+ /** Show video controls overlay. Default: true. Can be overridden per-slide via slide.config */
165
+ showVideoControls?: boolean;
166
+ }
167
+ export interface UseHeroSliderReturn {
168
+ next: () => void;
169
+ prev: () => void;
170
+ goTo: (index: number) => void;
171
+ activeIndex: Ref<number>;
172
+ snapIndex: Ref<number>;
173
+ totalSnaps: Ref<number>;
174
+ activeSlide: ComputedRef<HeroSlide>;
175
+ activeSlideConfig: ComputedRef<ResolvedSlideConfig>;
176
+ isActiveSlideVideo: ComputedRef<boolean>;
177
+ /** True when slidesPerView > 1 (or 'auto') — disables content animations */
178
+ isMultiSlide: ComputedRef<boolean>;
179
+ animationClass: (index: number) => string;
180
+ autoplayEnabled: boolean;
181
+ autoplayProgress: ComputedRef<number>;
182
+ autoplayRemaining: ComputedRef<number>;
183
+ autoplayDelay: Ref<number>;
184
+ autoplayPaused: Ref<boolean>;
185
+ autoplayPause: () => void;
186
+ autoplayResume: () => void;
187
+ autoplayReset: () => void;
188
+ autoplaySetDelay: (ms: number) => void;
189
+ videoPlaying: ComputedRef<boolean>;
190
+ videoCurrentTime: ComputedRef<number>;
191
+ videoDuration: ComputedRef<number>;
192
+ videoBuffered: ComputedRef<number>;
193
+ videoVolume: ComputedRef<number>;
194
+ videoMuted: ComputedRef<boolean>;
195
+ videoWaiting: ComputedRef<boolean>;
196
+ videoEnded: ComputedRef<boolean>;
197
+ videoToggle: () => void;
198
+ videoSeek: (time: number) => void;
199
+ /** Call when scrubber drag starts — pauses video, remembers play state */
200
+ videoScrubStart: () => void;
201
+ /** Call when scrubber drag ends — resumes if was playing before scrub */
202
+ videoScrubEnd: () => void;
203
+ videoSetVolume: (v: number) => void;
204
+ videoToggleMute: () => void;
205
+ isHovered: Ref<boolean>;
206
+ mergedSwiperOptions: ComputedRef<Record<string, unknown>>;
207
+ onSwiper: (swiper: any) => void;
208
+ onSlideChange: () => void;
209
+ registerSlideVideo: (index: number, controls: VideoMediaControls) => void;
210
+ unregisterSlideVideo: (index: number) => void;
211
+ }
212
+ export interface VideoMediaControls {
213
+ playing: Ref<boolean>;
214
+ currentTime: Ref<number>;
215
+ duration: Ref<number>;
216
+ buffered: Ref<[number, number][]>;
217
+ volume: Ref<number>;
218
+ muted: Ref<boolean>;
219
+ waiting: Ref<boolean>;
220
+ ended: Ref<boolean>;
221
+ }
File without changes
@@ -0,0 +1,22 @@
1
+ import type { OverlayPattern, ParallaxConfig } from './types.js';
2
+ /** Check if a URL points to a video file based on extension (.mp4, .webm, .mov, .ogg, .m3u8) */
3
+ export declare function isVideoUrl(url: string): boolean;
4
+ /** Check if a URL points to an HLS stream (.m3u8) */
5
+ export declare function isHlsUrl(url: string): boolean;
6
+ /** Generate CSS background-image for a pattern */
7
+ export declare function patternCSS(pattern: OverlayPattern): string;
8
+ /** Get the CSS background-size value appropriate for a pattern type */
9
+ export declare function patternSize(pattern: OverlayPattern): string;
10
+ /** Default parallax config */
11
+ export declare const DEFAULT_PARALLAX: Required<ParallaxConfig>;
12
+ /**
13
+ * Resolve a parallax prop value to a full config object.
14
+ * `false` disables all parallax, `true` uses defaults, objects are merged with defaults.
15
+ */
16
+ export declare function resolveParallaxConfig(value: boolean | ParallaxConfig): Required<ParallaxConfig>;
17
+ /** Format seconds as MM:SS */
18
+ export declare function formatTime(seconds: number): string;
19
+ /** Safely extract hero config from Nuxt runtime config */
20
+ export declare function getHeroConfig(runtimeConfig: {
21
+ public: Record<string, unknown>;
22
+ }): Record<string, any>;
@@ -0,0 +1,50 @@
1
+ const VIDEO_EXTENSIONS = /\.(mp4|webm|mov|ogg|m3u8)(\?|$)/i;
2
+ const HLS_EXTENSIONS = /\.(m3u8)(\?|$)/i;
3
+ export function isVideoUrl(url) {
4
+ return VIDEO_EXTENSIONS.test(url);
5
+ }
6
+ export function isHlsUrl(url) {
7
+ return HLS_EXTENSIONS.test(url);
8
+ }
9
+ export function patternCSS(pattern) {
10
+ const color = pattern.color ?? "black";
11
+ switch (pattern.type) {
12
+ case "lines":
13
+ return `repeating-linear-gradient(45deg, ${color} 25%, transparent 25%, transparent 75%, ${color} 75%, ${color}), repeating-linear-gradient(45deg, ${color} 25%, transparent 25%, transparent 75%, ${color} 75%, ${color})`;
14
+ case "dots":
15
+ return `radial-gradient(circle, ${color} 1px, transparent 1px)`;
16
+ case "gradient":
17
+ return `radial-gradient(circle at 55% 60%, #00aaff, #002aff, rgba(144,143,255,1))`;
18
+ case "custom":
19
+ return pattern.css ?? "";
20
+ }
21
+ }
22
+ export function patternSize(pattern) {
23
+ switch (pattern.type) {
24
+ case "lines":
25
+ return "2px 2px";
26
+ case "dots":
27
+ return "20px 20px";
28
+ default:
29
+ return "cover";
30
+ }
31
+ }
32
+ export const DEFAULT_PARALLAX = {
33
+ bg: true,
34
+ content: true,
35
+ speed: 0.125,
36
+ minOpacity: 0.7
37
+ };
38
+ export function resolveParallaxConfig(value) {
39
+ if (value === false) return { bg: false, content: false, speed: 0, minOpacity: 1 };
40
+ if (value === true) return { ...DEFAULT_PARALLAX };
41
+ return { ...DEFAULT_PARALLAX, ...value };
42
+ }
43
+ export function formatTime(seconds) {
44
+ const m = Math.floor(seconds / 60);
45
+ const s = Math.floor(seconds % 60);
46
+ return `${m.toString().padStart(2, "0")}:${s.toString().padStart(2, "0")}`;
47
+ }
48
+ export function getHeroConfig(runtimeConfig) {
49
+ return runtimeConfig.public.hero ?? {};
50
+ }
@@ -0,0 +1,9 @@
1
+ import type { NuxtModule } from '@nuxt/schema'
2
+
3
+ import type { default as Module } from './module.mjs'
4
+
5
+ export type ModuleOptions = typeof Module extends NuxtModule<infer O> ? Partial<O> : Record<string, any>
6
+
7
+ export { default } from './module.mjs'
8
+
9
+ export { type HeroModuleOptions } from './module.mjs'
package/package.json ADDED
@@ -0,0 +1,94 @@
1
+ {
2
+ "name": "nuxt-hero",
3
+ "version": "0.1.0",
4
+ "description": "A full-featured hero slider Nuxt module with parallax, video backgrounds, overlay patterns, and customizable animations.",
5
+ "license": "MIT",
6
+ "author": "weskhaled",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/weskhaled/nuxt-hero.git"
10
+ },
11
+ "homepage": "https://github.com/weskhaled/nuxt-hero#readme",
12
+ "bugs": {
13
+ "url": "https://github.com/weskhaled/nuxt-hero/issues"
14
+ },
15
+ "keywords": [
16
+ "nuxt",
17
+ "nuxt-module",
18
+ "hero",
19
+ "slider",
20
+ "parallax",
21
+ "video",
22
+ "swiper",
23
+ "gsap",
24
+ "tailwindcss"
25
+ ],
26
+ "type": "module",
27
+ "exports": {
28
+ ".": {
29
+ "import": "./dist/module.mjs"
30
+ }
31
+ },
32
+ "main": "./dist/module.mjs",
33
+ "files": [
34
+ "dist"
35
+ ],
36
+ "sideEffects": false,
37
+ "scripts": {
38
+ "dev": "nuxi dev playground",
39
+ "dev:build": "nuxi build playground",
40
+ "build": "nuxt-module-build build",
41
+ "prepare": "nuxt-module-build build --stub",
42
+ "prepack": "nuxt-module-build build",
43
+ "typecheck": "nuxi typecheck playground",
44
+ "test": "vitest run",
45
+ "test:watch": "vitest",
46
+ "lint": "oxlint .",
47
+ "lint:fix": "oxlint --fix .",
48
+ "lint:all": "oxlint . && pnpm typecheck"
49
+ },
50
+ "dependencies": {
51
+ "@nuxt/icon": "^2.2.1",
52
+ "@nuxt/kit": "^4.4.2",
53
+ "gsap": "^3.14.2"
54
+ },
55
+ "peerDependencies": {
56
+ "@nuxt/image": ">=2.0.0",
57
+ "@nuxtjs/color-mode": "^4.0.0",
58
+ "@tailwindcss/vite": "^4.2.2",
59
+ "@vueuse/core": "^14.2.1",
60
+ "@vueuse/nuxt": ">=14.2.1",
61
+ "animate.css": "^4.1.1",
62
+ "hls.js": "^1.5.0",
63
+ "swiper": "^11.0.0 || ^12.0.0",
64
+ "tailwindcss": "^4.2.2"
65
+ },
66
+ "peerDependenciesMeta": {
67
+ "@nuxt/image": {
68
+ "optional": true
69
+ },
70
+ "animate.css": {
71
+ "optional": true
72
+ },
73
+ "hls.js": {
74
+ "optional": true
75
+ }
76
+ },
77
+ "devDependencies": {
78
+ "@iconify-json/lucide": "^1.2.101",
79
+ "@nuxt/image": "^2.0.0",
80
+ "@nuxt/module-builder": "^1.0.2",
81
+ "@nuxt/test-utils": "^3.17.0",
82
+ "@tailwindcss/vite": "^4.2.2",
83
+ "@types/node": "^25.6.0",
84
+ "animate.css": "^4.1.1",
85
+ "hls.js": "^1.6.2",
86
+ "nuxt": "^4.4.2",
87
+ "oxlint": "^1.59.0",
88
+ "swiper": "^12.1.0",
89
+ "tailwindcss": "^4.2.2",
90
+ "typescript": "^6.0.2",
91
+ "vitest": "^4.1.4",
92
+ "vue-tsc": "^3.2.6"
93
+ }
94
+ }