From fe597db5b3f6cffb96cded5ef2612e2cc4012c33 Mon Sep 17 00:00:00 2001 From: Will Chen Date: Tue, 24 Jun 2025 16:46:40 -0700 Subject: [PATCH] harden app files snapshot (#486) --- e2e-tests/dyad_tags_parsing.spec.ts | 2 +- e2e-tests/helpers/test_helper.ts | 2 +- e2e-tests/partial_response.spec.ts | 2 +- e2e-tests/select_component.spec.ts | 2 +- ...gs_parsing.spec.ts_angle-tags-handled.txt} | 0 ...tial_response.spec.ts_message-resumed.txt} | 0 .../select_component.spec.ts_app-upgraded.txt | 494 +++++++++++++++++ ...c.ts_upgrade-app-to-select-component-1.txt | 496 +----------------- ...c.ts_upgrade-app-to-select-component-2.txt | 14 - ...ent.spec.ts_supabase-client-generated.txt} | 0 e2e-tests/supabase_client.spec.ts | 2 +- 11 files changed, 507 insertions(+), 507 deletions(-) rename e2e-tests/snapshots/{dyad_tags_parsing.spec.ts_dyad-tags-handles-nested-tags-1.txt => dyad_tags_parsing.spec.ts_angle-tags-handled.txt} (100%) rename e2e-tests/snapshots/{partial_response.spec.ts_partial-message-is-resumed-2.txt => partial_response.spec.ts_message-resumed.txt} (100%) create mode 100644 e2e-tests/snapshots/select_component.spec.ts_app-upgraded.txt delete mode 100644 e2e-tests/snapshots/select_component.spec.ts_upgrade-app-to-select-component-2.txt rename e2e-tests/snapshots/{supabase_client.spec.ts_supabase-client-is-generated-1.txt => supabase_client.spec.ts_supabase-client-generated.txt} (100%) diff --git a/e2e-tests/dyad_tags_parsing.spec.ts b/e2e-tests/dyad_tags_parsing.spec.ts index 1936149..8924008 100644 --- a/e2e-tests/dyad_tags_parsing.spec.ts +++ b/e2e-tests/dyad_tags_parsing.spec.ts @@ -4,5 +4,5 @@ testSkipIfWindows("dyad tags handles nested < tags", async ({ po }) => { await po.setUp({ autoApprove: true }); await po.importApp("minimal"); await po.sendPrompt("tc=dyad-write-angle"); - await po.snapshotAppFiles(); + await po.snapshotAppFiles({ name: "angle-tags-handled" }); }); diff --git a/e2e-tests/helpers/test_helper.ts b/e2e-tests/helpers/test_helper.ts index 55719e7..cc87c6d 100644 --- a/e2e-tests/helpers/test_helper.ts +++ b/e2e-tests/helpers/test_helper.ts @@ -285,7 +285,7 @@ export class PageObject { await expect(this.page.getByRole("dialog")).toMatchAriaSnapshot(); } - async snapshotAppFiles({ name }: { name?: string } = {}) { + async snapshotAppFiles({ name }: { name: string }) { const currentAppName = await this.getCurrentAppName(); if (!currentAppName) { throw new Error("No app selected"); diff --git a/e2e-tests/partial_response.spec.ts b/e2e-tests/partial_response.spec.ts index cd10860..09c5081 100644 --- a/e2e-tests/partial_response.spec.ts +++ b/e2e-tests/partial_response.spec.ts @@ -8,5 +8,5 @@ test("partial message is resumed", async ({ po }) => { // This is a special test case which triggers a dump. await po.snapshotServerDump("all-messages"); await po.snapshotMessages({ replaceDumpPath: true }); - await po.snapshotAppFiles(); + await po.snapshotAppFiles({ name: "message-resumed" }); }); diff --git a/e2e-tests/select_component.spec.ts b/e2e-tests/select_component.spec.ts index d87d902..be45c27 100644 --- a/e2e-tests/select_component.spec.ts +++ b/e2e-tests/select_component.spec.ts @@ -61,7 +61,7 @@ testSkipIfWindows("upgrade app to select component", async ({ po }) => { await po.expectAppUpgradeButtonIsNotVisible({ upgradeId: "component-tagger", }); - await po.snapshotAppFiles(); + await po.snapshotAppFiles({ name: "app-upgraded" }); await po.clickOpenInChatButton(); // There should be another version from the upgrade being committed. await expect(po.page.getByText("Version 2")).toBeVisible(); diff --git a/e2e-tests/snapshots/dyad_tags_parsing.spec.ts_dyad-tags-handles-nested-tags-1.txt b/e2e-tests/snapshots/dyad_tags_parsing.spec.ts_angle-tags-handled.txt similarity index 100% rename from e2e-tests/snapshots/dyad_tags_parsing.spec.ts_dyad-tags-handles-nested-tags-1.txt rename to e2e-tests/snapshots/dyad_tags_parsing.spec.ts_angle-tags-handled.txt diff --git a/e2e-tests/snapshots/partial_response.spec.ts_partial-message-is-resumed-2.txt b/e2e-tests/snapshots/partial_response.spec.ts_message-resumed.txt similarity index 100% rename from e2e-tests/snapshots/partial_response.spec.ts_partial-message-is-resumed-2.txt rename to e2e-tests/snapshots/partial_response.spec.ts_message-resumed.txt diff --git a/e2e-tests/snapshots/select_component.spec.ts_app-upgraded.txt b/e2e-tests/snapshots/select_component.spec.ts_app-upgraded.txt new file mode 100644 index 0000000..142366b --- /dev/null +++ b/e2e-tests/snapshots/select_component.spec.ts_app-upgraded.txt @@ -0,0 +1,494 @@ +=== .gitignore === +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + + +=== AI_RULES.md === +# AI RULES placeholder + + +=== components.json === +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": false, + "tsx": true, + "tailwind": { + "config": "", + "css": "src/styles/globals.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + }, + "iconLibrary": "lucide" +} + + +=== index.html === + + + + + + dyad-generated-app + + + +
+ + + + + +=== package.json === +{ + "name": "vite_react_shadcn_ts", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "build:dev": "vite build --mode development", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "@radix-ui/react-slot": "^1.2.3", + "@tailwindcss/vite": "^4.1.8", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "lucide-react": "^0.514.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-router-dom": "^6.26.2", + "tailwind-merge": "^3.3.1", + "tailwindcss": "^4.1.8" + }, + "devDependencies": { + "@dyad-sh/react-vite-component-tagger": "^0.8.0", + "@types/node": "^22.5.5", + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", + "@vitejs/plugin-react-swc": "^3.9.0", + "tw-animate-css": "^1.3.4", + "typescript": "^5.5.3", + "vite": "^6.3.4" + }, + "packageManager": "" +} + +=== src/App.tsx === +import { BrowserRouter, Routes, Route } from "react-router-dom"; +import Index from "./pages/Index"; + +const App = () => ( + + + } /> + + +); + +export default App; + + +=== src/components/ui/button.tsx === +import * as React from "react"; +import { Slot } from "@radix-ui/react-slot"; +import { cva, type VariantProps } from "class-variance-authority"; + +import { cn } from "@/lib/utils"; + +const buttonVariants = cva( + "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive", + { + variants: { + variant: { + default: + "bg-primary text-primary-foreground shadow-xs hover:bg-primary/90", + destructive: + "bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60", + outline: + "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50", + secondary: + "bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80", + ghost: + "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50", + link: "text-primary underline-offset-4 hover:underline", + }, + size: { + default: "h-9 px-4 py-2 has-[>svg]:px-3", + sm: "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5", + lg: "h-10 rounded-md px-6 has-[>svg]:px-4", + icon: "size-9", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + }, +); + +function Button({ + className, + variant, + size, + asChild = false, + ...props +}: React.ComponentProps<"button"> & + VariantProps & { + asChild?: boolean; + }) { + const Comp = asChild ? Slot : "button"; + + return ( + + ); +} + +export { Button, buttonVariants }; + + +=== src/lib/utils.ts === +import { clsx, type ClassValue } from "clsx"; +import { twMerge } from "tailwind-merge"; + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)); +} + + +=== src/main.tsx === +import { createRoot } from "react-dom/client"; +import App from "./App.tsx"; +import "./styles/globals.css"; + +createRoot(document.getElementById("root")!).render(); + + +=== src/pages/Index.tsx === +import { Button } from "@/components/ui/button"; +import { Rocket, ShieldCheck, Sparkles } from "lucide-react"; + +const features = [ + { + icon: , + title: "Fast & Modern", + description: "Built with the latest tech for blazing fast performance.", + }, + { + icon: , + title: "Secure by Design", + description: "Security best practices baked in from the start.", + }, + { + icon: , + title: "Easy to Customize", + description: "Effortlessly adapt the template to your needs.", + }, +]; + +const Index = () => { + return ( +
+ {/* Hero Section */} +
+

+ Launch Your Next Project +

+

+ A simple, modern landing page template built with React, shadcn/ui, + and Tailwind CSS. +

+ +
+ + {/* Features Section */} +
+
+
+ {features.map((feature, idx) => ( +
+ {feature.icon} +

+ {feature.title} +

+

{feature.description}

+
+ ))} +
+
+
+
+ ); +}; + +export default Index; + + +=== src/styles/globals.css === +@import "tailwindcss"; +@import "tw-animate-css"; + +@custom-variant dark (&:is(.dark *)); + +@theme inline { + --radius-sm: calc(var(--radius) - 4px); + --radius-md: calc(var(--radius) - 2px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) + 4px); + --color-background: var(--background); + --color-foreground: var(--foreground); + --color-card: var(--card); + --color-card-foreground: var(--card-foreground); + --color-popover: var(--popover); + --color-popover-foreground: var(--popover-foreground); + --color-primary: var(--primary); + --color-primary-foreground: var(--primary-foreground); + --color-secondary: var(--secondary); + --color-secondary-foreground: var(--secondary-foreground); + --color-muted: var(--muted); + --color-muted-foreground: var(--muted-foreground); + --color-accent: var(--accent); + --color-accent-foreground: var(--accent-foreground); + --color-destructive: var(--destructive); + --color-border: var(--border); + --color-input: var(--input); + --color-ring: var(--ring); + --color-chart-1: var(--chart-1); + --color-chart-2: var(--chart-2); + --color-chart-3: var(--chart-3); + --color-chart-4: var(--chart-4); + --color-chart-5: var(--chart-5); + --color-sidebar: var(--sidebar); + --color-sidebar-foreground: var(--sidebar-foreground); + --color-sidebar-primary: var(--sidebar-primary); + --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); + --color-sidebar-accent: var(--sidebar-accent); + --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); + --color-sidebar-border: var(--sidebar-border); + --color-sidebar-ring: var(--sidebar-ring); +} + +:root { + --radius: 0.625rem; + --background: oklch(1 0 0); + --foreground: oklch(0.145 0 0); + --card: oklch(1 0 0); + --card-foreground: oklch(0.145 0 0); + --popover: oklch(1 0 0); + --popover-foreground: oklch(0.145 0 0); + --primary: oklch(0.205 0 0); + --primary-foreground: oklch(0.985 0 0); + --secondary: oklch(0.97 0 0); + --secondary-foreground: oklch(0.205 0 0); + --muted: oklch(0.97 0 0); + --muted-foreground: oklch(0.556 0 0); + --accent: oklch(0.97 0 0); + --accent-foreground: oklch(0.205 0 0); + --destructive: oklch(0.577 0.245 27.325); + --border: oklch(0.922 0 0); + --input: oklch(0.922 0 0); + --ring: oklch(0.708 0 0); + --chart-1: oklch(0.646 0.222 41.116); + --chart-2: oklch(0.6 0.118 184.704); + --chart-3: oklch(0.398 0.07 227.392); + --chart-4: oklch(0.828 0.189 84.429); + --chart-5: oklch(0.769 0.188 70.08); + --sidebar: oklch(0.985 0 0); + --sidebar-foreground: oklch(0.145 0 0); + --sidebar-primary: oklch(0.205 0 0); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.97 0 0); + --sidebar-accent-foreground: oklch(0.205 0 0); + --sidebar-border: oklch(0.922 0 0); + --sidebar-ring: oklch(0.708 0 0); +} + +.dark { + --background: oklch(0.145 0 0); + --foreground: oklch(0.985 0 0); + --card: oklch(0.205 0 0); + --card-foreground: oklch(0.985 0 0); + --popover: oklch(0.205 0 0); + --popover-foreground: oklch(0.985 0 0); + --primary: oklch(0.922 0 0); + --primary-foreground: oklch(0.205 0 0); + --secondary: oklch(0.269 0 0); + --secondary-foreground: oklch(0.985 0 0); + --muted: oklch(0.269 0 0); + --muted-foreground: oklch(0.708 0 0); + --accent: oklch(0.269 0 0); + --accent-foreground: oklch(0.985 0 0); + --destructive: oklch(0.704 0.191 22.216); + --border: oklch(1 0 0 / 10%); + --input: oklch(1 0 0 / 15%); + --ring: oklch(0.556 0 0); + --chart-1: oklch(0.488 0.243 264.376); + --chart-2: oklch(0.696 0.17 162.48); + --chart-3: oklch(0.769 0.188 70.08); + --chart-4: oklch(0.627 0.265 303.9); + --chart-5: oklch(0.645 0.246 16.439); + --sidebar: oklch(0.205 0 0); + --sidebar-foreground: oklch(0.985 0 0); + --sidebar-primary: oklch(0.488 0.243 264.376); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.269 0 0); + --sidebar-accent-foreground: oklch(0.985 0 0); + --sidebar-border: oklch(1 0 0 / 10%); + --sidebar-ring: oklch(0.556 0 0); +} + +@layer base { + * { + @apply border-border outline-ring/50; + } + body { + @apply bg-background text-foreground; + } +} + + +=== src/vite-env.d.ts === +/// + + +=== tsconfig.app.json === +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": false, + "noUnusedLocals": false, + "noUnusedParameters": false, + "noImplicitAny": false, + "noFallthroughCasesInSwitch": false, + + "baseUrl": ".", + "paths": { + "@/*": ["./src/*"] + } + }, + "include": ["src"] +} + + +=== tsconfig.json === +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ], + "compilerOptions": { + "baseUrl": ".", + "paths": { + "@/*": ["./src/*"] + }, + "noImplicitAny": false, + "noUnusedParameters": false, + "skipLibCheck": true, + "allowJs": true, + "noUnusedLocals": false, + "strictNullChecks": false + } +} + + +=== tsconfig.node.json === +{ + "compilerOptions": { + "target": "ES2022", + "lib": ["ES2023"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": false, + "noUnusedParameters": false, + "noFallthroughCasesInSwitch": true + }, + "include": ["vite.config.ts"] +} + + +=== vite.config.ts === +import { defineConfig } from "vite"; +import tailwindcss from "@tailwindcss/vite"; +import react from "@vitejs/plugin-react-swc"; +import path from "path"; +import dyadComponentTagger from '@dyad-sh/react-vite-component-tagger'; + +export default defineConfig(() => ({ + server: { + host: "::", + port: 8080, + }, + plugins: [dyadComponentTagger(), react(), tailwindcss()], + resolve: { + alias: { + "@": path.resolve(__dirname, "./src"), + }, + }, +})); diff --git a/e2e-tests/snapshots/select_component.spec.ts_upgrade-app-to-select-component-1.txt b/e2e-tests/snapshots/select_component.spec.ts_upgrade-app-to-select-component-1.txt index 142366b..640213e 100644 --- a/e2e-tests/snapshots/select_component.spec.ts_upgrade-app-to-select-component-1.txt +++ b/e2e-tests/snapshots/select_component.spec.ts_upgrade-app-to-select-component-1.txt @@ -1,494 +1,14 @@ -=== .gitignore === -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* -lerna-debug.log* +=== +role: user +message: [dump] make it smaller -node_modules -dist -dist-ssr -*.local +Selected component: h1 (file: src/pages/Index.tsx) -# Editor directories and files -.vscode/* -!.vscode/extensions.json -.idea -.DS_Store -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? - - -=== AI_RULES.md === -# AI RULES placeholder - - -=== components.json === -{ - "$schema": "https://ui.shadcn.com/schema.json", - "style": "new-york", - "rsc": false, - "tsx": true, - "tailwind": { - "config": "", - "css": "src/styles/globals.css", - "baseColor": "neutral", - "cssVariables": true, - "prefix": "" - }, - "aliases": { - "components": "@/components", - "utils": "@/lib/utils", - "ui": "@/components/ui", - "lib": "@/lib", - "hooks": "@/hooks" - }, - "iconLibrary": "lucide" -} - - -=== index.html === - - - - - - dyad-generated-app - - - -
- - - - - -=== package.json === -{ - "name": "vite_react_shadcn_ts", - "private": true, - "version": "0.0.0", - "type": "module", - "scripts": { - "dev": "vite", - "build": "vite build", - "build:dev": "vite build --mode development", - "lint": "eslint .", - "preview": "vite preview" - }, - "dependencies": { - "@radix-ui/react-slot": "^1.2.3", - "@tailwindcss/vite": "^4.1.8", - "class-variance-authority": "^0.7.1", - "clsx": "^2.1.1", - "lucide-react": "^0.514.0", - "react": "^18.3.1", - "react-dom": "^18.3.1", - "react-router-dom": "^6.26.2", - "tailwind-merge": "^3.3.1", - "tailwindcss": "^4.1.8" - }, - "devDependencies": { - "@dyad-sh/react-vite-component-tagger": "^0.8.0", - "@types/node": "^22.5.5", - "@types/react": "^18.3.3", - "@types/react-dom": "^18.3.0", - "@vitejs/plugin-react-swc": "^3.9.0", - "tw-animate-css": "^1.3.4", - "typescript": "^5.5.3", - "vite": "^6.3.4" - }, - "packageManager": "" -} - -=== src/App.tsx === -import { BrowserRouter, Routes, Route } from "react-router-dom"; -import Index from "./pages/Index"; - -const App = () => ( - - - } /> - - -); - -export default App; - - -=== src/components/ui/button.tsx === -import * as React from "react"; -import { Slot } from "@radix-ui/react-slot"; -import { cva, type VariantProps } from "class-variance-authority"; - -import { cn } from "@/lib/utils"; - -const buttonVariants = cva( - "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive", - { - variants: { - variant: { - default: - "bg-primary text-primary-foreground shadow-xs hover:bg-primary/90", - destructive: - "bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60", - outline: - "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50", - secondary: - "bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80", - ghost: - "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50", - link: "text-primary underline-offset-4 hover:underline", - }, - size: { - default: "h-9 px-4 py-2 has-[>svg]:px-3", - sm: "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5", - lg: "h-10 rounded-md px-6 has-[>svg]:px-4", - icon: "size-9", - }, - }, - defaultVariants: { - variant: "default", - size: "default", - }, - }, -); - -function Button({ - className, - variant, - size, - asChild = false, - ...props -}: React.ComponentProps<"button"> & - VariantProps & { - asChild?: boolean; - }) { - const Comp = asChild ? Slot : "button"; - - return ( - - ); -} - -export { Button, buttonVariants }; - - -=== src/lib/utils.ts === -import { clsx, type ClassValue } from "clsx"; -import { twMerge } from "tailwind-merge"; - -export function cn(...inputs: ClassValue[]) { - return twMerge(clsx(inputs)); -} - - -=== src/main.tsx === -import { createRoot } from "react-dom/client"; -import App from "./App.tsx"; -import "./styles/globals.css"; - -createRoot(document.getElementById("root")!).render(); - - -=== src/pages/Index.tsx === -import { Button } from "@/components/ui/button"; -import { Rocket, ShieldCheck, Sparkles } from "lucide-react"; - -const features = [ - { - icon: , - title: "Fast & Modern", - description: "Built with the latest tech for blazing fast performance.", - }, - { - icon: , - title: "Secure by Design", - description: "Security best practices baked in from the start.", - }, - { - icon: , - title: "Easy to Customize", - description: "Effortlessly adapt the template to your needs.", - }, -]; - -const Index = () => { - return ( -
- {/* Hero Section */} +Snippet: +```
-

+

// <-- EDIT HERE Launch Your Next Project

- A simple, modern landing page template built with React, shadcn/ui, - and Tailwind CSS. -

- -
- - {/* Features Section */} -
-
-
- {features.map((feature, idx) => ( -
- {feature.icon} -

- {feature.title} -

-

{feature.description}

-
- ))} -
-
-
-
- ); -}; - -export default Index; - - -=== src/styles/globals.css === -@import "tailwindcss"; -@import "tw-animate-css"; - -@custom-variant dark (&:is(.dark *)); - -@theme inline { - --radius-sm: calc(var(--radius) - 4px); - --radius-md: calc(var(--radius) - 2px); - --radius-lg: var(--radius); - --radius-xl: calc(var(--radius) + 4px); - --color-background: var(--background); - --color-foreground: var(--foreground); - --color-card: var(--card); - --color-card-foreground: var(--card-foreground); - --color-popover: var(--popover); - --color-popover-foreground: var(--popover-foreground); - --color-primary: var(--primary); - --color-primary-foreground: var(--primary-foreground); - --color-secondary: var(--secondary); - --color-secondary-foreground: var(--secondary-foreground); - --color-muted: var(--muted); - --color-muted-foreground: var(--muted-foreground); - --color-accent: var(--accent); - --color-accent-foreground: var(--accent-foreground); - --color-destructive: var(--destructive); - --color-border: var(--border); - --color-input: var(--input); - --color-ring: var(--ring); - --color-chart-1: var(--chart-1); - --color-chart-2: var(--chart-2); - --color-chart-3: var(--chart-3); - --color-chart-4: var(--chart-4); - --color-chart-5: var(--chart-5); - --color-sidebar: var(--sidebar); - --color-sidebar-foreground: var(--sidebar-foreground); - --color-sidebar-primary: var(--sidebar-primary); - --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); - --color-sidebar-accent: var(--sidebar-accent); - --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); - --color-sidebar-border: var(--sidebar-border); - --color-sidebar-ring: var(--sidebar-ring); -} - -:root { - --radius: 0.625rem; - --background: oklch(1 0 0); - --foreground: oklch(0.145 0 0); - --card: oklch(1 0 0); - --card-foreground: oklch(0.145 0 0); - --popover: oklch(1 0 0); - --popover-foreground: oklch(0.145 0 0); - --primary: oklch(0.205 0 0); - --primary-foreground: oklch(0.985 0 0); - --secondary: oklch(0.97 0 0); - --secondary-foreground: oklch(0.205 0 0); - --muted: oklch(0.97 0 0); - --muted-foreground: oklch(0.556 0 0); - --accent: oklch(0.97 0 0); - --accent-foreground: oklch(0.205 0 0); - --destructive: oklch(0.577 0.245 27.325); - --border: oklch(0.922 0 0); - --input: oklch(0.922 0 0); - --ring: oklch(0.708 0 0); - --chart-1: oklch(0.646 0.222 41.116); - --chart-2: oklch(0.6 0.118 184.704); - --chart-3: oklch(0.398 0.07 227.392); - --chart-4: oklch(0.828 0.189 84.429); - --chart-5: oklch(0.769 0.188 70.08); - --sidebar: oklch(0.985 0 0); - --sidebar-foreground: oklch(0.145 0 0); - --sidebar-primary: oklch(0.205 0 0); - --sidebar-primary-foreground: oklch(0.985 0 0); - --sidebar-accent: oklch(0.97 0 0); - --sidebar-accent-foreground: oklch(0.205 0 0); - --sidebar-border: oklch(0.922 0 0); - --sidebar-ring: oklch(0.708 0 0); -} - -.dark { - --background: oklch(0.145 0 0); - --foreground: oklch(0.985 0 0); - --card: oklch(0.205 0 0); - --card-foreground: oklch(0.985 0 0); - --popover: oklch(0.205 0 0); - --popover-foreground: oklch(0.985 0 0); - --primary: oklch(0.922 0 0); - --primary-foreground: oklch(0.205 0 0); - --secondary: oklch(0.269 0 0); - --secondary-foreground: oklch(0.985 0 0); - --muted: oklch(0.269 0 0); - --muted-foreground: oklch(0.708 0 0); - --accent: oklch(0.269 0 0); - --accent-foreground: oklch(0.985 0 0); - --destructive: oklch(0.704 0.191 22.216); - --border: oklch(1 0 0 / 10%); - --input: oklch(1 0 0 / 15%); - --ring: oklch(0.556 0 0); - --chart-1: oklch(0.488 0.243 264.376); - --chart-2: oklch(0.696 0.17 162.48); - --chart-3: oklch(0.769 0.188 70.08); - --chart-4: oklch(0.627 0.265 303.9); - --chart-5: oklch(0.645 0.246 16.439); - --sidebar: oklch(0.205 0 0); - --sidebar-foreground: oklch(0.985 0 0); - --sidebar-primary: oklch(0.488 0.243 264.376); - --sidebar-primary-foreground: oklch(0.985 0 0); - --sidebar-accent: oklch(0.269 0 0); - --sidebar-accent-foreground: oklch(0.985 0 0); - --sidebar-border: oklch(1 0 0 / 10%); - --sidebar-ring: oklch(0.556 0 0); -} - -@layer base { - * { - @apply border-border outline-ring/50; - } - body { - @apply bg-background text-foreground; - } -} - - -=== src/vite-env.d.ts === -/// - - -=== tsconfig.app.json === -{ - "compilerOptions": { - "target": "ES2020", - "useDefineForClassFields": true, - "lib": ["ES2020", "DOM", "DOM.Iterable"], - "module": "ESNext", - "skipLibCheck": true, - - /* Bundler mode */ - "moduleResolution": "bundler", - "allowImportingTsExtensions": true, - "isolatedModules": true, - "moduleDetection": "force", - "noEmit": true, - "jsx": "react-jsx", - - /* Linting */ - "strict": false, - "noUnusedLocals": false, - "noUnusedParameters": false, - "noImplicitAny": false, - "noFallthroughCasesInSwitch": false, - - "baseUrl": ".", - "paths": { - "@/*": ["./src/*"] - } - }, - "include": ["src"] -} - - -=== tsconfig.json === -{ - "files": [], - "references": [ - { "path": "./tsconfig.app.json" }, - { "path": "./tsconfig.node.json" } - ], - "compilerOptions": { - "baseUrl": ".", - "paths": { - "@/*": ["./src/*"] - }, - "noImplicitAny": false, - "noUnusedParameters": false, - "skipLibCheck": true, - "allowJs": true, - "noUnusedLocals": false, - "strictNullChecks": false - } -} - - -=== tsconfig.node.json === -{ - "compilerOptions": { - "target": "ES2022", - "lib": ["ES2023"], - "module": "ESNext", - "skipLibCheck": true, - - /* Bundler mode */ - "moduleResolution": "bundler", - "allowImportingTsExtensions": true, - "isolatedModules": true, - "moduleDetection": "force", - "noEmit": true, - - /* Linting */ - "strict": true, - "noUnusedLocals": false, - "noUnusedParameters": false, - "noFallthroughCasesInSwitch": true - }, - "include": ["vite.config.ts"] -} - - -=== vite.config.ts === -import { defineConfig } from "vite"; -import tailwindcss from "@tailwindcss/vite"; -import react from "@vitejs/plugin-react-swc"; -import path from "path"; -import dyadComponentTagger from '@dyad-sh/react-vite-component-tagger'; - -export default defineConfig(() => ({ - server: { - host: "::", - port: 8080, - }, - plugins: [dyadComponentTagger(), react(), tailwindcss()], - resolve: { - alias: { - "@": path.resolve(__dirname, "./src"), - }, - }, -})); +``` \ No newline at end of file diff --git a/e2e-tests/snapshots/select_component.spec.ts_upgrade-app-to-select-component-2.txt b/e2e-tests/snapshots/select_component.spec.ts_upgrade-app-to-select-component-2.txt deleted file mode 100644 index 640213e..0000000 --- a/e2e-tests/snapshots/select_component.spec.ts_upgrade-app-to-select-component-2.txt +++ /dev/null @@ -1,14 +0,0 @@ -=== -role: user -message: [dump] make it smaller - -Selected component: h1 (file: src/pages/Index.tsx) - -Snippet: -``` -
-

// <-- EDIT HERE - Launch Your Next Project -

-

-``` \ No newline at end of file diff --git a/e2e-tests/snapshots/supabase_client.spec.ts_supabase-client-is-generated-1.txt b/e2e-tests/snapshots/supabase_client.spec.ts_supabase-client-generated.txt similarity index 100% rename from e2e-tests/snapshots/supabase_client.spec.ts_supabase-client-is-generated-1.txt rename to e2e-tests/snapshots/supabase_client.spec.ts_supabase-client-generated.txt diff --git a/e2e-tests/supabase_client.spec.ts b/e2e-tests/supabase_client.spec.ts index 9509d6f..3e8013a 100644 --- a/e2e-tests/supabase_client.spec.ts +++ b/e2e-tests/supabase_client.spec.ts @@ -11,5 +11,5 @@ testSkipIfWindows("supabase client is generated", async ({ po }) => { await po.clickBackButton(); await po.sendPrompt("tc=generate-supabase-client"); - await po.snapshotAppFiles(); + await po.snapshotAppFiles({ name: "supabase-client-generated" }); });