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/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 @@ + + +