From 78c8b702f001531e646654e965e59fcd04218fd4 Mon Sep 17 00:00:00 2001 From: Florian Bernard Date: Thu, 5 Nov 2026 18:07:19 +0000 Subject: [PATCH] Galerie aller shadcn/ui-Komponenten auf der Startseite MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Alle 63 Komponenten aus dem shadcn-Register installiert (Stil base-luma) - Galerie unter components/galerie mit 7 Kategorien und Sprungnavigation - Inhaltsbreite auf max-w-6xl erweitert - shadcn-Hauptfarbe auf E&P-Tiefblau, größter Radius eckig - App-Titel "UI-Galerie" Co-Authored-By: Claude Opus 5.5 --- frontend-starter/app/globals.css | 11 + frontend-starter/app/layout.tsx | 2 +- frontend-starter/app/page.tsx | 24 +- .../components/galerie/beispiele/chat.tsx | 262 +++ .../components/galerie/beispiele/daten.tsx | 163 ++ .../components/galerie/beispiele/feedback.tsx | 96 + .../galerie/beispiele/formulare.tsx | 235 +++ .../components/galerie/beispiele/layout.tsx | 107 ++ .../galerie/beispiele/navigation.tsx | 221 +++ .../components/galerie/beispiele/overlays.tsx | 187 ++ .../components/galerie/eintrag.tsx | 20 + .../components/galerie/galerie.tsx | 50 + frontend-starter/components/ui/accordion.tsx | 74 + .../components/ui/alert-dialog.tsx | 187 ++ frontend-starter/components/ui/alert.tsx | 75 + .../components/ui/aspect-ratio.tsx | 22 + frontend-starter/components/ui/attachment.tsx | 207 +++ frontend-starter/components/ui/avatar.tsx | 108 ++ frontend-starter/components/ui/badge.tsx | 51 + frontend-starter/components/ui/breadcrumb.tsx | 124 ++ frontend-starter/components/ui/bubble.tsx | 127 ++ .../components/ui/button-group.tsx | 87 + frontend-starter/components/ui/calendar.tsx | 221 +++ frontend-starter/components/ui/carousel.tsx | 242 +++ frontend-starter/components/ui/chart.tsx | 372 ++++ frontend-starter/components/ui/checkbox.tsx | 28 + frontend-starter/components/ui/code-block.tsx | 252 +++ .../components/ui/collapsible.tsx | 21 + frontend-starter/components/ui/combobox.tsx | 297 ++++ frontend-starter/components/ui/command.tsx | 196 +++ .../components/ui/context-menu.tsx | 270 +++ frontend-starter/components/ui/dialog.tsx | 160 ++ frontend-starter/components/ui/direction.tsx | 6 + frontend-starter/components/ui/drawer.tsx | 227 +++ .../components/ui/dropdown-menu.tsx | 267 +++ frontend-starter/components/ui/empty.tsx | 103 ++ frontend-starter/components/ui/field.tsx | 238 +++ frontend-starter/components/ui/hover-card.tsx | 50 + .../components/ui/input-group.tsx | 155 ++ frontend-starter/components/ui/input-otp.tsx | 86 + frontend-starter/components/ui/input.tsx | 19 + frontend-starter/components/ui/item.tsx | 201 +++ frontend-starter/components/ui/kbd.tsx | 26 + frontend-starter/components/ui/label.tsx | 19 + frontend-starter/components/ui/marker.tsx | 70 + frontend-starter/components/ui/menubar.tsx | 277 +++ .../components/ui/message-scroller.tsx | 131 ++ frontend-starter/components/ui/message.tsx | 91 + .../components/ui/native-select.tsx | 60 + .../components/ui/navigation-menu.tsx | 167 ++ frontend-starter/components/ui/pagination.tsx | 130 ++ frontend-starter/components/ui/popover.tsx | 89 + frontend-starter/components/ui/progress.tsx | 82 + .../components/ui/questionnaire.tsx | 324 ++++ .../components/ui/radio-group.tsx | 37 + frontend-starter/components/ui/resizable.tsx | 49 + .../components/ui/scroll-area.tsx | 54 + frontend-starter/components/ui/select.tsx | 203 +++ frontend-starter/components/ui/separator.tsx | 24 + frontend-starter/components/ui/sheet.tsx | 138 ++ frontend-starter/components/ui/sidebar.tsx | 726 ++++++++ frontend-starter/components/ui/skeleton.tsx | 13 + frontend-starter/components/ui/slider.tsx | 51 + frontend-starter/components/ui/spinner.tsx | 10 + frontend-starter/components/ui/switch.tsx | 31 + frontend-starter/components/ui/table.tsx | 115 ++ frontend-starter/components/ui/tabs.tsx | 81 + frontend-starter/components/ui/textarea.tsx | 17 + frontend-starter/components/ui/toast.tsx | 234 +++ .../components/ui/toggle-group.tsx | 89 + frontend-starter/components/ui/toggle.tsx | 44 + frontend-starter/components/ui/tooltip.tsx | 65 + frontend-starter/components/ui/trace.tsx | 162 ++ .../hooks/use-highlighted-code.ts | 75 + frontend-starter/hooks/use-mobile.ts | 19 + frontend-starter/lib/app.ts | 4 +- frontend-starter/lib/highlighter.tsx | 124 ++ frontend-starter/package-lock.json | 1556 ++++++++++++++++- frontend-starter/package.json | 10 + 79 files changed, 11234 insertions(+), 14 deletions(-) create mode 100644 frontend-starter/components/galerie/beispiele/chat.tsx create mode 100644 frontend-starter/components/galerie/beispiele/daten.tsx create mode 100644 frontend-starter/components/galerie/beispiele/feedback.tsx create mode 100644 frontend-starter/components/galerie/beispiele/formulare.tsx create mode 100644 frontend-starter/components/galerie/beispiele/layout.tsx create mode 100644 frontend-starter/components/galerie/beispiele/navigation.tsx create mode 100644 frontend-starter/components/galerie/beispiele/overlays.tsx create mode 100644 frontend-starter/components/galerie/eintrag.tsx create mode 100644 frontend-starter/components/galerie/galerie.tsx create mode 100644 frontend-starter/components/ui/accordion.tsx create mode 100644 frontend-starter/components/ui/alert-dialog.tsx create mode 100644 frontend-starter/components/ui/alert.tsx create mode 100644 frontend-starter/components/ui/aspect-ratio.tsx create mode 100644 frontend-starter/components/ui/attachment.tsx create mode 100644 frontend-starter/components/ui/avatar.tsx create mode 100644 frontend-starter/components/ui/badge.tsx create mode 100644 frontend-starter/components/ui/breadcrumb.tsx create mode 100644 frontend-starter/components/ui/bubble.tsx create mode 100644 frontend-starter/components/ui/button-group.tsx create mode 100644 frontend-starter/components/ui/calendar.tsx create mode 100644 frontend-starter/components/ui/carousel.tsx create mode 100644 frontend-starter/components/ui/chart.tsx create mode 100644 frontend-starter/components/ui/checkbox.tsx create mode 100644 frontend-starter/components/ui/code-block.tsx create mode 100644 frontend-starter/components/ui/collapsible.tsx create mode 100644 frontend-starter/components/ui/combobox.tsx create mode 100644 frontend-starter/components/ui/command.tsx create mode 100644 frontend-starter/components/ui/context-menu.tsx create mode 100644 frontend-starter/components/ui/dialog.tsx create mode 100644 frontend-starter/components/ui/direction.tsx create mode 100644 frontend-starter/components/ui/drawer.tsx create mode 100644 frontend-starter/components/ui/dropdown-menu.tsx create mode 100644 frontend-starter/components/ui/empty.tsx create mode 100644 frontend-starter/components/ui/field.tsx create mode 100644 frontend-starter/components/ui/hover-card.tsx create mode 100644 frontend-starter/components/ui/input-group.tsx create mode 100644 frontend-starter/components/ui/input-otp.tsx create mode 100644 frontend-starter/components/ui/input.tsx create mode 100644 frontend-starter/components/ui/item.tsx create mode 100644 frontend-starter/components/ui/kbd.tsx create mode 100644 frontend-starter/components/ui/label.tsx create mode 100644 frontend-starter/components/ui/marker.tsx create mode 100644 frontend-starter/components/ui/menubar.tsx create mode 100644 frontend-starter/components/ui/message-scroller.tsx create mode 100644 frontend-starter/components/ui/message.tsx create mode 100644 frontend-starter/components/ui/native-select.tsx create mode 100644 frontend-starter/components/ui/navigation-menu.tsx create mode 100644 frontend-starter/components/ui/pagination.tsx create mode 100644 frontend-starter/components/ui/popover.tsx create mode 100644 frontend-starter/components/ui/progress.tsx create mode 100644 frontend-starter/components/ui/questionnaire.tsx create mode 100644 frontend-starter/components/ui/radio-group.tsx create mode 100644 frontend-starter/components/ui/resizable.tsx create mode 100644 frontend-starter/components/ui/scroll-area.tsx create mode 100644 frontend-starter/components/ui/select.tsx create mode 100644 frontend-starter/components/ui/separator.tsx create mode 100644 frontend-starter/components/ui/sheet.tsx create mode 100644 frontend-starter/components/ui/sidebar.tsx create mode 100644 frontend-starter/components/ui/skeleton.tsx create mode 100644 frontend-starter/components/ui/slider.tsx create mode 100644 frontend-starter/components/ui/spinner.tsx create mode 100644 frontend-starter/components/ui/switch.tsx create mode 100644 frontend-starter/components/ui/table.tsx create mode 100644 frontend-starter/components/ui/tabs.tsx create mode 100644 frontend-starter/components/ui/textarea.tsx create mode 100644 frontend-starter/components/ui/toast.tsx create mode 100644 frontend-starter/components/ui/toggle-group.tsx create mode 100644 frontend-starter/components/ui/toggle.tsx create mode 100644 frontend-starter/components/ui/tooltip.tsx create mode 100644 frontend-starter/components/ui/trace.tsx create mode 100644 frontend-starter/hooks/use-highlighted-code.ts create mode 100644 frontend-starter/hooks/use-mobile.ts create mode 100644 frontend-starter/lib/highlighter.tsx diff --git a/frontend-starter/app/globals.css b/frontend-starter/app/globals.css index 02a9c82..13327b7 100644 --- a/frontend-starter/app/globals.css +++ b/frontend-starter/app/globals.css @@ -6,3 +6,14 @@ /* E&P-Farben, Schriften und Bausteine (ep-karte, ep-knopf, …) kommen aus @ep/ui/theme.css. * Hier nur app-eigene Regeln ergänzen. */ + +/* shadcn/ui-Komponenten an das E&P-Layout angleichen: + * Hauptfarbe Tiefblau statt Schwarz, auch die größten Radien eckig. */ +@theme { + --radius-4xl: 0px; +} +:root { + --primary: var(--ep-tiefblau); + --primary-foreground: var(--on-accent); + --ring: var(--ep-tiefblau); +} diff --git a/frontend-starter/app/layout.tsx b/frontend-starter/app/layout.tsx index c339c36..7b25d24 100644 --- a/frontend-starter/app/layout.tsx +++ b/frontend-starter/app/layout.tsx @@ -25,7 +25,7 @@ export default function RootLayout({ children }: { children: React.ReactNode }) Zum Inhalt springen -
+
{children}
diff --git a/frontend-starter/app/page.tsx b/frontend-starter/app/page.tsx index 1b75930..b014e71 100644 --- a/frontend-starter/app/page.tsx +++ b/frontend-starter/app/page.tsx @@ -1,17 +1,21 @@ +import { Galerie } from "@/components/galerie/galerie"; import { Card, CardContent, CardHeader } from "@/components/ui/card"; import { APP_BESCHREIBUNG, APP_TITEL } from "@/lib/app"; -// Startseite im E&P-Layout. Kopf und Fuß kommen aus app/layout.tsx, -// Farben und Bausteine (ep-karte, ep-ueberschrift, …) aus @ep/ui/theme.css. +// Startseite im E&P-Layout mit der Galerie aller shadcn/ui-Komponenten. +// Kopf und Fuß kommen aus app/layout.tsx, Farben und Bausteine (ep-karte, ep-ueberschrift, …) aus @ep/ui/theme.css. export default function Home() { return ( - - -

{APP_TITEL}

-
- -

{APP_BESCHREIBUNG}

-
-
+ <> + + +

{APP_TITEL}

+
+ +

{APP_BESCHREIBUNG}

+
+
+ + ); } diff --git a/frontend-starter/components/galerie/beispiele/chat.tsx b/frontend-starter/components/galerie/beispiele/chat.tsx new file mode 100644 index 0000000..0e3198b --- /dev/null +++ b/frontend-starter/components/galerie/beispiele/chat.tsx @@ -0,0 +1,262 @@ +"use client"; + +import { CalendarDaysIcon, FileTextIcon, SearchIcon, XIcon } from "lucide-react"; + +import { Eintrag } from "@/components/galerie/eintrag"; +import { + Attachment, + AttachmentAction, + AttachmentActions, + AttachmentContent, + AttachmentDescription, + AttachmentGroup, + AttachmentMedia, + AttachmentTitle, +} from "@/components/ui/attachment"; +import { Avatar, AvatarFallback } from "@/components/ui/avatar"; +import { Bubble, BubbleContent, BubbleGroup } from "@/components/ui/bubble"; +import { + CodeBlock, + CodeBlockActions, + CodeBlockContent, + CodeBlockCopyButton, + CodeBlockHeader, + CodeBlockLine, + CodeBlockTitle, +} from "@/components/ui/code-block"; +import { Marker, MarkerContent, MarkerIcon } from "@/components/ui/marker"; +import { + Message, + MessageAvatar, + MessageContent, + MessageGroup, + MessageHeader, +} from "@/components/ui/message"; +import { + MessageScroller, + MessageScrollerButton, + MessageScrollerContent, + MessageScrollerItem, + MessageScrollerProvider, + MessageScrollerViewport, +} from "@/components/ui/message-scroller"; +import { + Questionnaire, + QuestionnaireActions, + QuestionnaireChoice, + QuestionnaireChoices, + QuestionnaireInput, + QuestionnaireItem, + QuestionnaireNext, + QuestionnairePrevious, + QuestionnaireProgress, + QuestionnaireSubmit, + QuestionnaireTitle, +} from "@/components/ui/questionnaire"; +import { Spinner } from "@/components/ui/spinner"; +import { toast } from "@/components/ui/toast"; +import { + Trace, + TraceCollapsible, + TraceCollapsibleContent, + TraceCollapsibleTrigger, + TraceDescription, + TraceIcon, + TraceLine, + TraceTitle, +} from "@/components/ui/trace"; +import { useHighlightedCode } from "@/hooks/use-highlighted-code"; + +const BEISPIELCODE = `export function Begruessung({ name }: { name: string }) { + return

Willkommen, {name}!

+}`; + +const VERLAUF = [ + { id: "1", von: "kunde", text: "Hallo, ist die Island-Reise im Juli noch frei?" }, + { id: "2", von: "service", text: "Ja, es gibt noch 4 Plätze." }, + { id: "3", von: "kunde", text: "Super! Ist der Flug inklusive?" }, + { id: "4", von: "service", text: "Ja, ab Frankfurt oder München." }, + { id: "5", von: "kunde", text: "Dann buche ich für zwei Personen." }, + { id: "6", von: "service", text: "Gern, ich schicke Ihnen das Angebot." }, +]; + +function CodeBeispiel() { + const zeilen = useHighlightedCode(BEISPIELCODE, "tsx"); + + return ( + + + begruessung.tsx + + + + + + {zeilen.map((zeile, index) => ( + {zeile} + ))} + + + ); +} + +export function ChatBeispiele() { + return ( + <> + + + + + + + + Reiseplan.pdf + 240 KB + + + + + + + + + + + + + Pass.jpg + Wird hochgeladen … + + + + + + + + + Wann geht der Transfer zum Hotel? + + + Direkt nach der Landung, gegen 14 Uhr. + + + + + + + + + + EP + + + + Service + + Wie kann ich helfen? + + + + + + + Ich möchte meine Reise umbuchen. + + + + + + + + + + + + {VERLAUF.map((nachricht) => ( + + + {nachricht.text} + + + ))} + + + + + + + + +
+ + Heute + + + + + + Reise wurde auf den 12. Juli verschoben + +
+
+ + + + + + + + Hotels in Reykjavík gesucht + 1,2 s + + + Preise werden verglichen + + + + + 3 Angebote gefunden + + + Hotel Borg, Hotel Klettur, Center Hotel Plaza + + + + + + + + + + { + event.preventDefault(); + toast.add({ title: "Danke!", description: "Ihre Antworten sind angekommen.", type: "success" }); + }} + > + + + Wie reisen Sie am liebsten? + + Rundreise + Kreuzfahrt + Städtereise + + + + Haben Sie besondere Wünsche? + + + + Zurück + Weiter + Absenden + + + + + ); +} diff --git a/frontend-starter/components/galerie/beispiele/daten.tsx b/frontend-starter/components/galerie/beispiele/daten.tsx new file mode 100644 index 0000000..153ec9e --- /dev/null +++ b/frontend-starter/components/galerie/beispiele/daten.tsx @@ -0,0 +1,163 @@ +"use client"; + +import { Bar, BarChart, CartesianGrid, XAxis } from "recharts"; +import { ChevronRightIcon, PlaneIcon } from "lucide-react"; + +import { Eintrag } from "@/components/galerie/eintrag"; +import { Avatar, AvatarFallback, AvatarGroup } from "@/components/ui/avatar"; +import { Button } from "@/components/ui/button"; +import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "@/components/ui/card"; +import { + Carousel, + CarouselContent, + CarouselItem, + CarouselNext, + CarouselPrevious, +} from "@/components/ui/carousel"; +import { + ChartContainer, + ChartTooltip, + ChartTooltipContent, + type ChartConfig, +} from "@/components/ui/chart"; +import { + Item, + ItemActions, + ItemContent, + ItemDescription, + ItemMedia, + ItemTitle, +} from "@/components/ui/item"; +import { Kbd, KbdGroup } from "@/components/ui/kbd"; +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from "@/components/ui/table"; + +const BUCHUNGEN = [ + { monat: "Jan", buchungen: 18 }, + { monat: "Feb", buchungen: 24 }, + { monat: "Mär", buchungen: 31 }, + { monat: "Apr", buchungen: 27 }, + { monat: "Mai", buchungen: 42 }, + { monat: "Jun", buchungen: 38 }, +]; + +const DIAGRAMM: ChartConfig = { + buchungen: { label: "Buchungen", color: "var(--ep-tiefblau)" }, +}; + +const REISEN = [ + { ziel: "Island", tage: 10, preis: "2.490 €" }, + { ziel: "Japan", tage: 14, preis: "4.190 €" }, + { ziel: "Peru", tage: 16, preis: "3.780 €" }, +]; + +export function DatenBeispiele() { + return ( + <> + + + + Island Rundreise + 10 Tage · ab 2.490 € + + Gletscher, Geysire und Polarlichter. + + + + + + + + + + + Ziel + Tage + Preis + + + + {REISEN.map((reise) => ( + + {reise.ziel} + {reise.tage} + {reise.preis} + + ))} + +
+
+ + + + FB + + + + AK + + + MS + + + LW + + + + + + + + + + } /> + + + + + + + + + {["Island", "Japan", "Peru"].map((ziel) => ( + +
{ziel}
+
+ ))} +
+ + +
+
+ + + + + + + + Flug LH 450 + Frankfurt → Reykjavík · 08:40 Uhr + + + + + + + + + + Strg + K + + öffnet die Suche + + + ); +} diff --git a/frontend-starter/components/galerie/beispiele/feedback.tsx b/frontend-starter/components/galerie/beispiele/feedback.tsx new file mode 100644 index 0000000..7e59521 --- /dev/null +++ b/frontend-starter/components/galerie/beispiele/feedback.tsx @@ -0,0 +1,96 @@ +"use client"; + +import { InfoIcon, InboxIcon } from "lucide-react"; + +import { Eintrag } from "@/components/galerie/eintrag"; +import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert"; +import { Badge } from "@/components/ui/badge"; +import { Button } from "@/components/ui/button"; +import { + Empty, + EmptyContent, + EmptyDescription, + EmptyHeader, + EmptyMedia, + EmptyTitle, +} from "@/components/ui/empty"; +import { Progress } from "@/components/ui/progress"; +import { Skeleton } from "@/components/ui/skeleton"; +import { Spinner } from "@/components/ui/spinner"; +import { toast } from "@/components/ui/toast"; + +export function FeedbackBeispiele() { + return ( + <> + + + + Hinweis + Für diese Reise ist ein gültiger Reisepass nötig. + + + Fehler + Die Buchung konnte nicht gespeichert werden. + + + + + + + + + + + + +
+ +
+ + +
+
+
+ + + + + + + + Neu + Entwurf + Archiv + Storniert + + + + + + + + + Noch keine Buchungen + Sobald jemand bucht, erscheint es hier. + + + + + + + + ); +} diff --git a/frontend-starter/components/galerie/beispiele/formulare.tsx b/frontend-starter/components/galerie/beispiele/formulare.tsx new file mode 100644 index 0000000..fb16198 --- /dev/null +++ b/frontend-starter/components/galerie/beispiele/formulare.tsx @@ -0,0 +1,235 @@ +"use client"; + +import * as React from "react"; +import { format } from "date-fns"; +import { de } from "date-fns/locale"; +import { BoldIcon, CalendarIcon, ItalicIcon, SearchIcon, UnderlineIcon } from "lucide-react"; + +import { Eintrag } from "@/components/galerie/eintrag"; +import { Button } from "@/components/ui/button"; +import { ButtonGroup } from "@/components/ui/button-group"; +import { Calendar } from "@/components/ui/calendar"; +import { Checkbox } from "@/components/ui/checkbox"; +import { + Combobox, + ComboboxContent, + ComboboxEmpty, + ComboboxInput, + ComboboxItem, + ComboboxList, +} from "@/components/ui/combobox"; +import { Field, FieldDescription, FieldLabel } from "@/components/ui/field"; +import { Input } from "@/components/ui/input"; +import { InputGroup, InputGroupAddon, InputGroupInput } from "@/components/ui/input-group"; +import { InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot } from "@/components/ui/input-otp"; +import { Label } from "@/components/ui/label"; +import { NativeSelect, NativeSelectOption } from "@/components/ui/native-select"; +import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; +import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group"; +import { + Select, + SelectContent, + SelectGroup, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/components/ui/select"; +import { Slider } from "@/components/ui/slider"; +import { Switch } from "@/components/ui/switch"; +import { Textarea } from "@/components/ui/textarea"; +import { Toggle } from "@/components/ui/toggle"; +import { ToggleGroup, ToggleGroupItem } from "@/components/ui/toggle-group"; + +const REISEZIELE = ["Island", "Japan", "Kanada", "Namibia", "Norwegen", "Peru"]; + +const ZIMMER = [ + { label: "Einzelzimmer", value: "ez" }, + { label: "Doppelzimmer", value: "dz" }, + { label: "Suite", value: "suite" }, +]; + +export function FormularBeispiele() { + const [datum, setDatum] = React.useState(new Date()); + const [reisedatum, setReisedatum] = React.useState(); + + return ( + <> + + + + + + + + + + + + + + + + + + + + + + + + + + + + 12 Treffer + + + + + + + + + + + + + + + + + + + + +