From 47bef05a5878c5e71443563f43d51d5622c6dfa7 Mon Sep 17 00:00:00 2001 From: diusazzad Date: Tue, 4 Aug 2026 16:50:53 +0600 Subject: [PATCH] feat: add premium glassmorphism landing page for API root --- __pycache__/main.cpython-313.pyc | Bin 577 -> 1161 bytes main.py | 14 +- static/css/style.css | 227 +++++++++++++++++++++++++++++++ templates/index.html | 62 +++++++++ 4 files changed, 302 insertions(+), 1 deletion(-) create mode 100644 static/css/style.css create mode 100644 templates/index.html diff --git a/__pycache__/main.cpython-313.pyc b/__pycache__/main.cpython-313.pyc index d1c9546d31a23599839f2603ebd1018350423a3a..5e8164f929b8d3b0838c06f1c61e95be57ae1564 100644 GIT binary patch literal 1161 zcmZ`%&ubGw6rS1L?7H2gtxa3C3a(;>RY_}Up;ZwIMM~<_Z}dKa@d~-f#mlIKDK05gv8Aspt0j$Uv8^s=N;=hTRL19#tGO9hcZ~&=8f9bk zc>2k|w|lIt0nc;?7BHZ-phBe%k*thR6RO7kvQx{=&Edp$2g}N=;toxqEp4u!rq+L| zhW}I@pFn@u+3JXs|0Qc3MHsg{#ux7ug|SL@nuKu&3(Msm5Bys}NEo<7r6Ah!X6}<( zBlI|7t)V54dv}AVVlNhLsBJmLh?6i3swCpJOxhRirMlm&Nq>>CfN@V+K+Rk&Oc$md zRb+U;Ln5pSVLlBSJg7&)ctj`zqh(A%1xOHja)S!95>VpvI^6?Di@X{UCQl^^JS7a8 zJizaFDsD~&P=#Ob62L3876&D)%IH7m0ZiIe7L*IfQCC_6@Idmou*qwoqtGGX(kuYj zIk?1d+K*Mj8uf?~2gf8P|K1kkx387cHmxrf%QY{E3XMHsQsPzCX}!*A9*A;7*hzpk z`e}`RwkEsQ{n#X4$TxlIrANLXew&m9dkWfJwIJ1NE5cw+ z-zSWpy?fRNl+HVDv0-^R~&t~~5oYaMMZu32$%!q|W%^BMt_a;XL&^8HXD z8SsYOH7chiM$$}wx}cKkGNF2nhRD?F&4?!>P^%>AVl3icna6I_>Xl|lZqjp5EvLes z101Rt`Fe)(w zGX*mTvjnqRG8Zw$Fa@#0v?1tVHdCOPAP~$h#b63yG8D0-b7*qD1o5~v8E>(>B^H-B z26#@kWlWvCiK&K@8z}J^Bs)2gNm7_6BQ-InBqKgKBQ-g@hz}^tIXQq?yq*Wh^3!C! z#hwP#o>-7s#0(U;#hh4BaEm!TwFIoP2xL?dNM#W(NS4DUH$SB`C)KV<2*?FFt=I}k zd|+l|WW38D{g93K2AA{=0qYw)!XMdL*qIubKkzUxv9^mhig!p}W)%L&#K;)K_?el3 NNn~;z3p)$QWB@s^J@5bk diff --git a/main.py b/main.py index 15695aa..b5d7582 100644 --- a/main.py +++ b/main.py @@ -1,4 +1,6 @@ -from fastapi import FastAPI +from fastapi import FastAPI, Request +from fastapi.staticfiles import StaticFiles +from fastapi.templating import Jinja2Templates app = FastAPI( title="DataMind AI API", @@ -6,6 +8,16 @@ version="1.0.0", ) +# Mount static files (CSS, JS, Images) +app.mount("/static", StaticFiles(directory="static"), name="static") + +# Setup Jinja2 templates +templates = Jinja2Templates(directory="templates") + +@app.get("/") +def read_root(request: Request): + return templates.TemplateResponse(request=request, name="index.html") + @app.get("/health") def health_check(): return {"Status": "success", "message": "DataMind AI Server is running flawlessly!!!!"} diff --git a/static/css/style.css b/static/css/style.css new file mode 100644 index 0000000..ad7e20a --- /dev/null +++ b/static/css/style.css @@ -0,0 +1,227 @@ +@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;600;700&family=Outfit:wght@400;600;800&display=swap'); + +:root { + --bg-color: #0b0f19; + --card-bg: rgba(255, 255, 255, 0.03); + --glass-border: rgba(255, 255, 255, 0.08); + --primary-gradient: linear-gradient(135deg, #6366f1 0%, #a855f7 100%); + --text-main: #f8fafc; + --text-muted: #94a3b8; +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + background-color: var(--bg-color); + color: var(--text-main); + font-family: 'Inter', sans-serif; + min-height: 100vh; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + overflow-x: hidden; + position: relative; +} + +/* Animated Background Blobs */ +.blob { + position: absolute; + filter: blur(80px); + z-index: -1; + opacity: 0.5; + animation: float 10s infinite ease-in-out alternate; +} + +.blob-1 { + top: -10%; + left: -10%; + width: 400px; + height: 400px; + background: rgba(99, 102, 241, 0.4); + border-radius: 50%; +} + +.blob-2 { + bottom: -10%; + right: -10%; + width: 500px; + height: 500px; + background: rgba(168, 85, 247, 0.4); + border-radius: 50%; + animation-delay: -5s; +} + +@keyframes float { + 0% { transform: translateY(0px) scale(1); } + 100% { transform: translateY(30px) scale(1.1); } +} + +/* Glassmorphism Container */ +.container { + background: var(--card-bg); + backdrop-filter: blur(16px); + -webkit-backdrop-filter: blur(16px); + border: 1px solid var(--glass-border); + border-radius: 24px; + padding: 3rem 4rem; + text-align: center; + max-width: 800px; + width: 90%; + box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5); + animation: fadeUp 1s cubic-bezier(0.16, 1, 0.3, 1); +} + +@keyframes fadeUp { + 0% { opacity: 0; transform: translateY(40px); } + 100% { opacity: 1; transform: translateY(0); } +} + +h1 { + font-family: 'Outfit', sans-serif; + font-size: 3.5rem; + font-weight: 800; + margin-bottom: 1rem; + background: var(--primary-gradient); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + letter-spacing: -1px; +} + +p.subtitle { + font-size: 1.25rem; + color: var(--text-muted); + margin-bottom: 2.5rem; + line-height: 1.6; +} + +/* Features Grid */ +.features { + display: flex; + justify-content: center; + gap: 2rem; + margin-bottom: 3rem; + flex-wrap: wrap; +} + +.feature-badge { + background: rgba(255, 255, 255, 0.05); + border: 1px solid var(--glass-border); + padding: 0.75rem 1.5rem; + border-radius: 999px; + font-size: 0.9rem; + font-weight: 600; + color: var(--text-main); + display: flex; + align-items: center; + gap: 0.5rem; + transition: all 0.3s ease; +} + +.feature-badge:hover { + background: rgba(255, 255, 255, 0.1); + transform: translateY(-2px); + box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1); +} + +.feature-badge i { + color: #a855f7; +} + +/* Buttons */ +.btn-container { + display: flex; + gap: 1.5rem; + justify-content: center; +} + +.btn { + text-decoration: none; + padding: 1rem 2.5rem; + border-radius: 12px; + font-weight: 600; + font-size: 1.1rem; + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); + display: inline-block; +} + +.btn-primary { + background: var(--primary-gradient); + color: white; + box-shadow: 0 10px 25px -5px rgba(99, 102, 241, 0.5); + position: relative; + overflow: hidden; + border: none; +} + +.btn-primary::after { + content: ''; + position: absolute; + top: -50%; + left: -50%; + width: 200%; + height: 200%; + background: linear-gradient(transparent, rgba(255, 255, 255, 0.2), transparent); + transform: rotate(45deg); + transition: all 0.5s ease; + opacity: 0; +} + +.btn-primary:hover { + transform: translateY(-3px); + box-shadow: 0 20px 30px -5px rgba(99, 102, 241, 0.6); +} + +.btn-primary:hover::after { + left: 100%; + opacity: 1; +} + +.btn-secondary { + background: transparent; + color: var(--text-main); + border: 1px solid var(--glass-border); + backdrop-filter: blur(10px); +} + +.btn-secondary:hover { + background: rgba(255, 255, 255, 0.05); + border-color: rgba(255, 255, 255, 0.2); + transform: translateY(-3px); +} + +/* Pulse Animation for Status */ +.status { + position: absolute; + top: 2rem; + right: 2rem; + display: flex; + align-items: center; + gap: 0.5rem; + font-size: 0.85rem; + font-weight: 600; + color: #10b981; + background: rgba(16, 185, 129, 0.1); + padding: 0.5rem 1rem; + border-radius: 999px; + border: 1px solid rgba(16, 185, 129, 0.2); +} + +.pulse { + width: 8px; + height: 8px; + background-color: #10b981; + border-radius: 50%; + box-shadow: 0 0 0 0 rgba(16, 185, 129, 0.7); + animation: pulse-ring 1.5s infinite cubic-bezier(0.66, 0, 0, 1); +} + +@keyframes pulse-ring { + to { + box-shadow: 0 0 0 10px rgba(16, 185, 129, 0); + } +} diff --git a/templates/index.html b/templates/index.html new file mode 100644 index 0000000..3cf34ee --- /dev/null +++ b/templates/index.html @@ -0,0 +1,62 @@ + + + + + + DataMind AI | Enterprise Intelligent Assistant + + + + + + + + + + + +
+
+ + +
+
+ API Online +
+ + +
+

DataMind AI

+

+ Enterprise Intelligent Data & Document Assistant.
+ Bridging the gap between your databases, unstructured documents, and end-users through powerful Natural Language Processing. +

+ +
+
+ Data Analytics +
+
+ Text-to-SQL +
+
+ RAG Intelligence +
+
+ AI Agents +
+
+ + +
+ + +