+ {post.metadata.description} +
+ ) : null} +commit 9eb1dc2f340a2758ad6c2d0e616b045eb2ebe974 Author: fengxiangdebaozi <10845145+fengxiangdebaozi@user.noreply.gitee.com> Date: Wed May 13 12:56:52 2026 +0800 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..fa12407a --- /dev/null +++ b/.gitignore @@ -0,0 +1,56 @@ +# Workspace/editor +.vscode/ +frontend-web/.vscode/ + +# Frontend local/runtime artifacts +frontend-web/.env +frontend-web/node_modules/ +frontend-web/tsconfig.tsbuildinfo +frontend-web/vite-dev.log +frontend-web/vite-dev.err.log + +# Frontend local packages/archives/docs (non-source) +frontend-web/pnpm-lock.yaml +frontend-web/README.md +frontend-web/doc.md +frontend-web/src.zip +frontend-web/src9.zip +frontend-web/src-v1.zip +frontend-web/src-*.rar + +# Frontend build artifacts +frontend-web/dist-scheduled-check/ + +# Offline backend bundles and local deployment artifacts +offline-backend-20260505.zip +offline-backend-20260505/output/ +offline-backend-20260505/bundle/.env +offline-backend-20260505/bundle/.env.example +offline-backend-20260505/bundle/DEPLOY_BACKEND_OFFLINE_ZH.md +offline-backend-20260505/bundle/SHA256SUMS +offline-backend-20260505/bundle/config.yaml +offline-backend-20260505/bundle/config.yaml.example +offline-backend-20260505/bundle/data/ +offline-backend-20260505/bundle/deerflow-backend-offline-image-20260505.tar +offline-backend-20260505/bundle/extensions_config.json +offline-backend-20260505/bundle/frontend-vite.zip +offline-backend-20260505/bundle/skills/ +offline-backend-20260505/bundle/start_backend.0509.sh +offline-backend-20260505/bundle/start_backend.sh +offline-backend-20260505/bundle/stop_backend.sh + +# offline-backend-20260512 runtime artifacts (large files, local config, data) +offline-backend-20260512/.env +offline-backend-20260512/.env.example +offline-backend-20260512/DEPLOY_BACKEND_OFFLINE_ZH.md +offline-backend-20260512/SHA256SUMS +offline-backend-20260512/config.yaml +offline-backend-20260512/config.yaml.example +offline-backend-20260512/data/ +offline-backend-20260512/deerflow-backend-offline-image-20260505.tar +offline-backend-20260512/extensions_config.json +offline-backend-20260512/skills/ +offline-backend-20260512/wheelhouse/ +offline-backend-20260512/start_backend.sh +offline-backend-20260512/stop_backend.sh +offline-backend-20260512/check_backend.sh diff --git a/frontend-web/index.html b/frontend-web/index.html new file mode 100644 index 00000000..4d8d6fbb --- /dev/null +++ b/frontend-web/index.html @@ -0,0 +1,12 @@ + + +
+ + +{tooltip}
+{caption}
} +{displayPct}
++ {used} / {total} +
+{description}
+ )} +{tooltip}
+{attachmentLabel}
++ {data.mediaType} +
+ )} +Used {count} sources
+{title}
+{tooltip}
+No console output
+ ) : ( + logs.map((log, index) => ( +
+ An open-source SuperAgent harness that researches, codes, and creates.
+ With
+
+ the help of sandboxes, memories, tools, skills and subagents, it
+ handles
+
+ different levels of tasks that could take minutes to hours.
+
{formattedDate}
+ ) : null} + + {pathname && availableLanguages.length > 1 ? ( +{description}
+ ) : null} ++ {post.metadata.description} +
+ ) : null} ++ Research mRNA delivery, build a landing page, deploy to + Vercel +
++ {caseStudy.description} +
++ Open-source +
++ We recommend using{" "} + + All-in-One Sandbox + {" "} + that combines Browser, Shell, File, MCP and VSCode Server in a + single Docker container. +
+a:hover]:text-primary [&>a]:underline [&>a]:underline-offset-4", + className, + )} + {...props} + /> + ); +} + +function ItemActions({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ); +} + +function ItemHeader({ className, ...props }: React.ComponentProps<"div">) { + return ( + + ); +} + +function ItemFooter({ className, ...props }: React.ComponentProps<"div">) { + return ( + + ); +} + +export { + Item, + ItemMedia, + ItemContent, + ItemActions, + ItemGroup, + ItemSeparator, + ItemTitle, + ItemDescription, + ItemHeader, + ItemFooter, +}; diff --git a/frontend-web/src/components/ui/magic-bento.css b/frontend-web/src/components/ui/magic-bento.css new file mode 100644 index 00000000..d18e7f3f --- /dev/null +++ b/frontend-web/src/components/ui/magic-bento.css @@ -0,0 +1,217 @@ +:root { + --hue: 27; + --sat: 69%; + --white: hsl(0, 0%, 100%); + --purple-primary: rgba(132, 0, 255, 1); + --purple-glow: rgba(132, 0, 255, 0.2); + --purple-border: rgba(132, 0, 255, 0.8); + --border-color: #392e4e; + --background-dark: #060010; + color-scheme: light dark; +} + +.card-grid { + display: grid; + gap: 0.5em; + padding: 0.75em; + max-width: 54em; + font-size: clamp(1rem, 0.9rem + 0.5vw, 1.5rem); +} + +.magic-bento-card { + display: flex; + flex-direction: column; + justify-content: space-between; + position: relative; + aspect-ratio: 4/3; + min-height: 200px; + width: 100%; + max-width: 100%; + padding: 1.25em; + border-radius: 20px; + border: 1px solid var(--border-color); + background: var(--background-dark); + font-weight: 300; + overflow: hidden; + transition: all 0.3s ease; + + --glow-x: 50%; + --glow-y: 50%; + --glow-intensity: 0; + --glow-radius: 200px; +} + +.magic-bento-card:hover { + transform: translateY(-2px); + box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15); +} + +.magic-bento-card__header, +.magic-bento-card__content { + display: flex; + position: relative; + color: var(--white); +} + +.magic-bento-card__header { + gap: 0.75em; + justify-content: space-between; +} + +.magic-bento-card__content { + flex-direction: column; +} + +.magic-bento-card__label { + font-size: 16px; +} + +.magic-bento-card__title, +.magic-bento-card__description { + --clamp-title: 1; + --clamp-desc: 2; +} + +.magic-bento-card__title { + font-weight: 400; + font-size: 16px; + margin: 0 0 0.25em; +} + +.magic-bento-card__description { + font-size: 12px; + line-height: 1.2; + opacity: 0.9; +} + +.magic-bento-card--text-autohide .magic-bento-card__title, +.magic-bento-card--text-autohide .magic-bento-card__description { + display: -webkit-box; + -webkit-box-orient: vertical; + overflow: hidden; + text-overflow: ellipsis; +} + +.magic-bento-card--text-autohide .magic-bento-card__title { + -webkit-line-clamp: var(--clamp-title); + line-clamp: var(--clamp-title); +} + +.magic-bento-card--text-autohide .magic-bento-card__description { + -webkit-line-clamp: var(--clamp-desc); + line-clamp: var(--clamp-desc); +} + +@media (max-width: 599px) { + .card-grid { + grid-template-columns: 1fr; + width: 90%; + margin: 0 auto; + padding: 0.5em; + } + + .magic-bento-card { + width: 100%; + min-height: 180px; + } +} + +@media (min-width: 600px) { + .card-grid { + grid-template-columns: repeat(2, 1fr); + } +} + +@media (min-width: 1024px) { + .card-grid { + grid-template-columns: repeat(4, 1fr); + } + + .magic-bento-card:nth-child(3) { + grid-column: span 2; + grid-row: span 2; + } + + .magic-bento-card:nth-child(4) { + grid-column: 1 / span 2; + grid-row: 2 / span 2; + } + + .magic-bento-card:nth-child(6) { + grid-column: 4; + grid-row: 3; + } +} + +/* Border glow effect */ +.magic-bento-card--border-glow::after { + content: ""; + position: absolute; + inset: 0; + padding: 6px; + background: radial-gradient( + var(--glow-radius) circle at var(--glow-x) var(--glow-y), + rgba(132, 0, 255, calc(var(--glow-intensity) * 0.8)) 0%, + rgba(132, 0, 255, calc(var(--glow-intensity) * 0.4)) 30%, + transparent 60% + ); + border-radius: inherit; + -webkit-mask: + linear-gradient(#fff 0 0) content-box, + linear-gradient(#fff 0 0); + -webkit-mask-composite: xor; + mask: + linear-gradient(#fff 0 0) content-box, + linear-gradient(#fff 0 0); + mask-composite: exclude; + pointer-events: none; + opacity: 1; + transition: opacity 0.3s ease; + z-index: 1; +} + +.magic-bento-card--border-glow:hover::after { + opacity: 1; +} + +.magic-bento-card--border-glow:hover { + box-shadow: + 0 4px 20px rgba(46, 24, 78, 0.4), + 0 0 30px var(--purple-glow); +} + +.particle-container { + position: relative; + overflow: hidden; +} + +.particle::before { + content: ""; + position: absolute; + top: -2px; + left: -2px; + right: -2px; + bottom: -2px; + background: rgba(132, 0, 255, 0.2); + border-radius: 50%; + z-index: -1; +} + +.particle-container:hover { + box-shadow: + 0 4px 20px rgba(46, 24, 78, 0.2), + 0 0 30px var(--purple-glow); +} + +/* Global spotlight styles */ +.global-spotlight { + mix-blend-mode: screen; + will-change: transform, opacity; + z-index: 200 !important; + pointer-events: none; +} + +.bento-section { + position: relative; + user-select: none; +} diff --git a/frontend-web/src/components/ui/magic-bento.tsx b/frontend-web/src/components/ui/magic-bento.tsx new file mode 100644 index 00000000..637d11b5 --- /dev/null +++ b/frontend-web/src/components/ui/magic-bento.tsx @@ -0,0 +1,713 @@ +import { gsap } from "gsap"; +import React, { useRef, useEffect, useCallback, useState } from "react"; +import "./magic-bento.css"; + +export interface BentoCardProps { + color?: string; + title?: React.ReactNode; + description?: React.ReactNode; + label?: React.ReactNode; + textAutoHide?: boolean; + disableAnimations?: boolean; +} + +export interface BentoProps { + textAutoHide?: boolean; + enableStars?: boolean; + enableSpotlight?: boolean; + enableBorderGlow?: boolean; + disableAnimations?: boolean; + spotlightRadius?: number; + particleCount?: number; + enableTilt?: boolean; + glowColor?: string; + clickEffect?: boolean; + enableMagnetism?: boolean; + data: BentoCardProps[]; +} + +const DEFAULT_PARTICLE_COUNT = 12; +const DEFAULT_SPOTLIGHT_RADIUS = 300; +const DEFAULT_GLOW_COLOR = "132, 0, 255"; +const MOBILE_BREAKPOINT = 768; + +const createParticleElement = ( + x: number, + y: number, + color: string = DEFAULT_GLOW_COLOR, +): HTMLDivElement => { + const el = document.createElement("div"); + el.className = "particle"; + el.style.cssText = ` + position: absolute; + width: 4px; + height: 4px; + border-radius: 50%; + background: rgba(${color}, 1); + box-shadow: 0 0 6px rgba(${color}, 0.6); + pointer-events: none; + z-index: 100; + left: ${x}px; + top: ${y}px; + `; + return el; +}; + +const calculateSpotlightValues = (radius: number) => ({ + proximity: radius * 0.5, + fadeDistance: radius * 0.75, +}); + +const updateCardGlowProperties = ( + card: HTMLElement, + mouseX: number, + mouseY: number, + glow: number, + radius: number, +) => { + const rect = card.getBoundingClientRect(); + const relativeX = ((mouseX - rect.left) / rect.width) * 100; + const relativeY = ((mouseY - rect.top) / rect.height) * 100; + + card.style.setProperty("--glow-x", `${relativeX}%`); + card.style.setProperty("--glow-y", `${relativeY}%`); + card.style.setProperty("--glow-intensity", glow.toString()); + card.style.setProperty("--glow-radius", `${radius}px`); +}; + +const ParticleCard: React.FC<{ + children: React.ReactNode; + className?: string; + disableAnimations?: boolean; + style?: React.CSSProperties; + particleCount?: number; + glowColor?: string; + enableTilt?: boolean; + clickEffect?: boolean; + enableMagnetism?: boolean; +}> = ({ + children, + className = "", + disableAnimations = false, + style, + particleCount = DEFAULT_PARTICLE_COUNT, + glowColor = DEFAULT_GLOW_COLOR, + enableTilt = true, + clickEffect = false, + enableMagnetism = false, +}) => { + const cardRef = useRef+ {card.description} +
+
+ {wrappedChildren}
+
+ {description}
+ )} ++ {t.agents.description} +
+{t.agents.emptyTitle}
++ {t.agents.emptyDescription} +
++ {href} +
+ )} ++ {fact.content} +
++ {t.settings.notification.notSupported} +
++ {t.settings.notification.deniedHint} +
+ )} + + {permission === "granted" && settings.notification.enabled && ( +
+ {t.welcome.createYourOwnSkillDescription}
+
+ ) : (
+ {t.welcome.createYourOwnSkillDescription}
+ )} +
+ {t.welcome.description}
+
+ ) : (
+ {t.welcome.description}
+ )} +