[dyad] Improved UI and added skeleton loader - wrote 4 file(s)

This commit is contained in:
[dyad]
2026-01-20 12:13:06 +01:00
parent 4163372a17
commit 0d5065da81
4 changed files with 76 additions and 136 deletions

View File

@@ -2,147 +2,53 @@
@tailwind components; @tailwind components;
@tailwind utilities; @tailwind utilities;
@layer base { @layer base {
:root { :root {
--background: 240 10% 98%;
--background: 0 0% 100%; --foreground: 240 10% 3.9%;
--foreground: 0 0% 3.9%;
--card: 0 0% 100%; --card: 0 0% 100%;
--card-foreground: 240 10% 3.9%;
--card-foreground: 0 0% 3.9%;
--popover: 0 0% 100%; --popover: 0 0% 100%;
--popover-foreground: 240 10% 3.9%;
--primary: 262 84% 58%;
--primary-foreground: 0 0% 100%;
--secondary: 240 5% 90%;
--secondary-foreground: 240 5% 10%;
--muted: 240 5% 96%;
--muted-foreground: 240 4% 46%;
--accent: 240 5% 90%;
--accent-foreground: 240 5% 10%;
--destructive: 0 84% 60%;
--destructive-foreground: 0 0% 100%;
--border: 240 5% 83%;
--input: 240 5% 90%;
--ring: 262 84% 58%;
--radius: 0.75rem;
}
--popover-foreground: 0 0% 3.9%;
--primary: 0 0% 9%;
--primary-foreground: 0 0% 98%;
--secondary: 0 0% 96.1%;
--secondary-foreground: 0 0% 9%;
--muted: 0 0% 96.1%;
--muted-foreground: 0 0% 45.1%;
--accent: 0 0% 96.1%;
--accent-foreground: 0 0% 9%;
--destructive: 0 84.2% 60.2%;
--destructive-foreground: 0 0% 98%;
--border: 0 0% 89.8%;
--input: 0 0% 89.8%;
--ring: 0 0% 3.9%;
--chart-1: 12 76% 61%;
--chart-2: 173 58% 39%;
--chart-3: 197 37% 24%;
--chart-4: 43 74% 66%;
--chart-5: 27 87% 67%;
--radius: 0.5rem
;
--sidebar-background: 0 0% 98%;
--sidebar-foreground: 240 5.3% 26.1%;
--sidebar-primary: 240 5.9% 10%;
--sidebar-primary-foreground: 0 0% 98%;
--sidebar-accent: 240 4.8% 95.9%;
--sidebar-accent-foreground: 240 5.9% 10%;
--sidebar-border: 220 13% 91%;
--sidebar-ring: 217.2 91.2% 59.8%}
.dark { .dark {
--background: 240 10% 3.9%;
--background: 0 0% 3.9%;
--foreground: 0 0% 98%; --foreground: 0 0% 98%;
--card: 240 5% 11%;
--card: 0 0% 3.9%;
--card-foreground: 0 0% 98%; --card-foreground: 0 0% 98%;
--popover: 240 10% 3.9%;
--popover: 0 0% 3.9%;
--popover-foreground: 0 0% 98%; --popover-foreground: 0 0% 98%;
--primary: 262 84% 68%;
--primary: 0 0% 98%; --primary-foreground: 240 5% 10%;
--secondary: 240 4% 16%;
--primary-foreground: 0 0% 9%;
--secondary: 0 0% 14.9%;
--secondary-foreground: 0 0% 98%; --secondary-foreground: 0 0% 98%;
--muted: 240 4% 16%;
--muted: 0 0% 14.9%; --muted-foreground: 240 5% 65%;
--accent: 240 4% 16%;
--muted-foreground: 0 0% 63.9%;
--accent: 0 0% 14.9%;
--accent-foreground: 0 0% 98%; --accent-foreground: 0 0% 98%;
--destructive: 0 63% 31%;
--destructive: 0 62.8% 30.6%;
--destructive-foreground: 0 0% 98%; --destructive-foreground: 0 0% 98%;
--border: 240 4% 16%;
--border: 0 0% 14.9%; --input: 240 4% 16%;
--ring: 262 84% 68%;
--input: 0 0% 14.9%; }
--ring: 0 0% 83.1%;
--chart-1: 220 70% 50%;
--chart-2: 160 60% 45%;
--chart-3: 30 80% 55%;
--chart-4: 280 65% 60%;
--chart-5: 340 75% 55%
;
--sidebar-background: 240 5.9% 10%;
--sidebar-foreground: 240 4.8% 95.9%;
--sidebar-primary: 224.3 76.3% 48%;
--sidebar-primary-foreground: 0 0% 100%;
--sidebar-accent: 240 3.7% 15.9%;
--sidebar-accent-foreground: 240 4.8% 95.9%;
--sidebar-border: 240 3.7% 15.9%;
--sidebar-ring: 217.2 91.2% 59.8%}
} }
@layer base { @layer base {
* { * {
@apply border-border; @apply border-border;

View File

@@ -7,11 +7,12 @@ export default function Home() {
<main className="flex-grow flex items-center justify-center p-4 sm:p-8"> <main className="flex-grow flex items-center justify-center p-4 sm:p-8">
<div className="flex flex-col gap-8 items-center w-full max-w-2xl"> <div className="flex flex-col gap-8 items-center w-full max-w-2xl">
<div className="text-center space-y-2"> <div className="text-center space-y-2">
<h1 className="text-3xl sm:text-4xl font-bold text-foreground"> <h1 className="text-3xl sm:text-5xl font-bold text-foreground tracking-tight">
Meta Tag Extractor Website Meta Tag Extractor
</h1> </h1>
<p className="text-muted-foreground"> <p className="text-lg text-muted-foreground">
Enter a URL to extract its meta title and description. Instantly pull the title, description, and preview image from any
URL.
</p> </p>
</div> </div>
<MetaForm /> <MetaForm />

View File

@@ -8,6 +8,7 @@ import { Globe } from "lucide-react";
import { extractMetaData } from "@/app/actions"; import { extractMetaData } from "@/app/actions";
import { LengthIndicator } from "./length-indicator"; import { LengthIndicator } from "./length-indicator";
import { CopyButton } from "./copy-button"; import { CopyButton } from "./copy-button";
import { ResultsSkeleton } from "./results-skeleton";
interface MetaData { interface MetaData {
title: string; title: string;
@@ -59,21 +60,23 @@ export function MetaForm() {
<Button <Button
type="submit" type="submit"
disabled={loading} disabled={loading}
className="w-full sm:w-auto h-12 px-8 rounded-lg font-semibold transition-all" className="w-full sm:w-auto h-12 px-8 rounded-lg font-semibold transition-all hover:scale-105 active:scale-100"
> >
{loading ? "Extracting..." : "Extract"} {loading ? "Extracting..." : "Extract"}
</Button> </Button>
</form> </form>
{error && ( {loading && <ResultsSkeleton />}
{error && !loading && (
<Card className="border-destructive bg-destructive/10"> <Card className="border-destructive bg-destructive/10">
<CardContent className="p-4"> <CardContent className="p-4">
<p className="text-destructive text-center">{error}</p> <p className="text-destructive text-center font-medium">{error}</p>
</CardContent> </CardContent>
</Card> </Card>
)} )}
{metaData && ( {metaData && !loading && (
<Card className="w-full shadow-lg rounded-lg"> <Card className="w-full shadow-lg rounded-lg">
<CardHeader> <CardHeader>
<CardTitle className="text-xl text-card-foreground"> <CardTitle className="text-xl text-card-foreground">

View File

@@ -0,0 +1,30 @@
import { Card, CardContent, CardHeader } from "@/components/ui/card";
import { Skeleton } from "@/components/ui/skeleton";
export function ResultsSkeleton() {
return (
<Card className="w-full shadow-lg rounded-lg">
<CardHeader>
<Skeleton className="h-6 w-48" />
</CardHeader>
<CardContent className="space-y-6">
<div>
<Skeleton className="h-5 w-32 mb-2" />
<Skeleton className="aspect-video w-full rounded-md" />
</div>
<div>
<div className="flex items-center justify-between mb-1">
<Skeleton className="h-5 w-24" />
</div>
<Skeleton className="h-12 w-full" />
</div>
<div>
<div className="flex items-center justify-between mb-1">
<Skeleton className="h-5 w-36" />
</div>
<Skeleton className="h-20 w-full" />
</div>
</CardContent>
</Card>
);
}