"use client" import { useState } from "react" import Link from "next/link" import Image from "next/image" import { Button } from "@/components/ui/button" import { Badge } from "@/components/ui/badge" import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, } from "@/components/ui/card" import { Input } from "@/components/ui/input" import { Separator } from "@/components/ui/separator" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select" import { Checkbox } from "@/components/ui/checkbox" import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group" import { Label } from "@/components/ui/label" import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from "@/components/ui/accordion" import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert" import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger, } from "@/components/ui/alert-dialog" import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar" import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog" import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu" import { Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle, SheetTrigger, } from "@/components/ui/sheet" import { Textarea } from "@/components/ui/textarea" import { Skeleton } from "@/components/ui/skeleton" import { Progress } from "@/components/ui/progress" import { Slider } from "@/components/ui/slider" import { Switch } from "@/components/ui/switch" import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from "@/components/ui/tooltip" import { Popover, PopoverContent, PopoverTrigger, } from "@/components/ui/popover" import { Breadcrumb, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, } from "@/components/ui/breadcrumb" import { Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, } from "@/components/ui/table" import { useToast } from "@/components/ui/use-toast" import { Toaster } from "@/components/ui/toaster" import { Carousel, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious, } from "@/components/ui/carousel" import { AspectRatio } from "@/components/ui/aspect-ratio" import { ScrollArea } from "@/components/ui/scroll-area" import { HoverCard, HoverCardContent, HoverCardTrigger, } from "@/components/ui/hover-card" import { Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut, } from "@/components/ui/command" import { ContextMenu, ContextMenuContent, ContextMenuItem, ContextMenuTrigger, } from "@/components/ui/context-menu" import { Menubar, MenubarContent, MenubarItem, MenubarMenu, MenubarTrigger, } from "@/components/ui/menubar" import { NavigationMenu, NavigationMenuContent, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, } from "@/components/ui/navigation-menu" import { Pagination, PaginationContent, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, } from "@/components/ui/pagination" import { Toggle } from "@/components/ui/toggle" import { ToggleGroup, ToggleGroupItem } from "@/components/ui/toggle-group" import { Collapsible, CollapsibleContent, CollapsibleTrigger, } from "@/components/ui/collapsible" import { Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerTitle, DrawerTrigger, } from "@/components/ui/drawer" import { ResizablePanelGroup, ResizablePanel, ResizableHandle, } from "@/components/ui/resizable" import { Empty, EmptyContent, EmptyDescription, EmptyHeader, EmptyMedia, EmptyTitle, } from "@/components/ui/empty" import { Kbd, KbdGroup } from "@/components/ui/kbd" import { Spinner } from "@/components/ui/spinner" import { InputOTP, InputOTPGroup, InputOTPSlot, } from "@/components/ui/input-otp" import { Calendar } from "@/components/ui/calendar" import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form" import { Field, FieldContent, FieldDescription, FieldError, FieldGroup, FieldLabel, FieldLegend, FieldSet, FieldTitle, } from "@/components/ui/field" import { Item, ItemActions, ItemContent, ItemDescription, ItemFooter, ItemGroup, ItemHeader, ItemMedia, ItemSeparator, ItemTitle, } from "@/components/ui/item" import { InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput, InputGroupText, InputGroupTextarea, } from "@/components/ui/input-group" import { ButtonGroup, ButtonGroupSeparator, ButtonGroupText, } from "@/components/ui/button-group" // Sidebar components - complex component, shown in code example only // Note: Sidebar requires SidebarProvider context, so it's shown in code example only import { ChartContainer, ChartTooltip, ChartTooltipContent, } from "@/components/ui/chart" import { Toaster as SonnerToaster } from "@/components/ui/sonner" import { LineChart, Line, BarChart, Bar, AreaChart, Area, PieChart, Pie, Cell, RadarChart, Radar, PolarGrid, PolarAngleAxis, PolarRadiusAxis, ComposedChart, XAxis, YAxis, CartesianGrid, } from "recharts" import { Header } from "@/components/header" import { Footer } from "@/components/footer" import { GetFreeMachineModal } from "@/components/get-free-machine-modal" import { Cart } from "@/components/cart" import { CartButton } from "@/components/cart-button" import { MobileCartButton } from "@/components/mobile-cart-button" import { ProductGrid } from "@/components/product-grid" import { VendingMachinesShowcase } from "@/components/vending-machines-showcase" import { CreditCardReaderSection } from "@/components/credit-card-reader-section" import { FeatureCard } from "@/components/feature-card" import { ManualViewer } from "@/components/manual-viewer" import { PartsPanel } from "@/components/parts-panel" import { AboutPage } from "@/components/about-page" import { ContactPage } from "@/components/contact-page" import { WhoWeServePage } from "@/components/who-we-serve-page" import { RepairsPage } from "@/components/repairs-page" import { AuthorBio } from "@/components/author-bio" import { PageWrapper, PageHeader } from "@/components/page-wrapper" import { MovingServiceImage } from "@/components/moving-service-image" import { CheckCircle2, Sparkles, Wrench, MonitorSmartphone, CreditCard, Package, MapPin, Phone, Star, Menu, X, Copy, Check, AlertCircle, Info, User, Settings, Search, MoreHorizontal, ChevronRight, Loader2, ShoppingCart, } from "lucide-react" import { HeroSection } from "@/components/hero-section" import { StatsSection } from "@/components/stats-section" import { FeaturesSection } from "@/components/features-section" import { ProductShowcaseSection } from "@/components/product-showcase-section" import { HowItWorksSection } from "@/components/how-it-works-section" import { ServicesSection } from "@/components/services-section" import { ServiceAreasSection } from "@/components/service-areas-section" import { ReviewsSection } from "@/components/reviews-section" import { RequestMachineSection } from "@/components/request-machine-section" import { ContactSection } from "@/components/contact-section" // Color palette data const colorPalette = { primary: [ { name: "Primary", variable: "--primary", value: "#29A047", description: "Primary brand color (green from logo)", }, { name: "Secondary", variable: "--secondary", value: "#54595F", description: "Secondary color (gray)", }, { name: "Text/Foreground", variable: "--foreground", value: "oklch(0.178 0.014 275.627)", description: "Main text color (dark black)", }, { name: "Background", variable: "--background", value: "#fff8eb", description: "Warm cream background", }, ], links: [ { name: "Link Default", variable: "--link-color", value: "var(--foreground)", description: "Default link color", }, { name: "Link Hover (Accent)", variable: "--link-hover-color", value: "#C4142C", description: "Red accent/hover color", }, { name: "Link Hover Dark", variable: "--link-hover-color-dark", value: "#a01020", description: "Darker red for gradients", }, { name: "Link Hover BG", variable: "--link-hover-bg", value: "rgba(196, 20, 44, 0.1)", description: "Link hover background", }, ], custom: [ { name: "Yellow", variable: "--yellow", value: "#FCBA09", description: "Custom yellow color", }, { name: "Orange", variable: "--orange", value: "#F79611", description: "Custom orange color", }, { name: "Mountain Bubbles", variable: "--mountain-bubbles", value: "#FCBA0924", description: "Yellow with transparency", }, ], semantic: [ { name: "Muted", variable: "--muted", value: "oklch(0.961 0.004 106.423)", description: "Muted background", }, { name: "Muted Foreground", variable: "--muted-foreground", value: "oklch(0.556 0.014 275.627)", description: "Muted text", }, { name: "Destructive", variable: "--destructive", value: "oklch(0.577 0.245 27.325)", description: "Error/destructive actions", }, { name: "Border", variable: "--border", value: "oklch(0.922 0.004 106.423)", description: "Border color", }, ], } export default function StyleGuidePage() { const [copiedCode, setCopiedCode] = useState(null) const [isNavOpen, setIsNavOpen] = useState(false) const copyToClipboard = (text: string, id: string) => { navigator.clipboard.writeText(text) setCopiedCode(id) setTimeout(() => setCopiedCode(null), 2000) } const CodeBlock = ({ code, id }: { code: string; id: string }) => (
        {code}
      
) const Section = ({ id, title, children, }: { id: string title: string children: React.ReactNode }) => (

{title}

{children}
) const navItems = [ { id: "colors", label: "Color Palette" }, { id: "typography", label: "Typography" }, { id: "buttons", label: "Buttons" }, { id: "cards", label: "Cards" }, { id: "badges", label: "Badges" }, { id: "links", label: "Links" }, { id: "inputs", label: "Form Inputs" }, { id: "feedback", label: "Feedback Components" }, { id: "overlays", label: "Overlay Components" }, { id: "navigation", label: "Navigation Components" }, { id: "data-display", label: "Data Display" }, { id: "charts", label: "Charts & Graphs" }, { id: "interactive", label: "Interactive Components" }, { id: "layout", label: "Layout Components" }, { id: "advanced", label: "Advanced Components" }, { id: "spacing", label: "Spacing & Layout" }, { id: "images", label: "Image Patterns" }, { id: "sections", label: "Home Page Sections" }, { id: "custom", label: "Custom Components" }, ] // Chart data and configurations const lineChartData = [ { month: "January", desktop: 186, mobile: 80 }, { month: "February", desktop: 305, mobile: 200 }, { month: "March", desktop: 237, mobile: 120 }, { month: "April", desktop: 273, mobile: 190 }, { month: "May", desktop: 209, mobile: 130 }, { month: "June", desktop: 214, mobile: 140 }, ] const lineChartConfig = { desktop: { label: "Desktop", color: "#F79611", // Brand orange }, mobile: { label: "Mobile", color: "#54595F", // Secondary gray }, } const barChartData = [ { month: "January", desktop: 186, mobile: 80 }, { month: "February", desktop: 305, mobile: 200 }, { month: "March", desktop: 237, mobile: 120 }, { month: "April", desktop: 273, mobile: 190 }, { month: "May", desktop: 209, mobile: 130 }, { month: "June", desktop: 214, mobile: 140 }, ] const barChartConfig = { desktop: { label: "Desktop", color: "#F79611", // Brand orange }, mobile: { label: "Mobile", color: "#54595F", // Secondary gray }, } const areaChartData = [ { month: "January", desktop: 186, mobile: 80 }, { month: "February", desktop: 305, mobile: 200 }, { month: "March", desktop: 237, mobile: 120 }, { month: "April", desktop: 273, mobile: 190 }, { month: "May", desktop: 209, mobile: 130 }, { month: "June", desktop: 214, mobile: 140 }, ] const areaChartConfig = { desktop: { label: "Desktop", color: "#F79611", // Brand orange }, mobile: { label: "Mobile", color: "#54595F", // Secondary gray }, } const pieChartData = [ { name: "Desktop", value: 186, fill: "#F79611" }, // Brand orange { name: "Mobile", value: 80, fill: "#FCBA09" }, // Custom yellow { name: "Tablet", value: 50, fill: "#54595F" }, // Secondary gray { name: "Other", value: 30, fill: "#29A047" }, // Primary green ] const pieChartConfig = { value: { label: "Value", }, } const radarChartData = [ { subject: "Math", A: 120, B: 110, fullMark: 150 }, { subject: "Chinese", A: 98, B: 130, fullMark: 150 }, { subject: "English", A: 86, B: 130, fullMark: 150 }, { subject: "Geography", A: 99, B: 100, fullMark: 150 }, { subject: "Physics", A: 85, B: 90, fullMark: 150 }, { subject: "History", A: 65, B: 85, fullMark: 150 }, ] const radarChartConfig = { A: { label: "Student A", color: "#F79611", // Brand orange }, B: { label: "Student B", color: "#54595F", // Secondary gray }, } const { toast } = useToast() return ( <> {/* Sticky Navigation */}
{/* Introduction */}

Rocky Mountain Vending Style Guide

This style guide showcases all components, styles, and design patterns used throughout the Rocky Mountain Vending website. Use this as a reference when building new pages or components.

{/* Color Palette */}

Primary Colors

Core brand colors used throughout the application for primary actions, backgrounds, and text.

{colorPalette.primary.map((color) => { // Handle CSS variables - use the variable directly for display const colorValue = color.value.startsWith("var(") ? `var(${color.variable})` : color.value return (
{color.name}
{color.variable}
{color.value}
{color.description}
) })}

Link & Accent Colors

Colors used for links, hover states, and accent elements. Links use red hover color for brand consistency.

{colorPalette.links.map((color) => { // Handle CSS variables and rgba values const colorValue = color.value.startsWith("var(") ? `var(${color.variable})` : color.value return (
{color.name}
{color.variable}
{color.value}
{color.description}
) })}

Custom Colors

Custom brand colors including yellow and orange accents used for special highlights and decorative elements.

{colorPalette.custom.map((color) => (
{color.name}
{color.variable}
{color.value}
{color.description}
))}

Semantic Colors

Semantic color tokens for muted backgrounds, borders, and destructive actions. These provide consistent meaning across the UI.

{colorPalette.semantic.map((color) => { const getColorValue = (val: string) => { if (val.startsWith("oklch(")) return val return val } return (
{color.name}
{color.variable}
{color.value}
{color.description}
) })}
{/* Typography */}

Page Headers with Gradient Divider

Header pattern with centered title and gradient divider line, commonly used on service pages.

Page Title

Page Title

`} />

Font Families

Typography system using Inter for body text and UI elements, and Geist Mono for code and technical content.

Inter (Sans-serif)
--font-inter

Used for body text and UI elements

Geist Mono (Monospace)
--font-geist-mono

Used for code and technical content

Headings

Heading hierarchy with responsive sizing. H1 is used for page titles, H2 for section headers, and H3-H4 for subsections.

Heading 1 (H1)

Heading 1`} />

Used for page titles (only one per page)

Heading 2 (H2) - Section Header

Section Header`} />

Used for section headers (centered)

Heading 2 (H2) - Page Header

Page Header`} />

Used for page headers (left-aligned)

Heading 3 (H3)

Heading 3`} />

Heading 4 (H4)

Heading 4`} />

Paragraph Styles

Standard paragraph text styles with consistent sizing, line height, and color for optimal readability.

Standard paragraph text with text-lg, text-muted-foreground, text-pretty, and leading-relaxed classes.

Standard paragraph

`} />

Small text with text-sm and text-muted-foreground classes.

Small text

`} />

Centered paragraph with max-w-2xl mx-auto for centered content.

Centered paragraph

`} />
{/* Buttons */}

Button Variants

Different button styles for various use cases. The brand variant uses the primary red color for important CTAs.

Default `} />

Button Sizes

Button size options from small to large, plus icon-only buttons for compact interfaces.

Small `} />

Button States

Button states including normal, disabled, and link variants. Buttons can also be used as links with the asChild prop.

Normal `} />
{/* Cards */}

Standard Card

Basic card component with header, content, and footer sections. Includes hover effects for interactivity.

Card Title Card description text goes here

Card content area with padding and proper spacing.

Card Title Card description

Card content

`} />

Card with Image

Card layout with an image header using aspect-video ratio. Perfect for product cards and feature showcases.

Image Placeholder

Card with Image

Card content below image.

Description

Title

Content

`} />

Gradient CTA Card

A call-to-action card with gradient background, typically used for important CTAs on service pages.

Ready to Get Started?

Contact us today to learn more about our free vending machine services and how we can help your business.

Ready to Get Started?

Contact us today to learn more about our services.

`} />

Card with Icon Grid

Cards arranged in a grid with icons, commonly used for benefits or features sections.

100% FREE Service

No upfront costs, installation fees, or monthly charges

Regular Maintenance

We stock, service, and maintain all machines at no cost to you

Feature Title

Feature description text goes here.

`} />

Card with Secondary Background

Card with subtle secondary color background for emphasis. Ideal for highlighting important information or callouts.

This card uses a subtle secondary color background for emphasis. Perfect for highlighting important information or anecdotes.

Content with subtle background emphasis.

`} />
{/* Badges */}

Badge Variants

Badge components for labels, status indicators, and tags. Available in multiple variants for different contexts.

Default Secondary Destructive Outline
Default Secondary Destructive Outline`} />
{/* Links */} {/* Form Inputs */}

Input Fields

Text input fields with labels. Supports various input types including text, email, and disabled states.

`} />

Select Dropdown

Dropdown select component for choosing from a list of options. Accessible and keyboard navigable.

Option 1 Option 2 `} />

Checkboxes & Radio Buttons

Form controls for multiple selection (checkboxes) and single selection (radio buttons) with labels.

`} />

Tabs

Tabs component for organizing content into multiple panels. Supports default, card, and vertical variants.

Default Tabs

Account Password Settings Account Make changes to your account here. Click save when you're done.
Password Change your password here. After saving, you'll be logged out.
Settings Manage your account settings and preferences.
Account Password Settings Account Description {/* Content */} {/* Content */} `} />

Accordion

Collapsible content sections for organizing information. Supports single or multiple open items.

Accordion Item 1 Content for accordion item 1 goes here. Accordion Item 2 Content for accordion item 2 goes here. Item 1 Content 1 `} />

Textarea

Multi-line text input for longer content like messages, comments, or descriptions.