diff --git a/assets/pasted-20251220-213302-d711d038.png b/assets/pasted-20251220-213302-d711d038.png
new file mode 100644
index 0000000..0c2e36d
Binary files /dev/null and b/assets/pasted-20251220-213302-d711d038.png differ
diff --git a/assets/pasted-20251220-213627-9936cf00.png b/assets/pasted-20251220-213627-9936cf00.png
new file mode 100644
index 0000000..bfb6616
Binary files /dev/null and b/assets/pasted-20251220-213627-9936cf00.png differ
diff --git a/assets/vm-shot-2025-12-20T21-32-26-942Z.jpg b/assets/vm-shot-2025-12-20T21-32-26-942Z.jpg
new file mode 100644
index 0000000..77a5c55
Binary files /dev/null and b/assets/vm-shot-2025-12-20T21-32-26-942Z.jpg differ
diff --git a/core/__pycache__/urls.cpython-311.pyc b/core/__pycache__/urls.cpython-311.pyc
index dd03437..95294f3 100644
Binary files a/core/__pycache__/urls.cpython-311.pyc and b/core/__pycache__/urls.cpython-311.pyc differ
diff --git a/core/__pycache__/views.cpython-311.pyc b/core/__pycache__/views.cpython-311.pyc
index 8c6495b..1e837a2 100644
Binary files a/core/__pycache__/views.cpython-311.pyc and b/core/__pycache__/views.cpython-311.pyc differ
diff --git a/core/templates/core/dashboard.html b/core/templates/core/dashboard.html
new file mode 100644
index 0000000..44928a4
--- /dev/null
+++ b/core/templates/core/dashboard.html
@@ -0,0 +1,268 @@
+{% extends "base.html" %}
+{% load static %}
+
+{% block content %}
+
+
+
+
+
+
+
+
+
Dashboard
+
+
+
+

+
+
+
+
+
+
+
+
+
Ongoing Projects
+
+
From last month
+
+
+
Complete Projects
+
+
From last month
+
+
+
On Hold Projects
+
+
From last month
+
+
+
+
Alert Overview
+ Live
+
+
+
+
+
-
+
+
Fraud / anomaly alert
+
Project Manager — Eng. Rahim
+
Habiganj 9746tr — Ongoing
+
Material usage exceeded expected threshold.
+
+
5 hours ago
+
+
+
+
+
+
+
+
!
+
+
COI expiring soon
+
Subcontractor — R. Builders LLC
+
Certificate of Insurance
+
Expires in 7 days — request renewal.
+
+
Today
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Projects Map Overview
+
Mock map
+
+
📍 Kukatata wt46tr
+
📍 Habiganj 9746tr
+
📍 Newmarket 746t
+
+
+
+
+
+
+
+
+
Habiganj 9746tr — Ongoing
+
Location Dhaka, Bangladesh
+
+
+
+
+
+
+
Actual
+
$2.0M (-12%)
+
+
+
+
+
+
Compliance Status
+
+
+
Daily Logs
+
On-time: 92%
+
+
+
Docs
+
Valid: 128 • Expiring: 7
+
+
+
Equipment
+
Maintenance due: 3
+
+
+
+
+
+
+
+
+
+
Daily Activity Log
+
+
+
+
+
+
+
+
+
+
Floor Slab Project Manager — Eng. Rahim
+
Habiganj 9746tr — Ongoing
+
+ - Concrete pouring completed for 2nd floor slab — Ensure rebar spacing matches BOQ specification.
+ - Check curing process for foundation concrete.
+ - Verify column alignment before pouring.
+
+
Sep 17, 2025 — 06:45 PM
+
+
+

2 photos
+
+
+
+
+
+
+
Safety Meeting Supervisor — T. Coleman
+
Kukatata wt46tr — Ongoing
+
+ - Toolbox talk completed (PPE + ladder safety)
+ - Attendance captured with GPS check-in.
+ - PPE checklist verified (helmets, vests).
+ - Hazards documented with photo proof.
+
+
Sep 17, 2025 — 08:10 AM
+
+
+

Completed
+
+
+
+
+
+
+
+
+
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/core/templates/core/index.html b/core/templates/core/index.html
index 3da5fd8..eebfa60 100644
--- a/core/templates/core/index.html
+++ b/core/templates/core/index.html
@@ -67,7 +67,7 @@
diff --git a/core/urls.py b/core/urls.py
index 8e0d0ae..34e43fe 100644
--- a/core/urls.py
+++ b/core/urls.py
@@ -1,7 +1,8 @@
from django.urls import path
-from .views import index
+from .views import index, dashboard
urlpatterns = [
path("", index, name="index"),
+ path("dashboard/", dashboard, name="dashboard"),
]
diff --git a/core/views.py b/core/views.py
index e523447..73112b4 100644
--- a/core/views.py
+++ b/core/views.py
@@ -6,3 +6,10 @@ def index(request):
"project_name": "ComplianceShield",
}
return render(request, "core/index.html", context)
+
+
+def dashboard(request):
+ context = {
+ "project_name": "ComplianceShield",
+ }
+ return render(request, "core/dashboard.html", context)
diff --git a/static/css/custom.css b/static/css/custom.css
index 10f05e3..7f74644 100644
--- a/static/css/custom.css
+++ b/static/css/custom.css
@@ -1,54 +1,63 @@
:root{
- --ink:#0b0b0c;
- --paper:#fbfaf7;
- --line: rgba(11,11,12,.08);
- --shadow: 0 18px 48px rgba(11,11,12,.10);
- --shadow2: 0 10px 26px rgba(11,11,12,.10);
- --radius: 22px;
-
- /* premium blue theme (like the dashboard reference) */
- --blue:#2563eb;
- --blue2:#60a5fa;
- --ice:#eaf2ff;
- --ice2:#f6fbff;
- }
-
- html, body { height: 100%; }
- body { font-family: 'Inter', sans-serif; color: var(--ink); }
-
- .bg-premium{
- background:
- radial-gradient(1400px 560px at 18% 8%, rgba(96,165,250,.30), rgba(255,255,255,0) 60%),
- radial-gradient(1200px 520px at 92% 12%, rgba(37,99,235,.22), rgba(255,255,255,0) 55%),
- radial-gradient(1100px 620px at 55% 100%, rgba(234,242,255,.95), rgba(255,255,255,0) 60%),
- linear-gradient(180deg, #f6fbff 0%, #ffffff 55%, #f7fbff 100%);
- }
-
- .shell {
- border-radius: 26px;
- background: rgba(255,255,255,.78);
- border: 1px solid rgba(11,11,12,.08);
- box-shadow: var(--shadow);
- backdrop-filter: blur(10px);
- }
-
- .panel {
- border-radius: var(--radius);
- background: rgba(255,255,255,.92);
- border: 1px solid rgba(11,11,12,.06);
- box-shadow: var(--shadow2);
- }
-
- .chip {
- border-radius: 999px;
- background: rgba(255,255,255,.8);
- border: 1px solid rgba(11,11,12,.08);
- }
-
- .btn {
- border-radius: 16px;
- transition: transform .16s ease, box-shadow .16s ease, opacity .16s ease;
- }
- .btn:hover { transform: translateY(-1px); box-shadow: 0 18px 48px rgba(11,11,12,.10); }
-
- .drawer.hidden { display:none; }
\ No newline at end of file
+ --ink:#0b0b0c;
+ --line: rgba(11,11,12,.08);
+ --shadow: 0 18px 48px rgba(11,11,12,.10);
+ --shadow2: 0 10px 26px rgba(11,11,12,.10);
+ /* premium blue theme */
+ --blue:#2563eb;
+ --blue2:#60a5fa;
+ --ice:#eef6ff;
+}
+html, body { height: 100%; }
+body{
+ font-family: 'Inter', sans-serif;
+ color: var(--ink);
+ background: radial-gradient(1400px 760px at 20% 10%, rgba(96,165,250,.28), rgba(255,255,255,0) 60%), radial-gradient(1200px 640px at 90% 20%, rgba(37,99,235,.20), rgba(255,255,255,0) 55%), linear-gradient(180deg, #f6fbff 0%, #ffffff 55%, #f7fbff 100%);
+}
+.appShell{
+ border-radius: 30px;
+ background: rgba(255,255,255,.80);
+ border: 1px solid rgba(11,11,12,.08);
+ box-shadow: var(--shadow);
+ backdrop-filter: blur(10px);
+ overflow: hidden;
+}
+.card{
+ background: rgba(255,255,255,.92);
+ border: 1px solid rgba(11,11,12,.06);
+ border-radius: 18px;
+ box-shadow: var(--shadow2);
+}
+.chip{
+ border-radius: 999px;
+ background: rgba(255,255,255,.85);
+ border: 1px solid rgba(11,11,12,.08);
+}
+.btn{
+ border-radius: 14px;
+ transition: transform .16s ease, box-shadow .16s ease, opacity .16s ease;
+}
+.btn:hover{
+ transform: translateY(-1px);
+ box-shadow: var(--shadow2);
+}
+.softInput{
+ background: rgba(255,255,255,.92);
+ border: 1px solid rgba(11,11,12,.10);
+ border-radius: 18px;
+ padding: 10px 40px;
+ font-size: 14px;
+ outline: none;
+ width: 100%;
+}
+.softInput:focus{
+ border-color: rgba(37,99,235,.35);
+ box-shadow: 0 0 0 4px rgba(37,99,235,.10);
+}
+.divider{
+ border-color: rgba(11,11,12,.10);
+}
+/* Mobile sidebar behavior */
+.sidebarHidden {
+ display: none;
+}
\ No newline at end of file
diff --git a/staticfiles/css/custom.css b/staticfiles/css/custom.css
index 10f05e3..7f74644 100644
--- a/staticfiles/css/custom.css
+++ b/staticfiles/css/custom.css
@@ -1,54 +1,63 @@
:root{
- --ink:#0b0b0c;
- --paper:#fbfaf7;
- --line: rgba(11,11,12,.08);
- --shadow: 0 18px 48px rgba(11,11,12,.10);
- --shadow2: 0 10px 26px rgba(11,11,12,.10);
- --radius: 22px;
-
- /* premium blue theme (like the dashboard reference) */
- --blue:#2563eb;
- --blue2:#60a5fa;
- --ice:#eaf2ff;
- --ice2:#f6fbff;
- }
-
- html, body { height: 100%; }
- body { font-family: 'Inter', sans-serif; color: var(--ink); }
-
- .bg-premium{
- background:
- radial-gradient(1400px 560px at 18% 8%, rgba(96,165,250,.30), rgba(255,255,255,0) 60%),
- radial-gradient(1200px 520px at 92% 12%, rgba(37,99,235,.22), rgba(255,255,255,0) 55%),
- radial-gradient(1100px 620px at 55% 100%, rgba(234,242,255,.95), rgba(255,255,255,0) 60%),
- linear-gradient(180deg, #f6fbff 0%, #ffffff 55%, #f7fbff 100%);
- }
-
- .shell {
- border-radius: 26px;
- background: rgba(255,255,255,.78);
- border: 1px solid rgba(11,11,12,.08);
- box-shadow: var(--shadow);
- backdrop-filter: blur(10px);
- }
-
- .panel {
- border-radius: var(--radius);
- background: rgba(255,255,255,.92);
- border: 1px solid rgba(11,11,12,.06);
- box-shadow: var(--shadow2);
- }
-
- .chip {
- border-radius: 999px;
- background: rgba(255,255,255,.8);
- border: 1px solid rgba(11,11,12,.08);
- }
-
- .btn {
- border-radius: 16px;
- transition: transform .16s ease, box-shadow .16s ease, opacity .16s ease;
- }
- .btn:hover { transform: translateY(-1px); box-shadow: 0 18px 48px rgba(11,11,12,.10); }
-
- .drawer.hidden { display:none; }
\ No newline at end of file
+ --ink:#0b0b0c;
+ --line: rgba(11,11,12,.08);
+ --shadow: 0 18px 48px rgba(11,11,12,.10);
+ --shadow2: 0 10px 26px rgba(11,11,12,.10);
+ /* premium blue theme */
+ --blue:#2563eb;
+ --blue2:#60a5fa;
+ --ice:#eef6ff;
+}
+html, body { height: 100%; }
+body{
+ font-family: 'Inter', sans-serif;
+ color: var(--ink);
+ background: radial-gradient(1400px 760px at 20% 10%, rgba(96,165,250,.28), rgba(255,255,255,0) 60%), radial-gradient(1200px 640px at 90% 20%, rgba(37,99,235,.20), rgba(255,255,255,0) 55%), linear-gradient(180deg, #f6fbff 0%, #ffffff 55%, #f7fbff 100%);
+}
+.appShell{
+ border-radius: 30px;
+ background: rgba(255,255,255,.80);
+ border: 1px solid rgba(11,11,12,.08);
+ box-shadow: var(--shadow);
+ backdrop-filter: blur(10px);
+ overflow: hidden;
+}
+.card{
+ background: rgba(255,255,255,.92);
+ border: 1px solid rgba(11,11,12,.06);
+ border-radius: 18px;
+ box-shadow: var(--shadow2);
+}
+.chip{
+ border-radius: 999px;
+ background: rgba(255,255,255,.85);
+ border: 1px solid rgba(11,11,12,.08);
+}
+.btn{
+ border-radius: 14px;
+ transition: transform .16s ease, box-shadow .16s ease, opacity .16s ease;
+}
+.btn:hover{
+ transform: translateY(-1px);
+ box-shadow: var(--shadow2);
+}
+.softInput{
+ background: rgba(255,255,255,.92);
+ border: 1px solid rgba(11,11,12,.10);
+ border-radius: 18px;
+ padding: 10px 40px;
+ font-size: 14px;
+ outline: none;
+ width: 100%;
+}
+.softInput:focus{
+ border-color: rgba(37,99,235,.35);
+ box-shadow: 0 0 0 4px rgba(37,99,235,.10);
+}
+.divider{
+ border-color: rgba(11,11,12,.10);
+}
+/* Mobile sidebar behavior */
+.sidebarHidden {
+ display: none;
+}
\ No newline at end of file
diff --git a/staticfiles/pasted-20251220-213302-d711d038.png b/staticfiles/pasted-20251220-213302-d711d038.png
new file mode 100644
index 0000000..0c2e36d
Binary files /dev/null and b/staticfiles/pasted-20251220-213302-d711d038.png differ
diff --git a/staticfiles/pasted-20251220-213627-9936cf00.png b/staticfiles/pasted-20251220-213627-9936cf00.png
new file mode 100644
index 0000000..bfb6616
Binary files /dev/null and b/staticfiles/pasted-20251220-213627-9936cf00.png differ
diff --git a/staticfiles/vm-shot-2025-12-20T21-32-26-942Z.jpg b/staticfiles/vm-shot-2025-12-20T21-32-26-942Z.jpg
new file mode 100644
index 0000000..77a5c55
Binary files /dev/null and b/staticfiles/vm-shot-2025-12-20T21-32-26-942Z.jpg differ