-
+
+
diff --git a/src/psaggregator/src/lib/components/UploadPlanEntry.svelte b/src/psaggregator/src/lib/components/UploadPlanEntry.svelte
index 11959dc..0917783 100644
--- a/src/psaggregator/src/lib/components/UploadPlanEntry.svelte
+++ b/src/psaggregator/src/lib/components/UploadPlanEntry.svelte
@@ -3,44 +3,48 @@
import { PlayFilledAlt, Video, VideoPlayer } from "carbon-icons-svelte";
import moment from "moment";
import Sparkle from "./Sparkle.svelte";
+ import * as Card from "$lib/components/ui/card";
+ import { Button } from "./ui/button";
export let entry: ScheduledContentPiece;
-
-
-
- {#if entry.type === "TwitchStream"}
-
- {:else}
-
- {/if}
-
- {#if entry.startDate}
- {@const date = moment(entry.startDate)}
+
+
+
- {#if !moment().isSame(date, "day")}
- {date.format("DD. MMM,")}
+ {#if entry.type === "TwitchStream"}
+
+ {:else}
+
{/if}
- {date.format("HH:mm")}
+
+ {#if entry.startDate}
+ {@const date = moment(entry.startDate)}
+
+ {#if !moment().isSame(date, "day")}
+ {date.format("DD. MMM,")}
+ {/if}
+ {date.format("HH:mm")}
+
+ {/if}
+
+
{entry.title}
+ {#if entry.href || entry.importedFrom === "OpenAI"}
+
+ {/if}
+ {#if entry.href}
+
+
+
+
+ Ansehen
+
+ {/if}
+ {#if entry.importedFrom === "OpenAI"}
+
+
{/if}
- {entry.title}
- {#if entry.href || entry.importedFrom === "OpenAI"}
-
- {/if}
- {#if entry.href}
-
-
-
-
- Ansehen
-
- {/if}
- {#if entry.importedFrom === "OpenAI"}
-
-
-
- {/if}
-
+
diff --git a/src/psaggregator/src/lib/components/YouTubeCommunityPost.svelte b/src/psaggregator/src/lib/components/YouTubeCommunityPost.svelte
index 6e34b84..e4b2ae1 100644
--- a/src/psaggregator/src/lib/components/YouTubeCommunityPost.svelte
+++ b/src/psaggregator/src/lib/components/YouTubeCommunityPost.svelte
@@ -2,16 +2,19 @@
import { dateFormat } from "$lib/utils/dateFormat";
import type { Information } from "@prisma/client";
import { SHOW_ABSOLUTE_DATES } from "../../config/config";
+ import * as Card from "$lib/components/ui/card";
export let post: Information;
-
- {#if post.date}
- {dateFormat(post.date, $SHOW_ABSOLUTE_DATES)}
- {/if}
- {post.text}
- {#if post.imageUri}
-
- {/if}
-
+
+
+ {#if post.date}
+ {dateFormat(post.date, $SHOW_ABSOLUTE_DATES)}
+ {/if}
+ {post.text}
+ {#if post.imageUri}
+
+ {/if}
+
+
diff --git a/src/psaggregator/src/lib/components/ui/button/button.svelte b/src/psaggregator/src/lib/components/ui/button/button.svelte
new file mode 100644
index 0000000..86827f3
--- /dev/null
+++ b/src/psaggregator/src/lib/components/ui/button/button.svelte
@@ -0,0 +1,25 @@
+
+
+
+
+
diff --git a/src/psaggregator/src/lib/components/ui/button/index.ts b/src/psaggregator/src/lib/components/ui/button/index.ts
new file mode 100644
index 0000000..af1e188
--- /dev/null
+++ b/src/psaggregator/src/lib/components/ui/button/index.ts
@@ -0,0 +1,49 @@
+import { type VariantProps, tv } from "tailwind-variants";
+import type { Button as ButtonPrimitive } from "bits-ui";
+import Root from "./button.svelte";
+
+const buttonVariants = tv({
+ base: "ring-offset-background focus-visible:ring-ring inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",
+ variants: {
+ variant: {
+ default: "bg-primary text-primary-foreground hover:bg-primary/90",
+ destructive: "bg-destructive text-destructive-foreground hover:bg-destructive/90",
+ outline:
+ "border-input bg-background hover:bg-accent hover:text-accent-foreground border",
+ secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
+ ghost: "hover:bg-accent hover:text-accent-foreground",
+ link: "text-primary underline-offset-4 hover:underline",
+ },
+ size: {
+ default: "h-10 px-4 py-2",
+ sm: "h-9 rounded-md px-3",
+ lg: "h-11 rounded-md px-8",
+ icon: "h-10 w-10",
+ },
+ },
+ defaultVariants: {
+ variant: "default",
+ size: "default",
+ },
+});
+
+type Variant = VariantProps
["variant"];
+type Size = VariantProps["size"];
+
+type Props = ButtonPrimitive.Props & {
+ variant?: Variant;
+ size?: Size;
+};
+
+type Events = ButtonPrimitive.Events;
+
+export {
+ Root,
+ type Props,
+ type Events,
+ //
+ Root as Button,
+ type Props as ButtonProps,
+ type Events as ButtonEvents,
+ buttonVariants,
+};
diff --git a/src/psaggregator/src/lib/components/ui/calendar/calendar-cell.svelte b/src/psaggregator/src/lib/components/ui/calendar/calendar-cell.svelte
new file mode 100644
index 0000000..f2962b2
--- /dev/null
+++ b/src/psaggregator/src/lib/components/ui/calendar/calendar-cell.svelte
@@ -0,0 +1,21 @@
+
+
+
+
+
diff --git a/src/psaggregator/src/lib/components/ui/calendar/calendar-day.svelte b/src/psaggregator/src/lib/components/ui/calendar/calendar-day.svelte
new file mode 100644
index 0000000..c9b2efc
--- /dev/null
+++ b/src/psaggregator/src/lib/components/ui/calendar/calendar-day.svelte
@@ -0,0 +1,42 @@
+
+
+
+
+ {date.day}
+
+
diff --git a/src/psaggregator/src/lib/components/ui/calendar/calendar-grid-body.svelte b/src/psaggregator/src/lib/components/ui/calendar/calendar-grid-body.svelte
new file mode 100644
index 0000000..80b6f84
--- /dev/null
+++ b/src/psaggregator/src/lib/components/ui/calendar/calendar-grid-body.svelte
@@ -0,0 +1,13 @@
+
+
+
+
+
diff --git a/src/psaggregator/src/lib/components/ui/calendar/calendar-grid-head.svelte b/src/psaggregator/src/lib/components/ui/calendar/calendar-grid-head.svelte
new file mode 100644
index 0000000..dbe3e8e
--- /dev/null
+++ b/src/psaggregator/src/lib/components/ui/calendar/calendar-grid-head.svelte
@@ -0,0 +1,13 @@
+
+
+
+
+
diff --git a/src/psaggregator/src/lib/components/ui/calendar/calendar-grid-row.svelte b/src/psaggregator/src/lib/components/ui/calendar/calendar-grid-row.svelte
new file mode 100644
index 0000000..3a1473c
--- /dev/null
+++ b/src/psaggregator/src/lib/components/ui/calendar/calendar-grid-row.svelte
@@ -0,0 +1,13 @@
+
+
+
+
+
diff --git a/src/psaggregator/src/lib/components/ui/calendar/calendar-grid.svelte b/src/psaggregator/src/lib/components/ui/calendar/calendar-grid.svelte
new file mode 100644
index 0000000..d52c9a7
--- /dev/null
+++ b/src/psaggregator/src/lib/components/ui/calendar/calendar-grid.svelte
@@ -0,0 +1,13 @@
+
+
+
+
+
diff --git a/src/psaggregator/src/lib/components/ui/calendar/calendar-head-cell.svelte b/src/psaggregator/src/lib/components/ui/calendar/calendar-head-cell.svelte
new file mode 100644
index 0000000..f9eabbc
--- /dev/null
+++ b/src/psaggregator/src/lib/components/ui/calendar/calendar-head-cell.svelte
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/src/psaggregator/src/lib/components/ui/calendar/calendar-header.svelte b/src/psaggregator/src/lib/components/ui/calendar/calendar-header.svelte
new file mode 100644
index 0000000..014ff28
--- /dev/null
+++ b/src/psaggregator/src/lib/components/ui/calendar/calendar-header.svelte
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/src/psaggregator/src/lib/components/ui/calendar/calendar-heading.svelte b/src/psaggregator/src/lib/components/ui/calendar/calendar-heading.svelte
new file mode 100644
index 0000000..409a182
--- /dev/null
+++ b/src/psaggregator/src/lib/components/ui/calendar/calendar-heading.svelte
@@ -0,0 +1,19 @@
+
+
+
+
+ {headingValue}
+
+
diff --git a/src/psaggregator/src/lib/components/ui/calendar/calendar-months.svelte b/src/psaggregator/src/lib/components/ui/calendar/calendar-months.svelte
new file mode 100644
index 0000000..4621c54
--- /dev/null
+++ b/src/psaggregator/src/lib/components/ui/calendar/calendar-months.svelte
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/src/psaggregator/src/lib/components/ui/calendar/calendar-next-button.svelte b/src/psaggregator/src/lib/components/ui/calendar/calendar-next-button.svelte
new file mode 100644
index 0000000..dd0bffe
--- /dev/null
+++ b/src/psaggregator/src/lib/components/ui/calendar/calendar-next-button.svelte
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
diff --git a/src/psaggregator/src/lib/components/ui/calendar/calendar-prev-button.svelte b/src/psaggregator/src/lib/components/ui/calendar/calendar-prev-button.svelte
new file mode 100644
index 0000000..48d8235
--- /dev/null
+++ b/src/psaggregator/src/lib/components/ui/calendar/calendar-prev-button.svelte
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
diff --git a/src/psaggregator/src/lib/components/ui/calendar/calendar.svelte b/src/psaggregator/src/lib/components/ui/calendar/calendar.svelte
new file mode 100644
index 0000000..0857f3d
--- /dev/null
+++ b/src/psaggregator/src/lib/components/ui/calendar/calendar.svelte
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+ {#each months as month}
+
+
+
+ {#each weekdays as weekday}
+
+ {weekday.slice(0, 2)}
+
+ {/each}
+
+
+
+ {#each month.weeks as weekDates}
+
+ {#each weekDates as date}
+
+
+
+ {/each}
+
+ {/each}
+
+
+ {/each}
+
+
diff --git a/src/psaggregator/src/lib/components/ui/calendar/index.ts b/src/psaggregator/src/lib/components/ui/calendar/index.ts
new file mode 100644
index 0000000..ab257ab
--- /dev/null
+++ b/src/psaggregator/src/lib/components/ui/calendar/index.ts
@@ -0,0 +1,30 @@
+import Root from "./calendar.svelte";
+import Cell from "./calendar-cell.svelte";
+import Day from "./calendar-day.svelte";
+import Grid from "./calendar-grid.svelte";
+import Header from "./calendar-header.svelte";
+import Months from "./calendar-months.svelte";
+import GridRow from "./calendar-grid-row.svelte";
+import Heading from "./calendar-heading.svelte";
+import GridBody from "./calendar-grid-body.svelte";
+import GridHead from "./calendar-grid-head.svelte";
+import HeadCell from "./calendar-head-cell.svelte";
+import NextButton from "./calendar-next-button.svelte";
+import PrevButton from "./calendar-prev-button.svelte";
+
+export {
+ Day,
+ Cell,
+ Grid,
+ Header,
+ Months,
+ GridRow,
+ Heading,
+ GridBody,
+ GridHead,
+ HeadCell,
+ NextButton,
+ PrevButton,
+ //
+ Root as Calendar,
+};
diff --git a/src/psaggregator/src/lib/components/ui/card/card-content.svelte b/src/psaggregator/src/lib/components/ui/card/card-content.svelte
new file mode 100644
index 0000000..89d82b2
--- /dev/null
+++ b/src/psaggregator/src/lib/components/ui/card/card-content.svelte
@@ -0,0 +1,13 @@
+
+
+
+
+
diff --git a/src/psaggregator/src/lib/components/ui/card/card-description.svelte b/src/psaggregator/src/lib/components/ui/card/card-description.svelte
new file mode 100644
index 0000000..f65821d
--- /dev/null
+++ b/src/psaggregator/src/lib/components/ui/card/card-description.svelte
@@ -0,0 +1,13 @@
+
+
+
+
+
diff --git a/src/psaggregator/src/lib/components/ui/card/card-footer.svelte b/src/psaggregator/src/lib/components/ui/card/card-footer.svelte
new file mode 100644
index 0000000..32f90bb
--- /dev/null
+++ b/src/psaggregator/src/lib/components/ui/card/card-footer.svelte
@@ -0,0 +1,13 @@
+
+
+
+
+
diff --git a/src/psaggregator/src/lib/components/ui/card/card-header.svelte b/src/psaggregator/src/lib/components/ui/card/card-header.svelte
new file mode 100644
index 0000000..e474528
--- /dev/null
+++ b/src/psaggregator/src/lib/components/ui/card/card-header.svelte
@@ -0,0 +1,13 @@
+
+
+
+
+
diff --git a/src/psaggregator/src/lib/components/ui/card/card-title.svelte b/src/psaggregator/src/lib/components/ui/card/card-title.svelte
new file mode 100644
index 0000000..719808e
--- /dev/null
+++ b/src/psaggregator/src/lib/components/ui/card/card-title.svelte
@@ -0,0 +1,21 @@
+
+
+
+
+
diff --git a/src/psaggregator/src/lib/components/ui/card/card.svelte b/src/psaggregator/src/lib/components/ui/card/card.svelte
new file mode 100644
index 0000000..b69c15c
--- /dev/null
+++ b/src/psaggregator/src/lib/components/ui/card/card.svelte
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/src/psaggregator/src/lib/components/ui/card/index.ts b/src/psaggregator/src/lib/components/ui/card/index.ts
new file mode 100644
index 0000000..bcc031d
--- /dev/null
+++ b/src/psaggregator/src/lib/components/ui/card/index.ts
@@ -0,0 +1,24 @@
+import Root from "./card.svelte";
+import Content from "./card-content.svelte";
+import Description from "./card-description.svelte";
+import Footer from "./card-footer.svelte";
+import Header from "./card-header.svelte";
+import Title from "./card-title.svelte";
+
+export {
+ Root,
+ Content,
+ Description,
+ Footer,
+ Header,
+ Title,
+ //
+ Root as Card,
+ Content as CardContent,
+ Description as CardDescription,
+ Footer as CardFooter,
+ Header as CardHeader,
+ Title as CardTitle,
+};
+
+export type HeadingLevel = "h1" | "h2" | "h3" | "h4" | "h5" | "h6";
diff --git a/src/psaggregator/src/lib/components/ui/checkbox/checkbox.svelte b/src/psaggregator/src/lib/components/ui/checkbox/checkbox.svelte
new file mode 100644
index 0000000..f4b906f
--- /dev/null
+++ b/src/psaggregator/src/lib/components/ui/checkbox/checkbox.svelte
@@ -0,0 +1,35 @@
+
+
+
+
+ {#if isChecked}
+
+ {:else if isIndeterminate}
+
+ {/if}
+
+
diff --git a/src/psaggregator/src/lib/components/ui/checkbox/index.ts b/src/psaggregator/src/lib/components/ui/checkbox/index.ts
new file mode 100644
index 0000000..6d92d94
--- /dev/null
+++ b/src/psaggregator/src/lib/components/ui/checkbox/index.ts
@@ -0,0 +1,6 @@
+import Root from "./checkbox.svelte";
+export {
+ Root,
+ //
+ Root as Checkbox,
+};
diff --git a/src/psaggregator/src/lib/components/ui/dialog/dialog-content.svelte b/src/psaggregator/src/lib/components/ui/dialog/dialog-content.svelte
new file mode 100644
index 0000000..a06ccb2
--- /dev/null
+++ b/src/psaggregator/src/lib/components/ui/dialog/dialog-content.svelte
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+ Close
+
+
+
diff --git a/src/psaggregator/src/lib/components/ui/dialog/dialog-description.svelte b/src/psaggregator/src/lib/components/ui/dialog/dialog-description.svelte
new file mode 100644
index 0000000..8bc70cc
--- /dev/null
+++ b/src/psaggregator/src/lib/components/ui/dialog/dialog-description.svelte
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/src/psaggregator/src/lib/components/ui/dialog/dialog-footer.svelte b/src/psaggregator/src/lib/components/ui/dialog/dialog-footer.svelte
new file mode 100644
index 0000000..a235d1f
--- /dev/null
+++ b/src/psaggregator/src/lib/components/ui/dialog/dialog-footer.svelte
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/src/psaggregator/src/lib/components/ui/dialog/dialog-header.svelte b/src/psaggregator/src/lib/components/ui/dialog/dialog-header.svelte
new file mode 100644
index 0000000..6b4448c
--- /dev/null
+++ b/src/psaggregator/src/lib/components/ui/dialog/dialog-header.svelte
@@ -0,0 +1,13 @@
+
+
+
+
+
diff --git a/src/psaggregator/src/lib/components/ui/dialog/dialog-overlay.svelte b/src/psaggregator/src/lib/components/ui/dialog/dialog-overlay.svelte
new file mode 100644
index 0000000..1d376e4
--- /dev/null
+++ b/src/psaggregator/src/lib/components/ui/dialog/dialog-overlay.svelte
@@ -0,0 +1,21 @@
+
+
+
diff --git a/src/psaggregator/src/lib/components/ui/dialog/dialog-portal.svelte b/src/psaggregator/src/lib/components/ui/dialog/dialog-portal.svelte
new file mode 100644
index 0000000..eb5d0a5
--- /dev/null
+++ b/src/psaggregator/src/lib/components/ui/dialog/dialog-portal.svelte
@@ -0,0 +1,8 @@
+
+
+
+
+
diff --git a/src/psaggregator/src/lib/components/ui/dialog/dialog-title.svelte b/src/psaggregator/src/lib/components/ui/dialog/dialog-title.svelte
new file mode 100644
index 0000000..06574f3
--- /dev/null
+++ b/src/psaggregator/src/lib/components/ui/dialog/dialog-title.svelte
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/src/psaggregator/src/lib/components/ui/dialog/index.ts b/src/psaggregator/src/lib/components/ui/dialog/index.ts
new file mode 100644
index 0000000..b17ba5e
--- /dev/null
+++ b/src/psaggregator/src/lib/components/ui/dialog/index.ts
@@ -0,0 +1,37 @@
+import { Dialog as DialogPrimitive } from "bits-ui";
+
+import Title from "./dialog-title.svelte";
+import Portal from "./dialog-portal.svelte";
+import Footer from "./dialog-footer.svelte";
+import Header from "./dialog-header.svelte";
+import Overlay from "./dialog-overlay.svelte";
+import Content from "./dialog-content.svelte";
+import Description from "./dialog-description.svelte";
+
+const Root = DialogPrimitive.Root;
+const Trigger = DialogPrimitive.Trigger;
+const Close = DialogPrimitive.Close;
+
+export {
+ Root,
+ Title,
+ Portal,
+ Footer,
+ Header,
+ Trigger,
+ Overlay,
+ Content,
+ Description,
+ Close,
+ //
+ Root as Dialog,
+ Title as DialogTitle,
+ Portal as DialogPortal,
+ Footer as DialogFooter,
+ Header as DialogHeader,
+ Trigger as DialogTrigger,
+ Overlay as DialogOverlay,
+ Content as DialogContent,
+ Description as DialogDescription,
+ Close as DialogClose,
+};
diff --git a/src/psaggregator/src/lib/components/ui/input/index.ts b/src/psaggregator/src/lib/components/ui/input/index.ts
new file mode 100644
index 0000000..75e3bc2
--- /dev/null
+++ b/src/psaggregator/src/lib/components/ui/input/index.ts
@@ -0,0 +1,29 @@
+import Root from "./input.svelte";
+
+export type FormInputEvent = T & {
+ currentTarget: EventTarget & HTMLInputElement;
+};
+export type InputEvents = {
+ blur: FormInputEvent;
+ change: FormInputEvent;
+ click: FormInputEvent;
+ focus: FormInputEvent;
+ focusin: FormInputEvent;
+ focusout: FormInputEvent;
+ keydown: FormInputEvent;
+ keypress: FormInputEvent;
+ keyup: FormInputEvent;
+ mouseover: FormInputEvent;
+ mouseenter: FormInputEvent;
+ mouseleave: FormInputEvent;
+ mousemove: FormInputEvent;
+ paste: FormInputEvent;
+ input: FormInputEvent;
+ wheel: FormInputEvent;
+};
+
+export {
+ Root,
+ //
+ Root as Input,
+};
diff --git a/src/psaggregator/src/lib/components/ui/input/input.svelte b/src/psaggregator/src/lib/components/ui/input/input.svelte
new file mode 100644
index 0000000..cab1457
--- /dev/null
+++ b/src/psaggregator/src/lib/components/ui/input/input.svelte
@@ -0,0 +1,42 @@
+
+
+
diff --git a/src/psaggregator/src/lib/components/ui/label/index.ts b/src/psaggregator/src/lib/components/ui/label/index.ts
new file mode 100644
index 0000000..8bfca0b
--- /dev/null
+++ b/src/psaggregator/src/lib/components/ui/label/index.ts
@@ -0,0 +1,7 @@
+import Root from "./label.svelte";
+
+export {
+ Root,
+ //
+ Root as Label,
+};
diff --git a/src/psaggregator/src/lib/components/ui/label/label.svelte b/src/psaggregator/src/lib/components/ui/label/label.svelte
new file mode 100644
index 0000000..2a7d479
--- /dev/null
+++ b/src/psaggregator/src/lib/components/ui/label/label.svelte
@@ -0,0 +1,21 @@
+
+
+
+
+
diff --git a/src/psaggregator/src/lib/components/ui/popover/index.ts b/src/psaggregator/src/lib/components/ui/popover/index.ts
new file mode 100644
index 0000000..63aecf9
--- /dev/null
+++ b/src/psaggregator/src/lib/components/ui/popover/index.ts
@@ -0,0 +1,17 @@
+import { Popover as PopoverPrimitive } from "bits-ui";
+import Content from "./popover-content.svelte";
+const Root = PopoverPrimitive.Root;
+const Trigger = PopoverPrimitive.Trigger;
+const Close = PopoverPrimitive.Close;
+
+export {
+ Root,
+ Content,
+ Trigger,
+ Close,
+ //
+ Root as Popover,
+ Content as PopoverContent,
+ Trigger as PopoverTrigger,
+ Close as PopoverClose,
+};
diff --git a/src/psaggregator/src/lib/components/ui/popover/popover-content.svelte b/src/psaggregator/src/lib/components/ui/popover/popover-content.svelte
new file mode 100644
index 0000000..1d86206
--- /dev/null
+++ b/src/psaggregator/src/lib/components/ui/popover/popover-content.svelte
@@ -0,0 +1,22 @@
+
+
+
+
+
diff --git a/src/psaggregator/src/lib/components/ui/range-calendar/index.ts b/src/psaggregator/src/lib/components/ui/range-calendar/index.ts
new file mode 100644
index 0000000..43adb92
--- /dev/null
+++ b/src/psaggregator/src/lib/components/ui/range-calendar/index.ts
@@ -0,0 +1,30 @@
+import Root from "./range-calendar.svelte";
+import Cell from "./range-calendar-cell.svelte";
+import Day from "./range-calendar-day.svelte";
+import Grid from "./range-calendar-grid.svelte";
+import Header from "./range-calendar-header.svelte";
+import Months from "./range-calendar-months.svelte";
+import GridRow from "./range-calendar-grid-row.svelte";
+import Heading from "./range-calendar-heading.svelte";
+import GridBody from "./range-calendar-grid-body.svelte";
+import GridHead from "./range-calendar-grid-head.svelte";
+import HeadCell from "./range-calendar-head-cell.svelte";
+import NextButton from "./range-calendar-next-button.svelte";
+import PrevButton from "./range-calendar-prev-button.svelte";
+
+export {
+ Day,
+ Cell,
+ Grid,
+ Header,
+ Months,
+ GridRow,
+ Heading,
+ GridBody,
+ GridHead,
+ HeadCell,
+ NextButton,
+ PrevButton,
+ //
+ Root as RangeCalendar,
+};
diff --git a/src/psaggregator/src/lib/components/ui/range-calendar/range-calendar-cell.svelte b/src/psaggregator/src/lib/components/ui/range-calendar/range-calendar-cell.svelte
new file mode 100644
index 0000000..5e9d2dd
--- /dev/null
+++ b/src/psaggregator/src/lib/components/ui/range-calendar/range-calendar-cell.svelte
@@ -0,0 +1,21 @@
+
+
+
+
+
diff --git a/src/psaggregator/src/lib/components/ui/range-calendar/range-calendar-day.svelte b/src/psaggregator/src/lib/components/ui/range-calendar/range-calendar-day.svelte
new file mode 100644
index 0000000..86db6dd
--- /dev/null
+++ b/src/psaggregator/src/lib/components/ui/range-calendar/range-calendar-day.svelte
@@ -0,0 +1,43 @@
+
+
+
+
+ {date.day}
+
+
diff --git a/src/psaggregator/src/lib/components/ui/range-calendar/range-calendar-grid-body.svelte b/src/psaggregator/src/lib/components/ui/range-calendar/range-calendar-grid-body.svelte
new file mode 100644
index 0000000..23a5dee
--- /dev/null
+++ b/src/psaggregator/src/lib/components/ui/range-calendar/range-calendar-grid-body.svelte
@@ -0,0 +1,13 @@
+
+
+
+
+
diff --git a/src/psaggregator/src/lib/components/ui/range-calendar/range-calendar-grid-head.svelte b/src/psaggregator/src/lib/components/ui/range-calendar/range-calendar-grid-head.svelte
new file mode 100644
index 0000000..23dbefe
--- /dev/null
+++ b/src/psaggregator/src/lib/components/ui/range-calendar/range-calendar-grid-head.svelte
@@ -0,0 +1,13 @@
+
+
+
+
+
diff --git a/src/psaggregator/src/lib/components/ui/range-calendar/range-calendar-grid-row.svelte b/src/psaggregator/src/lib/components/ui/range-calendar/range-calendar-grid-row.svelte
new file mode 100644
index 0000000..157c7ea
--- /dev/null
+++ b/src/psaggregator/src/lib/components/ui/range-calendar/range-calendar-grid-row.svelte
@@ -0,0 +1,13 @@
+
+
+
+
+
diff --git a/src/psaggregator/src/lib/components/ui/range-calendar/range-calendar-grid.svelte b/src/psaggregator/src/lib/components/ui/range-calendar/range-calendar-grid.svelte
new file mode 100644
index 0000000..c5050ba
--- /dev/null
+++ b/src/psaggregator/src/lib/components/ui/range-calendar/range-calendar-grid.svelte
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/src/psaggregator/src/lib/components/ui/range-calendar/range-calendar-head-cell.svelte b/src/psaggregator/src/lib/components/ui/range-calendar/range-calendar-head-cell.svelte
new file mode 100644
index 0000000..0806c60
--- /dev/null
+++ b/src/psaggregator/src/lib/components/ui/range-calendar/range-calendar-head-cell.svelte
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/src/psaggregator/src/lib/components/ui/range-calendar/range-calendar-header.svelte b/src/psaggregator/src/lib/components/ui/range-calendar/range-calendar-header.svelte
new file mode 100644
index 0000000..3949ecd
--- /dev/null
+++ b/src/psaggregator/src/lib/components/ui/range-calendar/range-calendar-header.svelte
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/src/psaggregator/src/lib/components/ui/range-calendar/range-calendar-heading.svelte b/src/psaggregator/src/lib/components/ui/range-calendar/range-calendar-heading.svelte
new file mode 100644
index 0000000..f022eeb
--- /dev/null
+++ b/src/psaggregator/src/lib/components/ui/range-calendar/range-calendar-heading.svelte
@@ -0,0 +1,19 @@
+
+
+
+
+ {headingValue}
+
+
diff --git a/src/psaggregator/src/lib/components/ui/range-calendar/range-calendar-months.svelte b/src/psaggregator/src/lib/components/ui/range-calendar/range-calendar-months.svelte
new file mode 100644
index 0000000..4621c54
--- /dev/null
+++ b/src/psaggregator/src/lib/components/ui/range-calendar/range-calendar-months.svelte
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/src/psaggregator/src/lib/components/ui/range-calendar/range-calendar-next-button.svelte b/src/psaggregator/src/lib/components/ui/range-calendar/range-calendar-next-button.svelte
new file mode 100644
index 0000000..661568b
--- /dev/null
+++ b/src/psaggregator/src/lib/components/ui/range-calendar/range-calendar-next-button.svelte
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
diff --git a/src/psaggregator/src/lib/components/ui/range-calendar/range-calendar-prev-button.svelte b/src/psaggregator/src/lib/components/ui/range-calendar/range-calendar-prev-button.svelte
new file mode 100644
index 0000000..f7c1383
--- /dev/null
+++ b/src/psaggregator/src/lib/components/ui/range-calendar/range-calendar-prev-button.svelte
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
diff --git a/src/psaggregator/src/lib/components/ui/range-calendar/range-calendar.svelte b/src/psaggregator/src/lib/components/ui/range-calendar/range-calendar.svelte
new file mode 100644
index 0000000..d20ba67
--- /dev/null
+++ b/src/psaggregator/src/lib/components/ui/range-calendar/range-calendar.svelte
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+ {#each months as month}
+
+
+
+ {#each weekdays as weekday}
+
+ {weekday.slice(0, 2)}
+
+ {/each}
+
+
+
+ {#each month.weeks as weekDates}
+
+ {#each weekDates as date}
+
+
+
+ {/each}
+
+ {/each}
+
+
+ {/each}
+
+
diff --git a/src/psaggregator/src/lib/components/ui/sonner/index.ts b/src/psaggregator/src/lib/components/ui/sonner/index.ts
new file mode 100644
index 0000000..1ad9f4a
--- /dev/null
+++ b/src/psaggregator/src/lib/components/ui/sonner/index.ts
@@ -0,0 +1 @@
+export { default as Toaster } from "./sonner.svelte";
diff --git a/src/psaggregator/src/lib/components/ui/sonner/sonner.svelte b/src/psaggregator/src/lib/components/ui/sonner/sonner.svelte
new file mode 100644
index 0000000..7d5b2f1
--- /dev/null
+++ b/src/psaggregator/src/lib/components/ui/sonner/sonner.svelte
@@ -0,0 +1,20 @@
+
+
+
diff --git a/src/psaggregator/src/lib/components/ui/tabs/index.ts b/src/psaggregator/src/lib/components/ui/tabs/index.ts
new file mode 100644
index 0000000..f1ab372
--- /dev/null
+++ b/src/psaggregator/src/lib/components/ui/tabs/index.ts
@@ -0,0 +1,18 @@
+import { Tabs as TabsPrimitive } from "bits-ui";
+import Content from "./tabs-content.svelte";
+import List from "./tabs-list.svelte";
+import Trigger from "./tabs-trigger.svelte";
+
+const Root = TabsPrimitive.Root;
+
+export {
+ Root,
+ Content,
+ List,
+ Trigger,
+ //
+ Root as Tabs,
+ Content as TabsContent,
+ List as TabsList,
+ Trigger as TabsTrigger,
+};
diff --git a/src/psaggregator/src/lib/components/ui/tabs/tabs-content.svelte b/src/psaggregator/src/lib/components/ui/tabs/tabs-content.svelte
new file mode 100644
index 0000000..b611559
--- /dev/null
+++ b/src/psaggregator/src/lib/components/ui/tabs/tabs-content.svelte
@@ -0,0 +1,21 @@
+
+
+
+
+
diff --git a/src/psaggregator/src/lib/components/ui/tabs/tabs-list.svelte b/src/psaggregator/src/lib/components/ui/tabs/tabs-list.svelte
new file mode 100644
index 0000000..773c754
--- /dev/null
+++ b/src/psaggregator/src/lib/components/ui/tabs/tabs-list.svelte
@@ -0,0 +1,19 @@
+
+
+
+
+
diff --git a/src/psaggregator/src/lib/components/ui/tabs/tabs-trigger.svelte b/src/psaggregator/src/lib/components/ui/tabs/tabs-trigger.svelte
new file mode 100644
index 0000000..b99358d
--- /dev/null
+++ b/src/psaggregator/src/lib/components/ui/tabs/tabs-trigger.svelte
@@ -0,0 +1,23 @@
+
+
+
+
+
diff --git a/src/psaggregator/src/lib/utils.ts b/src/psaggregator/src/lib/utils.ts
new file mode 100644
index 0000000..8871245
--- /dev/null
+++ b/src/psaggregator/src/lib/utils.ts
@@ -0,0 +1,62 @@
+import { type ClassValue, clsx } from "clsx";
+import { twMerge } from "tailwind-merge";
+import { cubicOut } from "svelte/easing";
+import type { TransitionConfig } from "svelte/transition";
+
+export function cn(...inputs: ClassValue[]) {
+ return twMerge(clsx(inputs));
+}
+
+type FlyAndScaleParams = {
+ y?: number;
+ x?: number;
+ start?: number;
+ duration?: number;
+};
+
+export const flyAndScale = (
+ node: Element,
+ params: FlyAndScaleParams = { y: -8, x: 0, start: 0.95, duration: 150 }
+): TransitionConfig => {
+ const style = getComputedStyle(node);
+ const transform = style.transform === "none" ? "" : style.transform;
+
+ const scaleConversion = (
+ valueA: number,
+ scaleA: [number, number],
+ scaleB: [number, number]
+ ) => {
+ const [minA, maxA] = scaleA;
+ const [minB, maxB] = scaleB;
+
+ const percentage = (valueA - minA) / (maxA - minA);
+ const valueB = percentage * (maxB - minB) + minB;
+
+ return valueB;
+ };
+
+ const styleToString = (
+ style: Record
+ ): string => {
+ return Object.keys(style).reduce((str, key) => {
+ if (style[key] === undefined) return str;
+ return str + `${key}:${style[key]};`;
+ }, "");
+ };
+
+ return {
+ duration: params.duration ?? 200,
+ delay: 0,
+ css: (t) => {
+ const y = scaleConversion(t, [0, 1], [params.y ?? 5, 0]);
+ const x = scaleConversion(t, [0, 1], [params.x ?? 0, 0]);
+ const scale = scaleConversion(t, [0, 1], [params.start ?? 0.95, 1]);
+
+ return styleToString({
+ transform: `${transform} translate3d(${x}px, ${y}px, 0) scale(${scale})`,
+ opacity: t
+ });
+ },
+ easing: cubicOut
+ };
+};
\ No newline at end of file
diff --git a/src/psaggregator/src/routes/+layout.svelte b/src/psaggregator/src/routes/+layout.svelte
index 986a0e0..8ff5fc6 100644
--- a/src/psaggregator/src/routes/+layout.svelte
+++ b/src/psaggregator/src/routes/+layout.svelte
@@ -1,7 +1,5 @@
+
+
+
-
-
-
-
+
+
{#each data.announcements as announcement}
-
-
-
{#if MICROANALYTICS_ID}
+
+
+
Version {version}
+
+
+
Neues Design
+
+
+
+ Das Design wurde grundlegend überarbeitet. Es ist nun moderner und benutzerfreundlicher. Die Farben wurden angepasst und die
+ Schriftart wurde geändert. Lasst mich gerne wissen, wie es euch gefällt!
+
+
+
Neue Features
+
+ Verlinkung von YouTube-Videos!
+
+ In den Einstellungen kann nun konfiguriert werden, ob auf YouTube oder auf pietsmiet.de verlinkt werden soll. Der Import
+ historischer Daten ist noch nicht möglich, wird aber in Zukunft hinzugefügt. Somit funktioniert die Verlinkung zu YouTube
+ nur gelegentlich.
+
+
+
+ Neue API
+ Über den /video/[id] Endpoint kann nun ein einzelnes Video abgerufen werden.
+
+
+
diff --git a/src/psaggregator/src/routes/motivation/+page.svelte b/src/psaggregator/src/routes/motivation/+page.svelte
index ee6def9..f4047e7 100644
--- a/src/psaggregator/src/routes/motivation/+page.svelte
+++ b/src/psaggregator/src/routes/motivation/+page.svelte
@@ -1,10 +1,10 @@
@@ -39,12 +39,12 @@
{#if KOFI_USERNAME}
{/if}
Open Source
@@ -57,14 +57,14 @@
Wenn du Fragen hast, kannst du mich gerne via Mail erreichen.