-
Welcome Back!
+
Welcome!
Sign in to access your student portal workspace.
diff --git a/addons/theme_student_erp_custom/__init__.py b/addons/theme_student_erp_custom/__init__.py
new file mode 100644
index 0000000..40a96af
--- /dev/null
+++ b/addons/theme_student_erp_custom/__init__.py
@@ -0,0 +1 @@
+# -*- coding: utf-8 -*-
diff --git a/addons/theme_student_erp_custom/__manifest__.py b/addons/theme_student_erp_custom/__manifest__.py
new file mode 100644
index 0000000..a870b9e
--- /dev/null
+++ b/addons/theme_student_erp_custom/__manifest__.py
@@ -0,0 +1,30 @@
+{
+ 'name': 'Student ERP Custom Theme',
+ 'version': '1.0',
+ 'summary': 'Material Design and Brand Color Overrides for Student ERP',
+ 'description': """
+ This module overrides Odoo's default styling to provide a Material Design
+ feel to backend forms and applies brand-specific colors across both
+ the backend dashboard and the frontend student portal.
+ """,
+ 'category': 'Theme',
+ 'author': 'Antigravity',
+ 'depends': ['base', 'web', 'portal'],
+ 'data': [],
+ 'assets': {
+ 'web._assets_primary_variables': [
+ 'theme_student_erp_custom/static/src/scss/primary_variables.scss',
+ ],
+ 'web.assets_backend': [
+ 'theme_student_erp_custom/static/src/scss/backend_forms.scss',
+ 'theme_student_erp_custom/static/src/xml/sidebar.xml',
+ ],
+ 'web.assets_frontend': [
+ 'theme_student_erp_custom/static/src/scss/frontend_portal.scss',
+ ],
+ },
+ 'installable': True,
+ 'application': False,
+ 'auto_install': False,
+ 'license': 'LGPL-3',
+}
diff --git a/addons/theme_student_erp_custom/__pycache__/__init__.cpython-312.pyc b/addons/theme_student_erp_custom/__pycache__/__init__.cpython-312.pyc
new file mode 100644
index 0000000..2079040
Binary files /dev/null and b/addons/theme_student_erp_custom/__pycache__/__init__.cpython-312.pyc differ
diff --git a/addons/theme_student_erp_custom/static/src/js/sidebar.js b/addons/theme_student_erp_custom/static/src/js/sidebar.js
new file mode 100644
index 0000000..27d972a
--- /dev/null
+++ b/addons/theme_student_erp_custom/static/src/js/sidebar.js
@@ -0,0 +1,50 @@
+/** @odoo-module **/
+
+import { Component, useState, onWillStart } from "@odoo/owl";
+import { useService } from "@web/core/utils/hooks";
+import { WebClient } from "@web/webclient/webclient";
+import { registry } from "@web/core/registry";
+
+export class Sidebar extends Component {
+ setup() {
+ this.menuService = useService("menu");
+ this.actionService = useService("action");
+
+ this.state = useState({
+ openFolders: {},
+ activeMenuId: null
+ });
+
+ // Initialize safely
+ try {
+ const currentApp = this.menuService.getCurrentApp();
+ if (currentApp) {
+ this.state.activeMenuId = currentApp.id;
+ }
+ } catch (e) {
+ console.warn("Could not load initial sidebar state:", e);
+ }
+ }
+
+ get currentApp() {
+ return this.menuService.getCurrentApp();
+ }
+
+ get menuTree() {
+ const app = this.currentApp;
+ if (!app) return [];
+ return this.menuService.getMenuAsTree(app.id).childrenTree;
+ }
+
+ toggleAccordion(menuId) {
+ this.state.openFolders[menuId] = !this.state.openFolders[menuId];
+ }
+
+ onMenuClick(menu) {
+ this.state.activeMenuId = menu.id;
+ this.menuService.selectMenu(menu);
+ }
+}
+Sidebar.template = "theme_student_erp_custom.Sidebar";
+
+
diff --git a/addons/theme_student_erp_custom/static/src/scss/backend_forms.scss b/addons/theme_student_erp_custom/static/src/scss/backend_forms.scss
new file mode 100644
index 0000000..ee1379a
--- /dev/null
+++ b/addons/theme_student_erp_custom/static/src/scss/backend_forms.scss
@@ -0,0 +1,645 @@
+// ---------------------------------------------------------
+// COMPREHENSIVE BACKEND THEME & FORM OVERHAUL (ODOO 18/19)
+// ---------------------------------------------------------
+
+// 1. GLOBAL ROOT VARIABLES (Modern Odoo uses CSS variables extensively)
+// ---------------------------------------------------------
+:root {
+ --o-brand-primary: #1f8f8f;
+ --o-brand-odoo: #1f8f8f;
+ --bs-primary: #1f8f8f;
+ --bs-primary-rgb: 37, 99, 235;
+
+ // Override the default purple/dark background of Odoo
+ --o-navbar-background: #1f8f8f;
+ --o-navbar-text: #ffffff;
+}
+
+// Global Background & Structural Layout
+body.o_web_client {
+ background-color: #f0f4f8 !important;
+}
+
+.o_action_manager {
+ background-color: #f0f4f8 !important;
+}
+
+// Only push content when our custom sidebar is present
+body.o_web_client:has(.o_sidebar_custom) .o_action_manager {
+ margin-left: 260px;
+}
+
+.o_content, .o_form_view_container {
+ background-color: #f0f4f8 !important;
+}
+
+// 2. MAIN NAVBAR
+// ---------------------------------------------------------
+.o_main_navbar {
+ --o-navbar-height: 70px;
+ font-size: 0.975rem;
+ background-color: #eef9f9 !important;
+ border-bottom: 1px solid #e2e8f0 !important;
+ box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.05) !important;
+ color: #144d4d !important;
+ width: 100%;
+ z-index: 100; // Keep above sidebar
+
+ // Ensure all internal sections don't have the ugly purple background
+ .o_menu_sections, .o_menu_systray, .o_menu_brand {
+ background-color: transparent !important;
+ }
+
+ // Ensure horizontal menus are always visible in the header
+ .o_menu_sections {
+ display: flex !important;
+ flex-grow: 1 !important;
+ align-items: center !important;
+ overflow: visible !important;
+ }
+
+ // Explicitly override Odoo's internal enterprise variables
+ .o_menu_sections .o_nav_entry, .o_menu_sections .dropdown-toggle {
+ background: transparent !important;
+ background-color: transparent !important;
+ }
+
+ // Navbar Links
+ .o_menu_item > a, .o_nav_entry, .dropdown-toggle {
+ color: #144d4d !important;
+ font-weight: 600 !important;
+
+ &:hover, &:focus {
+ color: #144d4d !important;
+ background-color: rgba(20, 77, 77, 0.05) !important; // Very light teal hover
+ }
+ }
+
+ // App Switcher Icon (Grid)
+ .o_menu_toggle {
+ color: #144d4d !important;
+ &:hover {
+ background-color: rgba(20, 77, 77, 0.1) !important;
+ }
+ }
+
+ // Brand Name (e.g. Education)
+ .o_menu_brand {
+ color: #144d4d !important;
+ font-weight: 800 !important;
+ }
+}
+
+// ---------------------------------------------------------
+// APP SWITCHER & GLOBAL DROPDOWNS (Odoo appends these to body)
+// ---------------------------------------------------------
+.dropdown-menu, .o-dropdown--menu {
+ background-color: #ffffff !important;
+ border: 1px solid #e2e8f0 !important;
+ border-radius: 12px !important;
+ box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.15), 0 8px 10px -6px rgba(0, 0, 0, 0.1) !important;
+ padding: 8px !important;
+ margin-top: 8px !important;
+
+ .dropdown-item, .o_nav_entry, .dropdown-item-text {
+ color: #475569 !important;
+ border-radius: 8px !important;
+ padding: 10px 20px !important;
+ font-weight: 500 !important;
+ font-size: 0.95rem;
+ transition: all 0.15s ease-in-out;
+
+ &:hover, &:focus, &.active, &.selected, &.focus {
+ background-color: #eef9f9 !important;
+ color: #144d4d !important;
+ }
+ }
+}
+
+// 3. CONTROL PANEL
+// ---------------------------------------------------------
+.o_control_panel {
+ background-color: #ffffff !important;
+ border-bottom: 1px solid #e2e8f0 !important;
+ padding: 12px 24px !important;
+ box-shadow: 0 1px 3px rgba(0,0,0,0.05);
+
+ .o_breadcrumb {
+ font-family: 'Inter', sans-serif;
+ font-weight: 700;
+ color: #1e293b;
+ }
+
+ .btn-primary {
+ background-color: var(--o-brand-primary) !important;
+ border-color: var(--o-brand-primary) !important;
+ border-radius: 6px;
+ box-shadow: 0 2px 4px rgba(37, 99, 235, 0.2);
+ }
+}
+
+// 4. FORM VIEW OVERHAUL
+// ---------------------------------------------------------
+.o_form_view {
+ background-color: #f0f4f8 !important; // Match global background
+
+ // The entire left side (Sheet + Statusbar)
+ .o_form_sheet_bg {
+ background-color: transparent !important;
+ border-bottom: none !important;
+ padding: 24px !important;
+ }
+
+ // Status Bar (Top bar with Draft/Open/Done and action buttons)
+ .o_form_statusbar {
+ background-color: #ffffff !important;
+ border: 1px solid #e2e8f0 !important;
+ border-radius: 12px;
+ margin-bottom: 16px !important;
+ padding: 8px 16px !important;
+ box-shadow: 0 2px 4px rgba(0,0,0,0.02);
+
+ // The arrow steps
+ .o_statusbar_status {
+ .o_arrow_button {
+ background: transparent !important;
+ border: none !important;
+ color: #64748b !important;
+ font-weight: 600;
+
+ &::before, &::after { display: none !important; } // Remove standard chevron shapes
+
+ &.btn-primary {
+ color: var(--o-brand-primary) !important;
+ background-color: rgba(37, 99, 235, 0.1) !important;
+ border-radius: 20px !important;
+ padding: 4px 16px !important;
+ }
+ }
+ }
+
+ // Action Buttons inside statusbar
+ .btn {
+ border-radius: 6px;
+ font-weight: 500;
+ }
+ .btn-primary {
+ background-color: var(--o-brand-primary) !important;
+ border: none !important;
+ }
+ }
+
+ // The Main Card (Sheet)
+ .o_form_sheet {
+ background-color: #ffffff !important;
+ border-radius: 12px !important;
+ border: 1px solid #e2e8f0 !important;
+ box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.05), 0 4px 6px -2px rgba(0, 0, 0, 0.025) !important;
+ margin: 0 auto !important;
+ padding: 40px !important;
+ max-width: 1000px !important; // keep it readable
+ }
+
+ // Labels
+ .o_form_label {
+ color: #64748b !important;
+ font-weight: 700 !important;
+ font-size: 0.75rem !important;
+ text-transform: uppercase;
+ letter-spacing: 0.05em;
+ }
+
+ // Input fields (Modern SaaS style - clean gray boxes that highlight)
+ .o_field_widget {
+ input, select, textarea {
+ background-color: #f8fafc !important;
+ border: 1px solid #e2e8f0 !important;
+ border-radius: 6px !important;
+ color: #0f172a !important;
+ padding: 8px 12px !important;
+ transition: all 0.2s ease;
+ box-shadow: none !important;
+
+ &:focus, &:active {
+ background-color: #ffffff !important;
+ border-color: var(--o-brand-primary) !important;
+ box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1) !important;
+ outline: none !important;
+ }
+ }
+ }
+
+ // Group titles / Separators
+ .o_group .o_td_label {
+ border-right: none !important; // Remove default odoo vertical line
+ }
+ .o_horizontal_separator {
+ color: var(--o-brand-primary) !important;
+ font-weight: 700;
+ font-size: 1.1rem;
+ border-bottom: 2px solid #f1f5f9;
+ padding-bottom: 8px;
+ margin-bottom: 16px;
+ }
+}
+
+// 5. CHATTER (The right-side communication panel)
+// ---------------------------------------------------------
+.o-mail-Form-chatter {
+ background-color: #f8fafc !important;
+ border-left: 1px solid #e2e8f0 !important;
+
+ .o-mail-Chatter-topbar {
+ background-color: #ffffff !important;
+ border-bottom: 1px solid #e2e8f0 !important;
+ padding: 12px !important;
+
+ .btn {
+ border-radius: 6px !important;
+ &.active {
+ background-color: rgba(37, 99, 235, 0.1) !important;
+ color: var(--o-brand-primary) !important;
+ border-color: transparent !important;
+ }
+ }
+ }
+}
+
+
+// ==========================================================
+// 6. CONTENT SECTION — PROFESSIONAL LIST VIEW OVERHAUL
+// ==========================================================
+
+// --- Page background ---
+.o_action_manager {
+ background-color: #eef9f9 !important;
+}
+.o_home_menu { background-color: #eef9f9 !important; }
+
+// ---- CONTROL PANEL ----
+.o_control_panel {
+ background-color: transparent !important;
+ border-bottom: none !important;
+ box-shadow: none !important;
+ padding: 20px 28px 8px 28px !important;
+}
+
+// Top row: breadcrumb on left, New button on RIGHT
+.o_control_panel_breadcrumbs_actions {
+ display: flex !important;
+ align-items: center !important;
+ flex-wrap: nowrap !important;
+ gap: 12px !important;
+}
+
+.o_control_panel .o_breadcrumb {
+ order: 1 !important; // Always visually FIRST (left side)
+ flex: 1 !important; // Takes all remaining space → pushes button right
+ display: flex !important;
+ align-items: center !important;
+ flex-wrap: wrap !important;
+ gap: 4px !important;
+ min-width: 0 !important;
+}
+
+// Small breadcrumb trail (Home > Master Data >)
+.o_control_panel .o_breadcrumb .o_breadcrumb_item a,
+.o_control_panel .o_breadcrumb .o_breadcrumb_item > span:not(.o_last_breadcrumb_item span) {
+ font-size: 0.8rem !important;
+ color: #64748b !important;
+ font-weight: 500 !important;
+ text-decoration: none !important;
+}
+
+// Large title (last breadcrumb item)
+.o_control_panel .o_last_breadcrumb_item > span,
+.o_control_panel .o_breadcrumb li.active > span {
+ font-size: 1.45rem !important;
+ font-weight: 800 !important;
+ color: #0f172a !important;
+ letter-spacing: -0.025em !important;
+}
+
+// Breadcrumb separator
+.o_control_panel .o_breadcrumb li + li::before {
+ color: #cbd5e1 !important;
+}
+
+// New button → RIGHT side, teal — uses order:2 to override DOM order
+.o_control_panel_main_buttons {
+ order: 2 !important; // Always visually LAST (right side)
+ flex-shrink: 0 !important;
+ display: flex !important;
+ align-items: center !important;
+ gap: 8px !important;
+
+ .btn-primary {
+ background-color: #1f8f8f !important;
+ border-color: #1f8f8f !important;
+ border-radius: 10px !important;
+ font-weight: 600 !important;
+ font-size: 0.875rem !important;
+ padding: 9px 20px !important;
+ color: #fff !important;
+ box-shadow: 0 4px 14px rgba(31,143,143,0.3) !important;
+ transition: all 0.2s ease !important;
+
+ &:hover {
+ background-color: #177a7a !important;
+ transform: translateY(-1px) !important;
+ box-shadow: 0 6px 18px rgba(31,143,143,0.4) !important;
+ }
+ }
+
+ .btn-secondary {
+ background-color: #fff !important;
+ border: 1.5px solid #e2e8f0 !important;
+ border-radius: 10px !important;
+ color: #475569 !important;
+ font-weight: 600 !important;
+ font-size: 0.875rem !important;
+ padding: 9px 20px !important;
+
+ &:hover {
+ border-color: #1f8f8f !important;
+ color: #1f8f8f !important;
+ }
+ }
+}
+
+// Navigation row: search + filters + view switchers + pager
+.o_control_panel_navigation {
+ display: flex !important;
+ align-items: center !important;
+ gap: 8px !important;
+ padding: 8px 0 0 0 !important;
+ flex-wrap: wrap !important;
+}
+
+// ---- SEARCH BAR ----
+.o_searchview {
+ background-color: #fff !important;
+ border: 1.5px solid #e2e8f0 !important;
+ border-radius: 10px !important;
+ padding: 3px 12px !important;
+ box-shadow: 0 1px 4px rgba(0,0,0,0.04) !important;
+ min-height: 36px !important;
+ flex: 1 1 220px !important;
+ max-width: 360px !important;
+ transition: border-color 0.2s, box-shadow 0.2s !important;
+
+ &:focus-within {
+ border-color: #1f8f8f !important;
+ box-shadow: 0 0 0 3px rgba(31,143,143,0.12) !important;
+ }
+
+ .o_searchview_input {
+ font-size: 0.875rem !important;
+ color: #334155 !important;
+ background: transparent !important;
+ &::placeholder { color: #94a3b8 !important; }
+ }
+
+ .o_searchview_icon, .fa-search {
+ color: #94a3b8 !important;
+ }
+}
+
+// Filter / GroupBy / Favorites dropdown buttons
+.o_dropdown.o_filter_menu > button,
+.o_dropdown.o_group_by_menu > button,
+.o_dropdown.o_favorites_menu > button {
+ background-color: #fff !important;
+ border: 1.5px solid #e2e8f0 !important;
+ border-radius: 9px !important;
+ color: #475569 !important;
+ font-weight: 600 !important;
+ font-size: 0.8rem !important;
+ padding: 6px 12px !important;
+ transition: all 0.15s ease !important;
+
+ &:hover {
+ border-color: #1f8f8f !important;
+ color: #1f8f8f !important;
+ background-color: #eef9f9 !important;
+ }
+}
+
+// View switcher (List / Kanban)
+.o_cp_switch_buttons button {
+ background-color: #fff !important;
+ border: 1.5px solid #e2e8f0 !important;
+ border-radius: 8px !important;
+ color: #94a3b8 !important;
+ padding: 5px 9px !important;
+ transition: all 0.15s ease !important;
+
+ &.active, &[aria-pressed="true"] {
+ background-color: #eef9f9 !important;
+ border-color: #1f8f8f !important;
+ color: #1f8f8f !important;
+ }
+ &:hover:not(.active):not([aria-pressed="true"]) {
+ border-color: #cbd5e1 !important;
+ color: #475569 !important;
+ }
+}
+
+// Pager in control panel navigation
+.o_control_panel_navigation .o_pager {
+ display: flex !important;
+ align-items: center !important;
+ gap: 4px !important;
+ background: transparent !important;
+ border: none !important;
+ padding: 0 !important;
+
+ .o_pager_counter {
+ font-size: 0.8rem !important;
+ color: #64748b !important;
+ font-weight: 500 !important;
+ white-space: nowrap !important;
+ }
+
+ .o_pager_value {
+ background-color: #1f8f8f !important;
+ color: #fff !important;
+ border: none !important;
+ border-radius: 7px !important;
+ padding: 3px 10px !important;
+ font-size: 0.8rem !important;
+ font-weight: 700 !important;
+ cursor: default !important;
+ min-width: 28px !important;
+ text-align: center !important;
+ }
+
+ .o_pager_previous, .o_pager_next {
+ background: #fff !important;
+ border: 1.5px solid #e2e8f0 !important;
+ border-radius: 7px !important;
+ color: #475569 !important;
+ padding: 3px 8px !important;
+ font-size: 0.82rem !important;
+ transition: all 0.15s ease !important;
+
+ &:hover {
+ border-color: #1f8f8f !important;
+ color: #1f8f8f !important;
+ }
+ }
+}
+
+// ---- LIST VIEW — TABLE CARD ----
+// o_list_view = full page wrapper, do NOT add card here
+.o_list_view {
+ background-color: transparent !important;
+ border: none !important;
+ box-shadow: none !important;
+ margin: 0 !important;
+ overflow: visible !important;
+}
+
+// o_list_renderer = actual table container → THIS is the white card
+.o_list_renderer {
+ background-color: #fff !important;
+ border-radius: 14px !important;
+ border: 1px solid #e2e8f0 !important;
+ box-shadow: 0 4px 20px rgba(15,23,42,0.07) !important;
+ margin: 0 28px 28px 28px !important;
+ overflow: hidden !important;
+}
+
+// ---- TABLE HEADER ----
+.o_list_renderer table {
+ border-collapse: collapse !important;
+ width: 100% !important;
+}
+
+.o_list_renderer thead th {
+ background-color: #f8fafc !important;
+ color: #64748b !important;
+ font-size: 0.72rem !important;
+ font-weight: 700 !important;
+ text-transform: uppercase !important;
+ letter-spacing: 0.07em !important;
+ padding: 12px 14px !important;
+ border-bottom: 1.5px solid #e2e8f0 !important;
+ border-top: none !important;
+ white-space: nowrap !important;
+}
+
+// ---- TABLE ROWS ----
+.o_list_renderer .o_data_row {
+ border-bottom: 1px solid #f1f5f9 !important;
+ transition: background 0.12s ease !important;
+
+ &:last-child { border-bottom: none !important; }
+
+ &:hover > td {
+ background-color: #f8fafc !important;
+ }
+
+ > td {
+ padding: 13px 14px !important;
+ font-size: 0.875rem !important;
+ color: #475569 !important;
+ vertical-align: middle !important;
+ border: none !important;
+ background-color: transparent !important;
+ }
+
+ // First data column (record name) → bold
+ > td.o_data_cell:nth-child(2) {
+ font-weight: 700 !important;
+ color: #0f172a !important;
+ font-size: 0.9rem !important;
+ }
+}
+
+// ---- STATUS BADGE widget="badge" ----
+.o_list_renderer .badge,
+.o_field_badge .badge {
+ border-radius: 20px !important;
+ padding: 4px 12px !important;
+ font-size: 0.75rem !important;
+ font-weight: 600 !important;
+ letter-spacing: 0.02em !important;
+ border: none !important;
+}
+
+.badge.text-bg-success,
+.o_field_badge .o_tag.text-bg-success { background-color: #dcfce7 !important; color: #15803d !important; }
+
+.badge.text-bg-danger,
+.o_field_badge .o_tag.text-bg-danger { background-color: #fee2e2 !important; color: #b91c1c !important; }
+
+.badge.text-bg-warning,
+.o_field_badge .o_tag.text-bg-warning { background-color: #fef9c3 !important; color: #a16207 !important; }
+
+.badge.text-bg-secondary,
+.o_field_badge .o_tag.text-bg-secondary{ background-color: #f1f5f9 !important; color: #475569 !important; }
+
+.badge.text-bg-info,
+.o_field_badge .o_tag.text-bg-info { background-color: #e0f2fe !important; color: #0369a1 !important; }
+
+.badge.text-bg-primary,
+.o_field_badge .o_tag.text-bg-primary { background-color: #e0f7f7 !important; color: #0f6b6b !important; }
+
+// ---- CHECKBOXES ----
+.o_list_renderer input[type="checkbox"] {
+ accent-color: #1f8f8f !important;
+ width: 15px !important;
+ height: 15px !important;
+ cursor: pointer !important;
+}
+
+// Optional columns toggle
+.o_optional_columns_dropdown_toggle {
+ color: #94a3b8 !important;
+ background: transparent !important;
+ border: none !important;
+ &:hover { color: #1f8f8f !important; }
+}
+
+// ---- KANBAN VIEW ----
+.o_kanban_view {
+ background-color: #eef9f9 !important;
+ padding: 20px 28px !important;
+
+ .o_kanban_record {
+ background: #fff !important;
+ border-radius: 12px !important;
+ border: 1px solid #e8eef4 !important;
+ box-shadow: 0 2px 10px rgba(15,23,42,0.06) !important;
+ transition: box-shadow 0.2s ease, transform 0.2s ease !important;
+
+ &:hover {
+ box-shadow: 0 10px 28px rgba(15,23,42,0.12) !important;
+ transform: translateY(-2px) !important;
+ }
+ }
+}
+
+// ---- GLOBAL DROPDOWNS ----
+.dropdown-menu, .o-dropdown--menu {
+ background-color: #fff !important;
+ border: 1px solid #e2e8f0 !important;
+ border-radius: 12px !important;
+ box-shadow: 0 10px 30px rgba(15,23,42,0.12) !important;
+ padding: 6px !important;
+
+ .dropdown-item {
+ border-radius: 8px !important;
+ font-size: 0.875rem !important;
+ color: #475569 !important;
+ padding: 8px 14px !important;
+ font-weight: 500 !important;
+ transition: all 0.12s ease !important;
+
+ &:hover, &:focus {
+ background-color: #eef9f9 !important;
+ color: #1f8f8f !important;
+ }
+ }
+}
diff --git a/addons/theme_student_erp_custom/static/src/scss/frontend_portal.scss b/addons/theme_student_erp_custom/static/src/scss/frontend_portal.scss
new file mode 100644
index 0000000..3fcecaa
--- /dev/null
+++ b/addons/theme_student_erp_custom/static/src/scss/frontend_portal.scss
@@ -0,0 +1,56 @@
+// Frontend Portal Overrides
+
+body {
+ // Subtle background for the portal to make content cards pop
+ background-color: #f8fafc; // Slate 50
+}
+
+// Portal Navbar overrides
+header.o_header_standard, .navbar {
+ box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1);
+
+ .navbar-brand {
+ font-weight: bold;
+ color: $o-brand-primary;
+ }
+
+ .nav-link {
+ font-weight: 500;
+ &:hover, &.active {
+ color: $o-brand-primary !important;
+ }
+ }
+}
+
+// Enhance standard portal cards
+.o_portal_wrap {
+ .card {
+ box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
+ border: none;
+ border-radius: 8px;
+ transition: transform 0.2s ease-in-out, box-shadow 0.2s ease-in-out;
+
+ &:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
+ }
+
+ .card-header {
+ background-color: #ffffff;
+ border-bottom: 1px solid #f1f5f9;
+ font-weight: bold;
+ color: $o-brand-secondary;
+ }
+ }
+}
+
+// Primary buttons in the portal
+main .btn-primary {
+ border-radius: 6px;
+ font-weight: 500;
+ box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1);
+
+ &:hover {
+ box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
+ }
+}
diff --git a/addons/theme_student_erp_custom/static/src/scss/primary_variables.scss b/addons/theme_student_erp_custom/static/src/scss/primary_variables.scss
new file mode 100644
index 0000000..0b95b75
--- /dev/null
+++ b/addons/theme_student_erp_custom/static/src/scss/primary_variables.scss
@@ -0,0 +1,18 @@
+// Brand Colors - Override Bootstrap default variables
+// We are applying a modern, professional blue theme as a baseline.
+// You can adjust these hex codes to perfectly match your brand.
+
+$o-brand-primary: #1f8f8f; // Modern Indigo/Blue
+$o-brand-secondary: #475569; // Slate Grey
+$o-brand-info: #26a1a1; // Lighter Blue
+$o-brand-success: #10B981; // Emerald Green
+$o-brand-warning: #F59E0B; // Amber
+$o-brand-danger: #EF4444; // Red
+
+// For frontend overriding, Odoo often uses $primary directly
+$primary: $o-brand-primary;
+$secondary: $o-brand-secondary;
+$info: $o-brand-info;
+$success: $o-brand-success;
+$warning: $o-brand-warning;
+$danger: $o-brand-danger;
diff --git a/addons/theme_student_erp_custom/static/src/xml/sidebar.xml b/addons/theme_student_erp_custom/static/src/xml/sidebar.xml
new file mode 100644
index 0000000..17598e6
--- /dev/null
+++ b/addons/theme_student_erp_custom/static/src/xml/sidebar.xml
@@ -0,0 +1,94 @@
+
+
+
+
+
+
+
+
+
+
+
+
+