diff --git a/backend/asgi.py b/backend/asgi.py
index f934e0f..c6fe45e 100644
--- a/backend/asgi.py
+++ b/backend/asgi.py
@@ -1,12 +1,3 @@
-"""
-ASGI config for backend project.
-
-It exposes the ASGI callable as a module-level variable named ``application``.
-
-For more information on this file, see
-https://docs.djangoproject.com/en/6.1/howto/deployment/asgi/
-"""
-
import os
from django.core.asgi import get_asgi_application
diff --git a/frontend/public/fonts/integralcf/integralcf-regular.eot b/frontend/public/fonts/integralcf/integralcf-regular.eot
new file mode 100644
index 0000000..e69de29
diff --git a/frontend/public/fonts/integralcf/integralcf-regular.ttf b/frontend/public/fonts/integralcf/integralcf-regular.ttf
new file mode 100755
index 0000000..42cac26
Binary files /dev/null and b/frontend/public/fonts/integralcf/integralcf-regular.ttf differ
diff --git a/frontend/public/fonts/integralcf/integralcf-regular.woff b/frontend/public/fonts/integralcf/integralcf-regular.woff
new file mode 100644
index 0000000..e69de29
diff --git a/frontend/public/fonts/integralcf/integralcf-regular.woff2 b/frontend/public/fonts/integralcf/integralcf-regular.woff2
new file mode 100644
index 0000000..2c11480
Binary files /dev/null and b/frontend/public/fonts/integralcf/integralcf-regular.woff2 differ
diff --git a/frontend/src/App.css b/frontend/src/App.css
deleted file mode 100644
index f90339d..0000000
--- a/frontend/src/App.css
+++ /dev/null
@@ -1,184 +0,0 @@
-.counter {
- font-size: 16px;
- padding: 5px 10px;
- border-radius: 5px;
- color: var(--accent);
- background: var(--accent-bg);
- border: 2px solid transparent;
- transition: border-color 0.3s;
- margin-bottom: 24px;
-
- &:hover {
- border-color: var(--accent-border);
- }
- &:focus-visible {
- outline: 2px solid var(--accent);
- outline-offset: 2px;
- }
-}
-
-.hero {
- position: relative;
-
- .base,
- .framework,
- .vite {
- inset-inline: 0;
- margin: 0 auto;
- }
-
- .base {
- width: 170px;
- position: relative;
- z-index: 0;
- }
-
- .framework,
- .vite {
- position: absolute;
- }
-
- .framework {
- z-index: 1;
- top: 34px;
- height: 28px;
- transform: perspective(2000px) rotateZ(300deg) rotateX(44deg) rotateY(39deg)
- scale(1.4);
- }
-
- .vite {
- z-index: 0;
- top: 107px;
- height: 26px;
- width: auto;
- transform: perspective(2000px) rotateZ(300deg) rotateX(40deg) rotateY(39deg)
- scale(0.8);
- }
-}
-
-#center {
- display: flex;
- flex-direction: column;
- gap: 25px;
- place-content: center;
- place-items: center;
- flex-grow: 1;
-
- @media (max-width: 1024px) {
- padding: 32px 20px 24px;
- gap: 18px;
- }
-}
-
-#next-steps {
- display: flex;
- border-top: 1px solid var(--border);
- text-align: left;
-
- & > div {
- flex: 1 1 0;
- padding: 32px;
- @media (max-width: 1024px) {
- padding: 24px 20px;
- }
- }
-
- .icon {
- margin-bottom: 16px;
- width: 22px;
- height: 22px;
- }
-
- @media (max-width: 1024px) {
- flex-direction: column;
- text-align: center;
- }
-}
-
-#docs {
- border-right: 1px solid var(--border);
-
- @media (max-width: 1024px) {
- border-right: none;
- border-bottom: 1px solid var(--border);
- }
-}
-
-#next-steps ul {
- list-style: none;
- padding: 0;
- display: flex;
- gap: 8px;
- margin: 32px 0 0;
-
- .logo {
- height: 18px;
- }
-
- a {
- color: var(--text-h);
- font-size: 16px;
- border-radius: 6px;
- background: var(--social-bg);
- display: flex;
- padding: 6px 12px;
- align-items: center;
- gap: 8px;
- text-decoration: none;
- transition: box-shadow 0.3s;
-
- &:hover {
- box-shadow: var(--shadow);
- }
- .button-icon {
- height: 18px;
- width: 18px;
- }
- }
-
- @media (max-width: 1024px) {
- margin-top: 20px;
- flex-wrap: wrap;
- justify-content: center;
-
- li {
- flex: 1 1 calc(50% - 8px);
- }
-
- a {
- width: 100%;
- justify-content: center;
- box-sizing: border-box;
- }
- }
-}
-
-#spacer {
- height: 88px;
- border-top: 1px solid var(--border);
- @media (max-width: 1024px) {
- height: 48px;
- }
-}
-
-.ticks {
- position: relative;
- width: 100%;
-
- &::before,
- &::after {
- content: '';
- position: absolute;
- top: -4.5px;
- border: 5px solid transparent;
- }
-
- &::before {
- left: 0;
- border-left-color: var(--border);
- }
- &::after {
- right: 0;
- border-right-color: var(--border);
- }
-}
diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx
index 9ca8e8d..280c96c 100644
--- a/frontend/src/App.tsx
+++ b/frontend/src/App.tsx
@@ -1,122 +1,7 @@
-import { useState } from 'react'
-import heroImg from './assets/hero.png'
-import reactLogo from './assets/react.svg'
-import viteLogo from './assets/vite.svg'
-import './App.css'
+import Home from './pages/Home/Home'
function App() {
- const [count, setCount] = useState(0)
-
- return (
- <>
-
-
-
-
Get started
-
- Edit src/App.tsx and save to test HMR
-
-
-
-
-
-
-
-
-
-
-
Documentation
-
Your questions, answered
-
-
-
-
-
Connect with us
-
Join the Vite community
-
-
-
-
-
-
- >
- )
+ return
}
-export default App
+export default App
\ No newline at end of file
diff --git a/frontend/src/assets/hero.png b/frontend/src/assets/hero.png
deleted file mode 100644
index 02251f4..0000000
Binary files a/frontend/src/assets/hero.png and /dev/null differ
diff --git a/frontend/src/assets/react.svg b/frontend/src/assets/react.svg
deleted file mode 100644
index 6c87de9..0000000
--- a/frontend/src/assets/react.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/frontend/src/assets/vite.svg b/frontend/src/assets/vite.svg
deleted file mode 100644
index 5101b67..0000000
--- a/frontend/src/assets/vite.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/frontend/src/components/AnnouncementBar/AnnouncementBar.module.css b/frontend/src/components/AnnouncementBar/AnnouncementBar.module.css
new file mode 100644
index 0000000..ea5082e
--- /dev/null
+++ b/frontend/src/components/AnnouncementBar/AnnouncementBar.module.css
@@ -0,0 +1,45 @@
+.announcementBar {
+ position: relative;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ min-height: 38px;
+ padding: 8px 48px;
+ background: #000;
+ color: #fff;
+ font-size: 13px;
+}
+
+.text {
+ margin: 0;
+ text-align: center;
+}
+
+.signUp {
+ padding: 0;
+ border: 0;
+ background: none;
+ color: inherit;
+ font: inherit;
+ text-decoration: underline;
+ cursor: pointer;
+}
+
+.close {
+ position: absolute;
+ top: 50%;
+ right: 24px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 24px;
+ height: 24px;
+ padding: 0;
+ border: 0;
+ background: none;
+ color: #fff;
+ font-size: 22px;
+ line-height: 1;
+ cursor: pointer;
+ transform: translateY(-50%);
+}
\ No newline at end of file
diff --git a/frontend/src/components/AnnouncementBar/AnnouncementBar.tsx b/frontend/src/components/AnnouncementBar/AnnouncementBar.tsx
new file mode 100644
index 0000000..a63e85d
--- /dev/null
+++ b/frontend/src/components/AnnouncementBar/AnnouncementBar.tsx
@@ -0,0 +1,33 @@
+import { useState } from 'react'
+
+import styles from './AnnouncementBar.module.css'
+
+function AnnouncementBar() {
+ const [isVisible, setIsVisible] = useState(true)
+
+ if (!isVisible) {
+ return null
+ }
+
+ return (
+
+
+ Sign up and get 20% off to your first order.{' '}
+
+
+
+
+
+ )
+}
+
+export default AnnouncementBar
\ No newline at end of file
diff --git a/frontend/src/index.css b/frontend/src/index.css
deleted file mode 100644
index 5fb3313..0000000
--- a/frontend/src/index.css
+++ /dev/null
@@ -1,111 +0,0 @@
-:root {
- --text: #6b6375;
- --text-h: #08060d;
- --bg: #fff;
- --border: #e5e4e7;
- --code-bg: #f4f3ec;
- --accent: #aa3bff;
- --accent-bg: rgba(170, 59, 255, 0.1);
- --accent-border: rgba(170, 59, 255, 0.5);
- --social-bg: rgba(244, 243, 236, 0.5);
- --shadow:
- rgba(0, 0, 0, 0.1) 0 10px 15px -3px, rgba(0, 0, 0, 0.05) 0 4px 6px -2px;
-
- --sans: system-ui, 'Segoe UI', Roboto, sans-serif;
- --heading: system-ui, 'Segoe UI', Roboto, sans-serif;
- --mono: ui-monospace, Consolas, monospace;
-
- font: 18px/145% var(--sans);
- letter-spacing: 0.18px;
- color-scheme: light dark;
- color: var(--text);
- background: var(--bg);
- font-synthesis: none;
- text-rendering: optimizeLegibility;
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
-
- @media (max-width: 1024px) {
- font-size: 16px;
- }
-}
-
-@media (prefers-color-scheme: dark) {
- :root {
- --text: #9ca3af;
- --text-h: #f3f4f6;
- --bg: #16171d;
- --border: #2e303a;
- --code-bg: #1f2028;
- --accent: #c084fc;
- --accent-bg: rgba(192, 132, 252, 0.15);
- --accent-border: rgba(192, 132, 252, 0.5);
- --social-bg: rgba(47, 48, 58, 0.5);
- --shadow:
- rgba(0, 0, 0, 0.4) 0 10px 15px -3px, rgba(0, 0, 0, 0.25) 0 4px 6px -2px;
- }
-
- #social .button-icon {
- filter: invert(1) brightness(2);
- }
-}
-
-#root {
- width: 1126px;
- max-width: 100%;
- margin: 0 auto;
- text-align: center;
- border-inline: 1px solid var(--border);
- min-height: 100svh;
- display: flex;
- flex-direction: column;
- box-sizing: border-box;
-}
-
-body {
- margin: 0;
-}
-
-h1,
-h2 {
- font-family: var(--heading);
- font-weight: 500;
- color: var(--text-h);
-}
-
-h1 {
- font-size: 56px;
- letter-spacing: -1.68px;
- margin: 32px 0;
- @media (max-width: 1024px) {
- font-size: 36px;
- margin: 20px 0;
- }
-}
-h2 {
- font-size: 24px;
- line-height: 118%;
- letter-spacing: -0.24px;
- margin: 0 0 8px;
- @media (max-width: 1024px) {
- font-size: 20px;
- }
-}
-p {
- margin: 0;
-}
-
-code,
-.counter {
- font-family: var(--mono);
- display: inline-flex;
- border-radius: 4px;
- color: var(--text-h);
-}
-
-code {
- font-size: 15px;
- line-height: 135%;
- padding: 4px 8px;
- background: var(--code-bg);
-}
diff --git a/frontend/src/main.tsx b/frontend/src/main.tsx
index bef5202..3d3010a 100644
--- a/frontend/src/main.tsx
+++ b/frontend/src/main.tsx
@@ -1,10 +1,11 @@
import { StrictMode } from 'react'
import { createRoot } from 'react-dom/client'
-import './index.css'
-import App from './App.tsx'
+
+import App from './App'
+import './styles/globals.css'
createRoot(document.getElementById('root')!).render(
,
-)
+)
\ No newline at end of file
diff --git a/frontend/src/pages/Home/Home.tsx b/frontend/src/pages/Home/Home.tsx
new file mode 100644
index 0000000..12c443c
--- /dev/null
+++ b/frontend/src/pages/Home/Home.tsx
@@ -0,0 +1,11 @@
+import AnnouncementBar from '../../components/AnnouncementBar/AnnouncementBar'
+
+function Home() {
+ return (
+ <>
+
+ >
+ )
+}
+
+export default Home
\ No newline at end of file
diff --git a/frontend/src/styles/globals.css b/frontend/src/styles/globals.css
new file mode 100644
index 0000000..76d66b2
--- /dev/null
+++ b/frontend/src/styles/globals.css
@@ -0,0 +1,19 @@
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+@font-face {
+ font-family: "integralcf";
+ src: url("../../public/fonts/integralcf/integralcf-regular.woff") format("woff");
+ font-weight: 400;
+ font-style: normal;
+ font-display: swap;
+}
+
+body {
+ background-color: #fff;
+ color: #000;
+ font-family: "integralcf", sans-serif;
+}
\ No newline at end of file
Connect with us
-Join the Vite community
---
-
-
- GitHub
-
-
- -
-
-
- Discord
-
-
- -
-
-
- X.com
-
-
- -
-
-
- Bluesky
-
-
-
-