diff --git a/.vscode/launch.json b/.vscode/launch.json
new file mode 100644
index 0000000..a3e8259
--- /dev/null
+++ b/.vscode/launch.json
@@ -0,0 +1,35 @@
+{
+ "version": "0.2.0",
+ "configurations": [
+ {
+ // Use IntelliSense to find out which attributes exist for C# debugging
+ // Use hover for the description of the existing attributes
+ // For further information visit https://github.com/dotnet/vscode-csharp/blob/main/debugger-launchjson.md.
+ "name": ".NET Core Launch (web)",
+ "type": "coreclr",
+ "request": "launch",
+ "preLaunchTask": "build",
+ // If you have changed target frameworks, make sure to update the program path.
+ "program": "${workspaceFolder}/backend/bin/Debug/net9.0/backend.dll",
+ "args": [],
+ "cwd": "${workspaceFolder}/backend",
+ "stopAtEntry": false,
+ // Enable launching a web browser when ASP.NET Core starts. For more information: https://aka.ms/VSCode-CS-LaunchJson-WebBrowser
+ "serverReadyAction": {
+ "action": "openExternally",
+ "pattern": "\\bNow listening on:\\s+(https?://\\S+)"
+ },
+ "env": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ },
+ "sourceFileMap": {
+ "/Views": "${workspaceFolder}/Views"
+ }
+ },
+ {
+ "name": ".NET Core Attach",
+ "type": "coreclr",
+ "request": "attach"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/.vscode/tasks.json b/.vscode/tasks.json
new file mode 100644
index 0000000..0cd6dec
--- /dev/null
+++ b/.vscode/tasks.json
@@ -0,0 +1,41 @@
+{
+ "version": "2.0.0",
+ "tasks": [
+ {
+ "label": "build",
+ "command": "dotnet",
+ "type": "process",
+ "args": [
+ "build",
+ "${workspaceFolder}/backend/backend.csproj",
+ "/property:GenerateFullPaths=true",
+ "/consoleloggerparameters:NoSummary;ForceNoAlign"
+ ],
+ "problemMatcher": "$msCompile"
+ },
+ {
+ "label": "publish",
+ "command": "dotnet",
+ "type": "process",
+ "args": [
+ "publish",
+ "${workspaceFolder}/backend/backend.csproj",
+ "/property:GenerateFullPaths=true",
+ "/consoleloggerparameters:NoSummary;ForceNoAlign"
+ ],
+ "problemMatcher": "$msCompile"
+ },
+ {
+ "label": "watch",
+ "command": "dotnet",
+ "type": "process",
+ "args": [
+ "watch",
+ "run",
+ "--project",
+ "${workspaceFolder}/backend/backend.csproj"
+ ],
+ "problemMatcher": "$msCompile"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/frontend/app/Components/Items/ItemCard.module.scss b/frontend/app/Components/Items/ItemCard.module.scss
new file mode 100644
index 0000000..e69de29
diff --git a/frontend/app/Components/Items/ItemCard.tsx b/frontend/app/Components/Items/ItemCard.tsx
new file mode 100644
index 0000000..e1afa06
--- /dev/null
+++ b/frontend/app/Components/Items/ItemCard.tsx
@@ -0,0 +1,21 @@
+import { Card } from "react-bootstrap";
+import type Item from "~/Models/Item";
+
+interface Props {
+ item: Item;
+}
+
+const ItemCard = ({ item }: Props) => {
+ return (
+
+
+
+
+
+ {item.name}
+
+
+ );
+}
+
+export default ItemCard;
\ No newline at end of file
diff --git a/frontend/app/Components/Libraries/LibraryCard.module.scss b/frontend/app/Components/Libraries/LibraryCard.module.scss
new file mode 100644
index 0000000..e69de29
diff --git a/frontend/app/Components/Libraries/LibraryCard.tsx b/frontend/app/Components/Libraries/LibraryCard.tsx
new file mode 100644
index 0000000..85eaffa
--- /dev/null
+++ b/frontend/app/Components/Libraries/LibraryCard.tsx
@@ -0,0 +1,28 @@
+import { Card } from "react-bootstrap";
+import { useNavigate } from "react-router";
+import type Library from "~/Models/Library";
+
+interface Props {
+ library: Library;
+}
+
+const LibraryCard = ({ library }: Props) => {
+ const navigate = useNavigate();
+
+ function handleClick() {
+ navigate(`/Library/${library.id}`);
+ }
+
+ return (
+
+
+
+
+
+ {library.name}
+
+
+ );
+}
+
+export default LibraryCard;
\ No newline at end of file
diff --git a/frontend/app/Lib/Item.ts b/frontend/app/Lib/Item.ts
new file mode 100644
index 0000000..3ce3f06
--- /dev/null
+++ b/frontend/app/Lib/Item.ts
@@ -0,0 +1,16 @@
+import { ItemType } from "~/Models/Item";
+import type Item from "~/Models/Item";
+
+
+export const FetchItems = async (libraryId: string): Promise> => {
+ return [];
+}
+
+export const FetchItem = async (itemId: string, libraryId: string): Promise- => {
+ return {
+ id: "",
+ name: "",
+ servers: [],
+ type: ItemType.Movie,
+ };
+}
\ No newline at end of file
diff --git a/frontend/app/Lib/Library.ts b/frontend/app/Lib/Library.ts
new file mode 100644
index 0000000..2503f83
--- /dev/null
+++ b/frontend/app/Lib/Library.ts
@@ -0,0 +1,14 @@
+import type Library from "~/Models/Library";
+
+
+export const FetchLibraries = async (): Promise> => {
+ return [];
+}
+
+export const FetchLibrary = async (id: string): Promise => {
+ return {
+ id: "",
+ name: "",
+ servers: []
+ };
+}
\ No newline at end of file
diff --git a/frontend/app/Models/Item.ts b/frontend/app/Models/Item.ts
new file mode 100644
index 0000000..b8438ce
--- /dev/null
+++ b/frontend/app/Models/Item.ts
@@ -0,0 +1,15 @@
+import type Library from "./Library";
+
+export default interface Item {
+ name: string;
+ id: string;
+ library?: Library;
+ servers: Array;
+ type: ItemType;
+}
+
+export enum ItemType {
+ Movie,
+ TvShow,
+ Music,
+}
\ No newline at end of file
diff --git a/frontend/app/Models/Library.ts b/frontend/app/Models/Library.ts
new file mode 100644
index 0000000..7eaa3b6
--- /dev/null
+++ b/frontend/app/Models/Library.ts
@@ -0,0 +1,8 @@
+import type Item from "./Item";
+
+export default interface Library {
+ name: string;
+ id: string;
+ servers: Array;
+ items?: Array
- ;
+}
\ No newline at end of file
diff --git a/frontend/app/root.tsx b/frontend/app/root.tsx
index 9fc6636..d1b64a7 100644
--- a/frontend/app/root.tsx
+++ b/frontend/app/root.tsx
@@ -7,8 +7,10 @@ import {
ScrollRestoration,
} from "react-router";
+import React from "react";
import type { Route } from "./+types/root";
-import "./app.css";
+// import "./app.css";
+import 'bootstrap/dist/css/bootstrap.min.css';
export const links: Route.LinksFunction = () => [
{ rel: "preconnect", href: "https://fonts.googleapis.com" },
@@ -36,6 +38,17 @@ export function Layout({ children }: { children: React.ReactNode }) {
{children}
+
+
+
+
+
+
+