diff --git a/index.html b/index.html
index 7709c90..d3bae1e 100644
--- a/index.html
+++ b/index.html
@@ -31,6 +31,9 @@
+
+
+
diff --git a/src/constants/Categories.ts b/src/constants/Categories.ts
index 260aa9b..84bce7f 100644
--- a/src/constants/Categories.ts
+++ b/src/constants/Categories.ts
@@ -1,5 +1,5 @@
// Highlighted sidebar items
-export const NEW = ['Color Bends', 'Ghost Cursor', 'Grid Scan', 'Laser Flow', 'Liquid Ether', 'Pixel Blast', 'Floating Lines', 'Light Pillar', 'Pixel Snow'];
+export const NEW = ['Antigravity', 'Color Bends', 'Ghost Cursor', 'Laser Flow', 'Liquid Ether', 'Pixel Blast', 'Floating Lines', 'Light Pillar', 'Pixel Snow', 'Grid Scan'];
export const UPDATED = [];
// Used for main sidebar navigation
@@ -26,6 +26,7 @@ export const CATEGORIES = [
'Scroll Velocity',
'Scramble Text',
'Shiny Text',
+ 'Shuffle',
'Split Text',
'Text Cursor',
'Text Pressure',
@@ -39,6 +40,7 @@ export const CATEGORIES = [
name: 'Animations',
subcategories: [
'Animated Content',
+ 'Antigravity',
'Blob Cursor',
'Click Spark',
'Count Up',
@@ -49,12 +51,15 @@ export const CATEGORIES = [
'Ghost Cursor',
'Glare Hover',
'Gradual Blur',
+ 'Image Trail',
'Laser Flow',
'Logo Loop',
'Magnet',
'Magnet Lines',
+ 'Meta Balls',
'Metallic Paint',
'Noise',
+ 'Pixel Trail',
'Pixel Transition',
'Ribbons',
'Shape Blur',
diff --git a/src/constants/Components.ts b/src/constants/Components.ts
index ef53990..f3f8d0b 100644
--- a/src/constants/Components.ts
+++ b/src/constants/Components.ts
@@ -25,6 +25,8 @@ const animations = {
'gradual-blur': () => import('../demo/Animations/GradualBlurDemo.vue'),
'laser-flow': () => import('../demo/Animations/LaserFlowDemo.vue'),
'ghost-cursor': () => import('../demo/Animations/GhostCursorDemo.vue'),
+ 'antigravity': () => import('../demo/Animations/AntigravityDemo.vue'),
+ 'pixel-trail': () => import('../demo/Animations/PixelTrailDemo.vue'),
};
const textAnimations = {
@@ -50,6 +52,7 @@ const textAnimations = {
'scroll-velocity': () => import("../demo/TextAnimations/ScrollVelocityDemo.vue"),
'text-type': () => import("../demo/TextAnimations/TextTypeDemo.vue"),
'variable-proximity': () => import("../demo/TextAnimations/VariableProximityDemo.vue"),
+ 'shuffle': () => import("../demo/TextAnimations/ShuffleDemo.vue"),
};
const components = {
diff --git a/src/constants/Information.ts b/src/constants/Information.ts
index 4fbadc5..7e68373 100644
--- a/src/constants/Information.ts
+++ b/src/constants/Information.ts
@@ -222,6 +222,14 @@ export const componentMetadata: ComponentMetadata = {
docsUrl: 'https://vue-bits.dev/text-animations/count-up',
tags: []
},
+ 'Animations/PixelTrail': {
+ videoUrl: '/assets/videos/pixeltrail.webm',
+ description: 'Pixel grid trail effect that follows cursor movement with customizable gooey filter.',
+ category: 'Animations',
+ name: 'PixelTrail',
+ docsUrl: 'https://vue-bits.dev/animations/pixel-trail',
+ tags: []
+ },
//! Text Animations -------------------------------------------------------------------------------------------------------------------------------
@@ -393,6 +401,14 @@ export const componentMetadata: ComponentMetadata = {
docsUrl: 'https://vue-bits.dev/text-animations/variable-proximity',
tags: []
},
+ 'TextAnimations/Shuffle': {
+ videoUrl: '/assets/videos/shuffle.webm',
+ description: 'GSAP-powered slot machine style text shuffle animation with scroll trigger.',
+ category: 'TextAnimations',
+ name: 'Shuffle',
+ docsUrl: 'https://vue-bits.dev/text-animations/shuffle',
+ tags: []
+ },
//! Components -------------------------------------------------------------------------------------------------------------------------------
'Components/AnimatedList': {
diff --git a/src/constants/code/Animations/antigravityCode.ts b/src/constants/code/Animations/antigravityCode.ts
new file mode 100644
index 0000000..546d314
--- /dev/null
+++ b/src/constants/code/Animations/antigravityCode.ts
@@ -0,0 +1,29 @@
+import code from '@/content/Animations/Antigravity/Antigravity.vue?raw';
+import { createCodeObject } from '@/types/code';
+
+export const antigravity = createCodeObject(code, 'Animations/Antigravity', {
+ installation: `npm install three @types/three`,
+ usage: `
+
+
+
+`
+});
diff --git a/src/constants/code/Animations/pixelTrailCode.ts b/src/constants/code/Animations/pixelTrailCode.ts
new file mode 100644
index 0000000..e43bde0
--- /dev/null
+++ b/src/constants/code/Animations/pixelTrailCode.ts
@@ -0,0 +1,22 @@
+import code from '@/content/Animations/PixelTrail/PixelTrail.vue?raw';
+import { createCodeObject } from '@/types/code';
+
+export const pixelTrail = createCodeObject(code, 'Animations/PixelTrail', {
+ installation: `npm install three @types/three`,
+ usage: `
+
+
+
+`
+});
diff --git a/src/constants/code/Components/infiniteMenuCode.ts b/src/constants/code/Components/infiniteMenuCode.ts
index a41eefd..5620b63 100644
--- a/src/constants/code/Components/infiniteMenuCode.ts
+++ b/src/constants/code/Components/infiniteMenuCode.ts
@@ -3,12 +3,15 @@ import { createCodeObject } from '@/types/code';
export const infiniteMenu = createCodeObject(code, 'Components/InfiniteMenu', {
usage: `
-
+
`
+});
diff --git a/src/content/Animations/Antigravity/Antigravity.vue b/src/content/Animations/Antigravity/Antigravity.vue
new file mode 100644
index 0000000..75ca095
--- /dev/null
+++ b/src/content/Animations/Antigravity/Antigravity.vue
@@ -0,0 +1,340 @@
+
+
+
+
+
diff --git a/src/content/Animations/PixelTrail/PixelTrail.vue b/src/content/Animations/PixelTrail/PixelTrail.vue
new file mode 100644
index 0000000..6fead33
--- /dev/null
+++ b/src/content/Animations/PixelTrail/PixelTrail.vue
@@ -0,0 +1,419 @@
+
+
+
+
+
diff --git a/src/content/Components/InfiniteMenu/InfiniteMenu.vue b/src/content/Components/InfiniteMenu/InfiniteMenu.vue
index 11bfd27..574b392 100644
--- a/src/content/Components/InfiniteMenu/InfiniteMenu.vue
+++ b/src/content/Components/InfiniteMenu/InfiniteMenu.vue
@@ -11,6 +11,7 @@ type InfiniteMenuItem = {
type InfiniteMenuProps = {
items?: InfiniteMenuItem[];
+ scale?: number;
};
const DEFAULT_ITEMS: InfiniteMenuItem[] = [
@@ -22,7 +23,9 @@ const DEFAULT_ITEMS: InfiniteMenuItem[] = [
}
];
-const props = defineProps();
+const props = withDefaults(defineProps(), {
+ scale: 1.0
+});
// Refs
const canvasRef = ref();
@@ -699,8 +702,11 @@ class InfiniteGridMenu {
private items: InfiniteMenuItem[],
private onActiveItemChange: (index: number) => void,
private onMovementChange: (isMoving: boolean) => void,
- private onInit?: (menu: InfiniteGridMenu) => void
+ private onInit?: (menu: InfiniteGridMenu) => void,
+ scale: number = 3.0
) {
+ this.scaleFactor = scale;
+ this.camera.position[2] = scale;
this.init();
}
@@ -1127,6 +1133,26 @@ watch(
},
{ deep: true }
);
+
+watch(
+ () => props.scale,
+ () => {
+ if (infiniteMenu && canvasRef.value) {
+ infiniteMenu.destroy();
+ infiniteMenu = new InfiniteGridMenu(
+ canvasRef.value,
+ resolvedItems.value,
+ handleActiveItem,
+ moving => {
+ isMoving.value = moving;
+ },
+ menu => menu.run(),
+
+ props.scale
+ );
+ }
+ }
+);
diff --git a/src/content/TextAnimations/Shuffle/Shuffle.vue b/src/content/TextAnimations/Shuffle/Shuffle.vue
new file mode 100644
index 0000000..f55f4be
--- /dev/null
+++ b/src/content/TextAnimations/Shuffle/Shuffle.vue
@@ -0,0 +1,412 @@
+
+
+ {{ text }}
+
+
+
+
diff --git a/src/demo/Animations/AntigravityDemo.vue b/src/demo/Animations/AntigravityDemo.vue
new file mode 100644
index 0000000..17c5739
--- /dev/null
+++ b/src/demo/Animations/AntigravityDemo.vue
@@ -0,0 +1,230 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/demo/Animations/BlobCursorDemo.vue b/src/demo/Animations/BlobCursorDemo.vue
index dfb6cc8..21cd7ae 100644
--- a/src/demo/Animations/BlobCursorDemo.vue
+++ b/src/demo/Animations/BlobCursorDemo.vue
@@ -33,8 +33,8 @@
{{ blobType }}
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/demo/Components/InfiniteMenuDemo.vue b/src/demo/Components/InfiniteMenuDemo.vue
index f67d9f9..44d421a 100644
--- a/src/demo/Components/InfiniteMenuDemo.vue
+++ b/src/demo/Components/InfiniteMenuDemo.vue
@@ -2,9 +2,11 @@
-
+
-
+
+
+
@@ -27,6 +29,9 @@ import PropTable from '../../components/common/PropTable.vue';
import TabbedLayout from '../../components/common/TabbedLayout.vue';
import { infiniteMenu } from '../../constants/code/Components/infiniteMenuCode';
import InfiniteMenu from '../../content/Components/InfiniteMenu/InfiniteMenu.vue';
+import { ref } from 'vue';
+import PreviewSlider from '../../components/common/PreviewSlider.vue';
+import Customize from '../../components/common/Customize.vue';
const demoItems = [
{
@@ -55,12 +60,20 @@ const demoItems = [
}
];
+const scaleFactor = ref(3);
+
const propData = [
{
name: 'items',
type: 'InfiniteMenuItem[]',
default: '[{...}]',
description: 'Array of menu items with image, title, description, and link properties.'
+ },
+ {
+ name: 'scale',
+ type: 'number',
+ default: '3',
+ description: 'scale camera position'
}
];
diff --git a/src/demo/TextAnimations/ShuffleDemo.vue b/src/demo/TextAnimations/ShuffleDemo.vue
new file mode 100644
index 0000000..e05165a
--- /dev/null
+++ b/src/demo/TextAnimations/ShuffleDemo.vue
@@ -0,0 +1,237 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+