diff --git a/bun.lock b/bun.lock
index 7875d080..d15bc51e 100644
--- a/bun.lock
+++ b/bun.lock
@@ -29,6 +29,7 @@
"hugeicons-react": "^0.4.0",
"input-otp": "^1.4.2",
"lucide-react": "^0.563.0",
+ "matter-js": "^0.20.0",
"media-chrome": "^4.17.2",
"motion": "^12.34.1",
"next-themes": "^0.4.6",
@@ -1324,6 +1325,8 @@
"math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="],
+ "matter-js": ["matter-js@0.20.0", "", {}, "sha512-iC9fYR7zVT3HppNnsFsp9XOoQdQN2tUyfaKg4CHLH8bN+j6GT4Gw7IH2rP0tflAebrHFw730RR3DkVSZRX8hwA=="],
+
"mdast-util-from-markdown": ["mdast-util-from-markdown@2.0.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "mdast-util-to-string": "^4.0.0", "micromark": "^4.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA=="],
"mdast-util-frontmatter": ["mdast-util-frontmatter@2.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "escape-string-regexp": "^5.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "micromark-extension-frontmatter": "^2.0.0" } }, "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA=="],
diff --git a/package.json b/package.json
index 728186ca..62b90893 100644
--- a/package.json
+++ b/package.json
@@ -37,6 +37,7 @@
"hugeicons-react": "^0.4.0",
"input-otp": "^1.4.2",
"lucide-react": "^0.563.0",
+ "matter-js": "^0.20.0",
"media-chrome": "^4.17.2",
"motion": "^12.34.1",
"next-themes": "^0.4.6",
diff --git a/src/data/contents/blocks/bento-1/bento-1.mdx b/src/data/contents/blocks/bento-1/bento-1.mdx
new file mode 100644
index 00000000..6518f8bd
--- /dev/null
+++ b/src/data/contents/blocks/bento-1/bento-1.mdx
@@ -0,0 +1,29 @@
+---
+title: Bento-1
+slug: bento-1
+category: bento
+description: >-
+ A dark-themed bento layout featuring growth insights, workflow
+ integration, scalable visuals, and seamless team collaboration.
+image: 'https://assets.watermelon.sh/components/bento-1.webp'
+video: 'https://assets.watermelon.sh/components/bento-1.mp4'
+featured: false
+comingSoon: false
+dependencies:
+ - motion/react
+install:
+ - 'npx shadcn@latest add https://registry.watermelon.sh/r/bento-1.json'
+componentNumber: 1
+---
+
+# Bento-1
+
+A sleek, high-contrast bento layout designed to present insights, simplify workflows, and highlight collaboration through clean visual blocks.
+
+- **Growth Insights** - Smooth visual indicators to represent trends and performance over time.
+- **Custom Design Modules** - Clean, modular sections to showcase tailored solutions.
+- **Auto Scaling Visuals** - Subtle curves and highlights that reflect adaptability and system evolution.
+- **Workflow Integration** - Organized display of connected tools and services.
+- **Team Collaboration** - Interactive avatar groups that bring a sense of real-time teamwork.
+- **Tag-Based Highlights** - Compact pill elements for quick access to key features.
+- **Dark Premium UI** - High-contrast design with soft glows, gradients, and minimal accents.
diff --git a/src/data/contents/blocks/bento-1/demo.tsx b/src/data/contents/blocks/bento-1/demo.tsx
new file mode 100644
index 00000000..6c007cbc
--- /dev/null
+++ b/src/data/contents/blocks/bento-1/demo.tsx
@@ -0,0 +1,9 @@
+import Bento1 from '.'
+
+const demo = () => {
+ return (
+
+ )
+}
+
+export default demo
\ No newline at end of file
diff --git a/src/data/contents/blocks/bento-1/index.tsx b/src/data/contents/blocks/bento-1/index.tsx
new file mode 100644
index 00000000..5c5d648c
--- /dev/null
+++ b/src/data/contents/blocks/bento-1/index.tsx
@@ -0,0 +1,935 @@
+'use client';
+import { motion } from 'motion/react';
+import {
+ Card,
+ CardHeader,
+ CardTitle,
+ CardDescription,
+ CardContent,
+} from '@/components/base-ui/card';
+import { MdDesignServices, MdDeveloperMode } from 'react-icons/md';
+
+const MotionCard = motion(Card);
+
+const Bento1 = () => {
+ const buttonLinks = [
+ 'Design Workshops',
+ 'Workshop',
+ 'Trend Report',
+ 'Asset library',
+ 'Premium designers',
+ 'Multillingual support',
+ 'Design Workshops',
+ ];
+
+ const circleRows = [
+ [
+ { From: Figma, To: Github, delay: 0 },
+ { From: Twitter, To: Slack, delay: 0.07 },
+ { From: Claude, To: Cloudflare, delay: 0.14 },
+ ],
+ [
+ { From: Github, To: Figma, delay: 0.21 },
+ { From: Slack, To: Twitter, delay: 0.28 },
+ { From: Cloudflare, To: Claude, delay: 0.35 },
+ ],
+ ];
+
+ return (
+
+
+ {/* Row 1 - 3 Columns */}
+
+ {/* Card 1 */}
+
+
+
+ Growth
+
+
+ {[
+ { top: 52, bottom: 25 },
+ { top: 38, bottom: 18 },
+ { top: 50, bottom: 18 },
+ { top: 62, bottom: 32 },
+ { top: 62, bottom: 45 },
+ { top: 62, bottom: 15 },
+ { top: 52, bottom: 25 },
+ { top: 52, bottom: 25 },
+ { top: 38, bottom: -2 },
+ { top: 48, bottom: 12 },
+ { top: 58, bottom: 15 },
+ { top: 72, bottom: 15 },
+ { top: 85, bottom: 35 },
+ { top: 100, bottom: 40 },
+ { top: 75, bottom: 45 },
+ { top: 52, bottom: 25 },
+ ].map((b, i) => (
+
+ {b && (
+
+ )}
+
+ {i === 0 && (
+ <>
+
+
+ Mar, 10
+
+ >
+ )}
+
+ {i === 7 && (
+ <>
+
+
+ Mar, 12
+
+ >
+ )}
+
+ {i === 13 && (
+ <>
+
+
+ Today
+
+ >
+ )}
+
+ ))}
+
+
+
+
+
+
+ {/* Card 2 */}
+
+ {/* Design Graphic */}
+
+
+ {/* Deep Back card */}
+
+
+
+
+
+ Research
+
+
+ friday, 10:00
+
+
+
+
+ {/* Back card */}
+
+
+
+
+
+
+
+ Development
+
+
+ tuesday, 1:30
+
+
+
+
+ {/* Front card */}
+
+
+
+
+
+
+
+ Modern Design
+
+
+ monday, 12:30
+
+
+
+
+ {/* Dashed lines underneath */}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Custom - made designs
+
+
+ with more than expertise to make your vision come to reality
+
+
+
+
+ {/* Card 3 */}
+
+
+
+
+
+
+
+ Auto Scale Handling
+
+
+ we are ready to meet you evolving nends.
+
+
+
+
+
+ {/* Row 2 - 2 Columns */}
+
+ {/* Card 4 */}
+
+ {/* Background Dark Circles pattern */}
+
+ {circleRows.map((row, rowIdx) => (
+
+ {row.map(({ From, To, delay }, i) => (
+
+
+
+
+
+
+
+
+ ))}
+
+ ))}
+
+
+
+
+ WorkFlow
+
+ Management
+
+
+ Seamlessly manage all you existing apps.
+
+
+
+
+ {/* Card 5 */}
+
+
+
+ Team Collaboration
+
+ effortlessly
+
+
+ Seamless connection and collab with other teams
+
+
+
+ {/* Overlapping Rings UI */}
+
+ {/* Ring 1 - Red */}
+
+ {/* Ring 2 - Purple */}
+
+ {/* Ring 3 - Green with Glow */}
+
+ {/* Ring 4 - Dark grey */}
+
+
+ {/* Cursor and Label */}
+
+
+
+
+
+
+ Jack
+
+
+ Mike
+
+
+
+
+
+
+
+
+
+ {/* Row 3 - Tags */}
+
+
+ {buttonLinks.map((button, idx) => (
+
+
+
+ {button}
+
+
+ ))}
+
+
+
+
+
+
+ );
+};
+
+export default Bento1;
+
+const Graph = () => {
+ const originalD =
+ 'M1.86621 239L7.86621 226.5L15.3662 215.5L23.3662 205.5L31.3662 197.5L38.8662 192L48.3662 187L58.8662 183.5L67.3662 181.5L77.8662 179.5L87.8662 177L97.3662 172L103.866 166L108.866 159L111.866 151.5L112.866 144.5V137.5V134';
+ const extensionD =
+ 'M112.866 134 C113.366 119.667 124.866 98.8004 166.866 154 C208.866 209.2 220.2 117.5 220.866 64.5 C220.866 50 220.966 19.3 255.366 18.5 C289.766 17.7 280.7 -17.1667 271.866 -34.5';
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* Subtle large outer glow */}
+
+ {/* Glowing tip */}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+const Figma = () => {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+const Twitter = () => {
+ return (
+
+
+
+ );
+};
+
+const Claude = () => {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+const Github = () => {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+const Slack = () => {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+const Cloudflare = () => {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
diff --git a/src/data/contents/blocks/bento-14/bento-14.mdx b/src/data/contents/blocks/bento-14/bento-14.mdx
new file mode 100644
index 00000000..5d15e2f1
--- /dev/null
+++ b/src/data/contents/blocks/bento-14/bento-14.mdx
@@ -0,0 +1,30 @@
+---
+title: Bento-14
+slug: bento-14
+category: bento
+description: >-
+ A media-focused bento layout combining playback controls,
+ file handling, connected systems, and precision-driven insights.
+image: 'https://assets.watermelon.sh/components/bento-14.webp'
+video: 'https://assets.watermelon.sh/components/bento-14.mp4'
+featured: false
+comingSoon: false
+dependencies:
+ - motion/react
+ - lucide-react
+ - react-icons
+install:
+ - 'npx shadcn@latest add https://registry.watermelon.sh/r/bento-14.json'
+componentNumber: 1
+---
+
+# Bento-14
+
+A media-oriented bento layout built around playback, file interaction, and connected systems, arranged across four distinct blocks.
+
+- **Connected Hub** – A node-based visual linking devices (camera, center node, display), representing distribution or sync across endpoints.
+- **Playback Interface** – A full-width media control bar with timeline, play/pause, and navigation controls centered around “Break Free”.
+- **Precision Panel** – A patterned background with repeated labels, emphasizing controlled output and contextual handling.
+- **File Drop Zone** – A framed upload area with “Add Your File” and a floating file tag (my_file.mp3), indicating drag-and-drop interaction.
+- **Balanced Grid Layout** – Two upper cards paired with two lower cards, separating system, media, and file workflows.
+- **Minimal Control Icons** – Lightweight playback and interaction icons kept subtle to maintain focus on content.
\ No newline at end of file
diff --git a/src/data/contents/blocks/bento-14/demo.tsx b/src/data/contents/blocks/bento-14/demo.tsx
new file mode 100644
index 00000000..2687fc1b
--- /dev/null
+++ b/src/data/contents/blocks/bento-14/demo.tsx
@@ -0,0 +1,9 @@
+import Bento14 from '.'
+
+const demo = () => {
+ return (
+
+ )
+}
+
+export default demo
\ No newline at end of file
diff --git a/src/data/contents/blocks/bento-14/index.tsx b/src/data/contents/blocks/bento-14/index.tsx
new file mode 100644
index 00000000..b2972b96
--- /dev/null
+++ b/src/data/contents/blocks/bento-14/index.tsx
@@ -0,0 +1,726 @@
+"use client";
+import type { RefObject } from "react";
+import React, { useEffect, useId, useRef, useState } from "react";
+import {
+ AnimatePresence,
+ motion,
+ useAnimationFrame,
+ useMotionValue,
+} from "framer-motion";
+import {
+ Play,
+ Pause,
+ Heart,
+ Volume2,
+ Repeat,
+ Shuffle,
+ Monitor,
+ Speaker,
+ SkipForward,
+ SkipBack,
+} from "lucide-react";
+import { cn } from "@/lib/utils";
+import {
+ Card,
+ CardTitle,
+ CardDescription,
+ CardContent,
+ CardFooter,
+} from "@/components/base-ui/card";
+
+function Row({
+ direction,
+ isHovered,
+}: {
+ direction: number;
+ isHovered: boolean;
+}) {
+ const x = useMotionValue(0);
+ const containerRef = useRef(null);
+
+ useAnimationFrame((_, delta) => {
+ if (!containerRef.current) return;
+
+ const halfWidth = containerRef.current.scrollWidth / 2;
+ const speed = isHovered ? 5 : 30;
+
+ let next = x.get() + (direction * -speed * delta) / 1000;
+
+ if (next <= -halfWidth) next += halfWidth;
+ if (next >= 0) next -= halfWidth;
+
+ x.set(next);
+ });
+
+ const items = [...Array(12)];
+
+ return (
+
+
+ {[...items, ...items].map((_, i) => (
+
+ Sale on entire stock
+ ✦
+
+ ))}
+
+
+ );
+}
+function MarqueeCard() {
+ const [isHovered, setIsHovered] = useState(false);
+
+ return (
+ setIsHovered(true)}
+ onMouseLeave={() => setIsHovered(false)}
+ >
+
+
+
+
+
+
+
+
+ Tailored Precision
+
+ Chime offers tailored precision and intelligent insights, adeptly
+ managing diverse sophisticated contextual understanding.
+
+
+
+ );
+}
+
+function UploadCard() {
+ const dragVariants = {
+ rest: {
+ x: 130,
+ y: -80,
+ },
+ hover: {
+ x: 0,
+ y: 0,
+ transition: {
+ duration: 0.7,
+ ease: "easeInOut" as const,
+ },
+ },
+ };
+
+ return (
+
+
+
+
+
+
+
+
+ Add your file
+
+
+
+
+ my_file.mp3
+
+
+
+
+
+ Add Your File
+
+ Powerful capabilities, simplified. Our advanced features are integrated
+ with remarkably easy and seamless to master.
+
+
+
+
+ );
+}
+
+export interface AnimatedBeamProps {
+ className?: string;
+ containerRef: RefObject; // Container ref
+ fromRef: RefObject;
+ toRef: RefObject;
+ curvature?: number;
+ reverse?: boolean;
+ pathColor?: string;
+ pathWidth?: number;
+ pathOpacity?: number;
+ gradientStartColor?: string;
+ gradientStopColor?: string;
+ delay?: number;
+ duration?: number;
+ startXOffset?: number;
+ startYOffset?: number;
+ endXOffset?: number;
+ endYOffset?: number;
+}
+
+export const AnimatedBeam: React.FC = ({
+ className,
+ containerRef,
+ fromRef,
+ toRef,
+ curvature = 0,
+ reverse = false,
+ duration = Math.random() * 3 + 4,
+ delay = 0,
+ pathColor = "gray",
+ pathWidth = 2,
+ pathOpacity = 0.2,
+ gradientStartColor = "#ffaa40",
+ gradientStopColor = "#9c40ff",
+ startXOffset = 0,
+ startYOffset = 0,
+ endXOffset = 0,
+ endYOffset = 0,
+}) => {
+ const id = useId();
+ const [pathD, setPathD] = useState("");
+ const [svgDimensions, setSvgDimensions] = useState({ width: 0, height: 0 });
+
+ const gradientCoordinates = reverse
+ ? {
+ x1: ["90%", "-10%"],
+ x2: ["100%", "0%"],
+ y1: ["0%", "0%"],
+ y2: ["0%", "0%"],
+ }
+ : {
+ x1: ["10%", "110%"],
+ x2: ["0%", "100%"],
+ y1: ["0%", "0%"],
+ y2: ["0%", "0%"],
+ };
+
+ useEffect(() => {
+ const updatePath = () => {
+ if (containerRef.current && fromRef.current && toRef.current) {
+ const containerRect = containerRef.current.getBoundingClientRect();
+ const rectA = fromRef.current.getBoundingClientRect();
+ const rectB = toRef.current.getBoundingClientRect();
+
+ const svgWidth = containerRect.width;
+ const svgHeight = containerRect.height;
+ setSvgDimensions({ width: svgWidth, height: svgHeight });
+
+ const startX =
+ rectA.left - containerRect.left + rectA.width / 2 + startXOffset;
+ const startY =
+ rectA.top - containerRect.top + rectA.height / 2 + startYOffset;
+ const endX =
+ rectB.left - containerRect.left + rectB.width / 2 + endXOffset;
+ const endY =
+ rectB.top - containerRect.top + rectB.height / 2 + endYOffset;
+
+ const controlY = startY - curvature;
+ const d = `M ${startX},${startY} Q ${
+ (startX + endX) / 2
+ },${controlY} ${endX},${endY}`;
+ setPathD(d);
+ }
+ };
+
+ const resizeObserver = new ResizeObserver(() => {
+ updatePath();
+ });
+
+ if (containerRef.current) {
+ resizeObserver.observe(containerRef.current);
+ }
+
+ updatePath();
+
+ return () => {
+ resizeObserver.disconnect();
+ };
+ }, [
+ containerRef,
+ fromRef,
+ toRef,
+ curvature,
+ startXOffset,
+ startYOffset,
+ endXOffset,
+ endYOffset,
+ ]);
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+function Card2() {
+ const moniterRef = useRef(null);
+ const rippleRef = useRef(null);
+ const speakerRef = useRef(null);
+ const containerRef = useRef(null);
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Connected Hub
+
+ A dedicated platform engineered to empower your creative vision, and
+ global distribution.
+
+
+
+ );
+}
+
+const tracks = [
+ {
+ id: 1,
+ title: "Midnight Dreams",
+ artist: "Luna Waves",
+ cover: "https://images.unsplash.com/photo-1511379938547-c1f69419868d?w=300",
+ duration: 101,
+ },
+ {
+ id: 2,
+ title: "Ocean Lights",
+ artist: "Aurora Sky",
+ cover: "https://images.unsplash.com/photo-1507838153414-b4b713384a76?w=300",
+ duration: 124,
+ },
+ {
+ id: 3,
+ title: "Neon Streets",
+ artist: "Pulse City",
+ cover: "https://images.unsplash.com/photo-1493225457124-a3eb161ffa5f?w=300",
+ duration: 95,
+ },
+];
+
+function formatTime(t: number) {
+ const m = Math.floor(t / 60);
+ const s = Math.floor(t % 60);
+ return `${m}:${s.toString().padStart(2, "0")}`;
+}
+
+const barVariants = {
+ initial: { y: -60, opacity: 0, scale: 0, filter: "blur(4px)" },
+ animate: { y: 16, opacity: 1, scale: 1, filter: "blur(0px)" },
+ exit: { y: -60, opacity: 0, scale: 0, filter: "blur(4px)" },
+};
+
+const songVariants = {
+ enter: (dir: number) => ({
+ x: dir > 0 ? 180 : -180,
+ opacity: 0,
+ scale: 0.75,
+ filter: "blur(4px)",
+ }),
+ center: { x: 0, opacity: 1, scale: 1, filter: "blur(0px)" },
+ exit: (dir: number) => ({
+ x: dir > 0 ? -180 : 180,
+ opacity: 0,
+ scale: 0.75,
+ filter: "blur(4px)",
+ }),
+};
+
+function PlayerCard() {
+ const [index, setIndex] = useState(0);
+ const [time, setTime] = useState(0);
+ const [playing, setPlaying] = useState(false);
+ const [liked, setLiked] = useState(false);
+ const [loop, setLoop] = useState(false);
+ const [shuffle, setShuffle] = useState(false);
+ const [hover, setHover] = useState(false);
+ const [direction, setDirection] = useState(0);
+
+ const duration = tracks[index].duration;
+ const track = tracks[index];
+
+ const ref = useRef(null);
+
+ useEffect(() => {
+ if (!playing || !hover) return;
+
+ const interval = setInterval(() => {
+ setTime((t) => {
+ if (t >= duration) {
+ if (loop) return 0;
+ setDirection(1);
+ if (shuffle) {
+ setIndex(Math.floor(Math.random() * tracks.length));
+ } else {
+ setIndex((i) => (i + 1) % tracks.length);
+ }
+ return 0;
+ }
+ return t + 1;
+ });
+ }, 1000);
+
+ return () => clearInterval(interval);
+ }, [playing, duration, hover, loop, shuffle]);
+
+ function next() {
+ setDirection(1);
+ if (shuffle) {
+ setIndex(Math.floor(Math.random() * tracks.length));
+ } else {
+ setIndex((i) => (i + 1) % tracks.length);
+ }
+ setTime(0);
+ }
+
+ function prev() {
+ setDirection(-1);
+ setIndex((i) => (i - 1 + tracks.length) % tracks.length);
+ setTime(0);
+ }
+
+ function seek(e: React.MouseEvent) {
+ if (!ref.current) return;
+
+ const rect = ref.current.getBoundingClientRect();
+ const x = e.clientX - rect.left;
+ const percent = x / rect.width;
+
+ setTime(percent * duration);
+ }
+
+ const progress = (time / duration) * 100;
+
+ return (
+ {
+ setHover(true);
+ setPlaying(true);
+ }}
+ onMouseLeave={() => {
+ setHover(false);
+ setPlaying(false);
+ }}
+ className="md:col-span-7 relative bg-neutral-900 rounded-md flex flex-col justify-between border border-white/5 overflow-hidden h-[340px] p-0 gap-0 ring-0 shadow-none"
+ >
+
+ {hover && (
+
+
+
+
+
+
+
+
+ {track.title}
+
+
+ {track.artist}
+
+
+
+
+
+
+ )}
+
+
+
+
+
+
+
+
+
+
+
+
+ {formatTime(time)}
+ {formatTime(duration)}
+
+
+
+
+
setLiked(!liked)}
+ className={`w-5 h-5 cursor-pointer ${
+ liked ? "text-blue-500 fill-blue-500" : "text-neutral-400"
+ }`}
+ />
+
+
+
+
+
+ setPlaying(!playing)}
+ className="bg-white rounded-full p-2.5 shadow-[0_0_18px_rgba(255,255,255,0.15)] cursor-pointer"
+ >
+ {playing ? (
+
+ ) : (
+
+ )}
+
+
+
+
+ setLoop(!loop)}
+ className={`w-5 h-5 cursor-pointer ${
+ loop ? "text-blue-500" : "text-neutral-400"
+ }`}
+ />
+
+ setShuffle(!shuffle)}
+ className={`w-5 h-5 cursor-pointer ${
+ shuffle ? "text-blue-500" : "text-neutral-400"
+ }`}
+ />
+
+
+
+
+
+ Break Free
+
+ Seize full command over your music's journey
+
+
+
+ );
+}
+const Bento14 = () => {
+ return (
+
+ );
+};
+
+export default Bento14;
\ No newline at end of file
diff --git a/src/data/contents/blocks/bento-16/bento-16.mdx b/src/data/contents/blocks/bento-16/bento-16.mdx
new file mode 100644
index 00000000..ee905da1
--- /dev/null
+++ b/src/data/contents/blocks/bento-16/bento-16.mdx
@@ -0,0 +1,31 @@
+---
+title: Bento-16
+slug: bento-16
+category: bento
+description: >-
+ A finance-oriented bento layout combining global reach,
+ transaction security, performance metrics, and tax insights.
+image: 'https://assets.watermelon.sh/components/bento-16.webp'
+video: 'https://assets.watermelon.sh/components/bento-16.mp4'
+featured: false
+comingSoon: false
+dependencies:
+ - motion/react
+ - lucide-react
+ - react-icons
+install:
+ - 'npx shadcn@latest add https://registry.watermelon.sh/r/bento-16.json'
+componentNumber: 1
+---
+
+# Bento-16
+
+A finance-focused bento layout structured around funding, security, and performance indicators across multiple data-driven blocks.
+
+- **Global Reach Panel** – A world map with highlighted nodes, introducing scale and international presence.
+- **Verification Block** – A soft card with structured rows, suggesting identity checks or approval workflows.
+- **Radial Insight Card** – A circular visualization representing distribution, allocation, or risk layers.
+- **Performance Chart** – A vertical bar graph showing upward growth trends.
+- **Security Section** – A shield-centered card labeled “Secure transactions”, emphasizing protection and trust.
+- **Tax Optimization Panel** – A wide block with segmented bars showing tax credit, savings, and paid amounts.
+- **Mixed Layout Grid** – Combination of wide and compact cards to separate insights, metrics, and controls.
\ No newline at end of file
diff --git a/src/data/contents/blocks/bento-16/demo.tsx b/src/data/contents/blocks/bento-16/demo.tsx
new file mode 100644
index 00000000..6b1745ea
--- /dev/null
+++ b/src/data/contents/blocks/bento-16/demo.tsx
@@ -0,0 +1,9 @@
+import Bento16 from '.'
+
+const demo = () => {
+ return (
+
+ )
+}
+
+export default demo
\ No newline at end of file
diff --git a/src/data/contents/blocks/bento-16/index.tsx b/src/data/contents/blocks/bento-16/index.tsx
new file mode 100644
index 00000000..a7a21eab
--- /dev/null
+++ b/src/data/contents/blocks/bento-16/index.tsx
@@ -0,0 +1,416 @@
+"use client";
+import { motion, type Variants } from "motion/react";
+import { useMemo, useState } from "react";
+import { FaShield } from "react-icons/fa6";
+import {
+ Card,
+ CardContent,
+ CardDescription,
+ CardFooter,
+ CardHeader,
+ CardTitle,
+} from "@/components/base-ui/card";
+
+// const container:Variants = {
+// hidden: { opacity: 0 },
+// show: {
+// opacity: 1,
+// transition: { staggerChildren: 0.08 },
+// },
+// };
+
+const item:Variants = {
+ hidden: { opacity: 0, y: 20 },
+ show: { opacity: 1, y: 0 },
+};
+
+function PerformanceCard() {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Build for performance
+
+
+ Grew 30,000+ strong global design community!!
+
+
+
+
+ );
+}
+
+const dots = [
+ { t: "13%", l: "40%" },
+ { t: "38%", l: "30%" },
+ { t: "32%", l: "60%" },
+ { t: "70%", l: "50%" },
+ { t: "80%", l: "73%" },
+ { t: "85%", l: "35%" },
+];
+
+const createDelays = (seed: number) =>
+ dots.map((_, index) => {
+ const value = Math.abs(Math.sin((index + 1) * seed) * 10000);
+ return (value - Math.floor(value)) * 0.8;
+ });
+
+function EarthDots() {
+ const [hovered, setHovered] = useState(false);
+
+ const enterDelays = useMemo(() => createDelays(12.9898), []);
+ const exitDelays = useMemo(() => createDelays(78.233), []);
+
+ return (
+ setHovered(true)}
+ onHoverEnd={() => setHovered(false)}
+ className="col-span-12 lg:col-span-6"
+ >
+
+
+
+
+
+ {dots.map((pos, i) => (
+
+ ))}
+
+
+
+
+
+ Effortless funding
+
+
+ Grew 30,000+ strong global design community!!
+
+
+
+
+ );
+}
+
+const card:Variants = {
+ hidden: { y: 80, opacity: 0 },
+ show: {
+ y: 0,
+ opacity: 1,
+ transition: {
+ duration: 0.6,
+ ease: "easeOut",
+ when: "beforeChildren",
+ staggerChildren: 0.12,
+ },
+ },
+};
+
+const skeletonItem:Variants = {
+ hidden: { opacity: 0, y: 12 },
+ show: { opacity: 1, y: 0 },
+};
+
+function ProjectQualificationCard() {
+ return (
+
+
+
+
+ Project qualification and verification
+
+
+
+ Grew 30,000+ strong global design community!!
+
+
+
+
+
+ {[...Array(7)].map((_, i) => (
+
+
+
+
+ ))}
+
+
+
+
+ );
+}
+
+function GraphBar({ className, delay = 0, width }:{className:string, delay?:number, width:string|number}) {
+ return (
+
+ );
+}
+
+function Card5() {
+ const [hovered, setHovered] = useState(false);
+
+ return (
+ setHovered(true)}
+ onHoverEnd={() => setHovered(false)}
+ className="col-span-12 lg:col-span-6"
+ >
+
+
+
+ Tax liability optimize
+
+
+
+
+
+
+
+
+
+
Tax saving
+
$1200000
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+function OngoingSupportCard() {
+ const [hovered, setHovered] = useState(false);
+
+ return (
+ setHovered(true)}
+ onHoverEnd={() => setHovered(false)}
+ className="col-span-12 md:col-span-6 lg:col-span-3"
+ >
+
+
+ Ongoing support
+
+ Grew 30,000+ strong global design community!!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+export default function Bento16() {
+ return (
+
+
+
+
+
+
+
+
+
+ Secure transactions
+
+ Grew 30,000+ strong global design community!!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+function ArrowPathIcon({ className, ...props }: { className?: string; [key: string]: unknown }) {
+ return (
+
+
+
+
+ );
+}
diff --git a/src/data/contents/blocks/bento-2/bento-2.mdx b/src/data/contents/blocks/bento-2/bento-2.mdx
new file mode 100644
index 00000000..2e49fa3d
--- /dev/null
+++ b/src/data/contents/blocks/bento-2/bento-2.mdx
@@ -0,0 +1,29 @@
+---
+title: Bento-2
+slug: bento-2
+category: bento
+description: >-
+ A low-light bento layout focused on property discovery, blending
+ listing visuals, quick stats, and action-driven interface elements.
+image: 'https://assets.watermelon.sh/components/bento-2.webp'
+video: 'https://assets.watermelon.sh/components/bento-2.mp4'
+featured: false
+comingSoon: false
+dependencies:
+ - motion/react
+install:
+ - 'npx shadcn@latest add https://registry.watermelon.sh/r/bento-2.json'
+componentNumber: 1
+---
+
+# Bento-2
+
+A property-driven bento layout that combines immersive listing visuals with compact interaction blocks and data cues.
+
+- **Listing Focus Panel** – A wide card introducing properties through stacked house visuals, connected by a central transition point.
+- **Stat Indicator Block** – Vertical bars with a highlighted value (1.6k), giving a quick sense of activity or traction.
+- **Search Entry Zone** – A smaller section with floating particles and a “Find House” action, hinting at exploration flow.
+- **Core Actions Cluster** – Centralized icons (home, user, search) representing browsing, identity, and discovery.
+- **Radial Highlighting** – Each block uses a soft glow from the center to guide visual attention.
+- **Split Composition** – A dominant left panel balanced with stacked, utility-driven cards on the right.
+- **Accent-Driven UI** – Pink highlights used consistently for actions, focus points, and key data.
diff --git a/src/data/contents/blocks/bento-2/demo.tsx b/src/data/contents/blocks/bento-2/demo.tsx
new file mode 100644
index 00000000..c4f538e1
--- /dev/null
+++ b/src/data/contents/blocks/bento-2/demo.tsx
@@ -0,0 +1,9 @@
+import Bento2 from '.'
+
+const demo = () => {
+ return (
+
+ )
+}
+
+export default demo
\ No newline at end of file
diff --git a/src/data/contents/blocks/bento-2/index.tsx b/src/data/contents/blocks/bento-2/index.tsx
new file mode 100644
index 00000000..8c4d96e0
--- /dev/null
+++ b/src/data/contents/blocks/bento-2/index.tsx
@@ -0,0 +1,1465 @@
+"use client";
+
+import React from "react";
+import { AnimatePresence, motion } from "motion/react";
+import NumberFlow from "@number-flow/react";
+import {
+ Card,
+ CardHeader,
+ CardTitle,
+ CardDescription,
+ CardContent,
+} from "@/components/base-ui/card";
+
+const GLOBE_PHRASES = ["Find House", "Performance Market", "Handle Traffic"];
+
+const Bento2 = () => {
+ return (
+
+
+
+
+ {/* Bento-1 */}
+
+
+
+ A World of Properties Awaits
+
+
+ Utilize our dynamic platform to showcase your property in
+ stunning detail or dive into a curated marketplace. Every
+ listing is an opportunity waiting to be explored.
+
+
+
+
+
+
+
+ {/* Bento-2 */}
+
+
+
+
+
+
+ Marketplace Synergy
+
+
+ Experience a frictionless journey from property management to
+ monetization.
+
+
+
+
+
+
+ {/* Bento-3 */}
+
+
+
+
+
+
+ Advanced Analytics
+
+
+ Stop reacting and start strategizing. Our predictive analytics
+ help you identify growth
+
+
+
+
+ {/* Bento-4 */}
+
+
+
+
+
+
+ Integrated Management Tools
+
+
+ Our comprehensive toolkit simplifies the complexities of
+ property ownership, automating routine tasks so you can focus on
+ growth
+
+
+
+
+
+
+ );
+};
+
+export default Bento2;
+
+const Transforming = () => {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+const BARS = [
+ { height: 70, value: 0.9 },
+ { height: 107, value: 1.4 },
+ { height: 160, value: 2.0 },
+ { height: 125, value: 1.6 },
+ { height: 145, value: 1.8 },
+];
+
+const BAR_W = 28;
+const BAR_GAP = 12;
+const TOTAL_W = BARS.length * BAR_W + (BARS.length - 1) * BAR_GAP;
+const MAX_H = Math.max(...BARS.map((b) => b.height));
+const TICKER_W = 60;
+
+const Graph = () => {
+ const [activeBar, setActiveBar] = React.useState(2);
+
+ React.useEffect(() => {
+ const timer = setTimeout(() => {
+ setActiveBar((prev) => (prev + 1) % BARS.length);
+ }, 1500);
+ return () => clearTimeout(timer);
+ }, [activeBar]);
+
+ const barLeft = (i: number) => i * (BAR_W + BAR_GAP);
+ const barCenter = (i: number) => barLeft(i) + BAR_W / 2;
+ const tickerLeft = barCenter(activeBar) - TICKER_W / 2;
+ const tickerBottom = BARS[activeBar].height + 10;
+
+ return (
+
+ {/* Bars */}
+ {BARS.map((bar, i) => (
+
+ {/* Gray base */}
+
+ {/* Pink overlay */}
+
+
+ ))}
+
+ {/* Static centered glow */}
+
+
+ {/* Ticker */}
+
+ {/* Badge */}
+
+
+
+ {/* Downward triangle pointer */}
+
+
+
+ );
+};
+
+const Globe = () => {
+ const basePillWidth = 119;
+ const [activePhrase, setActivePhrase] = React.useState(0);
+
+ const [phraseWidths, setPhraseWidths] = React.useState(() =>
+ GLOBE_PHRASES.map(() => basePillWidth)
+ );
+
+ React.useEffect(() => {
+ if (typeof document === "undefined") return;
+
+ const canvas = document.createElement("canvas");
+ const ctx = canvas.getContext("2d");
+ if (!ctx) return;
+
+ ctx.font = "700 15px Inter, sans-serif";
+ const measuredWidths = GLOBE_PHRASES.map((phrase) =>
+ Math.max(90, Math.ceil(ctx.measureText(phrase).width) + 34)
+ );
+
+ setPhraseWidths(measuredWidths);
+ }, []);
+
+ const currentPillWidth = phraseWidths[activePhrase] ?? basePillWidth;
+ const currentPillX = (basePillWidth - currentPillWidth) / 2;
+
+ React.useEffect(() => {
+ const interval = setInterval(() => {
+ setActivePhrase((prev) => (prev + 1) % GLOBE_PHRASES.length);
+ }, 2400);
+
+ return () => clearInterval(interval);
+ }, []);
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {GLOBE_PHRASES[activePhrase]}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+const Tools = () => {
+ const profileX = [0, -15, 20, -8, 0];
+ const profileY = [0, -15, 18, 11, 0];
+ const searchX = [0, 16, -15, 18, 0];
+ const searchY = [0, 20, -15, 25, 0];
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
diff --git a/src/data/contents/blocks/bento-3/bento-3.mdx b/src/data/contents/blocks/bento-3/bento-3.mdx
new file mode 100644
index 00000000..23166140
--- /dev/null
+++ b/src/data/contents/blocks/bento-3/bento-3.mdx
@@ -0,0 +1,29 @@
+---
+title: Bento-3
+slug: bento-3
+category: bento
+description: >-
+ A workflow-focused bento layout highlighting tool access, activity tracking,
+ performance metrics, and team-level interactions in a structured grid.
+image: 'https://assets.watermelon.sh/components/bento-3.webp'
+video: 'https://assets.watermelon.sh/components/bento-3.mp4'
+featured: false
+comingSoon: false
+dependencies:
+ - motion/react
+install:
+ - 'npx shadcn@latest add https://registry.watermelon.sh/r/bento-3.json'
+componentNumber: 1
+---
+
+# Bento-3
+
+A utility-driven bento layout built around workflows, combining quick access panels, live updates, and performance indicators.
+
+- **Access Hub Panel** – A primary block introducing “Smart Access Hub” with a layered menu (Table, Status, Position, Comments, Search).
+- **Live Activity Feed** – A minimal stream section showing ongoing updates and team actions in real time.
+- **Performance Metric Card** – A bold “+93.5%” indicator paired with supporting text for quick KPI visibility.
+- **Toggle Interaction Block** – A small switch element with user context (Kyle), suggesting permission or state control.
+- **User Selection List** – Selectable user entries with check states, hinting at assignment or filtering actions.
+- **Update Timeline** – A compact feed of recent actions (Leo, Raj, Mia) showing chronological workflow events.
+- **Structured Grid Layout** – Balanced distribution of large and small cards, prioritizing access, updates, and control.
\ No newline at end of file
diff --git a/src/data/contents/blocks/bento-3/demo.tsx b/src/data/contents/blocks/bento-3/demo.tsx
new file mode 100644
index 00000000..a915c0fd
--- /dev/null
+++ b/src/data/contents/blocks/bento-3/demo.tsx
@@ -0,0 +1,9 @@
+import Bento3 from '.'
+
+const demo = () => {
+ return (
+
+ )
+}
+
+export default demo
\ No newline at end of file
diff --git a/src/data/contents/blocks/bento-3/index.tsx b/src/data/contents/blocks/bento-3/index.tsx
new file mode 100644
index 00000000..34e5a554
--- /dev/null
+++ b/src/data/contents/blocks/bento-3/index.tsx
@@ -0,0 +1,749 @@
+"use client";
+import React from "react";
+import { AnimatePresence, motion, useInView } from "motion/react";
+import {
+ Card,
+ CardHeader,
+ CardTitle,
+ CardDescription,
+ CardContent,
+ CardFooter,
+} from "@/components/base-ui/card";
+
+const CARD6_FEED = [
+ {
+ id: "alice",
+ name: "Alice g.",
+ message: "Alice successfully participated in the Team",
+ date: "13.10.2025 Tuesday",
+ },
+ {
+ id: "raj",
+ name: "Raj g.",
+ message: "Raj successfully participated in the Team",
+ date: "13.10.2025 Tuesday",
+ },
+ {
+ id: "shane",
+ name: "Shane p.",
+ message: "Shane successfully participated in the Team",
+ date: "13.10.2025 Tuesday",
+ },
+ {
+ id: "mia",
+ name: "Mia r.",
+ message: "Mia completed a customer feedback sync",
+ date: "14.10.2025 Wednesday",
+ },
+ {
+ id: "leo",
+ name: "Leo t.",
+ message: "Leo updated the sprint delivery timeline",
+ date: "14.10.2025 Wednesday",
+ },
+] as const;
+
+type Card6FeedItem = (typeof CARD6_FEED)[number];
+type Card6VisibleEntry = {
+ key: number;
+ item: Card6FeedItem;
+};
+
+const CARD3_TARGET_TENTHS = 936;
+const CARD3_DURATION_SECONDS = 4.2;
+
+const buildDigitTrack = (steps: number) =>
+ Array.from({ length: steps + 1 }, (_, index) => index % 10);
+
+const CARD3_TENS_STEPS = Math.floor(CARD3_TARGET_TENTHS / 100);
+const CARD3_ONES_STEPS = Math.floor(CARD3_TARGET_TENTHS / 10);
+const CARD3_DECIMAL_STEPS = CARD3_TARGET_TENTHS;
+
+const CARD3_TENS_TRACK = buildDigitTrack(CARD3_TENS_STEPS);
+const CARD3_ONES_TRACK = buildDigitTrack(CARD3_ONES_STEPS);
+const CARD3_DECIMAL_TRACK = buildDigitTrack(CARD3_DECIMAL_STEPS);
+
+const CARD5_USERS = [
+ { id: "alice", name: "Alice g.", email: "alice@gmail.com" },
+ { id: "park", name: "Park k.", email: "alice@gmail.com" },
+ { id: "leon", name: "Leon k.", email: "alice@gmail.com" },
+] as const;
+
+const MotionCard = motion(Card);
+
+const Bento3 = () => {
+ const [isCard4On, setIsCard4On] = React.useState(false);
+ const card4Name = isCard4On ? "Mia" : "Kyle";
+ const [card2SwapIndex, setCard2SwapIndex] = React.useState(0);
+ const card3Ref = React.useRef(null);
+ const isCard3InView = useInView(card3Ref, { once: true, amount: 0.6 });
+ const [card5CheckedCount, setCard5CheckedCount] = React.useState(0);
+
+ const card2Cards = [
+ { id: "think", label: "Think", img: "https://assets.watermelon.sh/Cube.svg" },
+ { id: "analyze", label: "Analyze", img: "https://assets.watermelon.sh/Compose.svg" },
+ { id: "record", label: "Record", img: "https://assets.watermelon.sh/Closed%20Treasure%20Chest.svg" },
+ { id: "status", label: "Status", img:"https://assets.watermelon.sh/Cube.svg" },
+ { id: "write", label: "Write", img: "https://assets.watermelon.sh/Edit%20Chat%20History.svg" },
+ { id: "host", label: "Host", img: "https://assets.watermelon.sh/Cloud%20Storage.svg" },
+ ] as const;
+
+ const card2SwapOrder = ["think", "analyze", "write", "host", "status"] as const;
+
+ const card2Slots = {
+ think: { x: -138, y: -92 },
+ analyze: { x: 138, y: -92 },
+ record: { x: 0, y: -44 },
+ status: { x: 0, y: 90 },
+ write: { x: -138, y: 44 },
+ host: { x: 138, y: 44 },
+ } as const;
+
+ React.useEffect(() => {
+ const intervalId = setInterval(() => {
+ setCard2SwapIndex((prev) => (prev + 1) % card2SwapOrder.length);
+ }, 1800);
+
+ return () => clearInterval(intervalId);
+ }, [card2SwapOrder.length]);
+
+ const getCard2SlotId = (cardId: (typeof card2Cards)[number]["id"]) => {
+ const currentSwapTarget = card2SwapOrder[card2SwapIndex];
+
+ if (cardId === "record") return currentSwapTarget;
+ if (cardId === currentSwapTarget) return "record";
+ return cardId;
+ };
+
+ const [card6VisibleEntries, setCard6VisibleEntries] = React.useState(() => [
+ { key: 0, item: CARD6_FEED[0] },
+ { key: 1, item: CARD6_FEED[1] },
+ { key: 2, item: CARD6_FEED[2] },
+ ]);
+ const card6CursorRef = React.useRef(3);
+ const card6KeyRef = React.useRef(3);
+
+ React.useEffect(() => {
+ const intervalId = setInterval(() => {
+ setCard6VisibleEntries((prev) => {
+ const nextItem = CARD6_FEED[card6CursorRef.current % CARD6_FEED.length];
+ card6CursorRef.current += 1;
+
+ const nextKey = card6KeyRef.current;
+ card6KeyRef.current += 1;
+
+ return [prev[1], prev[2], { key: nextKey, item: nextItem }];
+ });
+ }, 1800);
+
+ return () => clearInterval(intervalId);
+ }, []);
+
+ React.useEffect(() => {
+ const hasCompletedCycle = card5CheckedCount >= CARD5_USERS.length;
+
+ const timeoutId = setTimeout(() => {
+ if (hasCompletedCycle) {
+ // Reset all checks together before starting the next loop.
+ setCard5CheckedCount(0);
+ return;
+ }
+
+ setCard5CheckedCount((prev) => Math.min(prev + 1, CARD5_USERS.length));
+ }, hasCompletedCycle ? 1100 : 800);
+
+ return () => clearTimeout(timeoutId);
+ }, [card5CheckedCount]);
+
+ return (
+
+ {/* Back */}
+
+ {/*
+ Layout structure (nested flex for per-row column control):
+ Row 1: [Card1 (wide)] [Card2 (narrower)]
+ Rows 2-3: [Left section] [Right: Card5 spanning full height]
+ Left section Row A: [Card3 (wider)] [Card4 (narrower)]
+ Left section Row B: [Card6 (equal)] [Card7 (equal)]
+ */}
+
+ {/* ===== ROW 1 ===== */}
+
+ {/* Card 1 - Your Workflow, Accelerated (wider) */}
+
+
+ {/* Left content */}
+
+
+
+ Your Workflow, Accelerated.
+
+
+ Smart Access Hub
+
+
+ Your most-used tools, intelligently organized. Spend less time
+ searching and more time doing.
+
+
+
+ {/* Right floating menu card */}
+
+ Table
+ Status
+ Position
+ Comments
+
+ Active Search
+
+
+
+
+
+ {/* Card 2 - Live Activity Stream (Think, Analyze, Record, Write, Host) */}
+
+
+
+ {/* Labels and circles arrangement */}
+ {/* Top row labels */}
+
+ {card2Cards.map((card) => {
+ const slotId = getCard2SlotId(card.id);
+ const slot = card2Slots[slotId];
+
+ return (
+
+
+
+ {card.label}
+
+
+ );
+ })}
+
+
+ {/* Bottom text */}
+
+
+ Live Activity Stream
+
+
+ See important updates from your team as they happen.
+
+
+
+
+
+ {/* ===== ROWS 2-3 wrapper ===== */}
+
+ {/* Left section (rows 2 and 3 stacked) */}
+
+ {/* Row 2: Success Metric + Kyle */}
+
+ {/* Card 3 - Success Metric (+93.6%) — wider */}
+
+
+
+
+ {/* Big percentage */}
+
+ +
+
+
+ .
+
+ %
+
+
+ {/* Text content */}
+
+
+ Success Metric
+
+
+ Key performance indicators, visualized.
+
+
+
+
+
+ {/* Card 4 - Kyle avatar — narrower */}
+
+
+ setIsCard4On((prev) => !prev)}
+ onKeyDown={(e) => {
+ if (e.key === "Enter" || e.key === " ") {
+ e.preventDefault();
+ setIsCard4On((prev) => !prev);
+ }
+ }}
+ className={`w-18 h-10 rounded-full border relative`}
+ animate={{
+ backgroundColor: isCard4On
+ ? "#4488FF"
+ : "rgba(217, 217, 217, 0.1)",
+ borderColor: isCard4On ? "#5BA6FF" : "#3A3A3A",
+ }}
+ transition={{ duration: 0.45, ease: "easeInOut" }}
+ >
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* Row 3: Activity Timeline + Work From Anywhere (EQUAL width) */}
+
+ {/* Card 6 - Live Activity Stream (Timeline) */}
+
+
+
+ {/* Activity entries */}
+
+
+ {card6VisibleEntries.map(({ key, item }, index) => (
+
+
+
+
+
+
+ {item.name}
+
+
+ {item.message}
+
+
+ {item.date}
+
+
+
+ ))}
+
+
+
+ {/* Bottom text */}
+
+
+ Live Activity Stream
+
+
+ See important updates from your team as they happen.
+
+
+
+
+ {/* Card 7 - Work From Anywhere (Phone mockup) */}
+
+
+
+ {/* Phone mockup */}
+
+
+
+
+
+
+
+
+
+ {/* Bottom text */}
+
+
+ Work From Anywhere.
+
+
+ Manage your pipeline on the go. Get the native app for iOS
+ and Android.
+
+
+
+
+
+
+ {/* Right section: Card 5 - User Management (spans full height of rows 2-3) */}
+
+
+
+ {/* Top tags */}
+
+
+
+ Change
+
+
+ Edit users
+
+
+
+
+ Current Date
+
+
+ Current Day
+
+
+
+ {/* User list */}
+
+ {CARD5_USERS.map((user, index) => {
+ const isChecked = index < card5CheckedCount;
+
+ return (
+
+
+
+
+
+
+
+
+
+
+ {user.name}
+
+
+
+
+
+ {user.email}
+
+
+
+
+
+ );
+ })}
+
+
+ {/* Keyboard */}
+
+
+
+
+
+
+
+ );
+};
+
+export default Bento3;
+
+/* ============================
+ SUB-COMPONENTS
+ ============================ */
+
+const BullseyeIcon = ({ className }: { className?: string }) => {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+const PhoneMockup = () => {
+ return (
+
+ );
+};
+
+const KeyboardGraphic = () => {
+ return (
+
+ );
+};
+
+const Arrow = () => {
+ return (
+
+
+
+ );
+};
+
+const RollingDigit = ({
+ steps,
+ track,
+ shouldStart,
+ durationSeconds,
+}: {
+ steps: number;
+ track: number[];
+ shouldStart: boolean;
+ durationSeconds: number;
+}) => {
+ return (
+
+
+ {track.map((value, index) => (
+
+ {value}
+
+ ))}
+
+
+ );
+};
diff --git a/src/data/contents/blocks/bento-4/bento-4.mdx b/src/data/contents/blocks/bento-4/bento-4.mdx
new file mode 100644
index 00000000..5c287ddf
--- /dev/null
+++ b/src/data/contents/blocks/bento-4/bento-4.mdx
@@ -0,0 +1,29 @@
+---
+title: Bento-4
+slug: bento-4
+category: bento
+description: >-
+ A prompt-focused bento layout built around a central hero, surrounded by
+ usage stats, creation tools, and guided prompt utilities.
+image: 'https://assets.watermelon.sh/components/bento-4.webp'
+video: 'https://assets.watermelon.sh/components/bento-4.mp4'
+featured: false
+comingSoon: false
+dependencies:
+ - motion/react
+install:
+ - 'npx shadcn@latest add https://registry.watermelon.sh/r/bento-4.json'
+componentNumber: 1
+---
+
+# Bento-4
+
+A prompt-centric bento layout where a dominant central block is supported by surrounding stats, actions, and utility cards.
+
+- **Central Prompt Core** – A large hero block (“Master AI Prompting”) with a circular cutout, acting as the visual anchor of the layout.
+- **Usage Metrics** – Highlighted stats like “17M+ prompts crafted” and “21K users” placed in isolated cards for quick scanning.
+- **Trial Entry Block** – A dedicated section promoting onboarding with “10 days free trial” and pricing context.
+- **Creation Trigger** – A prominent “Create” button placed in its own card to emphasize primary action.
+- **Prompt Utilities** – Supporting cards like “Branching paths” and “Precision booster” describing how prompts can be refined.
+- **Template Access Panel** – A block offering formats (JPG, PNG, PDF) and quick actions like rewrite and trial entry.
+- **Accent-Driven Layout** – Strong orange tones used to highlight hierarchy, especially around the central core and key metrics.
diff --git a/src/data/contents/blocks/bento-4/demo.tsx b/src/data/contents/blocks/bento-4/demo.tsx
new file mode 100644
index 00000000..4e7db5fb
--- /dev/null
+++ b/src/data/contents/blocks/bento-4/demo.tsx
@@ -0,0 +1,9 @@
+import Bento4 from '.'
+
+const demo = () => {
+ return (
+
+ )
+}
+
+export default demo
\ No newline at end of file
diff --git a/src/data/contents/blocks/bento-4/index.tsx b/src/data/contents/blocks/bento-4/index.tsx
new file mode 100644
index 00000000..b1c83001
--- /dev/null
+++ b/src/data/contents/blocks/bento-4/index.tsx
@@ -0,0 +1,1862 @@
+"use client";
+import React, { useRef, useEffect } from "react";
+import { motion } from "motion/react";
+import Matter from "matter-js";
+import {
+ Card,
+ CardHeader,
+ CardTitle,
+ CardDescription,
+ CardContent,
+ CardFooter,
+} from "@/components/base-ui/card";
+
+const Bento4 = () => {
+ return (
+
+
+ {/* Bento Grid Container */}
+
+
+ {/* Card 1 */}
+
+
+
+
+ Perfect Prompts, Instantly
+
+
+
+
+
+ 10 days free trial
+
+
+ then – $5/month
+
+
+
+
+ {/* Card 2 */}
+
+
+
+
+
+ IdeaFlow
+
+
+ Master AI Prompting.
+
+
+
+
+
+
+
+
+ {/* Card 3 */}
+
+
+
+
+
+
+ {/* Card 4 */}
+
+
+ 17M+
+
+
+
+ prompts crafted
+
+
+
+ {/* Card 5 */}
+
+
+
+ 21K
+
+
+ satisfied users
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* Card 6 */}
+
+
+
+ {/* Hidden SVG definitions */}
+
+
+
+
+
+
+
+
+ {/* Clipped container */}
+
+
+
+ {/* Decorative lines */}
+
+
+
+
+
}
+ />
+
+
+
+ Branching paths
+
+
+ Discover ideas through multiple prompt routes.
+
+
+
+
+
+ {/* Card 7 */}
+
+
+
+ {/* Hidden SVG definitions */}
+
+
+
+
+
+
+
+
+ {/* Clipped container */}
+
+
+
+ {/* Decorative lines */}
+
+
+
+
+
}
+ />
+
+
+
+ Precision booster
+
+
+ Sharpen every prompt with keyword boosts.
+
+
+
+
+
+ {/* Card 8 */}
+
+
+
+ Prompt templates
+
+
+ Start faster with ready-to-use templates.
+
+
+
+
+
+
+
+
+ {/* Card 9 */}
+
+
+
+
+
+
+
+
+ );
+};
+
+export default Bento4;
+
+const TinyStarIcon = ({ className }: { className?: string }) => {
+ return (
+
+
+
+ );
+};
+
+const CardThreeToggle = () => {
+ const [enabled, setEnabled] = React.useState(false);
+
+ return (
+ setEnabled((value) => !value)}
+ className="w-36 h-18 border border-[#CB8265]/45 rounded-full relative overflow-hidden"
+ >
+
+
+
+
+ {enabled ? (
+
+ ) : (
+
+ )}
+
+
+
+ );
+};
+
+type StarParticle = {
+ id: number;
+ angle: number;
+ distance: number;
+ rotate: number;
+ size: number;
+ delay: number;
+ duration: number;
+};
+
+const makeStarParticles = (count: number): StarParticle[] => {
+ return Array.from({ length: count }, (_, index) => ({
+ id: index,
+ angle: Math.random() * Math.PI * 2,
+ distance: 60 + Math.random() * 54,
+ rotate: -180 + Math.random() * 360,
+ size: 20 + Math.random() * 10,
+ delay: Math.random() * 0.08,
+ duration: 0.7 + Math.random() * 0.45,
+ }));
+};
+
+const CardNineCTA = ({ compact = false }: { compact?: boolean }) => {
+ const [bursts, setBursts] = React.useState<
+ Array<{ id: number; particles: StarParticle[] }>
+ >([]);
+ const burstIdRef = React.useRef(0);
+ const lastTriggerAtRef = React.useRef(0);
+
+ const triggerConfetti = () => {
+ const now = Date.now();
+ // Guard against duplicate click events emitted in very quick succession.
+ if (now - lastTriggerAtRef.current < 220) {
+ return;
+ }
+ lastTriggerAtRef.current = now;
+
+ const id = burstIdRef.current + 1;
+ burstIdRef.current = id;
+
+ // Keep only one active burst so every user action maps to exactly one burst.
+ setBursts([
+ {
+ id,
+ particles: makeStarParticles(compact ? 12 : 16),
+ },
+ ]);
+
+ window.setTimeout(() => {
+ setBursts((previous) => previous.filter((burst) => burst.id !== id));
+ }, 1600);
+ };
+
+ return (
+
+
+
+
+ Create
+
+
+
+
+
+
+ {bursts.map((burst) =>
+ burst.particles.map((particle) => {
+ const x = Math.cos(particle.angle) * particle.distance;
+ const y = Math.sin(particle.angle) * particle.distance;
+
+ return (
+
+
+
+ );
+ }),
+ )}
+
+
+ );
+};
+
+// GravityStack – matter-js physics, each item falls and stacks on the one below
+const GravityStack = () => {
+ const stackRef = useRef(null);
+ const itemRef0 = useRef(null);
+ const itemRef1 = useRef(null);
+ const itemRef2 = useRef(null);
+ const itemRef3 = useRef(null);
+ const itemRef4 = useRef(null);
+
+ useEffect(() => {
+ const container = stackRef.current;
+ if (!container) return;
+
+ let animId = 0;
+ const { Engine, Runner, Bodies, Body, Composite, World } = Matter;
+
+ const W = container.clientWidth;
+ const H = container.clientHeight;
+ const randomInRange = (min: number, max: number) =>
+ min + Math.random() * (max - min);
+ const eventCleanup: Array<() => void> = [];
+
+ const engine = Engine.create({ gravity: { x: 0, y: 1.35 } });
+ const runner = Runner.create();
+
+ // Static boundaries
+ const ground = Bodies.rectangle(W / 2, H + 28, W * 2, 56, {
+ isStatic: true,
+ friction: 0.95,
+ });
+ const wallL = Bodies.rectangle(-25, H / 2, 50, H * 3, { isStatic: true });
+ const wallR = Bodies.rectangle(W + 25, H / 2, 50, H * 3, {
+ isStatic: true,
+ });
+ Composite.add(engine.world, [ground, wallL, wallR]);
+
+ type Synced = {
+ body: ReturnType;
+ el: HTMLDivElement;
+ w: number;
+ h: number;
+ };
+ const synced: Synced[] = [];
+ let activeInteraction: { body: ReturnType; pointerId: number } | null = null;
+
+ const getLocalPoint = (event: PointerEvent) => {
+ const rect = container.getBoundingClientRect();
+ return {
+ x: event.clientX - rect.left,
+ y: event.clientY - rect.top,
+ };
+ };
+
+ const handlePointerMove = (event: PointerEvent) => {
+ if (
+ !activeInteraction ||
+ activeInteraction.pointerId !== event.pointerId
+ ) {
+ return;
+ }
+
+ const { body } = activeInteraction;
+ const point = getLocalPoint(event);
+ const deltaX = point.x - body.position.x;
+ const deltaY = point.y - body.position.y;
+ const clamp = (value: number, limit: number) =>
+ Math.max(-limit, Math.min(limit, value));
+
+ Body.applyForce(body, body.position, {
+ x: clamp(deltaX * 0.000012, 0.0009),
+ y: clamp(deltaY * 0.00001, 0.0007),
+ });
+ Body.setAngularVelocity(
+ body,
+ body.angularVelocity + clamp(deltaX * 0.00015, 0.025),
+ );
+ };
+
+ const releaseInteraction = (event: PointerEvent) => {
+ if (
+ !activeInteraction ||
+ activeInteraction.pointerId !== event.pointerId
+ ) {
+ return;
+ }
+ activeInteraction = null;
+ };
+
+ window.addEventListener("pointermove", handlePointerMove);
+ window.addEventListener("pointerup", releaseInteraction);
+ window.addEventListener("pointercancel", releaseInteraction);
+ eventCleanup.push(() =>
+ window.removeEventListener("pointermove", handlePointerMove),
+ );
+ eventCleanup.push(() =>
+ window.removeEventListener("pointerup", releaseInteraction),
+ );
+ eventCleanup.push(() =>
+ window.removeEventListener("pointercancel", releaseInteraction),
+ );
+
+ const itemRefs = [itemRef0, itemRef1, itemRef2, itemRef3, itemRef4];
+ itemRefs.forEach((ref, i) => {
+ const el = ref.current;
+ if (!el) return;
+ const w = el.offsetWidth;
+ const h = el.offsetHeight;
+ const minX = w / 2 + 12;
+ const maxX = W - w / 2 - 12;
+ const startX = randomInRange(minX, Math.max(minX, maxX));
+ const startY = -(50 + i * 62);
+ const startAngle = randomInRange(-0.26, 0.26);
+
+ const body = Bodies.rectangle(startX, startY, w, h, {
+ restitution: 0.08,
+ friction: 0.88,
+ frictionStatic: 1,
+ frictionAir: 0.018,
+ chamfer: { radius: Math.min(18, h / 2) },
+ });
+ Body.setPosition(body, { x: startX, y: startY });
+ Body.setAngle(body, startAngle);
+ Body.setAngularVelocity(body, randomInRange(-0.018, 0.018));
+
+ // Initially position DOM element
+ el.style.position = "absolute";
+ el.style.left = `${startX - w / 2}px`;
+ el.style.top = `${startY - h / 2}px`;
+ el.style.transform = `rotate(${startAngle}rad)`;
+ el.style.transformOrigin = "center";
+ el.style.cursor = "grab";
+
+ Composite.add(engine.world, body);
+ synced.push({ body, el, w, h });
+
+ const handlePointerDown = (event: PointerEvent) => {
+ activeInteraction = { body, pointerId: event.pointerId };
+ el.style.cursor = "grabbing";
+ Body.applyForce(body, body.position, {
+ x: randomInRange(-0.0004, 0.0004),
+ y: -0.00035,
+ });
+ };
+
+ const handlePointerRelease = (event: PointerEvent) => {
+ if (activeInteraction?.pointerId === event.pointerId) {
+ el.style.cursor = "grab";
+ }
+ };
+
+ el.addEventListener("pointerdown", handlePointerDown);
+ el.addEventListener("pointerup", handlePointerRelease);
+ el.addEventListener("pointercancel", handlePointerRelease);
+ eventCleanup.push(() =>
+ el.removeEventListener("pointerdown", handlePointerDown),
+ );
+ eventCleanup.push(() =>
+ el.removeEventListener("pointerup", handlePointerRelease),
+ );
+ eventCleanup.push(() =>
+ el.removeEventListener("pointercancel", handlePointerRelease),
+ );
+ });
+
+ Runner.run(runner, engine);
+
+ const sync = () => {
+ synced.forEach(({ body, el, w, h }) => {
+ el.style.left = `${body.position.x - w / 2}px`;
+ el.style.top = `${body.position.y - h / 2}px`;
+ el.style.transform = `rotate(${body.angle}rad)`;
+ });
+ animId = requestAnimationFrame(sync);
+ };
+ sync();
+
+ return () => {
+ Runner.stop(runner);
+ cancelAnimationFrame(animId);
+ eventCleanup.forEach((dispose) => dispose());
+ World.clear(engine.world, false);
+ Engine.clear(engine);
+ };
+
+ }, []);
+
+ return (
+
+
+ 10 days trial
+
+
+
+
+
+
+
+
JPG
+
+
PNG
+
+
PDF
+
+
+
+
+
+ );
+};
+
+const Icon = () => {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+const Icon2 = ({ className }: { className?: string }) => {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+const PictureIcon = ({ className }: { className?: string }) => {
+ return (
+
+
+
+
+ );
+};
+
+const MagicStar = () => {
+ return (
+
+
+
+
+ );
+};
+
+const Star = ({
+ className,
+ style,
+}: {
+ className?: string;
+ style?: React.CSSProperties;
+}) => {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+const Gift = ({ className }: { className?: string }) => {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+const Camera = ({ className }: { className?: string }) => {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+const CurvedCard = ({ className }: { className?: string }) => {
+ const idBase = React.useId().replace(/:/g, "");
+ const notchArcId = `${idBase}-curved-notch-arc`;
+ const notchFadeId = `${idBase}-curved-notch-fade`;
+
+ return (
+
+
+
+
+
+
+
+
+ {/* Base Shape */}
+
+
+ {/* Gradient Overlay */}
+
+
+
+
+ );
+};
+
+const buildBinaryRibbon = (seed: number, groups: number, bitsPerGroup = 4) => {
+ let value = seed >>> 0;
+
+ return Array.from({ length: groups }, () => {
+ let chunk = "";
+
+ for (let index = 0; index < bitsPerGroup; index += 1) {
+ value = (value * 1664525 + 1013904223) >>> 0;
+ chunk += ((value >>> 31) & 1).toString();
+ }
+
+ return chunk;
+ }).join(" ");
+};
+
+const MAIN_BINARY_RIBBON = buildBinaryRibbon(0x51f4, 19);
+const CURVED_CARD_BINARY_RIBBON = buildBinaryRibbon(0xc18d, 15);
+
+const mutateBinaryText = (value: string) => {
+ return value
+ .split("")
+ .map((character) => {
+ if (character !== "0" && character !== "1") {
+ return character;
+ }
+
+ // Flip each bit independently with a random chance per tick.
+ if (Math.random() < 0.28) {
+ return character === "0" ? "1" : "0";
+ }
+
+ return character;
+ })
+ .join("");
+};
+
+const BinaryRibbon = ({
+ pathId,
+ pathD,
+ fadeId,
+ gradientStart,
+ gradientEnd,
+ activeColor,
+ text,
+ fontSize,
+ fontWeight,
+ letterSpacing,
+ startOffset = "50%",
+ dy = 0,
+}: {
+ pathId: string;
+ pathD: string;
+ fadeId: string;
+ gradientStart: number;
+ gradientEnd: number;
+ activeColor: string;
+ text: string;
+ fontSize: number;
+ fontWeight: string | number;
+ letterSpacing: number;
+ startOffset?: string;
+ dy?: number | string;
+}) => {
+ const [animatedText, setAnimatedText] = React.useState(text);
+
+ React.useEffect(() => {
+ setAnimatedText(text);
+
+ const intervalId = window.setInterval(() => {
+ setAnimatedText((current) => mutateBinaryText(current));
+ }, 150);
+
+ return () => window.clearInterval(intervalId);
+ }, [text]);
+
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+
+ {animatedText}
+
+
+ >
+ );
+};
+
+const MainCurvedCard = ({ className }: { className?: string }) => {
+ const idBase = React.useId().replace(/:/g, "");
+ const topArcId = `${idBase}-top-binary-arc`;
+ const topFadeId = `${idBase}-top-binary-fade`;
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+const Wire = ({ className }: { className?: string }) => {
+ return (
+
+
+
+
+ );
+};
+
+const MagicCapture = ({ className }: { className?: string }) => {
+ return (
+
+
+
+
+
+
+
+
+ );
+};
+
+const Barrel = ({
+ className,
+ icon,
+ iconClassName,
+}: {
+ className?: string;
+ icon?: React.ReactNode;
+ iconClassName?: string;
+}) => {
+ return (
+
+
+
+ {icon}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+const Branch = ({ className }: { className?: string }) => {
+ const travelPath =
+ "M 5 2 C 5 5 35 33 39.38 40 L 39.38 103 C 40 108 55 122 67.38 133";
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
diff --git a/src/data/contents/blocks/bento-5/bento-5.mdx b/src/data/contents/blocks/bento-5/bento-5.mdx
new file mode 100644
index 00000000..777fbad4
--- /dev/null
+++ b/src/data/contents/blocks/bento-5/bento-5.mdx
@@ -0,0 +1,28 @@
+---
+title: Bento-5
+slug: bento-5
+category: bento
+description: >-
+ A three-block bento layout centered on cybersecurity themes,
+ highlighting protection, global connection, and performance.
+image: 'https://assets.watermelon.sh/components/bento-5.webp'
+video: 'https://assets.watermelon.sh/components/bento-5.mp4'
+featured: false
+comingSoon: false
+dependencies:
+ - motion/react
+install:
+ - 'npx shadcn@latest add https://registry.watermelon.sh/r/bento-5.json'
+componentNumber: 1
+---
+
+# Bento-5
+
+A minimal three-card bento focused on cybersecurity onboarding, pairing symbolic visuals with short explanatory text.
+
+- **Shield Entry Card** – A centered shield icon with a glowing ring, introducing the “Begin Your Cyber Journey” message.
+- **Global Network Panel** – A wide card with flowing connection lines, representing collaboration with cybersecurity experts.
+- **Speed Indicator Block** – A radial gauge labeled “Fastest”, suggesting performance, response time, or system strength.
+- **Consistent Visual Language** – Blue highlights used across all cards to unify meaning around security and trust.
+- **Even Grid Structure** – Three equal-width cards arranged horizontally for balanced presentation.
+- **Soft Glow Focus** – Each visual element uses a subtle halo to draw attention without overpowering the layout.
\ No newline at end of file
diff --git a/src/data/contents/blocks/bento-5/demo.tsx b/src/data/contents/blocks/bento-5/demo.tsx
new file mode 100644
index 00000000..37896511
--- /dev/null
+++ b/src/data/contents/blocks/bento-5/demo.tsx
@@ -0,0 +1,9 @@
+import Bento5 from '.'
+
+const demo = () => {
+ return (
+
+ )
+}
+
+export default demo
\ No newline at end of file
diff --git a/src/data/contents/blocks/bento-5/index.tsx b/src/data/contents/blocks/bento-5/index.tsx
new file mode 100644
index 00000000..335672fa
--- /dev/null
+++ b/src/data/contents/blocks/bento-5/index.tsx
@@ -0,0 +1,2354 @@
+"use client";
+
+import { useState, useEffect } from "react";
+import { motion, AnimatePresence } from "motion/react";
+import { Card, CardContent, CardDescription ,CardFooter, CardTitle } from '@/components/base-ui/card';
+
+const Bento5 = () => {
+ return (
+
+
+
+ {/* Box-1 */}
+
+
+
+
+
+
+
+ Begin Your Cyber Journey
+
+
+ Step into the essential field of digital defense. We provide the
+ foundational knowledge and hands-on skills to start your career
+ with confidence.
+
+
+
+
+
+ {/* Box-2 */}
+
+
+
+
+
+
+
+
+
+
+ Connect with Global Experts
+
+
+ You're not alone. Join a worldwide network of cybersecurity
+ professionals to exchange ideas, discuss emerging threats.
+
+
+
+
+
+ {/* Box-3 */}
+
+
+
+
+
+
+
+
+
+
+ Begin Your Cyber Journey
+
+
+ Step into the essential field of digital defense. We provide the
+ foundational knowledge and hands-on skills to start your In a
+ world of evolving threats, your skills are your weapon.{" "}
+
+
+
+
+
+
+ );
+};
+
+export default Bento5;
+
+const LOOPING_TEXTS = ["Advanced", "Fastest", "Performance"];
+
+const LoopingText = () => {
+ const [index, setIndex] = useState(0);
+
+ useEffect(() => {
+ const timer = setInterval(() => {
+ setIndex((prev) => (prev + 1) % LOOPING_TEXTS.length);
+ }, 1500);
+ return () => clearInterval(timer);
+ }, []);
+
+ return (
+
+
+
+ {LOOPING_TEXTS[index]}
+
+
+
+ );
+};
+
+const One = ({ className }: { className?: string }) => {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+const Two = ({ className }: { className?: string }) => {
+ const path1 = "M-34 0.891113C14.3787 25.5114 264.026 138.484 514 0.891113";
+ const path2 = "M-35 200.891C13.3787 176.271 263.026 63.2987 513 200.891";
+ const path3 = "M-118 17.8911C-54.7898 42.5114 271.392 155.484 598 17.8911";
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+const FloatingDot = ({
+ name,
+ pathType,
+ duration,
+ delay,
+}: {
+ name: string;
+ pathType: "path1" | "path2" | "path3";
+ duration: number;
+ delay: number;
+}) => {
+ // Cubic Bezier interpolation: P(t) = (1-t)^3*P0 + 3(1-t)^2*t*P1 + 3(1-t)*t^2*P2 + t^3*P3
+ const getBezierPoints = (p0: any, p1: any, p2: any, p3: any) => {
+ const pointsX = [];
+ const pointsY = [];
+ for (let t = 0; t <= 1; t += 0.1) {
+ const x =
+ Math.pow(1 - t, 3) * p0.x +
+ 3 * Math.pow(1 - t, 2) * t * p1.x +
+ 3 * (1 - t) * Math.pow(t, 2) * p2.x +
+ Math.pow(t, 3) * p3.x;
+ const y =
+ Math.pow(1 - t, 3) * p0.y +
+ 3 * Math.pow(1 - t, 2) * t * p1.y +
+ 3 * (1 - t) * Math.pow(t, 2) * p2.y +
+ Math.pow(t, 3) * p3.y;
+ pointsX.push(x);
+ pointsY.push(y);
+ }
+ return { x: pointsX, y: pointsY };
+ };
+
+ const pathData = {
+ path1: getBezierPoints(
+ { x: -34, y: 0.89 },
+ { x: 14.37, y: 25.51 },
+ { x: 264.02, y: 138.48 },
+ { x: 514, y: 0.89 },
+ ),
+ path2: getBezierPoints(
+ { x: -35, y: 200.89 },
+ { x: 13.37, y: 176.27 },
+ { x: 263.02, y: 63.29 },
+ { x: 513, y: 200.89 },
+ ),
+ path3: getBezierPoints(
+ { x: -118, y: 17.89 },
+ { x: -54.78, y: 42.51 },
+ { x: 271.39, y: 155.48 },
+ { x: 598, y: 17.89 },
+ ),
+ };
+
+ const { x, y } = pathData[pathType];
+
+ return (
+
+
+
+
+
+
+
+
+ {name}
+
+
+
+ );
+};
+
+const Three = ({ className }: { className?: string }) => {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
diff --git a/src/data/contents/blocks/bento-6/bento-6.mdx b/src/data/contents/blocks/bento-6/bento-6.mdx
new file mode 100644
index 00000000..07d3f3cd
--- /dev/null
+++ b/src/data/contents/blocks/bento-6/bento-6.mdx
@@ -0,0 +1,29 @@
+---
+title: Bento-6
+slug: bento-6
+category: bento
+description: >-
+ A developer-focused bento layout combining documentation previews,
+ terminal feedback, and feature highlights across a structured grid.
+image: 'https://assets.watermelon.sh/components/bento-6.webp'
+video: 'https://assets.watermelon.sh/components/bento-6.mp4'
+featured: false
+comingSoon: false
+dependencies:
+ - motion/react
+install:
+ - 'npx shadcn@latest add https://registry.watermelon.sh/r/bento-6.json'
+componentNumber: 1
+---
+
+# Bento-6
+
+A product-oriented bento layout that blends documentation, system feedback, and feature highlights into a unified view.
+
+- **Docs Preview Panel** – A sidebar-style block showing sections like Getting Started, API Reference, and User Guides.
+- **Terminal Feedback Block** – A code-style panel displaying setup logs and running status (“listening on port 3000”).
+- **Performance Card** – A large icon-led block emphasizing speed and efficiency.
+- **Integration Cluster** – A central node surrounded by connected tool icons, representing ecosystem compatibility.
+- **Conversion Focus Card** – A feature block highlighting user-to-customer flow.
+- **Vertical Progress List** – A stacked list (developer, designer, product) aligned with a timeline-style indicator.
+- **Payment Section** – A card introducing subscription and payment handling.
\ No newline at end of file
diff --git a/src/data/contents/blocks/bento-6/demo.tsx b/src/data/contents/blocks/bento-6/demo.tsx
new file mode 100644
index 00000000..a94b5b31
--- /dev/null
+++ b/src/data/contents/blocks/bento-6/demo.tsx
@@ -0,0 +1,9 @@
+import Bento6 from '.'
+
+const demo = () => {
+ return (
+
+ )
+}
+
+export default demo
\ No newline at end of file
diff --git a/src/data/contents/blocks/bento-6/index.tsx b/src/data/contents/blocks/bento-6/index.tsx
new file mode 100644
index 00000000..be778a0e
--- /dev/null
+++ b/src/data/contents/blocks/bento-6/index.tsx
@@ -0,0 +1,913 @@
+import React, { useState, useEffect } from "react";
+import { motion, AnimatePresence } from "motion/react";
+import { Card, CardContent, CardFooter } from "@/components/base-ui/card";
+
+const Bento6 = () => {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+ Gorgeous out of the box
+
+
+ Everything you need to start building fast.
+
+
+
+
+ {/* Card 2: Developer forward */}
+
+
+
+
+
+
+ Developer forward
+
+ Built for developers with clean and flexible tools.
+
+
+
+
+ {/* Card 3: Build for performance */}
+
+
+
+
+
+ Build for performance
+
+ Fast, efficient, and optimized for scale and reliability.
+
+
+
+
+ {/* Card 4: Conversion as a priority */}
+
+
+
+
+
+
+ Conversion as a priority
+
+
+ Designed to turn visitors into loyal customers.
+
+
+
+
+ {/* Card 5: Effortless funding */}
+
+
+
+
+
+ Effortless funding
+
+ Simple payments and subscription management for your business.
+
+
+
+
+
+
+ {/* Background Subtle Effects */}
+
+
+ );
+};
+
+export default Bento6;
+
+const Card1 = () => {
+ const [activeTab, setActiveTab] = useState<"doc" | "api">("doc");
+
+ return (
+ setActiveTab("api")}
+ onMouseLeave={() => setActiveTab("doc")}
+ >
+
+
+
+
+
+
+
+
+
+ setActiveTab("doc")}
+ className={`text-xs md:text-sm font-semibold py-1 border-b-2 transition-all duration-300 ${
+ activeTab === "doc"
+ ? "text-white border-[#1145AA]"
+ : "text-[#838883] border-transparent hover:text-white/80"
+ }`}
+ >
+ Documentation
+
+
+ API Reference
+
+
+
+
+
+ {activeTab === "doc" ? (
+
+
+
+
+
+
+
+ Getting Started
+
+
+
+
+
+
+
+
+
+ Get Started
+
+
+
+ Introduction
+
+
+ Gain control of your spending with intuitive tracking.
+
+
+
+
+
+ ) : (
+
+
+
+
+ GET
+
+
+ /v1/user/profile
+
+
+
+
+ POST
+
+
+ /v1/user/auth
+
+
+
+
+ PUT
+
+
+ /v1/user/update
+
+
+
+
+
+
+ Response
+ 200 OK
+
+
+ {"{"}
+
+ "status" :{" "}
+ "success" ,
+
+
+
"data" : {"{"}
+
+ "id" :{" "}
+ "usr_928" ,
+
+
+ "email" :{" "}
+ "malay@patel.com" ,
+
+
+ "role" :{" "}
+ "premium"
+
+
{"}"}
+
+ {"}"}
+
+
+
+ )}
+
+
+
+ );
+};
+
+const Icon = ({ className }: { className?: string }) => {
+ return (
+
+
+
+ );
+};
+
+const Folder = ({ className }: { className?: string }) => {
+ return (
+
+
+
+ );
+};
+
+const API = ({ className }: { className?: string }) => {
+ return (
+
+
+
+
+
+
+
+ );
+};
+
+const Profile = ({ className }: { className?: string }) => {
+ return (
+
+
+
+
+
+ );
+};
+
+const Card2 = () => {
+ const [sessionKey, setSessionKey] = useState(0);
+
+ const terminalTemplates = [
+ [
+ { text: "➜ ~ pkg install @motion/core", color: "text-zinc-100" },
+ { text: "added 124 packages in 2.1s", color: "text-zinc-500" },
+ { text: "➜ ~ npx ui-pro@latest init", color: "text-zinc-100" },
+ {
+ text: "✔ Configuration synced successfully",
+ color: "text-emerald-400",
+ },
+ { text: "➜ ~ npm run dev:motion", color: "text-zinc-100" },
+ { text: "▲ Ready - listening on port 3000", color: "text-sky-400" },
+ ],
+ [
+ { text: "λ /motion-app: git branch", color: "text-violet-400" },
+ { text: "* main", color: "text-zinc-100" },
+ { text: "λ /motion-app: motion deploy --prod", color: "text-violet-400" },
+ { text: "⠋ Uploading assets to edge...", color: "text-zinc-500" },
+ { text: "✔ Deployment successful (2.4s)", color: "text-amber-400" },
+ {
+ text: "➜ https://motion.dev/prod-v42",
+ color: "text-zinc-100 underline decoration-amber-500/50",
+ },
+ ],
+ ];
+
+ const currentLines = terminalTemplates[sessionKey % terminalTemplates.length];
+ const isTemplateOne = sessionKey % 2 === 0;
+
+ useEffect(() => {
+ const timer = setInterval(() => {
+ setSessionKey((prev) => prev + 1);
+ }, 3000); // 6s loop for readability
+ return () => clearInterval(timer);
+ }, []);
+
+ const containerVariants = {
+ animate: {
+ transition: {
+ staggerChildren: 0.2,
+ delayChildren: 0.4,
+ },
+ },
+ } as const;
+
+ const lineVariants = {
+ initial: { opacity: 0, y: 4 },
+ animate: {
+ opacity: 1,
+ y: 0,
+ transition: {
+ duration: 0.25,
+ },
+ },
+ } as const;
+
+ const cursorVariants = {
+ animate: {
+ opacity: [0, 1, 0],
+ transition: {
+ duration: 0.8,
+ repeat: Infinity,
+ ease: "linear" as const,
+ },
+ },
+ };
+
+ return (
+
+ {/* Header */}
+
+
+
+
+ {isTemplateOne ? "bash — setup" : "zsh — production"}
+
+
+
+ Card 2
+
+
+
+ {/* Terminal Content */}
+
+
+
+ {currentLines.map((line, i) => (
+
+ {line.text}
+ {i === currentLines.length - 1 && (
+
+ )}
+
+ ))}
+
+
+
+
+ );
+};
+
+const Card3 = () => {
+ return (
+
+ );
+};
+
+const Card5 = () => {
+ const items = [
+ { title: "Developer forward", desc: "with intuitive tracking and tools." },
+ { title: "Designer creative", desc: "enhanced user experience design." },
+ { title: "Product strategic", desc: "seamless and rapid integration." },
+ ];
+
+ return (
+
+ {/* Background Vertical Line */}
+
+
+ {/* Moving Spark on the line */}
+
+
+
+ {items.map((item, i) => (
+
+ ))}
+
+
+ );
+};
+
+const TimelineItem = ({
+ index,
+ title,
+ desc,
+}: {
+ index: number;
+ title: string;
+ desc: string;
+}) => {
+ const syncDelay = index * 2;
+ const syncDuration = 2.5;
+
+ return (
+
+ {/* Node (Dot) */}
+
+
+
+ {/* Subtle Outer Ring Pulse */}
+
+
+
+ {/* Content Card */}
+
+
+
+ {title}
+
+
+ {desc}
+
+
+
+ );
+};
+
+const GoogleCloudIcon = ({ className }: { className?: string }) => {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+const ClineIcon = ({ className }: { className?: string }) => {
+ return (
+
+
+
+
+ );
+};
+
+const CloudfareIcon = ({ className }: { className?: string }) => {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+const FeatherlessIcon = ({ className }: { className?: string }) => {
+ return (
+
+
+
+ );
+};
+
+const LumaIcon = ({ className }: { className?: string }) => {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+const MoleculerIcon = ({ className }: { className?: string }) => {
+ return (
+
+
+
+ );
+};
+
+const Card4 = () => {
+ const icons = [
+ { component: GoogleCloudIcon, color: "#4285F4" },
+ { component: ClineIcon, color: "#FFFFFF" },
+ { component: LumaIcon, color: "#FFFFFF" },
+ { component: MoleculerIcon, color: "#3cafce" },
+ { component: CloudfareIcon, color: "#F4811F" },
+ { component: FeatherlessIcon, color: "#ffe184" },
+ ];
+
+ return (
+
+ {/* Background Orbit Paths */}
+
+
+
+
+ {/* Decorative Glow */}
+
+
+
+ {/* Main Center Icon with Pulsing Effect */}
+
+
+
+
+ {/* Orbiting Icons */}
+
+ {icons.map((item, i) => (
+
+ ))}
+
+
+ );
+};
+
+const OrbitingElement = ({
+ index,
+ total,
+ IconComponent,
+ color,
+}: {
+ index: number;
+ total: number;
+ IconComponent: React.ComponentType<{ className?: string }>;
+ color: string;
+}) => {
+ // Use a smaller radius on mobile to prevent overflow
+ const [radius, setRadius] = useState(105);
+
+ useEffect(() => {
+ const updateRadius = () => {
+ setRadius(window.innerWidth < 640 ? 70 : 90);
+ };
+ updateRadius();
+ window.addEventListener("resize", updateRadius);
+ return () => window.removeEventListener("resize", updateRadius);
+ }, []);
+
+ const initialAngle = (index / total) * 360;
+ const duration = 20;
+
+ return (
+
+
+
+
+
+ );
+};
diff --git a/src/data/contents/blocks/bento-7/bento-7.mdx b/src/data/contents/blocks/bento-7/bento-7.mdx
new file mode 100644
index 00000000..8fc04161
--- /dev/null
+++ b/src/data/contents/blocks/bento-7/bento-7.mdx
@@ -0,0 +1,28 @@
+---
+title: Bento-7
+slug: bento-7
+category: bento
+description: >-
+ A three-block bento layout showcasing AI-assisted workflows,
+ a central intelligence hub, and system-level optimization.
+image: 'https://assets.watermelon.sh/components/bento-7.webp'
+video: 'https://assets.watermelon.sh/components/bento-7.mp4'
+featured: false
+comingSoon: false
+dependencies:
+ - motion/react
+install:
+ - 'npx shadcn@latest add https://registry.watermelon.sh/r/bento-7.json'
+componentNumber: 1
+---
+
+# Bento-7
+
+A three-card bento layout built around AI-driven interactions, with each block centered on a single function and visual focus.
+
+- **AI Assist Module** – A compact toggle interface (A/B state with check) representing assisted decision or tool switching.
+- **Cognito Core** – A hexagonal central unit connected with vertical signal lines, suggesting monitoring and internal processing.
+- **System Engine Block** – A structured card element with layered UI pieces, representing coordinated system output.
+- **Centered Composition** – Each card places a single object in focus, avoiding clutter and reinforcing clarity.
+- **Soft Surface Styling** – Raised elements with subtle shadows and highlights, giving a tactile interface feel.
+- **Signal-Based Detailing** – Thin lines and small nodes hint at data flow and system communication.
\ No newline at end of file
diff --git a/src/data/contents/blocks/bento-7/demo.tsx b/src/data/contents/blocks/bento-7/demo.tsx
new file mode 100644
index 00000000..a538c65a
--- /dev/null
+++ b/src/data/contents/blocks/bento-7/demo.tsx
@@ -0,0 +1,9 @@
+import Bento7 from '.'
+
+const demo = () => {
+ return (
+
+ )
+}
+
+export default demo
\ No newline at end of file
diff --git a/src/data/contents/blocks/bento-7/index.tsx b/src/data/contents/blocks/bento-7/index.tsx
new file mode 100644
index 00000000..2fc7d738
--- /dev/null
+++ b/src/data/contents/blocks/bento-7/index.tsx
@@ -0,0 +1,905 @@
+"use client";
+import React from "react";
+import { motion } from "motion/react";
+import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/base-ui/card';
+
+const Bento7 = () => {
+ const [status, setStatus] = React.useState<"loading" | "complete">("loading");
+
+ React.useEffect(() => {
+ const cycle = setInterval(() => {
+ setStatus((prev) => (prev === "loading" ? "complete" : "loading"));
+ }, 3000);
+ return () => clearInterval(cycle);
+ }, []);
+
+ return (
+
+
+
+
+ {/* card 1 */}
+
+
+
+
+
+
+
+ AI Driven Assist
+
+ Enhance your design projects with AI tools for creativity and
+ efficiency.{" "}
+
+
+
+
+ {/* Card 2 */}
+
+
+
+
+
+ Cognito Core
+
+ The intelligent hub that unifies, monitors, and autonomously
+ tunes.{" "}
+
+
+
+
+ {/* Card 3 */}
+
+
+
+
+
+
+
+
+ System Synergy Engine
+
+
+ A proactive AI unit that maximizes efficiency and resource
+ distribution.{" "}
+
+
+
+
+
+ );
+};
+
+export default Bento7;
+
+const CheckIcon = ({
+ className,
+ status,
+}: {
+ className?: string;
+ status: "loading" | "complete";
+}) => {
+ return (
+
+ {status === "loading" ? (
+
+
+
+
+ ) : (
+
+ )}
+
+ );
+};
+
+const Wires = ({ className }: { className?: string }) => {
+ return (
+
+
+
+ {[
+ "M5.88318 39.5H57.0234L71.3923 24.5H92.8077",
+ "M96.5 62H83.9462L69.9154 45.5H0.948601",
+ "M95.0231 64.5H54.4077L40.3769 49.5L0.500003 50",
+ ].map((d, i) => (
+
+
+
+
+ ))}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+const Star = ({ className }: { className?: string }) => {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+const StarIcon = ({ className }: { className?: string }) => {
+ return (
+
+
+
+
+ );
+};
+
+const Cognito = ({ className }: { className?: string }) => {
+ return (
+
+
+ {[
+ "M173.017 117L173.017 60.0005L188.017 43.9851L188.017 20.1159",
+ "M150.517 16.0005L150.517 29.9928L167.017 45.6313L167.017 122.5",
+ "M148.017 17.6466L148.017 62.9159L163.017 78.5543L162.517 123",
+ ].map((d, i) => (
+
+ ))}
+
+ {[
+ "M163.019 265L163.019 322L148.019 338.016L148.019 361.885",
+ "M185.519 366L185.519 352.008L169.019 336.37L169.019 259.5",
+ "M188.019 364.354L188.019 319.085L173.019 303.447L173.519 259",
+ ].map((d, i) => (
+
+ ))}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
\ No newline at end of file
diff --git a/src/types/matter-js.d.ts b/src/types/matter-js.d.ts
new file mode 100644
index 00000000..a5484906
--- /dev/null
+++ b/src/types/matter-js.d.ts
@@ -0,0 +1,4 @@
+declare module "matter-js" {
+ const Matter: any;
+ export default Matter;
+}
\ No newline at end of file