From 836b085f75cd1ed2d1425d0f264629a91ef2d37e Mon Sep 17 00:00:00 2001 From: Developers Digest <124798203+developersdigest@users.noreply.github.com> Date: Fri, 5 Sep 2025 13:06:17 -0400 Subject: [PATCH] continue re-design --- app/api/conversation-state/route.ts | 22 +- app/api/create-ai-sandbox-v2/route.ts | 2 +- app/api/generate-ai-code-stream/route.ts | 58 +- app/api/scrape-screenshot/route.ts | 60 +- app/api/scrape-website/route.ts | 106 + app/builder/page.tsx | 285 ++ app/fonts/GeistMonoVF.woff | Bin 0 -> 58092 bytes app/fonts/GeistVF.woff | Bin 0 -> 58512 bytes app/generation/page.tsx | 3606 ++++++++++++++++ app/globals.css | 206 +- app/landing.tsx | 90 + app/layout.tsx | 29 +- app/page.backup.tsx | 236 ++ app/page.new.tsx | 3659 +++++++++++++++++ app/page.tsx | 3616 +--------------- colors.json | 182 + components/FirecrawlIcon.tsx | 15 + components/FirecrawlLogo.tsx | 48 + components/HeroInput.tsx | 110 + .../sections/ai-readiness/ControlPanel.tsx | 842 ++++ .../sections/ai-readiness/InlineResults.tsx | 341 ++ .../sections/ai-readiness/MetricBars.tsx | 189 + .../sections/ai-readiness/RadarChart.tsx | 220 + .../sections/ai-readiness/ScoreChart.tsx | 104 + .../EndpointsCrawl/EndpointsCrawl.tsx | 188 + .../EndpointsExtract/EndpointsExtract.tsx | 187 + .../endpoints/EndpointsMap/EndpointsMap.tsx | 11 + .../EndpointsScrape/EndpointsScrape.tsx | 181 + .../EndpointsSearch/EndpointsSearch.tsx | 142 + .../sections/endpoints/Extract/Extract.tsx | 134 + .../app/(home)/sections/endpoints/Mcp/Mcp.tsx | 183 + .../(home)/sections/hero-flame/HeroFlame.tsx | 64 + .../app/(home)/sections/hero-flame/data.json | 50 + .../sections/hero-input/Button/Button.tsx | 34 + .../(home)/sections/hero-input/HeroInput.tsx | 84 + .../hero-input/Tabs/Mobile/Mobile.tsx | 196 + .../(home)/sections/hero-input/Tabs/Tabs.tsx | 183 + .../sections/hero-input/_svg/ArrowRight.tsx | 19 + .../(home)/sections/hero-input/_svg/Globe.tsx | 19 + .../sections/hero-scraping/Code/Code.tsx | 159 + .../hero-scraping/Code/Loading/Loading.tsx | 63 + .../hero-scraping/Code/Loading/_svg/Check.tsx | 18 + .../sections/hero-scraping/HeroScraping.css | 21 + .../sections/hero-scraping/HeroScraping.tsx | 314 ++ .../(home)/sections/hero-scraping/Tag/Tag.tsx | 69 + .../hero-scraping/_svg/BrowserMobile.tsx | 137 + .../hero-scraping/_svg/BrowserTab.tsx | 19 + .../sections/hero/Background/Background.tsx | 184 + .../hero/Background/BackgroundOuterPiece.tsx | 56 + .../hero/Background/_svg/CenterStar.tsx | 21 + .../app/(home)/sections/hero/Badge/Badge.tsx | 43 + components/app/(home)/sections/hero/Hero.tsx | 62 + .../app/(home)/sections/hero/Pixi/Pixi.tsx | 46 + .../sections/hero/Pixi/tickers/ascii.ts | 141 + .../hero/Pixi/tickers/features/cell.ts | 65 + .../hero/Pixi/tickers/features/cellReveal.ts | 51 + .../features/components/AnimatedRect.ts | 104 + .../features/components/BlinkingContainer.ts | 83 + .../Pixi/tickers/features/components/Dot.ts | 19 + .../hero/Pixi/tickers/features/crawl.ts | 200 + .../hero/Pixi/tickers/features/index.ts | 124 + .../hero/Pixi/tickers/features/mapping.ts | 207 + .../hero/Pixi/tickers/features/scrape.ts | 219 + .../hero/Pixi/tickers/features/search.ts | 144 + .../app/(home)/sections/hero/Title/Title.tsx | 263 ++ .../app/.cursor/rules/home-page-components.md | 54 + components/app/generation/SidebarInput.tsx | 163 + .../app/generation/SidebarQuickInput.tsx | 47 + components/shared/Playground/Context/types.ts | 48 + components/shared/animated-dot-icon.tsx | 394 ++ components/shared/animated-height.tsx | 58 + components/shared/ascii-background.tsx | 60 + components/shared/ascii-flame-background.tsx | 59 + components/shared/button/Button.css | 72 + components/shared/button/Button.tsx | 67 + components/shared/buttons/capsule-button.tsx | 148 + .../shared/buttons/fire-action-link.tsx | 48 + components/shared/buttons/index.ts | 4 + components/shared/buttons/slate-button.tsx | 122 + .../shared/color-styles/color-styles.tsx | 31 + components/shared/combobox/combobox.tsx | 174 + .../effects/.cursor/rules/flame-effects.md | 73 + components/shared/effects/flame/Flame.tsx | 57 + .../shared/effects/flame/ascii-explosion.tsx | 56 + .../effects/flame/auth-pulse/auth-pulse.tsx | 64 + .../effects/flame/auth-pulse/pulse-data.json | 17 + .../shared/effects/flame/core-flame.json | 22 + .../shared/effects/flame/core-flame.tsx | 58 + .../shared/effects/flame/explosion-data.json | 27 + .../shared/effects/flame/flame-background.tsx | 41 + .../shared/effects/flame/hero-flame-data.json | 50 + .../shared/effects/flame/hero-flame.tsx | 68 + components/shared/effects/flame/index.ts | 7 + .../effects/flame/slate-grid/grid-data.json | 17 + .../effects/flame/slate-grid/slate-grid.tsx | 65 + .../shared/effects/flame/subtle-explosion.tsx | 68 + .../effects/flame/subtle-wave/subtle-wave.tsx | 45 + .../effects/flame/subtle-wave/wave-data.json | 34 + components/shared/effects/index.ts | 3 + .../shared/effects/subtle-ascii-animation.tsx | 71 + .../firecrawl-icon/firecrawl-icon-static.tsx | 23 + .../shared/firecrawl-icon/firecrawl-icon.tsx | 56 + .../shared/header/BrandKit/BrandKit.tsx | 216 + .../shared/header/BrandKit/_svg/Download.tsx | 20 + .../header/BrandKit/_svg/Guidelines.tsx | 20 + .../shared/header/BrandKit/_svg/Icon.tsx | 17 + .../header/Dropdown/Content/Content.tsx | 219 + .../header/Dropdown/Content/NavItemRow.tsx | 91 + .../header/Dropdown/Github/Flame/Flame.tsx | 63 + .../header/Dropdown/Github/Flame/data.json | 25 + .../shared/header/Dropdown/Github/Github.tsx | 27 + .../header/Dropdown/Mobile/Item/Item.tsx | 84 + .../shared/header/Dropdown/Mobile/Mobile.tsx | 49 + .../header/Dropdown/Stories/Flame/Flame.tsx | 62 + .../header/Dropdown/Stories/Stories.tsx | 31 + .../header/Dropdown/Stories/_svg/ArrowUp.tsx | 19 + .../header/Dropdown/Stories/_svg/Replit.tsx | 24 + .../header/Dropdown/Wrapper/Wrapper.tsx | 106 + .../shared/header/Github/GithubClient.tsx | 19 + .../shared/header/Github/_svg/GithubIcon.tsx | 19 + components/shared/header/HeaderContext.tsx | 137 + components/shared/header/Nav/Item/Item.tsx | 53 + .../header/Nav/Item/_svg/ChevronDown.tsx | 20 + components/shared/header/Nav/Nav.tsx | 319 ++ .../shared/header/Nav/RenderEndpointIcon.tsx | 16 + .../shared/header/Nav/_svg/Affiliate.tsx | 35 + components/shared/header/Nav/_svg/Api.tsx | 26 + .../shared/header/Nav/_svg/ArrowRight.tsx | 20 + components/shared/header/Nav/_svg/Careers.tsx | 19 + .../shared/header/Nav/_svg/Changelog.tsx | 19 + components/shared/header/Nav/_svg/Chats.tsx | 28 + components/shared/header/Nav/_svg/Lead.tsx | 18 + components/shared/header/Nav/_svg/MCP.tsx | 16 + .../shared/header/Nav/_svg/Platforms.tsx | 37 + .../shared/header/Nav/_svg/Research.tsx | 47 + components/shared/header/Nav/_svg/Student.tsx | 19 + .../shared/header/Nav/_svg/Templates.tsx | 26 + components/shared/header/Toggle/Toggle.tsx | 65 + components/shared/header/Wrapper/Wrapper.tsx | 40 + components/shared/header/_svg/Logo.tsx | 48 + components/shared/hero-flame.tsx | 122 + components/shared/icons/GitHub.tsx | 21 + components/shared/icons/Logo.tsx | 22 + components/shared/icons/animated-chevron.tsx | 64 + components/shared/icons/animated-icons.tsx | 962 +++++ components/shared/icons/arrow-animated.tsx | 28 + components/shared/icons/check.tsx | 18 + components/shared/icons/chevron-slide.tsx | 52 + components/shared/icons/copied.tsx | 19 + components/shared/icons/copy.tsx | 19 + components/shared/icons/curve.tsx | 24 + components/shared/icons/fingerprint-icon.tsx | 222 + components/shared/icons/openai.tsx | 18 + components/shared/icons/source-icon.tsx | 20 + components/shared/icons/symbol-colored.tsx | 22 + components/shared/icons/symbol-white.tsx | 21 + .../shared/icons/tremor-placeholder.tsx | 62 + components/shared/icons/wordmark-colored.tsx | 57 + components/shared/icons/wordmark-white.tsx | 54 + components/shared/image/Image.tsx | 56 + components/shared/image/getImageSrc.ts | 35 + components/shared/layout/animated-height.tsx | 57 + components/shared/layout/animated-width.tsx | 56 + .../shared/layout/curvy-rect-divider.tsx | 28 + components/shared/layout/curvy-rect.tsx | 185 + components/shared/loading/Shimmer.tsx | 120 + components/shared/loading/usage-loading.tsx | 18 + components/shared/lockBody.tsx | 25 + components/shared/logo-cloud/index.ts | 1 + components/shared/logo-cloud/logo-cloud.tsx | 56 + .../logo-cloud/logo-cloud2/Logocloud.css | 22 + .../logo-cloud/logo-cloud2/Logocloud.tsx | 55 + .../notifications/slack-notification.tsx | 53 + components/shared/pixi/Pixi.tsx | 222 + components/shared/pixi/PixiAssetManager.ts | 27 + components/shared/pixi/utils.ts | 60 + .../shared/portal-to-body/PortalToBody.tsx | 8 + .../shared/preview/json-error-highlighter.tsx | 200 + .../shared/preview/live-preview-frame.tsx | 342 ++ .../shared/preview/multiple-web-browsers.tsx | 76 + components/shared/preview/web-browser.tsx | 84 + components/shared/pylon.tsx | 102 + .../search-params-provider.tsx | 33 + .../shared/section-head/SectionHead.css | 4 + .../shared/section-head/SectionHead.tsx | 100 + .../shared/section-title/SectionTitle.tsx | 55 + components/shared/tabs/Tabs.tsx | 149 + components/shared/ui/app-dialog.tsx | 67 + components/shared/ui/ascii-dot-loader.tsx | 29 + components/shared/ui/dot-grid-loader.tsx | 65 + components/shared/ui/empty-state.tsx | 57 + components/shared/ui/index.ts | 5 + components/shared/ui/loading-state.tsx | 63 + components/shared/ui/mobile-sheet.tsx | 257 ++ components/shared/ui/stat-card.tsx | 98 + components/shared/utils/portal-to-body.tsx | 8 + components/ui/shadcn/accordion.tsx | 58 + components/ui/shadcn/alert-dialog.tsx | 167 + components/ui/shadcn/badge.tsx | 28 + components/ui/shadcn/button.css | 80 + components/ui/shadcn/button.tsx | 139 + components/ui/shadcn/card.tsx | 83 + components/ui/shadcn/checkbox.tsx | 57 + components/ui/shadcn/collapsible.tsx | 11 + components/ui/shadcn/combobox.tsx | 174 + components/ui/shadcn/context-menu.tsx | 200 + components/ui/shadcn/data-table.tsx | 117 + components/ui/shadcn/dialog.tsx | 128 + components/ui/shadcn/dropdown-menu.tsx | 200 + components/ui/shadcn/form.tsx | 179 + components/ui/shadcn/input.tsx | 29 + components/ui/shadcn/label.tsx | 26 + components/ui/shadcn/navigation-menu.tsx | 135 + components/ui/shadcn/popover.tsx | 31 + components/ui/shadcn/progress.tsx | 28 + components/ui/shadcn/scroll-area.tsx | 48 + components/ui/shadcn/select.tsx | 159 + components/ui/shadcn/separator.tsx | 31 + components/ui/shadcn/sheet.tsx | 143 + components/ui/shadcn/slider.tsx | 28 + components/ui/shadcn/switch.tsx | 58 + components/ui/shadcn/tabs.tsx | 55 + components/ui/shadcn/textarea.tsx | 21 + components/ui/shadcn/toast.tsx | 32 + components/ui/shadcn/toggle.tsx | 78 + components/ui/shadcn/tooltip-radix.tsx | 30 + components/ui/shadcn/tooltip.tsx | 120 + config/app.config.ts | 14 +- env.sample | 21 - hooks/useDebouncedCallback.ts | 34 + hooks/useDebouncedEffect.ts | 68 + hooks/useSwitchingCode.ts | 60 + lib/sandbox/providers/vercel-provider.ts | 45 +- lib/utils.ts | 8 +- package-lock.json | 2475 +++++++++-- package.json | 27 +- pnpm-lock.yaml | 770 ++-- postcss.config.mjs | 10 +- public/firecrawl-logo-with-fire.webp | Bin 2024 -> 0 bytes public/next.svg | 1 - public/vercel.svg | 1 - styles/additional-styles/custom-fonts.css | 0 styles/additional-styles/theme.css | 58 + styles/additional-styles/utility-patterns.css | 112 + styles/chrome-bug.css | 12 + styles/colors.json | 182 + .../.cursor/rules/component-styles.md | 32 + styles/components/button.css | 72 + styles/components/code.css | 45 + styles/components/index.css | 10 + .../.cursor/rules/design-system.md | 81 + styles/design-system/animations.css | 92 + styles/design-system/base/body.css | 132 + styles/design-system/base/layout.css | 212 + styles/design-system/base/reset.css | 132 + styles/design-system/colors.css | 135 + styles/design-system/fonts.css | 8 + styles/design-system/typography.css | 243 ++ styles/design-system/utilities.css | 235 ++ styles/fire.css | 103 + styles/inside-border-fix.css | 47 + styles/main.css | 229 ++ styling-reference/ai-ready-website | 1 - tailwind.config.ts | 360 +- test/package-lock.json | 701 ---- test/package.json | 15 - utils/cn.ts | 5 + utils/init-canvas.ts | 30 + utils/set-timeout-on-visible.ts | 130 + utils/sleep.ts | 2 + 270 files changed, 32269 insertions(+), 5182 deletions(-) create mode 100644 app/api/scrape-website/route.ts create mode 100644 app/builder/page.tsx create mode 100644 app/fonts/GeistMonoVF.woff create mode 100644 app/fonts/GeistVF.woff create mode 100644 app/generation/page.tsx create mode 100644 app/landing.tsx create mode 100644 app/page.backup.tsx create mode 100644 app/page.new.tsx create mode 100644 colors.json create mode 100644 components/FirecrawlIcon.tsx create mode 100644 components/FirecrawlLogo.tsx create mode 100644 components/HeroInput.tsx create mode 100644 components/app/(home)/sections/ai-readiness/ControlPanel.tsx create mode 100644 components/app/(home)/sections/ai-readiness/InlineResults.tsx create mode 100644 components/app/(home)/sections/ai-readiness/MetricBars.tsx create mode 100644 components/app/(home)/sections/ai-readiness/RadarChart.tsx create mode 100644 components/app/(home)/sections/ai-readiness/ScoreChart.tsx create mode 100644 components/app/(home)/sections/endpoints/EndpointsCrawl/EndpointsCrawl.tsx create mode 100644 components/app/(home)/sections/endpoints/EndpointsExtract/EndpointsExtract.tsx create mode 100644 components/app/(home)/sections/endpoints/EndpointsMap/EndpointsMap.tsx create mode 100644 components/app/(home)/sections/endpoints/EndpointsScrape/EndpointsScrape.tsx create mode 100644 components/app/(home)/sections/endpoints/EndpointsSearch/EndpointsSearch.tsx create mode 100644 components/app/(home)/sections/endpoints/Extract/Extract.tsx create mode 100644 components/app/(home)/sections/endpoints/Mcp/Mcp.tsx create mode 100644 components/app/(home)/sections/hero-flame/HeroFlame.tsx create mode 100644 components/app/(home)/sections/hero-flame/data.json create mode 100644 components/app/(home)/sections/hero-input/Button/Button.tsx create mode 100644 components/app/(home)/sections/hero-input/HeroInput.tsx create mode 100644 components/app/(home)/sections/hero-input/Tabs/Mobile/Mobile.tsx create mode 100644 components/app/(home)/sections/hero-input/Tabs/Tabs.tsx create mode 100644 components/app/(home)/sections/hero-input/_svg/ArrowRight.tsx create mode 100644 components/app/(home)/sections/hero-input/_svg/Globe.tsx create mode 100644 components/app/(home)/sections/hero-scraping/Code/Code.tsx create mode 100644 components/app/(home)/sections/hero-scraping/Code/Loading/Loading.tsx create mode 100644 components/app/(home)/sections/hero-scraping/Code/Loading/_svg/Check.tsx create mode 100644 components/app/(home)/sections/hero-scraping/HeroScraping.css create mode 100644 components/app/(home)/sections/hero-scraping/HeroScraping.tsx create mode 100644 components/app/(home)/sections/hero-scraping/Tag/Tag.tsx create mode 100644 components/app/(home)/sections/hero-scraping/_svg/BrowserMobile.tsx create mode 100644 components/app/(home)/sections/hero-scraping/_svg/BrowserTab.tsx create mode 100644 components/app/(home)/sections/hero/Background/Background.tsx create mode 100644 components/app/(home)/sections/hero/Background/BackgroundOuterPiece.tsx create mode 100644 components/app/(home)/sections/hero/Background/_svg/CenterStar.tsx create mode 100644 components/app/(home)/sections/hero/Badge/Badge.tsx create mode 100644 components/app/(home)/sections/hero/Hero.tsx create mode 100644 components/app/(home)/sections/hero/Pixi/Pixi.tsx create mode 100644 components/app/(home)/sections/hero/Pixi/tickers/ascii.ts create mode 100644 components/app/(home)/sections/hero/Pixi/tickers/features/cell.ts create mode 100644 components/app/(home)/sections/hero/Pixi/tickers/features/cellReveal.ts create mode 100644 components/app/(home)/sections/hero/Pixi/tickers/features/components/AnimatedRect.ts create mode 100644 components/app/(home)/sections/hero/Pixi/tickers/features/components/BlinkingContainer.ts create mode 100644 components/app/(home)/sections/hero/Pixi/tickers/features/components/Dot.ts create mode 100644 components/app/(home)/sections/hero/Pixi/tickers/features/crawl.ts create mode 100644 components/app/(home)/sections/hero/Pixi/tickers/features/index.ts create mode 100644 components/app/(home)/sections/hero/Pixi/tickers/features/mapping.ts create mode 100644 components/app/(home)/sections/hero/Pixi/tickers/features/scrape.ts create mode 100644 components/app/(home)/sections/hero/Pixi/tickers/features/search.ts create mode 100644 components/app/(home)/sections/hero/Title/Title.tsx create mode 100644 components/app/.cursor/rules/home-page-components.md create mode 100644 components/app/generation/SidebarInput.tsx create mode 100644 components/app/generation/SidebarQuickInput.tsx create mode 100644 components/shared/Playground/Context/types.ts create mode 100644 components/shared/animated-dot-icon.tsx create mode 100644 components/shared/animated-height.tsx create mode 100644 components/shared/ascii-background.tsx create mode 100644 components/shared/ascii-flame-background.tsx create mode 100644 components/shared/button/Button.css create mode 100644 components/shared/button/Button.tsx create mode 100644 components/shared/buttons/capsule-button.tsx create mode 100644 components/shared/buttons/fire-action-link.tsx create mode 100644 components/shared/buttons/index.ts create mode 100644 components/shared/buttons/slate-button.tsx create mode 100644 components/shared/color-styles/color-styles.tsx create mode 100644 components/shared/combobox/combobox.tsx create mode 100644 components/shared/effects/.cursor/rules/flame-effects.md create mode 100644 components/shared/effects/flame/Flame.tsx create mode 100644 components/shared/effects/flame/ascii-explosion.tsx create mode 100644 components/shared/effects/flame/auth-pulse/auth-pulse.tsx create mode 100644 components/shared/effects/flame/auth-pulse/pulse-data.json create mode 100644 components/shared/effects/flame/core-flame.json create mode 100644 components/shared/effects/flame/core-flame.tsx create mode 100644 components/shared/effects/flame/explosion-data.json create mode 100644 components/shared/effects/flame/flame-background.tsx create mode 100644 components/shared/effects/flame/hero-flame-data.json create mode 100644 components/shared/effects/flame/hero-flame.tsx create mode 100644 components/shared/effects/flame/index.ts create mode 100644 components/shared/effects/flame/slate-grid/grid-data.json create mode 100644 components/shared/effects/flame/slate-grid/slate-grid.tsx create mode 100644 components/shared/effects/flame/subtle-explosion.tsx create mode 100644 components/shared/effects/flame/subtle-wave/subtle-wave.tsx create mode 100644 components/shared/effects/flame/subtle-wave/wave-data.json create mode 100644 components/shared/effects/index.ts create mode 100644 components/shared/effects/subtle-ascii-animation.tsx create mode 100644 components/shared/firecrawl-icon/firecrawl-icon-static.tsx create mode 100644 components/shared/firecrawl-icon/firecrawl-icon.tsx create mode 100644 components/shared/header/BrandKit/BrandKit.tsx create mode 100644 components/shared/header/BrandKit/_svg/Download.tsx create mode 100644 components/shared/header/BrandKit/_svg/Guidelines.tsx create mode 100644 components/shared/header/BrandKit/_svg/Icon.tsx create mode 100644 components/shared/header/Dropdown/Content/Content.tsx create mode 100644 components/shared/header/Dropdown/Content/NavItemRow.tsx create mode 100644 components/shared/header/Dropdown/Github/Flame/Flame.tsx create mode 100644 components/shared/header/Dropdown/Github/Flame/data.json create mode 100644 components/shared/header/Dropdown/Github/Github.tsx create mode 100644 components/shared/header/Dropdown/Mobile/Item/Item.tsx create mode 100644 components/shared/header/Dropdown/Mobile/Mobile.tsx create mode 100644 components/shared/header/Dropdown/Stories/Flame/Flame.tsx create mode 100644 components/shared/header/Dropdown/Stories/Stories.tsx create mode 100644 components/shared/header/Dropdown/Stories/_svg/ArrowUp.tsx create mode 100644 components/shared/header/Dropdown/Stories/_svg/Replit.tsx create mode 100644 components/shared/header/Dropdown/Wrapper/Wrapper.tsx create mode 100644 components/shared/header/Github/GithubClient.tsx create mode 100644 components/shared/header/Github/_svg/GithubIcon.tsx create mode 100644 components/shared/header/HeaderContext.tsx create mode 100644 components/shared/header/Nav/Item/Item.tsx create mode 100644 components/shared/header/Nav/Item/_svg/ChevronDown.tsx create mode 100644 components/shared/header/Nav/Nav.tsx create mode 100644 components/shared/header/Nav/RenderEndpointIcon.tsx create mode 100644 components/shared/header/Nav/_svg/Affiliate.tsx create mode 100644 components/shared/header/Nav/_svg/Api.tsx create mode 100644 components/shared/header/Nav/_svg/ArrowRight.tsx create mode 100644 components/shared/header/Nav/_svg/Careers.tsx create mode 100644 components/shared/header/Nav/_svg/Changelog.tsx create mode 100644 components/shared/header/Nav/_svg/Chats.tsx create mode 100644 components/shared/header/Nav/_svg/Lead.tsx create mode 100644 components/shared/header/Nav/_svg/MCP.tsx create mode 100644 components/shared/header/Nav/_svg/Platforms.tsx create mode 100644 components/shared/header/Nav/_svg/Research.tsx create mode 100644 components/shared/header/Nav/_svg/Student.tsx create mode 100644 components/shared/header/Nav/_svg/Templates.tsx create mode 100644 components/shared/header/Toggle/Toggle.tsx create mode 100644 components/shared/header/Wrapper/Wrapper.tsx create mode 100644 components/shared/header/_svg/Logo.tsx create mode 100644 components/shared/hero-flame.tsx create mode 100644 components/shared/icons/GitHub.tsx create mode 100644 components/shared/icons/Logo.tsx create mode 100644 components/shared/icons/animated-chevron.tsx create mode 100644 components/shared/icons/animated-icons.tsx create mode 100644 components/shared/icons/arrow-animated.tsx create mode 100644 components/shared/icons/check.tsx create mode 100644 components/shared/icons/chevron-slide.tsx create mode 100644 components/shared/icons/copied.tsx create mode 100644 components/shared/icons/copy.tsx create mode 100644 components/shared/icons/curve.tsx create mode 100644 components/shared/icons/fingerprint-icon.tsx create mode 100644 components/shared/icons/openai.tsx create mode 100644 components/shared/icons/source-icon.tsx create mode 100644 components/shared/icons/symbol-colored.tsx create mode 100644 components/shared/icons/symbol-white.tsx create mode 100644 components/shared/icons/tremor-placeholder.tsx create mode 100644 components/shared/icons/wordmark-colored.tsx create mode 100644 components/shared/icons/wordmark-white.tsx create mode 100644 components/shared/image/Image.tsx create mode 100644 components/shared/image/getImageSrc.ts create mode 100644 components/shared/layout/animated-height.tsx create mode 100644 components/shared/layout/animated-width.tsx create mode 100644 components/shared/layout/curvy-rect-divider.tsx create mode 100644 components/shared/layout/curvy-rect.tsx create mode 100644 components/shared/loading/Shimmer.tsx create mode 100644 components/shared/loading/usage-loading.tsx create mode 100644 components/shared/lockBody.tsx create mode 100644 components/shared/logo-cloud/index.ts create mode 100644 components/shared/logo-cloud/logo-cloud.tsx create mode 100644 components/shared/logo-cloud/logo-cloud2/Logocloud.css create mode 100644 components/shared/logo-cloud/logo-cloud2/Logocloud.tsx create mode 100644 components/shared/notifications/slack-notification.tsx create mode 100644 components/shared/pixi/Pixi.tsx create mode 100644 components/shared/pixi/PixiAssetManager.ts create mode 100644 components/shared/pixi/utils.ts create mode 100644 components/shared/portal-to-body/PortalToBody.tsx create mode 100644 components/shared/preview/json-error-highlighter.tsx create mode 100644 components/shared/preview/live-preview-frame.tsx create mode 100644 components/shared/preview/multiple-web-browsers.tsx create mode 100644 components/shared/preview/web-browser.tsx create mode 100644 components/shared/pylon.tsx create mode 100644 components/shared/search-params-provider/search-params-provider.tsx create mode 100644 components/shared/section-head/SectionHead.css create mode 100644 components/shared/section-head/SectionHead.tsx create mode 100644 components/shared/section-title/SectionTitle.tsx create mode 100644 components/shared/tabs/Tabs.tsx create mode 100644 components/shared/ui/app-dialog.tsx create mode 100644 components/shared/ui/ascii-dot-loader.tsx create mode 100644 components/shared/ui/dot-grid-loader.tsx create mode 100644 components/shared/ui/empty-state.tsx create mode 100644 components/shared/ui/index.ts create mode 100644 components/shared/ui/loading-state.tsx create mode 100644 components/shared/ui/mobile-sheet.tsx create mode 100644 components/shared/ui/stat-card.tsx create mode 100644 components/shared/utils/portal-to-body.tsx create mode 100644 components/ui/shadcn/accordion.tsx create mode 100644 components/ui/shadcn/alert-dialog.tsx create mode 100644 components/ui/shadcn/badge.tsx create mode 100644 components/ui/shadcn/button.css create mode 100644 components/ui/shadcn/button.tsx create mode 100644 components/ui/shadcn/card.tsx create mode 100644 components/ui/shadcn/checkbox.tsx create mode 100644 components/ui/shadcn/collapsible.tsx create mode 100644 components/ui/shadcn/combobox.tsx create mode 100644 components/ui/shadcn/context-menu.tsx create mode 100644 components/ui/shadcn/data-table.tsx create mode 100644 components/ui/shadcn/dialog.tsx create mode 100644 components/ui/shadcn/dropdown-menu.tsx create mode 100644 components/ui/shadcn/form.tsx create mode 100644 components/ui/shadcn/input.tsx create mode 100644 components/ui/shadcn/label.tsx create mode 100644 components/ui/shadcn/navigation-menu.tsx create mode 100644 components/ui/shadcn/popover.tsx create mode 100644 components/ui/shadcn/progress.tsx create mode 100644 components/ui/shadcn/scroll-area.tsx create mode 100644 components/ui/shadcn/select.tsx create mode 100644 components/ui/shadcn/separator.tsx create mode 100644 components/ui/shadcn/sheet.tsx create mode 100644 components/ui/shadcn/slider.tsx create mode 100644 components/ui/shadcn/switch.tsx create mode 100644 components/ui/shadcn/tabs.tsx create mode 100644 components/ui/shadcn/textarea.tsx create mode 100644 components/ui/shadcn/toast.tsx create mode 100644 components/ui/shadcn/toggle.tsx create mode 100644 components/ui/shadcn/tooltip-radix.tsx create mode 100644 components/ui/shadcn/tooltip.tsx delete mode 100644 env.sample create mode 100644 hooks/useDebouncedCallback.ts create mode 100644 hooks/useDebouncedEffect.ts create mode 100644 hooks/useSwitchingCode.ts delete mode 100644 public/firecrawl-logo-with-fire.webp delete mode 100644 public/next.svg delete mode 100644 public/vercel.svg create mode 100644 styles/additional-styles/custom-fonts.css create mode 100644 styles/additional-styles/theme.css create mode 100644 styles/additional-styles/utility-patterns.css create mode 100644 styles/chrome-bug.css create mode 100644 styles/colors.json create mode 100644 styles/components/.cursor/rules/component-styles.md create mode 100644 styles/components/button.css create mode 100644 styles/components/code.css create mode 100644 styles/components/index.css create mode 100644 styles/design-system/.cursor/rules/design-system.md create mode 100644 styles/design-system/animations.css create mode 100644 styles/design-system/base/body.css create mode 100644 styles/design-system/base/layout.css create mode 100644 styles/design-system/base/reset.css create mode 100644 styles/design-system/colors.css create mode 100644 styles/design-system/fonts.css create mode 100644 styles/design-system/typography.css create mode 100644 styles/design-system/utilities.css create mode 100644 styles/fire.css create mode 100644 styles/inside-border-fix.css create mode 100644 styles/main.css delete mode 160000 styling-reference/ai-ready-website delete mode 100644 test/package-lock.json delete mode 100644 test/package.json create mode 100644 utils/cn.ts create mode 100644 utils/init-canvas.ts create mode 100644 utils/set-timeout-on-visible.ts create mode 100644 utils/sleep.ts diff --git a/app/api/conversation-state/route.ts b/app/api/conversation-state/route.ts index 1a37468..969692c 100644 --- a/app/api/conversation-state/route.ts +++ b/app/api/conversation-state/route.ts @@ -59,10 +59,26 @@ export async function POST(request: NextRequest) { case 'clear-old': // Clear old conversation data but keep recent context if (!global.conversationState) { + // Initialize conversation state if it doesn't exist + global.conversationState = { + conversationId: `conv-${Date.now()}`, + startedAt: Date.now(), + lastUpdated: Date.now(), + context: { + messages: [], + edits: [], + projectEvolution: { majorChanges: [] }, + userPreferences: {} + } + }; + + console.log('[conversation-state] Initialized new conversation state for clear-old'); + return NextResponse.json({ - success: false, - error: 'No active conversation to clear' - }, { status: 400 }); + success: true, + message: 'New conversation state initialized', + state: global.conversationState + }); } // Keep only recent data diff --git a/app/api/create-ai-sandbox-v2/route.ts b/app/api/create-ai-sandbox-v2/route.ts index 93410a1..6545fe8 100644 --- a/app/api/create-ai-sandbox-v2/route.ts +++ b/app/api/create-ai-sandbox-v2/route.ts @@ -5,7 +5,7 @@ import type { SandboxState } from '@/types/sandbox'; // Store active sandbox globally declare global { - var activeSandboxProvider: SandboxProvider | null; + var activeSandboxProvider: any; var sandboxData: any; var existingFiles: Set; var sandboxState: SandboxState; diff --git a/app/api/generate-ai-code-stream/route.ts b/app/api/generate-ai-code-stream/route.ts index af86837..049f533 100644 --- a/app/api/generate-ai-code-stream/route.ts +++ b/app/api/generate-ai-code-stream/route.ts @@ -18,6 +18,12 @@ export const dynamic = 'force-dynamic'; const isUsingAIGateway = !!process.env.AI_GATEWAY_API_KEY; const aiGatewayBaseURL = 'https://ai-gateway.vercel.sh/v1'; +console.log('[generate-ai-code-stream] AI Gateway config:', { + isUsingAIGateway, + hasGroqKey: !!process.env.GROQ_API_KEY, + hasAIGatewayKey: !!process.env.AI_GATEWAY_API_KEY +}); + const groq = createGroq({ apiKey: process.env.AI_GATEWAY_API_KEY ?? process.env.GROQ_API_KEY, baseURL: isUsingAIGateway ? aiGatewayBaseURL : undefined, @@ -152,10 +158,18 @@ export async function POST(request: NextRequest) { const stream = new TransformStream(); const writer = stream.writable.getWriter(); - // Function to send progress updates + // Function to send progress updates with flushing const sendProgress = async (data: any) => { const message = `data: ${JSON.stringify(data)}\n\n`; - await writer.write(encoder.encode(message)); + try { + await writer.write(encoder.encode(message)); + // Force flush by writing a keep-alive comment + if (data.type === 'stream' || data.type === 'conversation') { + await writer.write(encoder.encode(': keepalive\n\n')); + } + } catch (error) { + console.error('[generate-ai-code-stream] Error writing to stream:', error); + } }; // Start processing in background @@ -1169,15 +1183,22 @@ CRITICAL: When files are provided in the context: // Determine which provider to use based on model const isAnthropic = model.startsWith('anthropic/'); const isGoogle = model.startsWith('google/'); - const isOpenAI = model.startsWith('openai/gpt-5'); - const modelProvider = isAnthropic ? anthropic : (isOpenAI ? openai : (isGoogle ? googleGenerativeAI : groq)); + const isOpenAI = model.startsWith('openai/'); + const isKimiGroq = model === 'moonshotai/kimi-k2-instruct-0905'; + const modelProvider = isAnthropic ? anthropic : + (isOpenAI ? openai : + (isGoogle ? googleGenerativeAI : + (isKimiGroq ? groq : groq))); // Fix model name transformation for different providers let actualModel: string; if (isAnthropic) { actualModel = model.replace('anthropic/', ''); - } else if (model === 'openai/gpt-5') { - actualModel = 'gpt-5'; + } else if (isOpenAI) { + actualModel = model.replace('openai/', ''); + } else if (isKimiGroq) { + // Kimi on Groq - use full model string + actualModel = 'moonshotai/kimi-k2-instruct-0905'; } else if (isGoogle) { // Google uses specific model names - convert our naming to theirs actualModel = model.replace('google/', ''); @@ -1186,6 +1207,8 @@ CRITICAL: When files are provided in the context: } console.log(`[generate-ai-code-stream] Using provider: ${isAnthropic ? 'Anthropic' : isGoogle ? 'Google' : isOpenAI ? 'OpenAI' : 'Groq'}, model: ${actualModel}`); + console.log(`[generate-ai-code-stream] AI Gateway enabled: ${isUsingAIGateway}`); + console.log(`[generate-ai-code-stream] Model string: ${model}`); // Make streaming API call with appropriate provider const streamOptions: any = { @@ -1349,6 +1372,11 @@ It's better to have 3 complete files than 10 incomplete files.` raw: true }); + // Debug: Log every 100 characters streamed + if (generatedCode.length % 100 < text.length) { + console.log(`[generate-ai-code-stream] Streamed ${generatedCode.length} chars`); + } + // Check for package tags in buffered text (ONLY for edits, not initial generation) let lastIndex = 0; if (isEdit) { @@ -1638,12 +1666,28 @@ Provide the complete file content without any truncation. Include all necessary completionClient = openai; } else if (model.includes('claude')) { completionClient = anthropic; + } else if (model === 'moonshotai/kimi-k2-instruct-0905') { + completionClient = groq; } else { completionClient = groq; } + // Determine the correct model name for the completion + let completionModelName: string; + if (model === 'moonshotai/kimi-k2-instruct-0905') { + completionModelName = 'moonshotai/kimi-k2-instruct-0905'; + } else if (model.includes('openai')) { + completionModelName = model.replace('openai/', ''); + } else if (model.includes('anthropic')) { + completionModelName = model.replace('anthropic/', ''); + } else if (model.includes('google')) { + completionModelName = model.replace('google/', ''); + } else { + completionModelName = model; + } + const completionResult = await streamText({ - model: completionClient(modelMapping[model] || model), + model: completionClient(completionModelName), messages: [ { role: 'system', diff --git a/app/api/scrape-screenshot/route.ts b/app/api/scrape-screenshot/route.ts index b77820a..feccddf 100644 --- a/app/api/scrape-screenshot/route.ts +++ b/app/api/scrape-screenshot/route.ts @@ -1,4 +1,5 @@ import { NextRequest, NextResponse } from 'next/server'; +import FirecrawlApp from '@mendable/firecrawl-js'; export async function POST(req: NextRequest) { try { @@ -8,43 +9,44 @@ export async function POST(req: NextRequest) { return NextResponse.json({ error: 'URL is required' }, { status: 400 }); } - // Use Firecrawl API to capture screenshot - const firecrawlResponse = await fetch('https://api.firecrawl.dev/v1/scrape', { - method: 'POST', - headers: { - 'Authorization': `Bearer ${process.env.FIRECRAWL_API_KEY}`, - 'Content-Type': 'application/json' - }, - body: JSON.stringify({ - url, - formats: ['screenshot'], // Regular viewport screenshot, not full page - waitFor: 3000, // Wait for page to fully load - timeout: 30000, - blockAds: true, - actions: [ - { - type: 'wait', - milliseconds: 2000 // Additional wait for dynamic content - } - ] - }) + // Initialize Firecrawl with API key from environment + const apiKey = process.env.FIRECRAWL_API_KEY; + + if (!apiKey) { + console.error("FIRECRAWL_API_KEY not configured"); + return NextResponse.json({ + error: 'Firecrawl API key not configured' + }, { status: 500 }); + } + + const app = new FirecrawlApp({ apiKey }); + + // Use Firecrawl SDK to capture screenshot with the latest API + const scrapeResult = await app.scrapeUrl(url, { + formats: ['screenshot'], // Request screenshot format + waitFor: 3000, // Wait for page to fully load + timeout: 30000, + onlyMainContent: false, // Get full page for screenshot + actions: [ + { + type: 'wait', + milliseconds: 2000 // Additional wait for dynamic content + } + ] }); - if (!firecrawlResponse.ok) { - const error = await firecrawlResponse.text(); - throw new Error(`Firecrawl API error: ${error}`); + if (!scrapeResult.success) { + throw new Error(scrapeResult.error || 'Failed to capture screenshot'); } - - const data = await firecrawlResponse.json(); - if (!data.success || !data.data?.screenshot) { - throw new Error('Failed to capture screenshot'); + if (!scrapeResult.data?.screenshot) { + throw new Error('Screenshot not available in response'); } return NextResponse.json({ success: true, - screenshot: data.data.screenshot, - metadata: data.data.metadata + screenshot: scrapeResult.data.screenshot, + metadata: scrapeResult.data.metadata || {} }); } catch (error: any) { diff --git a/app/api/scrape-website/route.ts b/app/api/scrape-website/route.ts new file mode 100644 index 0000000..73e9e48 --- /dev/null +++ b/app/api/scrape-website/route.ts @@ -0,0 +1,106 @@ +import { NextRequest, NextResponse } from "next/server"; +import FirecrawlApp from '@mendable/firecrawl-js'; + +export async function POST(request: NextRequest) { + try { + const { url, formats = ['markdown', 'html'], options = {} } = await request.json(); + + if (!url) { + return NextResponse.json( + { error: "URL is required" }, + { status: 400 } + ); + } + + // Initialize Firecrawl with API key from environment + const apiKey = process.env.FIRECRAWL_API_KEY; + + if (!apiKey) { + console.error("FIRECRAWL_API_KEY not configured"); + // For demo purposes, return mock data if API key is not set + return NextResponse.json({ + success: true, + data: { + title: "Example Website", + content: `This is a mock response for ${url}. Configure FIRECRAWL_API_KEY to enable real scraping.`, + description: "A sample website", + markdown: `# Example Website\n\nThis is mock content for demonstration purposes.`, + html: `

Example Website

This is mock content for demonstration purposes.

`, + metadata: { + title: "Example Website", + description: "A sample website", + sourceURL: url, + statusCode: 200 + } + } + }); + } + + const app = new FirecrawlApp({ apiKey }); + + // Scrape the website using the latest SDK patterns + // Include screenshot if requested in formats + const scrapeResult = await app.scrapeUrl(url, { + formats: formats, + onlyMainContent: options.onlyMainContent !== false, // Default to true for cleaner content + waitFor: options.waitFor || 2000, // Wait for dynamic content + timeout: options.timeout || 30000, + ...options // Pass through any additional options + }); + + // Handle the response according to the latest SDK structure + if (!scrapeResult.success) { + throw new Error(scrapeResult.error || "Failed to scrape website"); + } + + return NextResponse.json({ + success: true, + data: { + title: scrapeResult.data?.metadata?.title || "Untitled", + content: scrapeResult.data?.markdown || scrapeResult.data?.html || "", + description: scrapeResult.data?.metadata?.description || "", + markdown: scrapeResult.data?.markdown || "", + html: scrapeResult.data?.html || "", + metadata: scrapeResult.data?.metadata || {}, + screenshot: scrapeResult.data?.screenshot || null, + links: scrapeResult.data?.links || [], + // Include raw data for flexibility + raw: scrapeResult.data + } + }); + + } catch (error) { + console.error("Error scraping website:", error); + + // Return a more detailed error response + return NextResponse.json({ + success: false, + error: error instanceof Error ? error.message : "Failed to scrape website", + // Provide mock data as fallback for development + data: { + title: "Example Website", + content: "This is fallback content due to an error. Please check your configuration.", + description: "Error occurred while scraping", + markdown: `# Error\n\n${error instanceof Error ? error.message : 'Unknown error occurred'}`, + html: `

Error

${error instanceof Error ? error.message : 'Unknown error occurred'}

`, + metadata: { + title: "Error", + description: "Failed to scrape website", + statusCode: 500 + } + } + }, { status: 500 }); + } +} + +// Optional: Add OPTIONS handler for CORS if needed +export async function OPTIONS(request: NextRequest) { + return new NextResponse(null, { + status: 200, + headers: { + 'Access-Control-Allow-Origin': '*', + 'Access-Control-Allow-Methods': 'POST, OPTIONS', + 'Access-Control-Allow-Headers': 'Content-Type', + }, + }); +} \ No newline at end of file diff --git a/app/builder/page.tsx b/app/builder/page.tsx new file mode 100644 index 0000000..9135b63 --- /dev/null +++ b/app/builder/page.tsx @@ -0,0 +1,285 @@ +"use client"; + +import { useEffect, useState } from "react"; +import { useRouter } from "next/navigation"; +import { toast } from "sonner"; + +export default function BuilderPage() { + const [targetUrl, setTargetUrl] = useState(""); + const [selectedStyle, setSelectedStyle] = useState("modern"); + const [isLoading, setIsLoading] = useState(true); + const [previewUrl, setPreviewUrl] = useState(""); + const [progress, setProgress] = useState("Initializing..."); + const [generatedCode, setGeneratedCode] = useState(""); + const router = useRouter(); + + useEffect(() => { + // Get the URL and style from sessionStorage + const url = sessionStorage.getItem('targetUrl'); + const style = sessionStorage.getItem('selectedStyle'); + + if (!url) { + router.push('/'); + return; + } + + setTargetUrl(url); + setSelectedStyle(style || "modern"); + + // Start the website generation process + generateWebsite(url, style || "modern"); + }, [router]); + + const generateWebsite = async (url: string, style: string) => { + try { + setProgress("Analyzing website..."); + + // For demo purposes, we'll generate a simple HTML template + // In production, this would call the actual scraping and generation APIs + const mockGeneratedCode = ` + + + + + + ${style} Website - Reimagined + + + +
+ +
+ +
+
+

Welcome to Your ${style === 'modern' ? 'Modern' : style === 'playful' ? 'Playful' : style === 'professional' ? 'Professional' : 'Artistic'} Website

+

Reimagined from ${url}

+ Get Started +
+ +
+
+

Fast

+

Lightning-fast performance optimized for modern web standards.

+
+
+

Responsive

+

Looks great on all devices, from mobile to desktop.

+
+
+

Beautiful

+

Stunning design that captures attention and drives engagement.

+
+
+
+ +`; + + setGeneratedCode(mockGeneratedCode); + + // Create a blob URL for the preview + const blob = new Blob([mockGeneratedCode], { type: 'text/html' }); + const blobUrl = URL.createObjectURL(blob); + setPreviewUrl(blobUrl); + + setProgress("Website ready!"); + setIsLoading(false); + + // Show success message + toast.success("Website generated successfully!"); + + } catch (error) { + console.error("Error generating website:", error); + toast.error("Failed to generate website. Please try again."); + setProgress("Error occurred"); + setTimeout(() => router.push('/'), 2000); + } + }; + + const downloadCode = () => { + const blob = new Blob([generatedCode], { type: 'text/html' }); + const url = URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = url; + a.download = 'website.html'; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + URL.revokeObjectURL(url); + toast.success("Code downloaded!"); + }; + + return ( +
+
+ {/* Sidebar */} +
+

Building Your Website

+ +
+
+
Target URL
+
{targetUrl}
+
+ +
+
Style
+
{selectedStyle}
+
+ +
+
Status
+
{progress}
+
+
+ +
+ {!isLoading && ( + + )} + + +
+
+ + {/* Preview */} +
+ {isLoading ? ( +
+
+
+

{progress}

+
+
+ ) : ( + previewUrl && ( +