summaryrefslogtreecommitdiff
path: root/src/app
diff options
context:
space:
mode:
Diffstat (limited to 'src/app')
-rw-r--r--src/app/favicon.icobin0 -> 25931 bytes
-rw-r--r--src/app/globals.css106
-rw-r--r--src/app/layout.tsx36
-rw-r--r--src/app/page.tsx5
-rw-r--r--src/app/upload/page.tsx38
5 files changed, 185 insertions, 0 deletions
diff --git a/src/app/favicon.ico b/src/app/favicon.ico
new file mode 100644
index 0000000..718d6fe
--- /dev/null
+++ b/src/app/favicon.ico
Binary files differ
diff --git a/src/app/globals.css b/src/app/globals.css
new file mode 100644
index 0000000..51cd92c
--- /dev/null
+++ b/src/app/globals.css
@@ -0,0 +1,106 @@
+@import 'tailwindcss';
+@import 'tw-animate-css';
+
+@custom-variant dark (&:is(.dark *));
+
+:root {
+ --background: #05040a;
+ --foreground: #ffffff;
+
+ --violet: #464199;
+ --light-violet: #8784c9;
+ --dark-indigo: #0d0c1c;
+ --red: #e64c4f;
+
+ --radius: 0.625rem;
+ --card: oklch(1 0 0);
+ --card-foreground: oklch(0.13 0.028 261.692);
+ --popover: oklch(1 0 0);
+ --popover-foreground: oklch(0.13 0.028 261.692);
+ --primary: oklch(0.21 0.034 264.665);
+ --primary-foreground: oklch(0.985 0.002 247.839);
+ --secondary: oklch(0.967 0.003 264.542);
+ --secondary-foreground: oklch(0.21 0.034 264.665);
+ --muted: oklch(0.967 0.003 264.542);
+ --muted-foreground: oklch(0.551 0.027 264.364);
+ --accent: oklch(0.967 0.003 264.542);
+ --accent-foreground: oklch(0.21 0.034 264.665);
+ --destructive: oklch(0.577 0.245 27.325);
+ --input: oklch(0.928 0.006 264.531);
+ --ring: oklch(0.707 0.022 261.325);
+ --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.002 247.839);
+ --sidebar-foreground: oklch(0.13 0.028 261.692);
+ --sidebar-primary: oklch(0.21 0.034 264.665);
+ --sidebar-primary-foreground: oklch(0.985 0.002 247.839);
+ --sidebar-accent: oklch(0.967 0.003 264.542);
+ --sidebar-accent-foreground: oklch(0.21 0.034 264.665);
+ --sidebar-border: oklch(0.928 0.006 264.531);
+ --sidebar-ring: oklch(0.707 0.022 261.325);
+}
+
+@theme inline {
+ --color-background: var(--background);
+ --color-foreground: var(--foreground);
+ --color-violet: var(--violet);
+ --color-light-violet: var(--light-violet);
+ --color-dark-indigo: var(--dark-indigo);
+ --color-red: var(--red);
+
+ --color-sidebar-ring: var(--sidebar-ring);
+ --color-sidebar-border: var(--sidebar-border);
+ --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
+ --color-sidebar-accent: var(--sidebar-accent);
+ --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
+ --color-sidebar-primary: var(--sidebar-primary);
+ --color-sidebar-foreground: var(--sidebar-foreground);
+ --color-sidebar: var(--sidebar);
+ --color-chart-5: var(--chart-5);
+ --color-chart-4: var(--chart-4);
+ --color-chart-3: var(--chart-3);
+ --color-chart-2: var(--chart-2);
+ --color-chart-1: var(--chart-1);
+ --color-ring: var(--ring);
+ --color-input: var(--input);
+ --color-border: var(--border);
+ --color-destructive: var(--destructive);
+ --color-accent-foreground: var(--accent-foreground);
+ --color-accent: var(--accent);
+ --color-muted-foreground: var(--muted-foreground);
+ --color-muted: var(--muted);
+ --color-secondary-foreground: var(--secondary-foreground);
+ --color-secondary: var(--secondary);
+ --color-primary-foreground: var(--primary-foreground);
+ --color-primary: var(--primary);
+ --color-popover-foreground: var(--popover-foreground);
+ --color-popover: var(--popover);
+ --color-card-foreground: var(--card-foreground);
+ --color-card: var(--card);
+ --radius-sm: calc(var(--radius) - 4px);
+ --radius-md: calc(var(--radius) - 2px);
+ --radius-lg: var(--radius);
+ --radius-xl: calc(var(--radius) + 4px);
+ --radius-2xl: calc(var(--radius) + 8px);
+ --radius-3xl: calc(var(--radius) + 12px);
+ --radius-4xl: calc(var(--radius) + 16px);
+}
+
+@layer base {
+ * {
+ @apply border-violet outline-ring/50;
+ }
+ html {
+ @apply scroll-smooth;
+ }
+ body {
+ @apply bg-background text-foreground;
+ }
+ button:not(:disabled),
+ [role='button']:not(:disabled) {
+ cursor: pointer;
+ }
+}
diff --git a/src/app/layout.tsx b/src/app/layout.tsx
new file mode 100644
index 0000000..194dca2
--- /dev/null
+++ b/src/app/layout.tsx
@@ -0,0 +1,36 @@
+import type { Metadata } from 'next';
+import { Nunito } from 'next/font/google';
+import './globals.css';
+import { Header } from '../components/header';
+import { GlobalContextProvider } from '../lib/contexts';
+import { Footer } from '../components/footer';
+
+const nunito = Nunito();
+
+export const metadata: Metadata = {
+ title: 'Artberry',
+ description: 'Happy gooning!',
+ icons: '/icons/logo.svg',
+};
+
+export default function RootLayout({
+ children,
+}: Readonly<{
+ children: React.ReactNode;
+}>) {
+ return (
+ <html lang="en">
+ <body className={`${nunito.className} antialiased px-37.5`}>
+ <div className="max-w-375 min-h-dvh flex flex-col mx-auto">
+ <GlobalContextProvider>
+ <Header />
+ <main className="mt-[50px] mb-[80px] grow">
+ {children}
+ </main>
+ <Footer />
+ </GlobalContextProvider>
+ </div>
+ </body>
+ </html>
+ );
+}
diff --git a/src/app/page.tsx b/src/app/page.tsx
new file mode 100644
index 0000000..b073f26
--- /dev/null
+++ b/src/app/page.tsx
@@ -0,0 +1,5 @@
+import Image from 'next/image';
+
+export default function Home() {
+ return null;
+}
diff --git a/src/app/upload/page.tsx b/src/app/upload/page.tsx
new file mode 100644
index 0000000..d0f096f
--- /dev/null
+++ b/src/app/upload/page.tsx
@@ -0,0 +1,38 @@
+'use client';
+
+import { Button } from '@/components/ui';
+import {
+ UploadMenu,
+ FileDropzone,
+ TagsInput,
+ SourceInput,
+} from '@/components/upload';
+import { PUBLISH_DISCLAIMER } from '@/lib/consts';
+
+export default function Upload() {
+ return (
+ <div className="flex justify-between w-full">
+ <UploadMenu />
+ <form
+ className="flex flex-col grow max-w-[900px] gap-5"
+ onSubmit={(e) => {
+ console.log('SUBMIT');
+ e.preventDefault();
+
+ const formData = new FormData(e.currentTarget);
+ const data: any = Object.fromEntries(formData.entries());
+
+ console.log(data.files);
+ }}
+ >
+ <FileDropzone />
+ <TagsInput />
+ <SourceInput />
+ <span className="text-center text-sm">
+ {PUBLISH_DISCLAIMER}
+ </span>
+ <Button>Опубликовать</Button>
+ </form>
+ </div>
+ );
+}