diff --git a/custom-components/app/globals.css b/custom-components/app/globals.css new file mode 100644 index 000000000..15b921b61 --- /dev/null +++ b/custom-components/app/globals.css @@ -0,0 +1,158 @@ +@import "tailwindcss"; +@import "tw-animate-css"; + +@custom-variant dark (&:is(.dark *)); + +/* Added United Tattoo design system colors and tokens */ +:root { + /* United Tattoo Palette - Primary */ + --burnt-orange: #e67e50; + --terracotta: #d87850; + --burnt: #b0471e; + + /* United Tattoo Palette - Secondary */ + --sage-concrete: #7a8b8b; + --sage: #a28f79; + --deep-olive: #4a4034; + --moss: #6f5c49; + + /* United Tattoo Palette - Neutral */ + --charcoal: #1c1915; + --ink: #241b16; + --cream: #fff7ec; + --sand: #f2e3d0; + --rose: #e59863; + + /* Shadows */ + --shadow-subtle: 0 4px 12px rgba(31, 27, 23, 0.08); + --shadow-md: 0 12px 28px rgba(31, 27, 23, 0.1); + --shadow-lg: 0 20px 40px rgba(36, 27, 22, 0.15); + --shadow-bloom: 0 32px 60px rgba(31, 27, 23, 0.2); + --shadow-filmic: 0 40px 70px rgba(31, 27, 23, 0.25); + + --background: var(--sand); + --foreground: var(--ink); + --card: var(--cream); + --card-foreground: var(--ink); + --popover: var(--cream); + --popover-foreground: var(--ink); + --primary: var(--burnt); + --primary-foreground: #ffffff; + --secondary: var(--terracotta); + --secondary-foreground: #ffffff; + --muted: var(--sage-concrete); + --muted-foreground: var(--moss); + --accent: var(--burnt-orange); + --accent-foreground: #ffffff; + --destructive: oklch(0.577 0.245 27.325); + --destructive-foreground: oklch(0.577 0.245 27.325); + --border: rgba(31, 27, 23, 0.12); + --input: rgba(210, 106, 50, 0.25); + --ring: var(--terracotta); + --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); + --radius: 0.75rem; + --sidebar: var(--cream); + --sidebar-foreground: var(--ink); + --sidebar-primary: var(--burnt); + --sidebar-primary-foreground: #ffffff; + --sidebar-accent: var(--sand); + --sidebar-accent-foreground: var(--ink); + --sidebar-border: rgba(31, 27, 23, 0.12); + --sidebar-ring: var(--terracotta); +} + +@theme inline { + --font-sans: "Space Grotesk", "Space Grotesk Fallback", system-ui, sans-serif; + --font-serif: "Playfair Display", "Playfair Display Fallback", Georgia, serif; + --font-mono: "Geist Mono", "Geist Mono Fallback"; + --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-destructive-foreground: var(--destructive-foreground); + --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); + --radius-sm: calc(var(--radius) - 4px); + --radius-md: calc(var(--radius) - 2px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) + 4px); + --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); + + /* United Tattoo specific colors for direct usage */ + --color-burnt-orange: var(--burnt-orange); + --color-terracotta: var(--terracotta); + --color-burnt: var(--burnt); + --color-sage-concrete: var(--sage-concrete); + --color-sage: var(--sage); + --color-deep-olive: var(--deep-olive); + --color-moss: var(--moss); + --color-charcoal: var(--charcoal); + --color-ink: var(--ink); + --color-cream: var(--cream); + --color-sand: var(--sand); + --color-rose: var(--rose); +} + +@layer base { + * { + @apply border-border outline-ring/50; + } + body { + @apply text-foreground; + /* United Tattoo layered background */ + background: linear-gradient(180deg, var(--sage-concrete) 0%, #9caaa6 45%, var(--sand) 100%); + min-height: 100vh; + } + + /* Texture Layer: Radial overlays */ + body::before { + content: ""; + position: fixed; + inset: 0; + background: radial-gradient(circle at 15% 20%, rgba(216, 120, 80, 0.15), transparent 45%), + radial-gradient(circle at 85% 5%, rgba(36, 27, 22, 0.08), transparent 55%); + opacity: 0.8; + z-index: -2; + pointer-events: none; + } + + /* Texture Layer: Grid pattern */ + body::after { + content: ""; + position: fixed; + inset: 0; + background-image: url('data:image/svg+xml;charset=UTF-8,'); + mix-blend-mode: multiply; + opacity: 1; + z-index: -1; + pointer-events: none; + } +} diff --git a/custom-components/app/layout.tsx b/custom-components/app/layout.tsx new file mode 100644 index 000000000..e3f8e41e9 --- /dev/null +++ b/custom-components/app/layout.tsx @@ -0,0 +1,53 @@ +import type React from "react" +import type { Metadata } from "next" +import { Space_Grotesk, Playfair_Display } from "next/font/google" +import { Analytics } from "@vercel/analytics/next" +import "./globals.css" + +const spaceGrotesk = Space_Grotesk({ + subsets: ["latin"], + variable: "--font-sans", +}) + +const playfairDisplay = Playfair_Display({ + subsets: ["latin"], + variable: "--font-serif", +}) + +export const metadata: Metadata = { + title: "United Tattoo Component Library", + description: "A living design system with sun-washed plaster aesthetics and gallery pacing principles", + generator: "v0.app", + icons: { + icon: [ + { + url: "/icon-light-32x32.png", + media: "(prefers-color-scheme: light)", + }, + { + url: "/icon-dark-32x32.png", + media: "(prefers-color-scheme: dark)", + }, + { + url: "/icon.svg", + type: "image/svg+xml", + }, + ], + apple: "/apple-icon.png", + }, +} + +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode +}>) { + return ( + + + {children} + + + + ) +} diff --git a/custom-components/app/page.tsx b/custom-components/app/page.tsx new file mode 100644 index 000000000..0c7ce12b5 --- /dev/null +++ b/custom-components/app/page.tsx @@ -0,0 +1,266 @@ +import { Button } from "@/components/united/button" +import { Card, CardHeader, CardTitle, CardContent } from "@/components/united/card" +import { Toast } from "@/components/united/toast" +import { FormContainer } from "@/components/united/form-container" +import { FormField, Input, Textarea } from "@/components/united/form-field" +import { Calendar } from "@/components/united/calendar" +import { ColorSwatch } from "@/components/united/color-swatch" +import { SectionLabel } from "@/components/united/section-label" +import { Heading } from "@/components/united/heading" +import { LeadText } from "@/components/united/lead-text" +import { HeroOverlay } from "@/components/united/hero-overlay" +import { AnimatedLink } from "@/components/united/animated-link" +import { LiftCard } from "@/components/united/lift-card" +import { MotionCard } from "@/components/united/motion-card" +import { GalleryCard } from "@/components/united/gallery-card" +import { StickySplit } from "@/components/united/sticky-split" +import { Divider } from "@/components/united/divider" +import { Filmstrip } from "@/components/united/filmstrip" +import { Reveal } from "@/components/united/reveal" +import { Metadata } from "@/components/united/metadata" + +export default function ComponentLibrary() { + const calendarDays = [ + { day: 10, isBooked: true }, + { day: 11 }, + { day: 12 }, + { day: 13 }, + { day: 14, isBooked: true }, + { day: 15 }, + { day: 16 }, + ] + + const filmstripItems = [ + { src: "/monument-statue-with-colorful-objects-artistic.jpg", label: "Monument Prep" }, + { src: "/statue-of-liberty-watercolor-painting-pastel.jpg", label: "Avian Story" }, + { src: "/artistic-studio-with-paintbrushes-and-statue.jpg", label: "Architectural Study" }, + ] + + return ( +
+ {/* Hero Section */} +
+ + + United Tattoo + Design Language Reference + + A living style guide documenting color, typography, components, and interaction patterns. + + + +
+ + {/* Filmstrip Gallery */} + + + {/* Brand Identity Section */} +
+ + Brand Identity + Color, typography, and materiality echo sun-washed plaster. + + Think plaster walls catching a diagonal slice of afternoon light—burnt oranges, desaturated greens, and + charcoal blacks. Typography feels like museum placards. + + + } + > +
+ + + + Color Language + Ratio — 60 / 25 / 15 + + +

+ Primary palette blends burnt oranges with sage concrete. +

+
+ + + + +
+
+
+
+ + + + Typography + +
+
+ Display / Headlines +
+ Playfair Display +
+ Sculptural Statements +
+
+
+ Body / Interface +

+ Space Grotesk. Used for body copy and interface elements. Quiet, generous tracking, always + legible on textured backgrounds. +

+
+
+
+
+
+
+
+
+ + + + {/* Interface Components Section */} +
+ + Interface Components + Micro-interactions that feel tactile. + + +
+ +
+

+ Action Hierarchy +

+
+ + + +
+ +

+ Toast States +

+
+ + +
+
+
+ + + + Booking Request + + + + + + +