From bba1bab8c244f2c00f78b85e7679e4cf399a970f Mon Sep 17 00:00:00 2001 From: Nicholai Date: Tue, 25 Nov 2025 03:01:30 -0700 Subject: [PATCH] feat(components): initialize custom component library with foundational files - Added essential configuration files including components.json, package.json, and tsconfig.json to establish the component library structure. - Introduced global styles in globals.css and layout structure in layout.tsx for consistent design application. - Implemented various UI components such as Accordion, AlertDialog, Button, Card, and more, enhancing the component library for future development. - Included utility functions and hooks to support component functionality and responsiveness. This commit sets up the groundwork for a comprehensive UI component library, facilitating a modular and scalable design system. --- custom-components/app/globals.css | 158 ++++ custom-components/app/layout.tsx | 53 ++ custom-components/app/page.tsx | 266 +++++++ custom-components/components.json | 21 + .../components/theme-provider.tsx | 11 + custom-components/components/ui/accordion.tsx | 66 ++ .../components/ui/alert-dialog.tsx | 157 ++++ custom-components/components/ui/alert.tsx | 66 ++ .../components/ui/aspect-ratio.tsx | 11 + custom-components/components/ui/avatar.tsx | 53 ++ custom-components/components/ui/badge.tsx | 46 ++ .../components/ui/breadcrumb.tsx | 109 +++ .../components/ui/button-group.tsx | 83 ++ custom-components/components/ui/button.tsx | 60 ++ custom-components/components/ui/calendar.tsx | 213 +++++ custom-components/components/ui/card.tsx | 92 +++ custom-components/components/ui/carousel.tsx | 241 ++++++ custom-components/components/ui/chart.tsx | 353 +++++++++ custom-components/components/ui/checkbox.tsx | 32 + .../components/ui/collapsible.tsx | 33 + custom-components/components/ui/command.tsx | 184 +++++ .../components/ui/context-menu.tsx | 252 ++++++ custom-components/components/ui/dialog.tsx | 143 ++++ custom-components/components/ui/drawer.tsx | 135 ++++ .../components/ui/dropdown-menu.tsx | 257 +++++++ custom-components/components/ui/empty.tsx | 104 +++ custom-components/components/ui/field.tsx | 244 ++++++ custom-components/components/ui/form.tsx | 167 ++++ .../components/ui/hover-card.tsx | 44 ++ .../components/ui/input-group.tsx | 169 ++++ custom-components/components/ui/input-otp.tsx | 77 ++ custom-components/components/ui/input.tsx | 21 + custom-components/components/ui/item.tsx | 193 +++++ custom-components/components/ui/kbd.tsx | 28 + custom-components/components/ui/label.tsx | 24 + custom-components/components/ui/menubar.tsx | 276 +++++++ .../components/ui/navigation-menu.tsx | 166 ++++ .../components/ui/pagination.tsx | 127 +++ custom-components/components/ui/popover.tsx | 48 ++ custom-components/components/ui/progress.tsx | 31 + .../components/ui/radio-group.tsx | 45 ++ custom-components/components/ui/resizable.tsx | 56 ++ .../components/ui/scroll-area.tsx | 58 ++ custom-components/components/ui/select.tsx | 185 +++++ custom-components/components/ui/separator.tsx | 28 + custom-components/components/ui/sheet.tsx | 139 ++++ custom-components/components/ui/sidebar.tsx | 726 ++++++++++++++++++ custom-components/components/ui/skeleton.tsx | 13 + custom-components/components/ui/slider.tsx | 63 ++ custom-components/components/ui/sonner.tsx | 25 + custom-components/components/ui/spinner.tsx | 16 + custom-components/components/ui/switch.tsx | 31 + custom-components/components/ui/table.tsx | 116 +++ custom-components/components/ui/tabs.tsx | 66 ++ custom-components/components/ui/textarea.tsx | 18 + custom-components/components/ui/toast.tsx | 129 ++++ custom-components/components/ui/toaster.tsx | 35 + .../components/ui/toggle-group.tsx | 73 ++ custom-components/components/ui/toggle.tsx | 47 ++ custom-components/components/ui/tooltip.tsx | 61 ++ .../components/ui/use-mobile.tsx | 19 + custom-components/components/ui/use-toast.ts | 191 +++++ .../components/united/animated-link.tsx | 32 + .../components/united/button.tsx | 53 ++ .../components/united/calendar.tsx | 57 ++ custom-components/components/united/card.tsx | 84 ++ .../components/united/color-swatch.tsx | 40 + .../components/united/divider.tsx | 21 + .../components/united/filmstrip.tsx | 112 +++ .../components/united/form-container.tsx | 24 + .../components/united/form-field.tsx | 68 ++ .../components/united/gallery-card.tsx | 37 + .../components/united/heading.tsx | 49 ++ .../components/united/hero-overlay.tsx | 26 + custom-components/components/united/index.ts | 35 + .../components/united/lead-text.tsx | 21 + .../components/united/lift-card.tsx | 28 + .../components/united/metadata.tsx | 11 + .../components/united/motion-card.tsx | 28 + .../components/united/reveal.tsx | 56 ++ .../components/united/section-label.tsx | 27 + .../components/united/sticky-split.tsx | 29 + custom-components/components/united/toast.tsx | 38 + custom-components/hooks/use-mobile.ts | 19 + custom-components/hooks/use-toast.ts | 191 +++++ custom-components/lib/utils.ts | 6 + custom-components/package.json | 73 ++ custom-components/tsconfig.json | 27 + 88 files changed, 8146 insertions(+) create mode 100644 custom-components/app/globals.css create mode 100644 custom-components/app/layout.tsx create mode 100644 custom-components/app/page.tsx create mode 100644 custom-components/components.json create mode 100644 custom-components/components/theme-provider.tsx create mode 100644 custom-components/components/ui/accordion.tsx create mode 100644 custom-components/components/ui/alert-dialog.tsx create mode 100644 custom-components/components/ui/alert.tsx create mode 100644 custom-components/components/ui/aspect-ratio.tsx create mode 100644 custom-components/components/ui/avatar.tsx create mode 100644 custom-components/components/ui/badge.tsx create mode 100644 custom-components/components/ui/breadcrumb.tsx create mode 100644 custom-components/components/ui/button-group.tsx create mode 100644 custom-components/components/ui/button.tsx create mode 100644 custom-components/components/ui/calendar.tsx create mode 100644 custom-components/components/ui/card.tsx create mode 100644 custom-components/components/ui/carousel.tsx create mode 100644 custom-components/components/ui/chart.tsx create mode 100644 custom-components/components/ui/checkbox.tsx create mode 100644 custom-components/components/ui/collapsible.tsx create mode 100644 custom-components/components/ui/command.tsx create mode 100644 custom-components/components/ui/context-menu.tsx create mode 100644 custom-components/components/ui/dialog.tsx create mode 100644 custom-components/components/ui/drawer.tsx create mode 100644 custom-components/components/ui/dropdown-menu.tsx create mode 100644 custom-components/components/ui/empty.tsx create mode 100644 custom-components/components/ui/field.tsx create mode 100644 custom-components/components/ui/form.tsx create mode 100644 custom-components/components/ui/hover-card.tsx create mode 100644 custom-components/components/ui/input-group.tsx create mode 100644 custom-components/components/ui/input-otp.tsx create mode 100644 custom-components/components/ui/input.tsx create mode 100644 custom-components/components/ui/item.tsx create mode 100644 custom-components/components/ui/kbd.tsx create mode 100644 custom-components/components/ui/label.tsx create mode 100644 custom-components/components/ui/menubar.tsx create mode 100644 custom-components/components/ui/navigation-menu.tsx create mode 100644 custom-components/components/ui/pagination.tsx create mode 100644 custom-components/components/ui/popover.tsx create mode 100644 custom-components/components/ui/progress.tsx create mode 100644 custom-components/components/ui/radio-group.tsx create mode 100644 custom-components/components/ui/resizable.tsx create mode 100644 custom-components/components/ui/scroll-area.tsx create mode 100644 custom-components/components/ui/select.tsx create mode 100644 custom-components/components/ui/separator.tsx create mode 100644 custom-components/components/ui/sheet.tsx create mode 100644 custom-components/components/ui/sidebar.tsx create mode 100644 custom-components/components/ui/skeleton.tsx create mode 100644 custom-components/components/ui/slider.tsx create mode 100644 custom-components/components/ui/sonner.tsx create mode 100644 custom-components/components/ui/spinner.tsx create mode 100644 custom-components/components/ui/switch.tsx create mode 100644 custom-components/components/ui/table.tsx create mode 100644 custom-components/components/ui/tabs.tsx create mode 100644 custom-components/components/ui/textarea.tsx create mode 100644 custom-components/components/ui/toast.tsx create mode 100644 custom-components/components/ui/toaster.tsx create mode 100644 custom-components/components/ui/toggle-group.tsx create mode 100644 custom-components/components/ui/toggle.tsx create mode 100644 custom-components/components/ui/tooltip.tsx create mode 100644 custom-components/components/ui/use-mobile.tsx create mode 100644 custom-components/components/ui/use-toast.ts create mode 100644 custom-components/components/united/animated-link.tsx create mode 100644 custom-components/components/united/button.tsx create mode 100644 custom-components/components/united/calendar.tsx create mode 100644 custom-components/components/united/card.tsx create mode 100644 custom-components/components/united/color-swatch.tsx create mode 100644 custom-components/components/united/divider.tsx create mode 100644 custom-components/components/united/filmstrip.tsx create mode 100644 custom-components/components/united/form-container.tsx create mode 100644 custom-components/components/united/form-field.tsx create mode 100644 custom-components/components/united/gallery-card.tsx create mode 100644 custom-components/components/united/heading.tsx create mode 100644 custom-components/components/united/hero-overlay.tsx create mode 100644 custom-components/components/united/index.ts create mode 100644 custom-components/components/united/lead-text.tsx create mode 100644 custom-components/components/united/lift-card.tsx create mode 100644 custom-components/components/united/metadata.tsx create mode 100644 custom-components/components/united/motion-card.tsx create mode 100644 custom-components/components/united/reveal.tsx create mode 100644 custom-components/components/united/section-label.tsx create mode 100644 custom-components/components/united/sticky-split.tsx create mode 100644 custom-components/components/united/toast.tsx create mode 100644 custom-components/hooks/use-mobile.ts create mode 100644 custom-components/hooks/use-toast.ts create mode 100644 custom-components/lib/utils.ts create mode 100644 custom-components/package.json create mode 100644 custom-components/tsconfig.json 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 + + + + + + +