tr]:last:border-b-0",
+ className,
+ )}
+ {...props}
+ />
+ );
+}
+
+function TableRow({ className, ...props }: React.ComponentProps<"tr">) {
+ return (
+
+ );
+}
+
+function TableHead({ className, ...props }: React.ComponentProps<"th">) {
+ return (
+ [role=checkbox]]:translate-y-[2px]",
+ className,
+ )}
+ {...props}
+ />
+ );
+}
+
+function TableCell({ className, ...props }: React.ComponentProps<"td">) {
+ return (
+ | [role=checkbox]]:translate-y-[2px]",
+ className,
+ )}
+ {...props}
+ />
+ );
+}
+
+function TableCaption({
+ className,
+ ...props
+}: React.ComponentProps<"caption">) {
+ return (
+
+ );
+}
+
+export {
+ Table,
+ TableHeader,
+ TableBody,
+ TableFooter,
+ TableHead,
+ TableRow,
+ TableCell,
+ TableCaption,
+};
diff --git a/src/main/client/src/index.css b/src/main/client/src/index.css
index 13a2afa..b2eda3d 100644
--- a/src/main/client/src/index.css
+++ b/src/main/client/src/index.css
@@ -1,11 +1,47 @@
@import url("https://fonts.googleapis.com/css2?family=Saira:ital,wght@0,100..900;1,100..900&display=swap");
@import url("https://fonts.googleapis.com/css2?family=Montserrat:ital,wght@0,100..900;1,100..900&display=swap");
+@import "tailwindcss";
+@import "tw-animate-css";
+
+@custom-variant dark (&:is(.dark *));
:root {
font-synthesis: none;
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
+ --radius: 0.625rem;
+ --background: oklch(1 0 0);
+ --foreground: oklch(0.145 0 0);
+ --card: oklch(1 0 0);
+ --card-foreground: oklch(0.145 0 0);
+ --popover: oklch(1 0 0);
+ --popover-foreground: oklch(0.145 0 0);
+ --primary: oklch(0.205 0 0);
+ --primary-foreground: oklch(0.985 0 0);
+ --secondary: oklch(0.97 0 0);
+ --secondary-foreground: oklch(0.205 0 0);
+ --muted: oklch(0.97 0 0);
+ --muted-foreground: oklch(0.556 0 0);
+ --accent: oklch(0.97 0 0);
+ --accent-foreground: oklch(0.205 0 0);
+ --destructive: oklch(0.577 0.245 27.325);
+ --border: oklch(0.922 0 0);
+ --input: oklch(0.922 0 0);
+ --ring: oklch(0.708 0 0);
+ --chart-1: oklch(0.646 0.222 41.116);
+ --chart-2: oklch(0.6 0.118 184.704);
+ --chart-3: oklch(0.398 0.07 227.392);
+ --chart-4: oklch(0.828 0.189 84.429);
+ --chart-5: oklch(0.769 0.188 70.08);
+ --sidebar: oklch(0.985 0 0);
+ --sidebar-foreground: oklch(0.145 0 0);
+ --sidebar-primary: oklch(0.205 0 0);
+ --sidebar-primary-foreground: oklch(0.985 0 0);
+ --sidebar-accent: oklch(0.97 0 0);
+ --sidebar-accent-foreground: oklch(0.205 0 0);
+ --sidebar-border: oklch(0.922 0 0);
+ --sidebar-ring: oklch(0.708 0 0);
}
* {
@@ -38,3 +74,85 @@
body {
position: relative;
}
+
+@theme inline {
+ --radius-sm: calc(var(--radius) - 4px);
+ --radius-md: calc(var(--radius) - 2px);
+ --radius-lg: var(--radius);
+ --radius-xl: calc(var(--radius) + 4px);
+ --color-background: var(--background);
+ --color-foreground: var(--foreground);
+ --color-card: var(--card);
+ --color-card-foreground: var(--card-foreground);
+ --color-popover: var(--popover);
+ --color-popover-foreground: var(--popover-foreground);
+ --color-primary: var(--primary);
+ --color-primary-foreground: var(--primary-foreground);
+ --color-secondary: var(--secondary);
+ --color-secondary-foreground: var(--secondary-foreground);
+ --color-muted: var(--muted);
+ --color-muted-foreground: var(--muted-foreground);
+ --color-accent: var(--accent);
+ --color-accent-foreground: var(--accent-foreground);
+ --color-destructive: var(--destructive);
+ --color-border: var(--border);
+ --color-input: var(--input);
+ --color-ring: var(--ring);
+ --color-chart-1: var(--chart-1);
+ --color-chart-2: var(--chart-2);
+ --color-chart-3: var(--chart-3);
+ --color-chart-4: var(--chart-4);
+ --color-chart-5: var(--chart-5);
+ --color-sidebar: var(--sidebar);
+ --color-sidebar-foreground: var(--sidebar-foreground);
+ --color-sidebar-primary: var(--sidebar-primary);
+ --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
+ --color-sidebar-accent: var(--sidebar-accent);
+ --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
+ --color-sidebar-border: var(--sidebar-border);
+ --color-sidebar-ring: var(--sidebar-ring);
+}
+
+.dark {
+ --background: oklch(0.145 0 0);
+ --foreground: oklch(0.985 0 0);
+ --card: oklch(0.205 0 0);
+ --card-foreground: oklch(0.985 0 0);
+ --popover: oklch(0.205 0 0);
+ --popover-foreground: oklch(0.985 0 0);
+ --primary: oklch(0.922 0 0);
+ --primary-foreground: oklch(0.205 0 0);
+ --secondary: oklch(0.269 0 0);
+ --secondary-foreground: oklch(0.985 0 0);
+ --muted: oklch(0.269 0 0);
+ --muted-foreground: oklch(0.708 0 0);
+ --accent: oklch(0.269 0 0);
+ --accent-foreground: oklch(0.985 0 0);
+ --destructive: oklch(0.704 0.191 22.216);
+ --border: oklch(1 0 0 / 10%);
+ --input: oklch(1 0 0 / 15%);
+ --ring: oklch(0.556 0 0);
+ --chart-1: oklch(0.488 0.243 264.376);
+ --chart-2: oklch(0.696 0.17 162.48);
+ --chart-3: oklch(0.769 0.188 70.08);
+ --chart-4: oklch(0.627 0.265 303.9);
+ --chart-5: oklch(0.645 0.246 16.439);
+ --sidebar: oklch(0.205 0 0);
+ --sidebar-foreground: oklch(0.985 0 0);
+ --sidebar-primary: oklch(0.488 0.243 264.376);
+ --sidebar-primary-foreground: oklch(0.985 0 0);
+ --sidebar-accent: oklch(0.269 0 0);
+ --sidebar-accent-foreground: oklch(0.985 0 0);
+ --sidebar-border: oklch(1 0 0 / 10%);
+ --sidebar-ring: oklch(0.556 0 0);
+}
+
+@layer base {
+ * {
+ @apply border-border outline-ring/50;
+ }
+
+ body {
+ @apply bg-background text-foreground;
+ }
+}
diff --git a/src/main/client/src/lib/utils.ts b/src/main/client/src/lib/utils.ts
new file mode 100644
index 0000000..365058c
--- /dev/null
+++ b/src/main/client/src/lib/utils.ts
@@ -0,0 +1,6 @@
+import { type ClassValue, clsx } from "clsx";
+import { twMerge } from "tailwind-merge";
+
+export function cn(...inputs: ClassValue[]) {
+ return twMerge(clsx(inputs));
+}
diff --git a/src/main/client/src/types.spec.ts b/src/main/client/src/types.spec.ts
index 891d26e..d106e3e 100644
--- a/src/main/client/src/types.spec.ts
+++ b/src/main/client/src/types.spec.ts
@@ -20,8 +20,3 @@ export interface UserObject {
dob: string;
profilePicture: string;
}
-
-
-export interface ApiResponse {
- data: T;
-}
\ No newline at end of file
diff --git a/src/main/client/tsconfig.json b/src/main/client/tsconfig.json
index 9a5b64e..ae62a56 100644
--- a/src/main/client/tsconfig.json
+++ b/src/main/client/tsconfig.json
@@ -1,5 +1,11 @@
{
"compilerOptions": {
+ "baseUrl": ".",
+ "paths": {
+ "@/*": [
+ "./src/*"
+ ]
+ },
"target": "ES2020",
"useDefineForClassFields": true,
"lib": [
diff --git a/src/main/client/tsconfig.node.json b/src/main/client/tsconfig.node.json
index c7a071e..6b6a721 100644
--- a/src/main/client/tsconfig.node.json
+++ b/src/main/client/tsconfig.node.json
@@ -5,7 +5,13 @@
"module": "ESNext",
"moduleResolution": "bundler",
"allowSyntheticDefaultImports": true,
- "strict": true
+ "strict": true,
+ "baseUrl": ".",
+ "paths": {
+ "@/*": [
+ "./src/*"
+ ]
+ }
},
"include": [
"vite.config.ts"
diff --git a/src/main/client/vite.config.ts b/src/main/client/vite.config.ts
index 84b75e5..1375eab 100644
--- a/src/main/client/vite.config.ts
+++ b/src/main/client/vite.config.ts
@@ -1,11 +1,18 @@
-import { defineConfig } from "vite";
+import path from "path";
import react from "@vitejs/plugin-react";
+import tailwindcss from "@tailwindcss/vite";
+import { defineConfig } from "vite";
// https://vitejs.dev/config/
export default defineConfig({
- plugins: [react()],
+ plugins: [react(), tailwindcss()],
+ resolve: {
+ alias: {
+ "@": path.resolve(__dirname, "./src"),
+ },
+ },
build: {
outDir: "../resources/static/",
- emptyOutDir: true
- }
+ emptyOutDir: true,
+ },
});
diff --git a/src/main/resources/application-local.properties b/src/main/resources/application-local.properties
new file mode 100644
index 0000000..e949684
--- /dev/null
+++ b/src/main/resources/application-local.properties
@@ -0,0 +1,6 @@
+server.port=8080
+server.address=localhost
+spring.datasource.url=jdbc:postgresql://localhost:5432/ergon
+spring.datasource.username=ergonadmin
+spring.datasource.password=test123
+logging.level.web='DEBUG'
\ No newline at end of file
diff --git a/src/main/resources/application-prod.properties b/src/main/resources/application-prod.properties
new file mode 100644
index 0000000..881536b
--- /dev/null
+++ b/src/main/resources/application-prod.properties
@@ -0,0 +1,4 @@
+spring.application.name=Ergon
+server.port=${PORT:4000}
+server.address=0.0.0.0
+spring.devtools.add-properties=false
\ No newline at end of file
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index e40b872..e0657ad 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -1,19 +1,2 @@
spring.application.name=Ergon
-server.port=${PORT:4000}
-server.address=0.0.0.0
-
-spring.datasource.url=jdbc:postgresql://localhost:5432/ERGON
-spring.datasource.username=ergonAdmin
-spring.datasource.password=test123
-spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
-#image.upload.directory=./src/main/resources/static/images
-
-
-# Specify explicitly the dialect (here for PostgreSQL, adapt for your database)
-spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
-
-# Disable Hibernate usage of JDBC metadata
-spring.jpa.properties.hibernate.boot.allow_jdbc_metadata_access=false
-
-# Database initialization should typically be performed outside of Spring lifecycle
-spring.jpa.hibernate.ddl-auto=update
+spring.jpa.hibernate.ddl-auto=update
\ No newline at end of file
|