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 + + + + + + + + + + + + + + + + + + + + +