initial import
This commit is contained in:
14
app/layout.tsx
Normal file
14
app/layout.tsx
Normal file
@@ -0,0 +1,14 @@
|
||||
import '@/app/ui/global.css';
|
||||
import { inter } from '@/app/ui/fonts';
|
||||
|
||||
export default function RootLayout({
|
||||
children,
|
||||
}: {
|
||||
children: React.ReactNode;
|
||||
}) {
|
||||
return (
|
||||
<html lang="en">
|
||||
<body className={`${inter.className} antialiased`}>{children}</body>
|
||||
</html>
|
||||
);
|
||||
}
|
||||
2
app/lib/actions.ts
Normal file
2
app/lib/actions.ts
Normal file
@@ -0,0 +1,2 @@
|
||||
'use server';
|
||||
|
||||
25
app/lib/sql-shim.ts
Normal file
25
app/lib/sql-shim.ts
Normal file
@@ -0,0 +1,25 @@
|
||||
import { Client, QueryResult, QueryResultRow } from 'pg';
|
||||
|
||||
const client = new Client({
|
||||
// connectionString: process.env.DATABASE_URL,
|
||||
host: process.env.POSTGRES_HOST,
|
||||
user: process.env.POSTGRES_USER,
|
||||
password: process.env.POSTGRES_PASSWORD,
|
||||
database: process.env.POSTGRES_DB
|
||||
});
|
||||
|
||||
client.connect();
|
||||
|
||||
/** an adapter function which simulates @vercel/postgres `sql` function */
|
||||
export function sql<T extends QueryResultRow>(strings: TemplateStringsArray, ...values: any[]): Promise<QueryResult<T>> {
|
||||
// string values need to be wrapped in single quotes
|
||||
const fixedValues = values.map((value) => {
|
||||
if (typeof value === 'string') {
|
||||
return `'${value}'`;
|
||||
}
|
||||
return value;
|
||||
});
|
||||
|
||||
const query = String.raw(strings, ...fixedValues);
|
||||
return client.query<T>(query);
|
||||
}
|
||||
51
app/page.tsx
Normal file
51
app/page.tsx
Normal file
@@ -0,0 +1,51 @@
|
||||
import Link from 'next/link';
|
||||
import styles from '@/app/ui/home.module.css';
|
||||
import { lusitana } from './ui/fonts';
|
||||
import Image from 'next/image';
|
||||
|
||||
import {
|
||||
Cog8ToothIcon
|
||||
} from '@heroicons/react/24/outline';
|
||||
|
||||
export default function Page() {
|
||||
return (
|
||||
<main className="flex min-h-screen flex-col p-6 bg-base-300">
|
||||
|
||||
<div className="card card-compact card-bordered max-w-[36em] bg-base-100 shadow-s my-1">
|
||||
<div className="card-body">
|
||||
<h2 className="card-title">2023-05 Budakova <Cog8ToothIcon className="h-[1em] w-[1em] absolute right-4 cursor-pointer" /></h2>
|
||||
<div className="card-actions">
|
||||
<div className="badge badge-lg badge-success cursor-pointer">GDKG</div>
|
||||
<div className="badge badge-lg badge-neutral cursor-pointer">HEP Elektra</div>
|
||||
<div className="badge badge-lg badge-neutral cursor-pointer">Iskon</div>
|
||||
<div className="badge badge-lg badge-neutral cursor-pointer">Plinara</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="card card-compact card-bordered max-w-[36em] bg-base-100 shadow-s my-1">
|
||||
<div className="card-body">
|
||||
<h2 className="card-title">2023-05 Kopernikova <Cog8ToothIcon className="h-[1em] w-[1em] absolute right-4 cursor-pointer" /></h2>
|
||||
<div className="card-actions">
|
||||
<div className="badge badge-lg badge-success cursor-pointer">GDKG</div>
|
||||
<div className="badge badge-lg badge-neutral cursor-pointer">HEP Elektra</div>
|
||||
<div className="badge badge-lg badge-neutral cursor-pointer">Iskon</div>
|
||||
<div className="badge badge-lg badge-neutral cursor-pointer">Plinara</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="card card-compact card-bordered max-w-[36em] bg-base-100 shadow-s my-1">
|
||||
<div className="card-body">
|
||||
<h2 className="card-title">2023-05 Šišićeva <Cog8ToothIcon className="h-[1em] w-[1em] absolute right-4 cursor-pointer" /></h2>
|
||||
<div className="card-actions">
|
||||
<div className="badge badge-lg badge-success cursor-pointer">GDKG</div>
|
||||
<div className="badge badge-lg badge-neutral cursor-pointer">HEP Elektra</div>
|
||||
<div className="badge badge-lg badge-neutral cursor-pointer">Iskon</div>
|
||||
<div className="badge badge-lg badge-neutral cursor-pointer">Plinara</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
);
|
||||
}
|
||||
19
app/ui/button.tsx
Normal file
19
app/ui/button.tsx
Normal file
@@ -0,0 +1,19 @@
|
||||
import clsx from 'clsx';
|
||||
|
||||
interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
|
||||
children: React.ReactNode;
|
||||
}
|
||||
|
||||
export function Button({ children, className, ...rest }: ButtonProps) {
|
||||
return (
|
||||
<button
|
||||
{...rest}
|
||||
className={clsx(
|
||||
'flex h-10 items-center rounded-lg bg-blue-500 px-4 text-sm font-medium text-white transition-colors hover:bg-blue-400 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-blue-500 active:bg-blue-600 aria-disabled:cursor-not-allowed aria-disabled:opacity-50',
|
||||
className,
|
||||
)}
|
||||
>
|
||||
{children}
|
||||
</button>
|
||||
);
|
||||
}
|
||||
4
app/ui/fonts.ts
Normal file
4
app/ui/fonts.ts
Normal file
@@ -0,0 +1,4 @@
|
||||
import { Inter, Lusitana } from 'next/font/google';
|
||||
|
||||
export const inter = Inter({ subsets: ['latin'] });
|
||||
export const lusitana = Lusitana({ weight: ["400", "700"], subsets: ['latin'] });
|
||||
18
app/ui/global.css
Normal file
18
app/ui/global.css
Normal file
@@ -0,0 +1,18 @@
|
||||
@tailwind base;
|
||||
@tailwind components;
|
||||
@tailwind utilities;
|
||||
|
||||
input[type='number'] {
|
||||
-moz-appearance: textfield;
|
||||
appearance: textfield;
|
||||
}
|
||||
|
||||
input[type='number']::-webkit-inner-spin-button {
|
||||
-webkit-appearance: none;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
input[type='number']::-webkit-outer-spin-button {
|
||||
-webkit-appearance: none;
|
||||
margin: 0;
|
||||
}
|
||||
7
app/ui/home.module.css
Normal file
7
app/ui/home.module.css
Normal file
@@ -0,0 +1,7 @@
|
||||
.shape {
|
||||
height: 0;
|
||||
width: 0;
|
||||
border-bottom: 30px solid indigo;
|
||||
border-left: 20px solid transparent;
|
||||
border-right: 20px solid transparent;
|
||||
}
|
||||
Reference in New Issue
Block a user