commit 78714dbd266207f57ef9348b0a769e2fc0d4f0d4 Author: Alaguraj0361 Date: Mon Mar 2 21:31:24 2026 +0530 first commit diff --git a/addons/Dine360_Chennora/__init__.py b/addons/Dine360_Chennora/__init__.py new file mode 100644 index 0000000..0bc76d3 --- /dev/null +++ b/addons/Dine360_Chennora/__init__.py @@ -0,0 +1,2 @@ +# Meta module for Dine360 Chennora +from .hooks import uninstall_hook diff --git a/addons/Dine360_Chennora/__manifest__.py b/addons/Dine360_Chennora/__manifest__.py new file mode 100644 index 0000000..e3a6659 --- /dev/null +++ b/addons/Dine360_Chennora/__manifest__.py @@ -0,0 +1,27 @@ +{ + 'name': 'Dine360 Restaurant Suite', + 'version': '1.0.0', + 'license': 'LGPL-3', + 'category': 'Website', + 'summary': 'Installs all Dine360 Restaurant modules', + 'author': 'Dine360', + 'depends': [ + 'dine360_dashboard', + 'dine360_restaurant', + 'dine360_theme_chennora', + 'dine360_kds', + 'dine360_reservation', + ], + 'uninstall_hook': 'uninstall_hook', + 'data': [ + 'views/apps_kanban_menu.xml', + ], + 'assets': { + 'web.assets_backend': [ + 'Dine360_Chennora/static/src/css/apps_kanban_fix.css', + ], + }, + 'installable': True, + 'application': True, +} + diff --git a/addons/Dine360_Chennora/__pycache__/__init__.cpython-310.pyc b/addons/Dine360_Chennora/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000..c741d76 Binary files /dev/null and b/addons/Dine360_Chennora/__pycache__/__init__.cpython-310.pyc differ diff --git a/addons/Dine360_Chennora/__pycache__/hooks.cpython-310.pyc b/addons/Dine360_Chennora/__pycache__/hooks.cpython-310.pyc new file mode 100644 index 0000000..3b79800 Binary files /dev/null and b/addons/Dine360_Chennora/__pycache__/hooks.cpython-310.pyc differ diff --git a/addons/Dine360_Chennora/hooks.py b/addons/Dine360_Chennora/hooks.py new file mode 100644 index 0000000..28311b4 --- /dev/null +++ b/addons/Dine360_Chennora/hooks.py @@ -0,0 +1,26 @@ +from odoo import api, SUPERUSER_ID + +def uninstall_hook(cr, registry): + """ + Synchronized uninstallation: When Dine360 Restaurant Suite is uninstalled, + automatically trigger uninstallation for all its core sub-modules. + """ + env = api.Environment(cr, SUPERUSER_ID, {}) + modules_to_uninstall = [ + 'dine360_dashboard', + 'dine360_restaurant', + 'dine360_theme_chennora', + 'dine360_kds', + 'dine360_reservation' + ] + + # Search for these modules if they are installed + modules = env['ir.module.module'].search([ + ('name', 'in', modules_to_uninstall), + ('state', '=', 'installed') + ]) + + if modules: + # Mark modules for uninstallation + # button_immediate_uninstall will trigger the full process including registry reload + modules.button_immediate_uninstall() diff --git a/addons/Dine360_Chennora/static/description/icon.png b/addons/Dine360_Chennora/static/description/icon.png new file mode 100644 index 0000000..6fe8f76 Binary files /dev/null and b/addons/Dine360_Chennora/static/description/icon.png differ diff --git a/addons/Dine360_Chennora/static/src/css/apps_kanban_fix.css b/addons/Dine360_Chennora/static/src/css/apps_kanban_fix.css new file mode 100644 index 0000000..7418207 --- /dev/null +++ b/addons/Dine360_Chennora/static/src/css/apps_kanban_fix.css @@ -0,0 +1,31 @@ +/* Fix Apps kanban icon sizing and dropdown overlap */ +.o_modules_kanban .oe_module_vignette, +.o_modules_kanban .o_kanban_record { + overflow: visible; +} + +.o_modules_kanban .o_kanban_record { + position: relative; + z-index: 1; +} + +.o_modules_kanban .oe_module_icon { + width: 64px; + height: 64px; + display: flex; + align-items: center; + justify-content: center; +} + +.o_modules_kanban .oe_module_icon img { + width: 64px; + height: 64px; + object-fit: contain; +} + +.o_modules_kanban .oe_module_vignette .dropdown-menu { + right: 0; + left: auto; + min-width: 160px; + z-index: 1060; +} diff --git a/addons/Dine360_Chennora/views/apps_kanban_menu.xml b/addons/Dine360_Chennora/views/apps_kanban_menu.xml new file mode 100644 index 0000000..59b3bff --- /dev/null +++ b/addons/Dine360_Chennora/views/apps_kanban_menu.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/addons/dine360_dashboard/__init__.py b/addons/dine360_dashboard/__init__.py new file mode 100644 index 0000000..991d9d3 --- /dev/null +++ b/addons/dine360_dashboard/__init__.py @@ -0,0 +1,3 @@ +# dine360_dashboard/__init__.py +from . import controllers + diff --git a/addons/dine360_dashboard/__manifest__.py b/addons/dine360_dashboard/__manifest__.py new file mode 100644 index 0000000..cc34078 --- /dev/null +++ b/addons/dine360_dashboard/__manifest__.py @@ -0,0 +1,37 @@ +{ + 'name': 'Dine360 Dashboard', + 'version': '1.0.1', + 'license': 'LGPL-3', + 'category': 'Website', + 'summary': 'Redirect login to home and show icon grid', + 'depends': ['base', 'web', 'auth_signup', 'website', 'website_sale'], + 'data': [ + 'views/home_template.xml', + 'views/login_templates.xml', + 'views/web_title_template.xml', + 'views/website_logo.xml', + 'views/shop_template.xml', + 'data/branding_data.xml', + ], + 'assets': { + 'web.assets_backend': [ + 'dine360_dashboard/static/src/css/theme_variables.css', + 'dine360_dashboard/static/src/css/home_menu.css', + 'dine360_dashboard/static/src/js/chennora_title.js', + ], + 'web.assets_frontend': [ + 'dine360_dashboard/static/src/css/theme_variables.css', + 'dine360_dashboard/static/src/css/login_style.css', + 'dine360_dashboard/static/src/css/website_style.css', + 'dine360_dashboard/static/src/css/shop_style.css', + ], + 'web.assets_common': [ + 'dine360_dashboard/static/src/css/theme_variables.css', + ], + 'point_of_sale._assets_pos': [ + 'dine360_dashboard/static/src/css/pos_style.css', + ], + }, + 'installable': True, + 'application': True, +} diff --git a/addons/dine360_dashboard/__pycache__/__init__.cpython-310.pyc b/addons/dine360_dashboard/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000..839edc1 Binary files /dev/null and b/addons/dine360_dashboard/__pycache__/__init__.cpython-310.pyc differ diff --git a/addons/dine360_dashboard/controllers/__init__.py b/addons/dine360_dashboard/controllers/__init__.py new file mode 100644 index 0000000..e402e9d --- /dev/null +++ b/addons/dine360_dashboard/controllers/__init__.py @@ -0,0 +1,4 @@ +# dine360_dashboard/controllers/__init__.py +from . import main +from . import cors + diff --git a/addons/dine360_dashboard/controllers/__pycache__/__init__.cpython-310.pyc b/addons/dine360_dashboard/controllers/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000..566d5ae Binary files /dev/null and b/addons/dine360_dashboard/controllers/__pycache__/__init__.cpython-310.pyc differ diff --git a/addons/dine360_dashboard/controllers/__pycache__/cors.cpython-310.pyc b/addons/dine360_dashboard/controllers/__pycache__/cors.cpython-310.pyc new file mode 100644 index 0000000..e986eec Binary files /dev/null and b/addons/dine360_dashboard/controllers/__pycache__/cors.cpython-310.pyc differ diff --git a/addons/dine360_dashboard/controllers/__pycache__/main.cpython-310.pyc b/addons/dine360_dashboard/controllers/__pycache__/main.cpython-310.pyc new file mode 100644 index 0000000..028b542 Binary files /dev/null and b/addons/dine360_dashboard/controllers/__pycache__/main.cpython-310.pyc differ diff --git a/addons/dine360_dashboard/controllers/cors.py b/addons/dine360_dashboard/controllers/cors.py new file mode 100644 index 0000000..5b43d33 --- /dev/null +++ b/addons/dine360_dashboard/controllers/cors.py @@ -0,0 +1,15 @@ +from odoo import http +from odoo.http import request +import json + +class CorsHandler(http.Controller): + # This specifically targets the authentication endpoint for CORS + @http.route('/web/session/authenticate', type='json', auth="none", cors="*") + def authenticate_cors(self, db, login, password, base_location=None): + request.session.authenticate(db, login, password) + return request.env['ir.http'].session_info() + + # Generic search_read for the dashboard apps + @http.route('/web/dataset/call_kw', type='json', auth="user", cors="*") + def call_kw_cors(self, model, method, args, kwargs, path=None): + return request.env[model].with_user(request.uid).call_kw(method, args, kwargs) diff --git a/addons/dine360_dashboard/controllers/main.py b/addons/dine360_dashboard/controllers/main.py new file mode 100644 index 0000000..56c3cf9 --- /dev/null +++ b/addons/dine360_dashboard/controllers/main.py @@ -0,0 +1,73 @@ +from odoo import http +from odoo.http import request +from odoo.addons.web.controllers.home import Home + +class CustomHome(Home): + @http.route('/web/login', type='http', auth="public", website=True) + def web_login(self, *args, **kw): + response = super(CustomHome, self).web_login(*args, **kw) + if request.params.get('login_success') and request.session.uid: + return request.redirect('/') + return response + +from odoo.addons.website.controllers.main import Website + +class ImageHome(Website): + @http.route('/', type='http', auth='public', website=True, sitemap=True) + def index(self, **kwargs): + if not request.session.uid: + return request.render('website.homepage') + + # Remove sudo() to respect Odoo's standard menu group restrictions + menus = request.env['ir.ui.menu'].search([ + ('parent_id', '=', False) + ], order='sequence') + + # User role checks + is_admin = request.env.user.has_group('base.group_system') or request.env.user.has_group('dine360_restaurant.group_restaurant_admin') + is_kitchen = request.env.user.has_group('dine360_restaurant.group_restaurant_kitchen') + + filtered_menus = [] + seen_names = set() + for menu in menus: + # 1. Hide "Apps" for non-admins (usually name is 'Apps' or xmlid has base.menu_management) + if (menu.name == 'Apps' or (menu.web_icon and menu.web_icon.startswith('base,'))) and not is_admin: + continue + + # 2. Hide "Kitchen (KDS)" for Waiters (only show for Kitchen Staff or Admin) + if 'Kitchen' in menu.name or 'KDS' in menu.name: + if not (is_kitchen or is_admin): + continue + + # 3. De-duplicate by name to prevent double icons (like Kitchen showing twice) + if menu.name in seen_names: + continue + seen_names.add(menu.name) + + filtered_menus.append(menu) + + # Low Stock Alerts (Ingredients) + low_stock_products = [] + try: + # Try to get low stock products if the model and method exist + ProductTemplate = request.env['product.template'].sudo() + if hasattr(ProductTemplate, 'get_low_stock_products'): + low_stock_products = ProductTemplate.get_low_stock_products(limit=5) + except Exception: + # Fallback if module is not yet fully loaded or method missing + low_stock_products = [] + + + + return request.render('dine360_dashboard.image_home_template', { + 'menus': filtered_menus, + 'user_id': request.env.user, + 'low_stock_products': low_stock_products + }) + + + + @http.route('/home', type='http', auth="public", website=True, sitemap=True) + def website_home(self, **kw): + # Explicit route for standard Website Homepage + return request.render('website.homepage') diff --git a/addons/dine360_dashboard/data/branding_data.xml b/addons/dine360_dashboard/data/branding_data.xml new file mode 100644 index 0000000..d1ec9b2 --- /dev/null +++ b/addons/dine360_dashboard/data/branding_data.xml @@ -0,0 +1,15 @@ + + + + + web.base_title + Chennora + + + + + +1(647)856-2878 + + + + diff --git a/addons/dine360_dashboard/static/description/icon.png b/addons/dine360_dashboard/static/description/icon.png new file mode 100644 index 0000000..0ece662 Binary files /dev/null and b/addons/dine360_dashboard/static/description/icon.png differ diff --git a/addons/dine360_dashboard/static/src/css/home_menu.css b/addons/dine360_dashboard/static/src/css/home_menu.css new file mode 100644 index 0000000..b3e0fff --- /dev/null +++ b/addons/dine360_dashboard/static/src/css/home_menu.css @@ -0,0 +1,176 @@ +/* Main background */ +body.o_home_dashboard, +#wrapwrap.o_home_dashboard, +.o_home_menu_background { + background: linear-gradient(rgb(0 0 0 / 83%), rgb(0 0 0 / 83%)), + url('/dine360_dashboard/static/src/img/dashboard_bg.png') no-repeat center center !important; + background-size: cover !important; + background-attachment: fixed !important; + min-height: 100vh !important; + padding: 0 !important; + margin: 0 !important; + font-family: 'Inter', 'Segoe UI', Roboto, sans-serif !important; + position: relative !important; +} + +#wrapwrap.o_home_dashboard #wrap { + background: transparent !important; +} + +.o_apps { + display: flex !important; + flex-wrap: wrap !important; + justify-content: center !important; + gap: 40px 50px !important; + max-width: 1000px !important; + margin: 0 auto !important; + padding: 20px !important; +} + +.o_app { + display: flex !important; + flex-direction: column !important; + align-items: center !important; + text-decoration: none !important; + transition: transform 0.3s cubic-bezier(0.34, 1.56, 0.64, 1) !important; + width: 120px !important; +} + +.o_app_icon_container { + background: #ffffff !important; + width: 90px !important; + height: 90px !important; + display: flex !important; + align-items: center !important; + justify-content: center !important; + border-radius: 24px !important; + box-shadow: + 0 4px 6px -1px rgba(0, 0, 0, 0.05), + 0 2px 4px -1px rgba(0, 0, 0, 0.03) !important; + margin-bottom: 12px !important; + position: relative !important; + overflow: hidden; + border: 1px solid rgba(0, 0, 0, 0.03) !important; + transition: all 0.4s ease !important; +} + +.o_app:hover .o_app_icon_container { + transform: translateY(-10px) rotate(2deg) !important; + background: #ffffff !important; + border-bottom: 2px solid #d6111e !important; + box-shadow: + 0 20px 25px -5px rgba(214, 17, 30, 0.2), + 0 10px 10px -5px rgba(23, 20, 34, 0.1) !important; +} + +.o_app_icon_container::before { + content: ""; + --pos-accent-red: #d6111e; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: linear-gradient(135deg, rgba(255, 255, 255, 0.4) 0%, rgba(255, 255, 255, 0) 50%); + z-index: 1; +} + +.o_app_icon { + width: 56px !important; + height: 56px !important; + object-fit: contain !important; + z-index: 2; + transition: transform 0.3s ease !important; +} + +.o_app:hover .o_app_icon { + transform: scale(1.1) !important; +} + +.o_app_name { + color: #ffffff !important; + font-size: 14px !important; + font-weight: 500 !important; + text-align: center !important; + letter-spacing: -0.2px !important; + transition: color 0.3s ease !important; +} + +.o_app:hover .o_app_name { + color: #d6111e !important; + font-weight: 700 !important; +} + +.o_home_top_bar { + position: fixed !important; + top: 25px !important; + left: 0; + right: 0; + display: flex !important; + justify-content: center !important; + z-index: 1000 !important; +} + +.o_top_bar_island { + display: flex !important; + align-items: center !important; + gap: 12px !important; + padding: 10px 25px !important; + background: rgba(0, 0, 0, 0.9) !important; + backdrop-filter: blur(15px) !important; + -webkit-backdrop-filter: blur(15px); + border-radius: 50px !important; + border-color: #d6111e !important; + box-shadow: 0 0 0 3px rgba(214, 17, 30, 0.15) !important; + box-shadow: 0 12px 25px rgba(214, 17, 30, 0.3) !important; +} + +.o_top_item { + width: 40px; + height: 40px; + display: flex; + align-items: center; + justify-content: center; + color: #ffffff !important; + transition: all 0.3s ease; + cursor: pointer; + position: relative; + text-decoration: none !important; +} + +.o_top_item:hover { + color: #d6111e !important; + transform: translateY(-3px); +} + +.o_bar_divider { + width: 1px; + height: 24px; + background: rgba(255, 255, 255, 0.2); + margin: 0 10px; +} + +.o_ai_icon { + font-weight: 800; + color: #d6111e !important; +} + +.badge_dot { + position: absolute !important; + top: 8px; + right: 8px; + width: 8px; + height: 8px; + background: #d6111e !important; + border-radius: 50% !important; + border: 2px solid white !important; +} + +.o_user_avatar { + width: 35px !important; + height: 35px !important; + border-radius: 12px !important; + background: #d6111e !important; + color: white !important; + font-weight: bold !important; +} \ No newline at end of file diff --git a/addons/dine360_dashboard/static/src/css/login_style.css b/addons/dine360_dashboard/static/src/css/login_style.css new file mode 100644 index 0000000..1670d2e --- /dev/null +++ b/addons/dine360_dashboard/static/src/css/login_style.css @@ -0,0 +1,263 @@ +/* Container: Full Screen Split */ +.o_login_main_wrapper { + display: flex !important; + height: 100vh !important; + width: 100vw !important; + overflow: hidden; + background: url('/dine360_theme_chennora/static/src/img/chen-banner-2.webp') !important; + background-repeat: no-repeat !important; + background-position: center center !important; + background-size: cover !important; +} + +/* Left Side: Background Image and Branding */ +.o_login_left_side { + flex: 1.5 !important; + display: flex !important; + align-items: center !important; + justify-content: center !important; + padding: 60px !important; + position: relative; + /* Dark overlay on image for text readability */ + /* background: linear-gradient(rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.5)), + url('/dine360_dashboard/static/src/img/login_bg.png') no-repeat center center !important; + background-size: cover !important; */ + color: white !important; +} + +.o_login_content { + text-align: center; + max-width: 80%; +} + +.o_login_content h1 { + font-size: 3.8rem !important; + font-weight: 800 !important; + margin-bottom: 20px; + text-shadow: 2px 4px 15px rgba(0, 0, 0, 0.6) !important; +} + +.o_login_content p { + font-size: 1.4rem !important; + opacity: 0.9; +} + +/* Right Side: Form Section */ +.o_login_right_side { + flex: 1 !important; + /* background: #ffffff !important; */ + display: flex !important; + justify-content: center !important; + align-items: center !important; + padding: 40px !important; + position: relative; +} + +.o_login_card_wrapper { + width: 60% +} + +/* Glassmorphism Card UI */ +.o_login_card { + width: 100% !important; + max-width: 450px !important; + padding: 40px !important; + background: rgba(255, 255, 255, 0.05) !important; + backdrop-filter: blur(15px) !important; + -webkit-backdrop-filter: blur(15px) !important; + border-radius: 20px !important; + box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5) !important; + border: 1px solid rgba(255, 255, 255, 0.1) !important; + z-index: 2; +} + +/* Header Text Gradient */ +.o_login_header_text h3 { + font-size: 2rem !important; + font-weight: 800 !important; + margin-bottom: 10px; + color: #d6111e !important; +} + +/* Logo */ +.o_login_logo_container { + text-align: center; + margin-bottom: 30px; +} + +.o_login_logo_container img { + max-height: 120px; + /* Larger logo */ + width: auto; + filter: drop-shadow(0 0 10px rgba(255, 255, 255, 0.2)); +} + +/* Form Inputs */ +.form-control:focus { + border-color: #FECD4F !important; + box-shadow: 0 0 0 3px rgba(254, 205, 79, 0.2) !important; + background: #ffffff !important; +} + +.o_login_form_container label { + color: #ffffff !important; + margin-bottom: 8px; + font-weight: 500; +} + +.o_login_form_container a, +.o_login_form_container .btn-link { + color: #ffffff !important; +} + +.form-control { + background: rgba(255, 255, 255, 0.05) !important; + border: 1px solid rgba(255, 255, 255, 0.1) !important; + border-radius: 12px !important; + padding: 12px 15px !important; + height: auto !important; + color: white !important; +} + +.form-control::placeholder { + color: rgba(255, 255, 255, 0.3) !important; +} + +/* Login Button with Gradient */ +.oe_login_buttons .btn-primary { + background: #FECD4F !important; + border: none !important; + border-radius: 12px !important; + padding: 14px !important; + font-weight: 700 !important; + font-size: 1rem !important; + color: #04121D !important; + width: 100% !important; + transition: all 0.3s ease !important; + box-shadow: 0 4px 15px rgba(254, 205, 79, 0.3) !important; +} + +.oe_login_buttons .btn-primary:hover { + background: #04121D !important; + color: #FECD4F !important; + transform: translateY(-2px); + box-shadow: 0 8px 20px rgba(254, 205, 79, 0.4) !important; +} + + +/* Responsive Handling */ +@media (max-width: 992px) { + .o_login_main_wrapper { + flex-direction: column; + } + + .o_login_left_side { + display: none !important; + } + + .o_login_right_side { + background: #0f172a !important; + /* Keep dark background on mobile */ + } +} + +/* Hide Website Header/Footer ONLY on Login, Signup, Reset Password */ +body.o_custom_login_body header, +body.o_custom_login_body footer, +body.o_custom_login_body .o_footer_copyright, +body.o_custom_login_body #o_main_nav, +body.o_custom_login_body .o_header_standard, +body.o_custom_login_body #wrapwrap>header, +body.o_custom_login_body #wrapwrap>footer { + display: none !important; + height: 0 !important; + width: 0 !important; + visibility: hidden !important; + opacity: 0 !important; + position: absolute !important; + pointer-events: none !important; +} + +/* Ensure wrapwrap doesn't have padding/margin from header on these pages */ +body.o_custom_login_body #wrapwrap { + padding-top: 0 !important; + margin-top: 0 !important; +} + +/* Ensure the wrapper covers the entire screen, ignoring website container constraints */ +body.o_custom_login_body .o_login_main_wrapper { + position: fixed !important; + top: 0; + left: 0; + width: 100vw !important; + height: 100vh !important; + z-index: 9999; + /* Ensure it stays on top */ + margin: 0 !important; + padding: 0 !important; +} + +/* Custom Footer */ +.o_login_footer_custom { + position: absolute; + bottom: 0; + right: 0; + width: 50%; + /* Only on the right side which is 50% usually, or just right side */ + text-align: center; + padding: 15px; + background: transparent; + color: #6c757d; + z-index: 10; + font-size: 0.9rem; +} + +@media (max-width: 992px) { + .o_login_footer_custom { + width: 100%; + color: white; + /* Visible on gradient background */ + } +} + +.o_login_footer_custom a { + color: #d6111e; + text-decoration: none; + font-weight: 600; +} + +.o_login_footer_custom a:hover { + color: #171422; +} + + +/* website login screen */ +.oe_website_login_container { + display: flex !important; + justify-content: center !important; + align-items: center !important; + height: 100vh !important; + /* width: 100vw !important; */ + overflow: hidden !important; + background: linear-gradient(rgba(0, 0, 0, 0.6), rgba(0, 0, 0, 0.6)), url('/dine360_theme_chennora/static/src/img/chen-banner-2.webp') no-repeat center center !important; + background-size: cover !important; +} + +.oe_website_login_container .oe_login_form, +.oe_website_login_container .oe_signup_form, +.oe_website_login_container .oe_reset_password_form { + width: 60% !important; + padding: 40px !important; + background: rgba(255, 255, 255, 0.05) !important; + backdrop-filter: blur(15px) !important; + -webkit-backdrop-filter: blur(15px) !important; + border-radius: 20px !important; + box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5) !important; + border: 1px solid rgba(255, 255, 255, 0.1) !important; + z-index: 2; + max-width: 400px; +} +.oe_website_login_container label, +.oe_website_login_container a { + color: #ffffff !important; +} diff --git a/addons/dine360_dashboard/static/src/css/pos_style.css b/addons/dine360_dashboard/static/src/css/pos_style.css new file mode 100644 index 0000000..b8a4e99 --- /dev/null +++ b/addons/dine360_dashboard/static/src/css/pos_style.css @@ -0,0 +1,302 @@ +/* ======================================== + CHENNORA RUSH MODE - POS THEME (ULTRA PREMIUM) + ======================================== */ + +:root { + --pos-primary: #171422; + /* Secondary Dark */ + --pos-secondary: #d6111e; + /* Main Teal */ + --pos-accent-orange: #e66421; + /* Biryani Orange */ + --pos-accent-gold: #cc9900; + /* Tandoor Gold */ + --pos-accent-red: #d6111e; + /* Main Teal */ + --pos-bg-main: #f8fafc; + /* Ultra light gray */ + --pos-card-dark: #1a1d23; + /* Dark Card Background */ + --pos-text-light: #ffffff; + --pos-text-dark: #111827; + --border-radius-xl: 24px; + --border-radius-lg: 16px; +} + +/* 1. Main POS Layout Swapping */ +/* Standard Odoo: Leftpane = Cart, Rightpane = Products */ +/* Goal: Food List on Left, Orders/Calculations on Right */ +/* .pos .pos-content, +.pos .product-screen { + display: flex !important; + flex-direction: row-reverse !important; */ +/* SWAP Panes */ +/* height: calc(100vh - 85px) !important; +} */ + +.pos .leftpane, +.pos .order-container { + /* The Cart Section - Move to Right */ + width: 480px !important; + border-left: 2px solid #f1f5f9 !important; + border-right: none !important; + background: #ffffff !important; + display: flex !important; + flex-direction: column !important; + flex: none !important; + height: 37.9vh !important; +} + +.product-screen { + display: flex !important; + flex-direction: row-reverse !important; +} + +.pos .rightpane, +.pos .product-list-container { + /* The Product Section - Move to Left */ + flex: 1 !important; + background: #f8fafc !important; +} + +/* 2. Header & Branding */ +.pos .pos-topheader { + background: #171422 !important; + border-bottom: 2px solid #d6111e !important; + color: #fff !important; + height: 85px !important; + display: flex !important; + align-items: center !important; + padding: 0 30px !important; +} + +/* Logo from Odoo Settings */ +.pos .pos-logo { + display: flex !important; + align-items: center !important; + gap: 15px !important; + margin-right: 50px !important; + width: auto !important; +} + +.pos .pos-logo img, +.pos .pos-logo { + content: url('/web/binary/company_logo') !important; + height: 55px !important; + width: auto !important; + object-fit: contain !important; +} + +/* "Rush Mode" Label next to logo */ +.pos .pos-logo::after { + content: "RUSH MODE"; + font-size: 14px; + font-weight: 800; + color: #ef4444; + letter-spacing: 2px; + border-left: 2px solid #e5e7eb; + padding-left: 20px; + margin-left: 10px; +} + +/* 3. Search Bar - Teal Theme */ +.pos .search-bar { + background: #e0f2f1 !important; + border-radius: var(--border-radius-lg) !important; + margin: 0 !important; + width: 380px !important; + height: 50px !important; + display: flex !important; + align-items: center !important; + padding: 0 20px !important; +} + +.pos .search-bar input { + background: transparent !important; + border: none !important; + font-weight: 800 !important; + color: #00695c !important; + font-size: 16px !important; + text-transform: uppercase !important; +} + +/* 4. Category Bar - Fix Truncation */ +.pos .category-list { + display: flex !important; + gap: 12px !important; + padding: 15px 30px !important; + background: #ffffff !important; + border-bottom: 2px solid #f1f5f9 !important; +} + +.pos .category-button { + border-radius: var(--border-radius-lg) !important; + font-weight: 900 !important; + text-transform: uppercase !important; + padding: 12px 30px !important; + font-size: 14px !important; + border: none !important; + min-width: 140px !important; + /* STOP MAI... truncation */ + white-space: nowrap !important; + background: #f1f5f9 !important; + color: #475569 !important; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05) !important; +} + +.pos .category-button.active { + background: #d6111e !important; + color: #ffffff !important; +} + +/* Dynamic Colors for specific indexes */ +.pos .category-button:nth-child(2) { + background: var(--pos-accent-orange) !important; + color: white !important; +} + +.pos .category-button:nth-child(3) { + background: var(--pos-accent-gold) !important; + color: white !important; +} + +/* 5. Product Cards - Dark Premium */ +.pos .product-list-container { + background: #f8fafc !important; +} + +.pos .product-list { + display: flex !important; + flex-wrap: wrap !important; + padding: 25px !important; + gap: 25px !important; +} + +.pos .product { + background: #171422 !important; + border-radius: var(--border-radius-lg) !important; + width: 210px !important; + height: 230px !important; + flex: 0 0 auto !important; + flex-shrink: 0 !important; + border: none !important; + box-shadow: 0 2px 4px rgba(42, 106, 126, 0.05) !important; + transition: all 0.3s ease !important; + position: relative !important; + overflow: hidden !important; +} + +.pos .product:hover { + transform: translateY(-8px) scale(1.02) !important; +} + +.pos .product .product-img { + width: 100% !important; + height: 150px !important; + object-fit: cover !important; +} + +.product-img img { + width: 100% !important; + height: 100% !important; + /* object-fit: cover !important; */ +} + +.pos .product .product-name { + color: #ffffff !important; + font-size: 16px !important; + font-weight: 700 !important; + padding: 12px 15px 5px 15px !important; + background: transparent !important; +} + +.pos .product .price-tag { + background: transparent !important; + color: #ffffff !important; + font-size: 15px !important; + font-weight: 600 !important; + position: relative !important; + bottom: 5px !important; + left: 15px !important; + top: auto !important; + right: auto !important; + padding: 0 !important; +} + +/* 6. Order (Cart) Styling - Now on Right */ +.pos .order-container { + background: #ffffff !important; + padding: 10px 0 !important; +} + +.pos .orderline { + border-radius: var(--border-radius-lg) !important; + border: 2px solid #f1f5f9 !important; + margin: 8px 20px !important; + padding: 15px !important; + background: white !important; + transition: all 0.2s ease !important; +} + +.pos .orderline.selected { + border: 2px solid var(--pos-secondary) !important; + background: #f0fdf4 !important; + box-shadow: 0 4px 12px rgba(16, 185, 129, 0.1) !important; +} + +.pos .orderline .product-name { + font-weight: 900 !important; + font-size: 17px !important; + color: #111827 !important; +} + +/* 7. Summary & Pay Button */ +.pos .order-summary { + background: #ffffff !important; + padding: 25px 30px !important; + border-top: 2px dashed #e2e8f0 !important; +} + +.pos .summary .total { + color: var(--pos-secondary) !important; + font-size: 40px !important; + font-weight: 900 !important; + letter-spacing: -1px; +} + +.pos .action-pad .button.pay { + background: var(--pos-secondary) !important; + color: white !important; + border-radius: var(--border-radius-lg) !important; + margin: 20px !important; + height: 75px !important; + font-size: 24px !important; + font-weight: 900 !important; + text-transform: uppercase !important; + display: flex !important; + align-items: center !important; + justify-content: center !important; + box-shadow: 0 12px 25px rgba(214, 17, 30, 0.3) !important; + border: none !important; +} + +.pos .action-pad .button.pay::after { + content: "\2794"; + margin-left: 15px; + font-size: 30px; +} + +/* 8. Numpad styling */ +.pos .numpad { + background: #f8fafc !important; + padding: 20px !important; +} + +.pos .numpad button { + border-radius: 12px !important; + border: 1px solid #e2e8f0 !important; + background: white !important; + height: 55px !important; + font-weight: 700 !important; + font-size: 14px !important; +} \ No newline at end of file diff --git a/addons/dine360_dashboard/static/src/css/shop_style.css b/addons/dine360_dashboard/static/src/css/shop_style.css new file mode 100644 index 0000000..f7f750e --- /dev/null +++ b/addons/dine360_dashboard/static/src/css/shop_style.css @@ -0,0 +1,312 @@ +/* ======================================== + SHOP PAGE - LEFT SIDEBAR FILTER STYLING + ======================================== */ + +/* Ensure Shop Page Layout with Sidebar */ +#wrapwrap.oe_website_sale { + background: #ffffff !important; +} + +/* Main Shop Container - Two Column Layout */ +.oe_website_sale #products_grid_before { + display: block !important; + visibility: visible !important; + opacity: 1 !important; + width: 100% !important; +} + +/* Left Sidebar Filter Section */ +.oe_website_sale #o_shop_collapse_category, +.oe_website_sale .o_wsale_products_searchbar_form, +.oe_website_sale #wsale_products_categories_collapse { + display: block !important; + visibility: visible !important; + opacity: 1 !important; +} + +/* Shop Layout Container */ +.oe_website_sale .container, +.oe_website_sale .container-fluid { + max-width: 1400px; + margin: 0 auto; + padding: 20px; +} + +/* Row with Sidebar and Products */ +.oe_website_sale .row { + display: flex !important; + flex-wrap: wrap; +} + +/* Left Sidebar Column (Categories/Filters) */ +.oe_website_sale #products_grid_before, +.oe_website_sale .col-lg-3, +.oe_website_sale aside { + flex: 0 0 280px !important; + max-width: 280px !important; + display: block !important; + visibility: visible !important; + padding-right: 20px; +} + +/* Right Products Column */ +.oe_website_sale #products_grid, +.oe_website_sale .col-lg-9 { + flex: 1 !important; + max-width: calc(100% - 280px) !important; +} + +/* Filter Sidebar Styling */ +.oe_website_sale #products_grid_before { + background: rgba(255, 255, 255, 0.95) !important; + border-radius: 16px !important; + padding: 20px !important; + box-shadow: 0 10px 30px rgba(0, 0, 0, 0.08) !important; + backdrop-filter: blur(10px); + border: 1px solid rgba(0, 0, 0, 0.05); +} + +/* Category Filter Section */ +.oe_website_sale .o_wsale_products_searchbar_form, +.oe_website_sale #wsale_products_categories_collapse { + margin-bottom: 25px; +} + +/* Category Filter Title */ +.oe_website_sale #products_grid_before h5, +.oe_website_sale #products_grid_before .h5, +.oe_website_sale #products_grid_before h6 { + color: var(--secondary-color, #2BB1A5) !important; + font-weight: 700 !important; + font-size: 1.1rem !important; + margin-bottom: 15px !important; + text-transform: uppercase; + letter-spacing: 0.5px; +} + +/* Category List Items */ +.oe_website_sale #products_grid_before ul, +.oe_website_sale #products_grid_before .list-group { + list-style: none; + padding: 0; + margin: 0; +} + +.oe_website_sale #products_grid_before li, +.oe_website_sale #products_grid_before .list-group-item { + background: transparent !important; + border: none !important; + padding: 10px 15px !important; + margin-bottom: 5px !important; + border-radius: 10px !important; + transition: all 0.2s ease !important; +} + +.oe_website_sale #products_grid_before li a, +.oe_website_sale #products_grid_before .list-group-item a { + color: #4a5568 !important; + text-decoration: none !important; + font-weight: 500 !important; + display: block; + width: 100%; +} + +.oe_website_sale #products_grid_before li:hover, +.oe_website_sale #products_grid_before .list-group-item:hover { + background: #2bb1a5 !important; + transform: translateX(5px); +} + +.oe_website_sale #products_grid_before li:hover a, +.oe_website_sale #products_grid_before .list-group-item:hover a { + color: #ffffff !important; +} + +/* Active Category */ +.oe_website_sale #products_grid_before li.active, +.oe_website_sale #products_grid_before .list-group-item.active { + background: transparent !important; + box-shadow: none !important; +} + +.oe_website_sale #products_grid_before li.active a, +.oe_website_sale #products_grid_before .list-group-item.active a { + color: #000000 !important; + font-weight: 700 !important; +} + +/* Search Bar in Sidebar */ +.oe_website_sale #products_grid_before .form-control, +.oe_website_sale #products_grid_before input[type="text"], +.oe_website_sale #products_grid_before input[type="search"] { + border-radius: 10px !important; + border: 1px solid #e2e8f0 !important; + padding: 10px 15px !important; + background: #f8f9fa !important; + transition: all 0.2s ease; +} + +.oe_website_sale #products_grid_before .form-control:focus, +.oe_website_sale #products_grid_before input:focus { + border-color: var(--secondary-color, #2BB1A5) !important; + background: #ffffff !important; + box-shadow: 0 0 0 3px rgba(43, 177, 165, 0.15) !important; + outline: none; +} + +/* Filter Buttons */ +.oe_website_sale #products_grid_before .btn, +.oe_website_sale #products_grid_before button { + border-radius: 10px !important; + padding: 8px 20px !important; + font-weight: 600 !important; + transition: all 0.2s ease; +} + +.oe_website_sale #products_grid_before .btn-primary { + background: #2BB1A5 !important; + border: none !important; + color: #ffffff !important; + box-shadow: 0 4px 12px rgba(43, 177, 165, 0.3) !important; +} + +.oe_website_sale #products_grid_before .btn-primary:hover { + transform: translateY(-2px); + box-shadow: 0 8px 15px rgba(43, 177, 165, 0.4) !important; +} + +/* Attribute Filters (Color, Size, etc.) */ +.oe_website_sale #products_grid_before .css_attribute_color { + display: inline-block; + width: 30px; + height: 30px; + border-radius: 50%; + margin: 5px; + border: 2px solid #e2e8f0; + cursor: pointer; + transition: all 0.2s ease; +} + +.oe_website_sale #products_grid_before .css_attribute_color:hover, +.oe_website_sale #products_grid_before .css_attribute_color.active { + border-color: var(--secondary-color, #2BB1A5); + transform: scale(1.1); + box-shadow: 0 2px 8px rgba(43, 177, 165, 0.3); +} + +/* Price Range Filter */ +.oe_website_sale #products_grid_before .o_wsale_price_filter { + margin-top: 20px; +} + +.oe_website_sale #products_grid_before .o_wsale_price_filter input[type="range"] { + width: 100%; + accent-color: var(--secondary-color, #2BB1A5); +} + +/* Collapse/Expand Buttons */ +.oe_website_sale #products_grid_before .btn-link { + color: var(--secondary-color, #2BB1A5) !important; + text-decoration: none !important; + font-weight: 600 !important; +} + +.oe_website_sale #products_grid_before .btn-link:hover { + color: var(--primary-color, #171422) !important; +} + +/* Mobile Responsive */ +@media (max-width: 991px) { + + .oe_website_sale #products_grid_before, + .oe_website_sale .col-lg-3, + .oe_website_sale aside { + flex: 0 0 100% !important; + max-width: 100% !important; + margin-bottom: 20px; + padding-right: 0; + } + + .oe_website_sale #products_grid, + .oe_website_sale .col-lg-9 { + flex: 0 0 100% !important; + max-width: 100% !important; + } +} + +/* Ensure visibility of all filter elements */ +.oe_website_sale .o_wsale_products_searchbar_form, +.oe_website_sale .o_wsale_products_categories, +.oe_website_sale #wsale_products_categories_collapse, +.oe_website_sale .o_wsale_products_attributes, +.oe_website_sale .o_wsale_products_price { + display: block !important; + visibility: visible !important; + opacity: 1 !important; +} + +/* Category Navigation */ +.oe_website_sale .o_wsale_products_categories ul.o_wsale_categories_list { + padding-left: 0 !important; +} + +.oe_website_sale .o_wsale_products_categories ul.o_wsale_categories_list li { + list-style: none; +} + +/* Attribute Filters Section */ +.oe_website_sale .o_wsale_products_attributes { + margin-top: 20px; +} + +.oe_website_sale .o_wsale_products_attributes .o_wsale_attribute { + margin-bottom: 20px; +} + +.oe_website_sale .o_wsale_products_attributes .o_wsale_attribute label { + display: block; + margin-bottom: 10px; + color: #4a5568; + font-weight: 500; +} + +/* Clear Filters Button */ +.oe_website_sale .o_wsale_clear_filters { + margin-top: 20px; + width: 100%; +} + +.oe_website_sale .o_wsale_clear_filters .btn { + width: 100%; + background: #f8f9fa !important; + border: 1px solid #e2e8f0 !important; + color: #4a5568 !important; +} + +.oe_website_sale .o_wsale_clear_filters .btn:hover { + background: #ffffff !important; + border-color: var(--secondary-color, #2BB1A5) !important; + color: var(--secondary-color, #2BB1A5) !important; +} + +.css_quantity input { + max-width: 20px !important; +} + +/* Product Details Quantity Input Fix */ +.css_quantity input.quantity { + color: #000000 !important; + background-color: #ffffff !important; + opacity: 1 !important; + width: 60px !important; + max-width: 60px !important; + height: 45px !important; + line-height: 45px !important; + font-weight: 600 !important; + font-size: 18px !important; + padding: 0 !important; + text-align: center !important; + border: 1px solid #000000 !important; + display: inline-block !important; + visibility: visible !important; +} \ No newline at end of file diff --git a/addons/dine360_dashboard/static/src/css/theme_variables.css b/addons/dine360_dashboard/static/src/css/theme_variables.css new file mode 100644 index 0000000..e8b8774 --- /dev/null +++ b/addons/dine360_dashboard/static/src/css/theme_variables.css @@ -0,0 +1,599 @@ +/* ======================================== + ODOO THEME COLOR VARIABLES + Primary Color: #ec0000 (Dine360 Red) + Secondary Color: #000000 (Black) + ======================================== */ + +:root { + /* Primary Brand Colors */ + --primary-color: #d6111e; + --primary-dark: #8B0A0E; + --primary-light: #E57373; + --primary-lighter: #FFCDD2; + + /* Secondary/Accent Color */ + --secondary-color: #171422; + --secondary-dark: #000000; + --secondary-light: #2d293d; + + /* Gradient Combinations Removed - Using Solid Colors */ + --gradient-primary: #d6111e; + --gradient-primary-hover: #8B0A0E; + + /* Home Page Background */ + --bg-gradient-main: #ffffff; + + /* UI Element Colors */ + --btn-primary-bg: #d6111e; + --link-color: #171422; + --link-hover: #d6111e; + + /* Status Colors */ + --success-color: #171422; + --warning-color: #FECD4F; + --danger-color: #d6111e; + --info-color: #2d293d; + + /* Shadows */ + --shadow-primary: 0 4px 15px rgba(214, 17, 30, 0.2); + --shadow-primary-hover: 0 8px 20px rgba(214, 17, 30, 0.3); + --shadow-card: 0 10px 30px rgba(23, 20, 34, 0.08); +} + +/* ::selection - Text Selection Color */ +::selection { + background: var(--primary-color) !important; + color: #fff !important; +} + +/* Scrollbar Styling (Webkit) */ +::-webkit-scrollbar-thumb { + background: var(--secondary-color) !important; + border-radius: 10px; +} + +::-webkit-scrollbar-track { + background: #f1f1f1; +} + +/* --------------------------------------------------------- + GLOBAL UI OVERRIDES (HOME PAGE STYLE) + --------------------------------------------------------- */ + +/* Global Background & Font */ +body, +.o_web_client { + background: var(--bg-gradient-main) !important; + font-family: 'Inter', 'Segoe UI', Roboto, sans-serif !important; + font-size: 15px !important; + /* Increased Font Size for Readability */ + background-attachment: fixed !important; + background-size: cover !important; +} + +/* + REMOVED AGGRESSIVE LAYOUT OVERRIDES + (o_action_manager, o_view_controller overrides deleted to restore Odoo default structural behavior) +*/ + +/* --------------------------------------------------------- + NAVBAR & SIDEBAR (CONTROL PANEL) + --------------------------------------------------------- */ + +/* Top Navbar - Glassmorphism */ +.o_main_navbar { + background: #ffffff !important; + border-bottom: 2px solid var(--primary-color) !important; + box-shadow: 0 4px 15px rgba(0, 0, 0, 0.03) !important; + color: #2c3e50 !important; +} + +.o_main_navbar .o_menu_brand { + color: var(--secondary-color) !important; + font-weight: 800 !important; + font-size: 1.4rem !important; + letter-spacing: -0.5px; +} + +.o_main_navbar .o_menu_sections .o_nav_entry, +.o_main_navbar .o_menu_systray .o_nav_entry { + color: white !important; + font-size: 14px !important; + font-weight: 600 !important; +} + +.o_main_navbar .o_menu_sections .o_nav_entry:hover, +.o_main_navbar .o_menu_systray .o_nav_entry:hover { + background: var(--primary-color) !important; +} + +/* Control Panel (Search, Filter Bar) */ +.o_control_panel { + background: #fdfdfd !important; + border-bottom: 1px solid rgba(0, 0, 0, 0.05) !important; +} + +/* Breadcrumbs */ +.breadcrumb-item a { + color: #d6111e !important; + font-weight: 700 !important; + font-size: 18px !important; + /* Larger headers */ +} + +.breadcrumb-item.active { + color: #718096 !important; + font-weight: 600 !important; + font-size: 18px !important; +} + +/* Search Bar Input */ +.o_searchview { + background: #f8f9fa !important; + border: 1px solid #e2e8f0 !important; + border-radius: 10px !important; + padding: 6px 15px !important; +} + +.o_searchview .o_searchview_input { + background: transparent !important; + font-size: 14px !important; +} + +/* --------------------------------------------------------- + TABLES (LIST VIEW) + --------------------------------------------------------- */ + +.o_list_view .o_list_table { + background: transparent !important; +} + +/* Table Header */ +.o_list_view .o_list_table thead { + background: rgba(248, 249, 250, 0.8) !important; + color: #4a5568 !important; + border-bottom: 2px solid var(--secondary-color) !important; +} + +.o_list_view .o_list_table thead th { + border: none !important; + text-transform: uppercase; + font-size: 0.75rem; + letter-spacing: 0.05em; + font-weight: 700 !important; + padding: 12px 10px !important; +} + +/* Table Rows */ +.o_list_view .o_list_table tbody tr.o_data_row { + transition: all 0.2s ease !important; + border-bottom: 1px solid rgba(0, 0, 0, 0.03) !important; +} + +.o_list_view .o_list_table tbody tr.o_data_row:hover { + background-color: rgba(214, 17, 30, 0.05) !important; + /* Light Red Hover */ + transform: scale(1.002); + box-shadow: 0 4px 10px rgba(0, 0, 0, 0.02); +} + +/* --------------------------------------------------------- + KANBAN CARDS + --------------------------------------------------------- */ + +.o_kanban_view .o_kanban_record { + background: #fff !important; + border: 1px solid rgba(0, 0, 0, 0.04) !important; + border-radius: 16px !important; + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.02) !important; + margin-bottom: 10px !important; + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1) !important; + overflow: hidden; +} + +/* Hover Effect for Cards */ +.o_kanban_view .o_kanban_record:hover { + transform: translateY(-5px) !important; + box-shadow: 0 15px 30px rgba(0, 0, 0, 0.08) !important; + border-color: var(--primary-color) !important; +} + +/* Card Header/Title */ +.o_kanban_record .o_kanban_record_title, +.o_kanban_record strong { + color: #2d3748 !important; + font-weight: 700 !important; + font-size: 1.05rem !important; +} + +/* Kanban Group Headers */ +.o_kanban_view .o_kanban_group_header { + background: transparent !important; +} + +/* --------------------------------------------------------- + BUTTONS & FORM ELEMENTS + --------------------------------------------------------- */ + +/* Gradient Buttons */ +.btn-primary, +.o_form_button_save, +.o_form_button_create { + background: var(--gradient-primary) !important; + border: none !important; + border-radius: 10px !important; + padding: 8px 20px !important; + font-weight: 600 !important; + letter-spacing: 0.3px; + box-shadow: 0 4px 12px rgba(214, 17, 30, 0.3) !important; + color: #fff !important; +} + +.btn-primary:hover, +.o_form_button_save:hover, +.o_form_button_create:hover { + background: var(--gradient-primary-hover) !important; + transform: translateY(-2px); + box-shadow: 0 8px 15px rgba(214, 17, 30, 0.4) !important; +} + +/* Secondary Buttons */ +.btn-secondary { + background: #fff !important; + border: 1px solid #e2e8f0 !important; + color: #4a5568 !important; + border-radius: 10px !important; +} + +.btn-secondary:hover { + background: #f7fafc !important; + color: var(--secondary-color) !important; + border-color: var(--secondary-color) !important; +} + +/* Form Inputs */ +.o_form_view .o_input { + border-radius: 8px !important; + border: 1px solid #e2e8f0 !important; + padding: 8px 12px !important; + background-color: #fcfcfc !important; +} + +.o_form_view .o_input:focus { + border-color: var(--secondary-color) !important; + background-color: #fff !important; + box-shadow: 0 0 0 3px rgba(214, 17, 30, 0.15) !important; +} + +/* --------------------------------------------------------- + COMPONENT OVERRIDES + --------------------------------------------------------- */ + +/* Primary Buttons */ +.btn-primary, +.o_form_button_save, +.o_form_button_create, +.o_button_import { + background: var(--gradient-primary) !important; + border: none !important; + border-radius: 10px !important; + padding: 8px 20px !important; + font-weight: 600 !important; + letter-spacing: 0.3px; + box-shadow: 0 4px 12px rgba(214, 17, 30, 0.3) !important; +} + +.btn-primary:hover, +.o_form_button_save:hover, +.o_form_button_create:hover, +.o_button_import:hover { + background: var(--gradient-primary-hover) !important; + transform: translateY(-2px); + box-shadow: 0 8px 15px rgba(214, 17, 30, 0.4) !important; +} + +/* --------------------------------------------------------- + DASHBOARD SPECIFIC UI UPDATES (But safer for global) + --------------------------------------------------------- */ + +/* Top Menu Tabs */ +.o_main_navbar .o_menu_sections .dropdown-item, +.o_main_navbar .o_menu_sections .o_nav_entry { + background: transparent !important; + color: var(--primary-color) !important; + font-weight: 600 !important; + border-radius: 8px !important; + margin: 0 4px !important; +} + +/* Active Tab / Hover State */ +.o_main_navbar .o_menu_sections .o_nav_entry:hover, +.o_main_navbar .o_menu_sections .show .dropdown-toggle { + background-color: #ffffff !important; + /* Yellow Active Background */ + color: #d6111e !important; + border-bottom: 2px solid #d6111e !important; +} + +/* Dashboard Sidebar (Finance/Logistics) */ +.o_notebook .nav.nav-tabs, +.o_dashboard_view .o_group_selector { + background: rgba(255, 255, 255, 0.6) !important; + backdrop-filter: blur(10px); + border-right: 1px solid rgba(0, 0, 0, 0.05); + padding: 15px !important; +} + +.o_notebook .nav-link, +.o_dashboard_view .o_group_selector li { + color: var(--secondary-color) !important; + /* Teal Text */ + border: none !important; + border-radius: 10px !important; + margin-bottom: 8px !important; + padding: 10px 15px !important; + font-weight: 500 !important; + transition: all 0.2s ease; +} + +.o_notebook .nav-link.active, +.o_dashboard_view .o_group_selector li.selected { + background: var(--gradient-primary) !important; + color: #fff !important; + box-shadow: 0 4px 10px rgba(214, 17, 30, 0.3) !important; +} + +/* Dashboard KPI Cards (Invoiced, Average Invoice, DSO) */ +.o_dashboard_view .o_group .o_aggregate, +.o_group .o_group_col_6 { + background: #fff !important; + border-radius: 15px !important; + padding: 20px !important; + box-shadow: 0 5px 20px rgba(0, 0, 0, 0.05) !important; + border: 1px solid rgba(0, 0, 0, 0.02) !important; + transition: transform 0.3s ease !important; + margin-bottom: 20px !important; +} + +.o_dashboard_view .o_group .o_aggregate:hover { + transform: translateY(-5px) !important; + box-shadow: 0 10px 25px rgba(214, 17, 30, 0.15) !important; + border-color: var(--secondary-color) !important; +} + +/* Value Text in Cards */ +.o_dashboard_view .o_group .o_aggregate .o_value { + color: var(--secondary-color) !important; + font-weight: 800 !important; + font-size: 2rem !important; +} + +.o_dashboard_view .o_group .o_aggregate label { + color: #718096 !important; + font-size: 0.9rem !important; + text-transform: uppercase; + letter-spacing: 1px; +} + +/* Charts Background */ +.o_graph_view { + background: transparent !important; +} + +.o_graph_canvas_container canvas { + background: rgba(255, 255, 255, 0.5) !important; + border-radius: 15px; + padding: 10px; +} + +/* Links */ +a, +.o_form_uri, +.oe_link, +.btn-link { + color: var(--secondary-color) !important; + /* Switched to teal for better readibility on white */ +} + +a:hover, +.o_form_uri:hover, +.oe_link:hover, +.btn-link:hover { + color: var(--primary-dark) !important; +} + +/* Nav & Menu Active States */ +.nav-link.active, +.o_menu_sections .dropdown-item.active, +.o_menu_brand:hover { + color: var(--secondary-color) !important; + border-bottom-color: var(--secondary-color) !important; +} + +/* Badges */ +.badge-primary, +.o_tag { + background-color: var(--primary-color) !important; + color: #fff !important; +} + +/* Progress bars */ +.progress-bar { + background-color: var(--secondary-color) !important; +} + +/* Checkboxes and Radios */ +.custom-control-input:checked~.custom-control-label::before, +.o_checkbox input:checked+label::before { + background-color: var(--secondary-color) !important; + border-color: var(--secondary-color) !important; +} + +/* Form Controls - Focus using Secondary (Teal) like Login Page */ +.form-control:focus, +.o_input:focus, +.o_searchview_input:focus { + border-color: var(--secondary-color) !important; + box-shadow: 0 0 0 0.2rem rgba(214, 17, 30, 0.25) !important; +} + +/* Loading Bar */ +.o_loading { + background-color: var(--primary-color) !important; +} + +/* Backend View Headers */ +.o_list_view .o_list_table thead, +.o_kanban_view .o_kanban_group_header { + background-color: #f8f9fa; + border-bottom: 2px solid var(--primary-color) !important; + color: #4a5568 !important; + font-weight: 600 !important; + padding: 10px !important; +} + +/* Kanban Records Selected */ +.o_kanban_record.o_kanban_record_selected { + box-shadow: 0 0 0 2px var(--primary-color) !important; +} + +/* Pagination */ +.page-item.active .page-link { + background-color: var(--secondary-color) !important; + border-color: var(--secondary-color) !important; +} + +/* Switcher/Toggle */ +.o_switch.custom-switch .custom-control-input:checked~.custom-control-label::before { + background-color: var(--secondary-color) !important; +} + +/* Calendar Today */ +.fc-day-today { + background-color: rgba(254, 205, 79, 0.1) !important; +} + +/* --------------------------------------------------------- + HEADER SUBMENU DROPDOWN NAVIGATION + --------------------------------------------------------- */ + +/* Dropdown Container */ +.dropdown-menu { + background: #ffffff !important; + border: 1px solid #e2e8f0 !important; + border-radius: 12px !important; + box-shadow: 0 20px 50px rgba(0, 0, 0, 0.15) !important; + padding: 8px !important; + margin-top: 5px !important; + z-index: 10000 !important; + /* Raised to be above most backend elements */ +} + +/* Fix for Dropdowns being hidden in List Views (Editable rows) */ +.o_list_view .o_list_table { + overflow: visible !important; +} + +.o_list_view .o_list_table tbody tr, +.o_list_view .o_list_table tbody td { + overflow: visible !important; +} + +/* Ensure Autocomplete stays in front */ +.ui-autocomplete, +.o_autocomplete_dropdown, +.dropdown-menu.show { + z-index: 10001 !important; +} + + +.o_main_navbar .o_menu_sections .o_nav_entry.active, +.o_main_navbar .o_menu_sections .dropdown-toggle { + background-color: none !important; +} + + +.o_main_navbar .o_menu_sections .o_nav_entry.active, +.o_main_navbar .o_menu_sections .dropdown-toggle.active { + background-color: var(--primary-color) !important; +} + +.o_main_navbar .o_menu_brand, +.o_main_navbar .o_navbar_apps_menu .dropdown-toggle, +.o_main_navbar .o_nav_entry, +.o_main_navbar .dropdown-toggle { + color: var(--secondary-color) !important; + font-size: 1.1rem !important; + transition: all 0.2s ease !important; +} + +/* Navbar Icons */ +.o_main_navbar .o_menu_systray .o_nav_entry i, +.o_main_navbar .o_menu_apps .o_app_drawer i, +.o_main_navbar .o_menu_sections .fa { + color: var(--secondary-color) !important; + font-size: 1.1rem !important; + transition: all 0.2s ease !important; +} + +.o_main_navbar .o_menu_systray .o_nav_entry:hover i, +.o_main_navbar .o_menu_apps .o_app_drawer:hover i { + color: var(--primary-dark) !important; + transform: scale(1.1); + text-shadow: 0 2px 10px rgba(214, 17, 30, 0.5); +} + +/* Dropdown Items */ +.dropdown-item { + color: #4a5568 !important; + padding: 10px 15px !important; + border-radius: 8px !important; + font-weight: 500 !important; + transition: all 0.2s ease !important; + margin-bottom: 2px !important; + background: transparent; +} + +/* Dropdown Item Hover */ +.dropdown-item:hover, +.dropdown-item:focus { + background: var(--gradient-primary) !important; + color: #fff !important; + box-shadow: 0 4px 10px rgba(214, 17, 30, 0.2); +} + +/* Dropdown Header/Divider */ +.dropdown-divider { + border-top: 1px solid rgba(0, 0, 0, 0.06) !important; + margin: 8px 0 !important; +} + +.dropdown-header { + color: var(--secondary-color) !important; + font-weight: 700 !important; + text-transform: uppercase; + font-size: 0.75rem !important; + letter-spacing: 0.05em; + padding: 8px 15px !important; + background: transparent !important; +} + +/* Active Dropdown Item */ +.dropdown-item.active, +.dropdown-item:active { + background: var(--gradient-primary) !important; + color: #fff !important; +} + +.o_main_navbar .o_menu_sections .o_nav_entry, +.o_main_navbar .o_menu_sections .dropdown-toggle { + background: #ffffff; + border-bottom: 2px solid #d6111e; +} + +.list-group-item.active { + z-index: 2; + color: #fff; + background-color: #d6111e; + border-color: #d6111e; +} \ No newline at end of file diff --git a/addons/dine360_dashboard/static/src/css/website_style.css b/addons/dine360_dashboard/static/src/css/website_style.css new file mode 100644 index 0000000..44ddfa3 --- /dev/null +++ b/addons/dine360_dashboard/static/src/css/website_style.css @@ -0,0 +1,138 @@ +/* Custom Website Header Styling */ + +/* Force Header Background to Black */ +header#top, +body .o_header_standard, +body header.o_header_standard, +body .navbar, +body #o_main_nav { + background-color: #111 !important; + /* background: #171422 !important; */ + border-bottom: none; +} + +/* Navbar Links / Menu Items */ +header#top .navbar-nav .nav-link, +header#top .nav-link, +body .o_header_standard .nav-link, +body .navbar .nav-link, +body #o_main_nav .nav-link { + color: #ffffff !important; + font-weight: 500; +} + +/* Navbar Icons (Search, Cart, User, etc.) */ +header#top i, +header#top .fa, +body .o_header_standard i, +body .o_header_standard .fa, +body .navbar i, +body .navbar .fa { + color: #ffffff !important; +} + +/* Brand / Logo Text (if text logo) */ +header#top .navbar-brand, +body .o_header_standard .navbar-brand { + color: #ffffff !important; +} + +/* Hover States - Using Theme Teal */ +header#top .nav-link:hover, +body .o_header_standard .nav-link:hover, +header#top i:hover, +body .o_header_standard i:hover { + color: #2BB1A5 !important; +} + +/* Active States - Using Theme Gold */ +header#top .nav-link.active, +body .o_header_standard .nav-link.active { + color: #2BB1A5 !important; +} + +/* Dropdown Menu overrides (ensure visibility) */ +header#top .dropdown-menu, +body .o_header_standard .dropdown-menu { + background-color: #171422 !important; + border: 1px solid rgba(43, 177, 165, 0.2); +} + +header#top .dropdown-item, +body .o_header_standard .dropdown-item { + color: #ffffff !important; +} + +header#top .dropdown-item:hover, +body .o_header_standard .dropdown-item:hover { + background-color: #2BB1A5 !important; + color: #ffffff !important; +} + +/* Header Cart & Search Icon Adjustments */ +.o_wsale_my_cart, +.o_nav_item_search, +.o_nav_item_cart, +header .navbar-nav .nav-item a[href="/shop/cart"], +header .navbar-nav .nav-item a.o_navlink_background_hover { + transition: all 0.3s ease !important; +} + +/* Hover background for Search and Cart icons */ +.o_wsale_my_cart:hover, +.o_nav_item_search:hover, +.o_nav_item_cart:hover, +header .navbar-nav .nav-item a[href="/shop/cart"]:hover, +header .o_search_button:hover { + background-color: #FECD4F !important; + border-radius: 50px !important; +} + +/* Ensure icons turn dark on yellow background hover */ +.o_wsale_my_cart:hover i, +.o_nav_item_search:hover i, +.o_nav_item_cart:hover i, +header .navbar-nav .nav-item a[href="/shop/cart"]:hover i, +header .o_search_button:hover i { + color: #111 !important; +} + +/* Cart Count Badge Color */ +.o_wsale_my_cart .badge, +.o_wsale_my_cart .o_wsale_cart_quantity, +header .navbar-nav .nav-item .badge-pill, +header .navbar-nav .nav-item .badge { + background-color: #2BB1A5 !important; + color: #ffffff !important; + border: none !important; +} + +/* Header Action Buttons */ +header .btn, +header .btn-primary, +header .o_header_cta_btn, +header .btn-contact, +header a.btn[href="/contactus"], +header a.btn[href*="contact"] { + background-color: #FECD4F !important; + color: #04121D !important; + border: none !important; + border-radius: 8px !important; + padding: 10px 25px !important; + font-weight: 700 !important; + text-transform: uppercase !important; + transition: all 0.3s ease !important; + box-shadow: 0 4px 10px rgba(254, 205, 79, 0.3) !important; + text-decoration: none !important; +} + +header .btn:hover, +header .btn-primary:hover, +header .o_header_cta_btn:hover, +header .btn-contact:hover, +header a.btn[href="/contactus"]:hover, +header a.btn[href*="contact"]:hover { + background-color: #FECD4F !important; + color: #FECD4F !important; + transform: translateY(-2px) !important; +} \ No newline at end of file diff --git a/addons/dine360_dashboard/static/src/img/dashboard_bg.png b/addons/dine360_dashboard/static/src/img/dashboard_bg.png new file mode 100644 index 0000000..a393fb6 Binary files /dev/null and b/addons/dine360_dashboard/static/src/img/dashboard_bg.png differ diff --git a/addons/dine360_dashboard/static/src/img/login_bg.png b/addons/dine360_dashboard/static/src/img/login_bg.png new file mode 100644 index 0000000..0c4c67c Binary files /dev/null and b/addons/dine360_dashboard/static/src/img/login_bg.png differ diff --git a/addons/dine360_dashboard/static/src/js/chennora_title.js b/addons/dine360_dashboard/static/src/js/chennora_title.js new file mode 100644 index 0000000..03628af --- /dev/null +++ b/addons/dine360_dashboard/static/src/js/chennora_title.js @@ -0,0 +1,11 @@ +/** @odoo-module **/ + +import { WebClient } from "@web/webclient/webclient"; +import { patch } from "@web/core/utils/patch"; + +patch(WebClient.prototype, { + setup() { + super.setup(); + this.title.setParts({ brand: "Chennora" }); + } +}); diff --git a/addons/dine360_dashboard/views/home_template.xml b/addons/dine360_dashboard/views/home_template.xml new file mode 100644 index 0000000..ae0bc52 --- /dev/null +++ b/addons/dine360_dashboard/views/home_template.xml @@ -0,0 +1,110 @@ + + + + diff --git a/addons/dine360_dashboard/views/login_templates.xml b/addons/dine360_dashboard/views/login_templates.xml new file mode 100644 index 0000000..e61c752 --- /dev/null +++ b/addons/dine360_dashboard/views/login_templates.xml @@ -0,0 +1,45 @@ + + + diff --git a/addons/dine360_dashboard/views/shop_template.xml b/addons/dine360_dashboard/views/shop_template.xml new file mode 100644 index 0000000..9b3cc82 --- /dev/null +++ b/addons/dine360_dashboard/views/shop_template.xml @@ -0,0 +1,17 @@ + + + + + + + diff --git a/addons/dine360_dashboard/views/web_title_template.xml b/addons/dine360_dashboard/views/web_title_template.xml new file mode 100644 index 0000000..cce9fab --- /dev/null +++ b/addons/dine360_dashboard/views/web_title_template.xml @@ -0,0 +1,27 @@ + + + diff --git a/addons/dine360_dashboard/views/website_logo.xml b/addons/dine360_dashboard/views/website_logo.xml new file mode 100644 index 0000000..94b1a9f --- /dev/null +++ b/addons/dine360_dashboard/views/website_logo.xml @@ -0,0 +1,14 @@ + + + + + + diff --git a/addons/dine360_theme_chennora/__init__.py b/addons/dine360_theme_chennora/__init__.py new file mode 100644 index 0000000..91c5580 --- /dev/null +++ b/addons/dine360_theme_chennora/__init__.py @@ -0,0 +1,2 @@ +from . import controllers +from . import models diff --git a/addons/dine360_theme_chennora/__manifest__.py b/addons/dine360_theme_chennora/__manifest__.py new file mode 100644 index 0000000..060a129 --- /dev/null +++ b/addons/dine360_theme_chennora/__manifest__.py @@ -0,0 +1,39 @@ +{ + 'name': 'Dine360 Theme Chennora', + 'description': 'Custom theme for Dine360 Chennora website', + 'category': 'Theme/Website', + 'version': '1.0', + 'author': 'Dine360', + 'depends': ['website', 'website_sale', 'website_crm'], + 'data': [ + 'views/layout.xml', # Header, Footer, and Global Layout changes + 'views/pages.xml', # specific page content (Home, About, etc.) + 'views/about_page.xml', # About Page + 'views/contact_page.xml',# Contact Page + 'views/faq_page.xml', # FAQ Page + 'views/blog_page.xml', # Blog Page + 'views/blog_detail_page.xml', # Blog Detail Page + 'views/shop_page.xml', # Shop Page + 'views/product_details_page.xml', # Customized Product Details Page + 'views/product_views.xml', # Product Form custom fields + 'views/snippets.xml', # Custom Building Blocks + 'views/options.xml', # Options for snippets (if any) + 'data/website_data.xml', # Data for creating pages + ], + 'assets': { + 'web.assets_frontend': [ + 'dine360_theme_chennora/static/src/scss/primary_variables.scss', + 'dine360_theme_chennora/static/src/scss/theme.scss', + 'dine360_theme_chennora/static/src/scss/shop.scss', + 'dine360_theme_chennora/static/src/js/deal_switcher.js', + 'dine360_theme_chennora/static/src/js/category_slider.js', + ], + }, + 'images': [ + 'static/description/cover.png', + ], + 'installable': True, + 'application': True, + 'license': 'LGPL-3', +} + diff --git a/addons/dine360_theme_chennora/__pycache__/__init__.cpython-310.pyc b/addons/dine360_theme_chennora/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000..96920c1 Binary files /dev/null and b/addons/dine360_theme_chennora/__pycache__/__init__.cpython-310.pyc differ diff --git a/addons/dine360_theme_chennora/controllers/__init__.py b/addons/dine360_theme_chennora/controllers/__init__.py new file mode 100644 index 0000000..12a7e52 --- /dev/null +++ b/addons/dine360_theme_chennora/controllers/__init__.py @@ -0,0 +1 @@ +from . import main diff --git a/addons/dine360_theme_chennora/controllers/__pycache__/__init__.cpython-310.pyc b/addons/dine360_theme_chennora/controllers/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000..5bad43c Binary files /dev/null and b/addons/dine360_theme_chennora/controllers/__pycache__/__init__.cpython-310.pyc differ diff --git a/addons/dine360_theme_chennora/controllers/__pycache__/main.cpython-310.pyc b/addons/dine360_theme_chennora/controllers/__pycache__/main.cpython-310.pyc new file mode 100644 index 0000000..fa686d8 Binary files /dev/null and b/addons/dine360_theme_chennora/controllers/__pycache__/main.cpython-310.pyc differ diff --git a/addons/dine360_theme_chennora/controllers/main.py b/addons/dine360_theme_chennora/controllers/main.py new file mode 100644 index 0000000..2867f94 --- /dev/null +++ b/addons/dine360_theme_chennora/controllers/main.py @@ -0,0 +1,92 @@ +from odoo import http +from odoo.http import request + +class ContactController(http.Controller): + @http.route('/contactus/submit', type='http', auth="public", website=True, csrf=True) + def contact_submit(self, **post): + name = post.get('name') + email = post.get('email_from') + phone = post.get('phone') + subject = post.get('subject') + message = post.get('description') + + # Format the email content + email_content = f""" +
+

New Contact Form Submission

+ + + + + + + + + + + + + + + + + +
Full Name:{name}
Email:{email}
Phone:{phone}
Subject:{subject}
+
+ Message: +
{message}
+
+
+ """ + + mail_values = { + 'subject': f"Contact Form: {subject or 'Inquiry'} from {name}", + 'body_html': email_content, + 'email_to': 'alaguraj0361@gmail.com', + 'email_from': request.env.user.company_id.email or 'noreply@chennora.com', + 'reply_to': email, + } + + # Create and send the mail + try: + mail = request.env['mail.mail'].sudo().create(mail_values) + mail.send() + except Exception as e: + # You might want to log the error + pass + + return request.render('dine360_theme_chennora.contact_thank_you') + +class BlogController(http.Controller): + @http.route(['/blog'], type='http', auth='public', website=True) + def blog_list(self, **post): + blog_posts = request.env['chennora.blog.post'].sudo().search([('active', '=', True)]) + return request.render('dine360_theme_chennora.blog_page', { + 'blog_posts': blog_posts, + }) + + @http.route(['/blog/'], type='http', auth='public', website=True) + def blog_detail(self, slug, **post): + blog_post = request.env['chennora.blog.post'].sudo().search([('slug', '=', slug), ('active', '=', True)], limit=1) + if not blog_post: + return request.not_found() + + recent_posts = request.env['chennora.blog.post'].sudo().search([('active', '=', True), ('id', '!=', blog_post.id)], limit=3) + + # Get dynamic categories and counts + all_posts = request.env['chennora.blog.post'].sudo().search([('active', '=', True)]) + categories = {} + for p in all_posts: + if p.category: + categories[p.category] = categories.get(p.category, 0) + 1 + + return request.render('dine360_theme_chennora.blog_detail_layout', { + 'blog_title': blog_post.title, + 'blog_img': blog_post.image, + 'blog_date': blog_post.date.strftime('%B %d, %Y') if blog_post.date else '', + 'blog_category': blog_post.category, + 'blog_content': blog_post.content, + 'recent_posts': recent_posts, + 'categories': categories, + }) + diff --git a/addons/dine360_theme_chennora/data/website_data.xml b/addons/dine360_theme_chennora/data/website_data.xml new file mode 100644 index 0000000..de43b34 --- /dev/null +++ b/addons/dine360_theme_chennora/data/website_data.xml @@ -0,0 +1,30 @@ + + + + + + /about + True + + About Us + + + + + /faq + True + + FAQ + + + + + /blog + True + + Blog + + + + diff --git a/addons/dine360_theme_chennora/full_import.py b/addons/dine360_theme_chennora/full_import.py new file mode 100644 index 0000000..6b730fd --- /dev/null +++ b/addons/dine360_theme_chennora/full_import.py @@ -0,0 +1,742 @@ + +from datetime import datetime + +blog_posts = [ + { + "slug": "dining-with-family-chennora-is-the-perfect-spot-for-a-south-indian-feast", + "title": "Dining with Family? Here’s Why Chennora is the Perfect Spot for a South Indian Feast", + "category": "Tradition", + "excerpt": "Dining out with family is more than just a meal—it’s about creating memorable moments and enjoying delicious food together.", + "image": "/dine360_theme_chennora/static/src/img/blog-detail-1.webp", + "date": "2026-03-27", + "content": """
+

Dining out with family is more than just a meal—it’s about creating memorable moments and enjoying + delicious food + together. If you’re looking for a place that serves authentic South Indian cuisine in a family-friendly environment, + look no further than Chennora Indian Kitchen Bar in Brampton.

+

From crispy dosas to flavorful biryanis, Chennora offers a diverse menu that caters to both kids and + adults. Here’s + why it’s the perfect restaurant for your next family feast!

+

1. A Menu That Pleases Everyone

+

One of the biggest challenges when dining with family is finding food that everyone loves. At Chennora, + we offer a + wide range of dishes that cater to different tastes and dietary preferences.

+ +

Whether you’re a vegetarian, meat lover, or Indo-Chinese fan, we’ve got something for you!

+ +

2. Authentic Tamil Nadu Flavors

+

At Chennora, we stay true to tradition by using authentic South Indian spices, fresh ingredients, and + age-old cooking + techniques. Every dish is prepared by expert chefs who bring the flavors of Chennai straight to your table.

+

Signature Dishes to Try:

+ +

3. Warm & Cozy Family-Friendly Ambiance

+

We believe that a great dining experience goes beyond food—it’s also about comfort and atmosphere. At + Chennora, we + offer:

+ +

Whether it’s a casual dinner, birthday celebration, or a weekend family outing, Chennora is the perfect + setting to + enjoy a meal together.

+

4. Pocket-Friendly Prices & Great Value Meals

+

Eating out with family shouldn’t break the bank! At Chennora, we offer affordable meals with generous portions so you + get the best value for your money.

+

Customer Favorites:

+ +

5. Convenient Location & Easy Takeout Options

+

We know that family outings can be hectic, so we make it easy for you!

+ +

Conclusion – Plan Your Family Feast Today!

+

At Chennora Indian Kitchen Bar, we make family dining fun, flavorful, and unforgettable. Whether you’re + craving a + traditional Tamil Nadu meal or a quick biryani fix, we’ve got you covered.

+

Visit Us At: Unit 66, 11665 McVean Dr, Brampton

+

Call Us: +1(647) 856-2878

+

Order Online: www.chennora.com

+

Ready for a South Indian feast with your family? Visit Chennora today!

""" + }, + { + "slug": "5-must-try-south-indian-dishes-at-chennora-that-will-leave-you-craving-more", + "title": "5 Must-Try South Indian Dishes at Chennora That Will Leave You Craving More", + "category": "Food", + "excerpt": "If you’re a fan of bold spices, rich flavors, and comforting meals, South Indian cuisine is a must-try!", + "image": "/dine360_theme_chennora/static/src/img/blog-detail-2.webp", + "date": "2026-03-28", + "content": """
+

If you’re a fan of bold spices, rich flavors, and comforting meals, South Indian cuisine is a must-try! At Chennora + Indian Kitchen Bar in Brampton, you’ll find an authentic taste of Tamil Nadu with dishes that are both delicious and + satisfying.

+

From crispy dosas to aromatic biryani, here are the top 5 must-try South Indian dishes at Chennora that will keep you + coming back for more!

+ +

1. Crispy Masala Dosa – The Classic Favorite

+
Why You’ll Love It:
+

A golden, paper-thin crepe made from fermented rice and lentil batter, filled with spicy potato masala and served + with coconut chutney and sambar.

+
Best Pairing:
+

Enjoy it with Chennai-style filter coffee for the ultimate South Indian breakfast experience!

+

Perfect for: Light eaters, vegetarians, and dosa lovers!

+ +

2. Chettinad Chicken Curry – Spicy & Aromatic

+
Why You’ll Love It:
+

A bold and fiery South Indian chicken curry made with a special blend of Chettinad spices, black pepper, and coconut. +

+
Best Pairing:
+

Tastes heavenly with steamed rice or Malabar parotta.

+

Perfect for: Spicy food lovers and meat enthusiasts!

+ +

3. Seeraga Samba Mutton Biryani – A South Indian Delight

+
Why You’ll Love It:
+

Unlike traditional basmati biryani, this version uses Seeraga Samba rice, a fragrant small-grain rice that absorbs + flavors beautifully. Slow-cooked with succulent mutton, caramelized onions, and aromatic spices, it’s a dish you + can’t miss!

+
Best Pairing:
+

Goes well with onion raita and a side of spicy mutton gravy.

+

Perfect for: Biryani lovers and those looking for a unique twist on a classic dish!

+ +

4. Chicken Kothu Parotta – The Ultimate Comfort Food

+
Why You’ll Love It:
+

Shredded flaky parottas stir-fried with chicken, eggs, onions, and special masala, creating a flavorful and + comforting dish.

+
Best Pairing:
+

Enjoy it with a side of raita or spicy salna curry.

+

Perfect for: Late-night cravings and street food lovers!

+ +

5. Ghee Podi Idli – A Burst of Flavor in Every Bite

+
Why You’ll Love It:
+

Soft idlis tossed in aromatic podi (gunpowder spice mix) and drizzled with pure ghee, creating a flavorful and + melt-in-your-mouth experience.

+
Best Pairing:
+

Tastes amazing with coconut chutney and a cup of Madras coffee.

+

Perfect for: A quick snack or a light meal!

+ +

Conclusion – Plan Your Family Feast Today!

+

At Chennora Indian Kitchen Bar, every dish is made with authentic spices and fresh ingredients, bringing you the true + flavors of South India right here in Brampton.

+

Visit Us At: Unit 66, 11665 McVean Dr, Brampton

+

Call Us: +1(647) 856-2878

+

Order Online: www.chennora.com

+

Whether you’re a first-time visitor or a regular customer, these must-try dishes will leave you craving more. Come + and experience the best of South Indian cuisine at Chennora today!

""" + }, + { + "slug": "top-south-indian-cuisine-restaurants-near-me", + "title": "Why Chennora is Brampton’s Go-To Spot for Authentic South Indian Cuisine", + "category": "Tradition", + "excerpt": "Craving a taste of authentic South Indian food in Brampton? Look no further than Chennora Indian Kitchen Bar.", + "image": "/dine360_theme_chennora/static/src/img/blog-detail-3.webp", + "date": "2026-03-29", + "content": """
+

Craving a taste of authentic South Indian food in Brampton? Look no further than Chennora Indian + Kitchen Bar, + where the essence of Chennai meets the rich culinary traditions of Tamil Nadu. From crispy dosas to fragrant + biryanis, every dish is crafted with traditional spices, fresh ingredients, and homely love. +

+

But what makes Chennora the best South Indian restaurant in Brampton? Let’s dive into the flavors, ambiance, and + experience that set it apart. +

+
+ +

1. Authentic Flavors Straight from Tamil Nadu

+

Chennora isn’t just a restaurant—it’s an experience. Every bite transports you to the streets of + Chennai, where food + isn’t just a meal, but an emotion.

+
Signature Dishes You Can’t Miss:
+ +

By using traditional cooking techniques and authentic Indian spices, Chennora ensures that every dish + reflects the + true taste of South India.

+ +

2. A Menu for Every Food Lover – From Veg to Non-Veg

+

Whether you’re a vegetarian, meat lover, or spice enthusiast, Chennora’s diverse menu has something for + everyone.

+
Vegetarian Delights:
+ + +
Non-Vegetarian Specialties:
+ +

With each dish prepared fresh upon order, you’ll experience food at its finest.

+ +

3. Traditional Cooking Methods for Authentic Taste

+

What makes Chennora different from other Indian restaurants in Brampton? The commitment to authenticity + and + tradition.

+ +

Every dish is crafted without shortcuts, ensuring that you get restaurant-quality food with a homemade + touch.

+ +

4. Perfect Blend of South Indian & Indo-Chinese Flavors

+

If you love fusion food, Chennora brings the best Indo-Chinese flavors straight to your plate.

+
Popular Indo-Chinese Dishes at Chennora:
+ +

This perfect balance of Indian spice and Chinese flavors makes Chennora a must-visit spot for food + lovers.

+ +

5. A Cozy Ambience & Friendly Hospitality

+

A great dining experience isn’t just about food—it’s about ambiance and hospitality.

+
Why Customers Love Dining at Chennora:
+ +

Located conveniently in Brampton, it’s the perfect spot for family dinners, casual hangouts, and even + special + celebrations.

+ +

6. Catering & Party Orders – Bring Chennora to Your Home!

+

Hosting a party or special event? Chennora offers catering services to make your event memorable.

+
Catering Menu Includes:
+ +

Whether it's a corporate event, wedding, or birthday, Chennora ensures restaurant-quality food at your + doorstep.

+ +

7. Convenient Takeout & Delivery Options

+

Can’t visit? No worries! Chennora offers easy online ordering with quick takeout and delivery options. +

+

Visit Us At: Unit 66, 11665 McVean Dr, Brampton

+

Call Us: +1(647) 856-2878

+

Order Online: www.chennora.com

+

Enjoy your favorite South Indian dishes from the comfort of your home.

""" + }, + { + "slug": "the-rise-of-south-indian-food-in-canada-why-everyone’s-loving-it", + "title": "The Rise of South Indian Food in Canada: Why Everyone’s Loving It", + "category": "Cuisine", + "excerpt": "Over the past decade, Canada has witnessed an incredible shift in its culinary landscape.", + "image": "/dine360_theme_chennora/static/src/img/rise-big-img.webp", + "date": "2026-11-17", + "content": """
+

Over the past decade, Canada has witnessed an incredible shift in its culinary landscape. While Indian cuisine has always been popular, something interesting is happening now — South Indian food, especially Tamil cuisine, is rising faster than ever.

+

From crispy dosas and idlis to aromatic biryanis and flavour-rich curries, Canadians are exploring flavours that were once lesser-known. Chennora stands at the front of this movement, bringing authentic Tamil flavours to Brampton with a bold, modern twist. But why exactly is South Indian food becoming so popular?

+
+
+
+

1. Canada Loves Healthy, Light, Flavorful Food

+

South Indian cuisine naturally aligns with what modern Canadians prefer:

+
    +
  • • Fermented foods
  • +
  • • Low-oil cooking styles
  • +
  • • Rice- and lentil-based dishes
  • +
  • • High-protein vegetarian meals
  • +
  • • Gut-friendly flavours
  • +
+

Dishes like idli, dosa, uttapam, sambar and Rasam check all the boxes for a health-conscious audience.

+

In fact, nutritionists often classify South Indian cuisine as:

+
    +
  • • “highly digestible”
  • +
  • • “fermentation-rich”
  • +
  • • “naturally balanced”
  • +
+

No wonder Canadians love it!

+
+
+

2. Fermented Foods Are Trending Worldwide

+

Health trends today highlight:

+
    +
  • • gut health
  • +
  • • probiotics
  • +
  • • natural fermentation
  • +
+

South Indian staples like dosa & idli batter are made through 24+ hours of natural fermentation, making them:

+
    +
  • • easier to digest
  • +
  • • probiotic-rich
  • +
  • • great for metabolism
  • +
+

This aligns perfectly with Canada’s growing wellness culture.

+
+
+
+

3. Canadians Are Becoming More Adventurous With Food

+

With multiculturalism at its peak, Canadians increasingly explore new cuisines. South Indian food offers:

+
    +
  • • textures (crispy, fluffy, creamy, spicy)
  • +
  • • flavours (tangy, aromatic, fiery, coconut-rich)
  • +
  • • experiences (dosa served like a giant cone, biryani served aromatic & layered)
  • +
+

For many, eating a dosa or biryani isn’t just a meal — it’s an experience.

+
+
+

4. Tamil Diaspora Is Growing in GTA

+

The Tamil community in Toronto, Mississauga, Brampton, and Scarborough has grown significantly. With that comes:

+
    +
  • • authentic restaurants
  • +
  • • specialty spice stores
  • +
  • • cultural festivals
  • +
  • • growing curiosity from non-Tamil audiences
  • +
+

Chennora is part of this growing cultural wave, offering dishes that reflect real Tamil flavours — not commercialized or toned down versions.

+
+
+
+

5. The Popularity of Vegan & Vegetarian Dining

+

South Indian cuisine is uniquely the only major Indian cuisine that’s naturally 70% vegetarian.

+

Dishes like:

+
    +
  • • sambar
  • +
  • • rasam
  • +
  • • vegetable kurma
  • +
  • • lemon rice
  • +
  • • coconut chutney
  • +
  • • pongal
  • +
+

fit beautifully into Canada’s vegan-friendly, plant-powered dining trend.

+

Many guests are surprised how satisfying and flavourful Tamil vegetarian food can be.

+
+
+

6. Comfort Food Appeal: Biryani, Dosa, and More

+

Three dishes are leading the popularity wave:

+
    +
  • DOSA – Crispy, golden, customizable — dosa is a crowd favourite.
  • +
  • BIRYANI – South Indian biryani is aromatic, layered and deeply flavour-rich.
  • +
  • CURRIES – South Indian curries offer:
  • +
+
    +
  • • coconut bases
  • +
  • • lentil bases
  • +
  • • tangy tamarind
  • +
  • • bright flavours
  • +
+

People who once only knew “butter chicken” now explore an entire new range.

+
+

7. Restaurants Like Chennora Are Changing the Game

+
+
+

Chennora isn’t just a restaurant; it’s a modern Tamil dining experience.

+

It blends:

+
    +
  • • authentic flavours
  • +
  • • modern décor
  • +
  • • music and nightlife energy
  • +
  • • bar pairings
  • +
  • • celebration-friendly ambiance
  • +
+
+
+

This makes South Indian cuisine appealing to:

+
    +
  • • families
  • +
  • • youth
  • +
  • • food explorers
  • +
  • • group celebrations
  • +
  • • cocktail lovers
  • +
  • • cultural enthusiasts
  • +
+

By elevating the dining atmosphere, Chennora introduces Tamil cuisine to wider audiences.

+
+

Conclusion

+

South Indian cuisine is rising fast in Canada because it checks every box: flavour, health, comfort, experience, and cultural authenticity. And restaurants like Chennora are bringing these flavours forward in a vibrant, modern way that appeals to everyone.

+

From crispy dosas to aromatic biryanis — Canadian diners are falling in love. And it’s only the beginning.

+

Visit Us At: Unit 66, 11665 McVean Dr, Brampton

+

Call Us: +1(647) 856-2878

+

Order Online: www.chennora.com

+

Enjoy your favorite South Indian dishes from the comfort of your home.

""" + }, + { + "slug": "the-science-of-south-indian-cooking-fermentation-spices-perfect-flavour-balance", + "title": "The Science of South Indian Cooking: Fermentation, Spices & Perfect Flavour Balance", + "category": "South Indian Cooking", + "excerpt": "South Indian cuisine isn’t just delicious — it’s one of the most scientifically intelligent culinary systems in the world.", + "image": "/dine360_theme_chennora/static/src/img/science-big-img.webp", + "date": "2026-11-17", + "content": """
+

South Indian cuisine isn’t just delicious — it’s one of the most scientifically intelligent culinary systems in the world. Every dosa, idli, biryani, or curry you enjoy at Chennora is built on techniques rooted in chemistry, biology, and sensory science. This blog explores the science behind flavour: fermentation, spices, seasonings, aromatics, heat balance, texture creation, and how these come together in perfect harmony.

+
+
+
+

1. Fermentation: The Secret Behind Dosa & Idli

+

South Indian cuisine’s identity begins with fermentation.

+

Why ferment food? Fermentation naturally:

+
    +
  • • creates probiotics
  • +
  • • improves gut health
  • +
  • • increases nutrient absorption
  • +
  • • enhances flavour
  • +
  • • makes food more digestible
  • +
+

Dosa and idli batter ferments for 12–24 hours. This transforms:

+
    +
  • • rice + lentils into
  • +
  • • a light, airy, gut-friendly base.
  • +
+

When cooked, these fermented batters create:

+
    +
  • • crispy dosas
  • +
  • • fluffy idlis
  • +
  • • soft uttapams
  • +
+

It’s science meeting tradition.

+
+
+

2. The Tempering Technique (Tadka): Aroma Chemistry

+

Tempering (tadka) is when spices are heated in hot oil or ghee to release essential oils. This process triggers:

+
    +
  • • flavour molecule activation
  • +
  • • aroma release
  • +
  • • deeper colour
  • +
  • • enhanced nutrient availability
  • +
+

Common spices used:

+
    +
  • • mustard seeds
  • +
  • • curry leaves
  • +
  • • cumin
  • +
  • • dried chilies
  • +
  • • urad dal
  • +
+

When they hit hot oil.

+
    +
  • • flavours explode
  • +
  • • aroma fills the air.
  • +
+

This signature fragrance is what Chennora guests recognise instantly.

+
+
+
+

3. Spice Science: Heat, Aroma, Balance

+

Spices in South Indian cooking don’t just add heat — they create functional flavour.

+

Example:

+
    +
  • Tamarind → acidity for balance
  • +
  • Coconut → natural sweetness, cooling effect
  • +
  • Curry leaves → essential oils with medicinal benefit
  • +
  • Black pepper → heat + metabolism boost
  • +
  • Turmeric → anti-inflammatory properties
  • +
  • Asafoetida (hing) → digestion enhancement
  • +
+

Each spice has purpose.

+

Each combination is intentional.

+
+
+

4. The Magic of Coconut

+

Coconut is used in:

+
    +
  • • chutney
  • +
  • • curries
  • +
  • • desserts
  • +
  • • tempering
  • +
  • • garnishes
  • +
+

Scientifically, coconut:

+
    +
  • • adds healthy fats
  • +
  • • enhances absorption of fat-soluble spices
  • +
  • • balances the heat of chilies
  • +
  • • creates creamy textures without dairy
  • +
+

South Indian cuisine’s reliance on coconut is both cultural and scientific.

+
+
+
+

5. Rice + Lentil System: A Complete Nutrition Model

+

Unlike wheat-based cuisines, South Indian food builds protein and energy with:

+
    +
  • • rice
  • +
  • • lentils
  • +
  • • legumes
  • +
+

Together, they create:

+
    +
  • • complete amino acid profile
  • +
  • • sustained energy release
  • +
  • • easier digestion
  • +
+

Dosa, idli, pongal, sambar — all share this powerful nutrition system.

+
+
+

6. Heat Balance: How Spice Levels Are Managed

+

Contrary to myth, South Indian cuisine isn’t just “spicy”. It’s strategic. Heat is balanced through:

+

Heat is balanced through:

+
+
+
    +
  • • coconut
  • +
  • • yogurt
  • +
  • • ghee
  • +
  • • jaggery
  • +
+
+
+
    +
  • • tamarind
  • +
  • • lentils
  • +
  • • rice
  • +
+
+
+

This layering ensures each bite is fiery, tangy, sweet, creamy and aromatic — all at once.

+
+

7. Why South Indian Food Feels “Comforting”

+

Scientifically, comfort food triggers:

+
    +
  • • serotonin (mood boost)
  • +
  • • warmth
  • +
  • • softness
  • +
  • • nostalgia across cultures
  • +
+

South Indian dishes — sambar, rasam, pongal, dosa — are designed with:

+
    +
  • • warm spices
  • +
  • • soft textures
  • +
  • • soothing aromas
  • +
+

This makes them universally comforting, even for first-time diners.

+

Conclusion

+

The magic of South Indian cooking isn’t accidental - it’s scientific mastery. Fermentation, tempering, spice chemistry, rice-lentil balance and aromatics combine to create a cuisine that is nutritious, flavour-rich and emotionally satisfying. At Chennora, every dosa, biryani, curry and chutney follows this timeless science - delivered with modern presentation and flavour precision.

+

Visit Us At: Unit 66, 11665 McVean Dr, Brampton

+

Call Us: +1(647) 856-2878

+

Order Online: www.chennora.com

+

Enjoy your favorite South Indian dishes from the comfort of your home.

""" + }, + { + "slug": "what-type-of-food-does-chennora-brampton-serve", + "title": "What Type of Food Does Chennora Brampton Serve?", + "category": "Restaurant Guide", + "excerpt": "Chennora Brampton is a family-friendly Indian kitchen and bar serving North Indian curries, tandoor grills, and snacks.", + "image": "/dine360_theme_chennora/static/src/img/serve-big-img.webp", + "date": "2026-11-22", + "content": """
+

If you're in Brampton and craving authentic Indian cuisine, you've probably searched for a spot that feels both exciting and comforting. Somewhere you can grab a cozy family dinner, enjoy drinks with friends, or order in on a busy weekday night. That's exactly where Chennora Brampton comes into the picture.

+

This guide breaks down what type of food Chennora Indian Kitchen Bar serves, how it fits into Brampton's food scene, and why it's becoming a go-to choice near McVean Dr.

+
+

Meet Chennora Brampton on McVean Dr

+

Tucked into Unit 66, 11665 McVean Dr, Brampton, Chennora Indian Kitchen Bar is one of those places you hear about from a friend first.

+

When you walk in, you're not hit with stiff, formal vibes. Instead, you get warm lighting, comfortable seating, and the kind of buzz you expect from a neighbourhood Brampton Indian restaurant where families, couples, and coworkers all feel at home.

+

To get a sense of what's cooking right now, you can always browse the latest Chennora menu online.

+

What Type of Food Does Chennora Indian Kitchen Bar Serve?

+

Think of it as a mix of:

+
    +
  • • Classic North Indian comfort dishes
  • +
  • • South Indian–inspired and street-style snacks
  • +
  • • Tandoor grills and sizzling plates
  • +
  • • Bar bites made to share over drinks
  • +
  • • Plenty of vegetarian-friendly options
  • +
+

North Indian Favourites and Comfort Curries

+

If you grew up on North Indian food — or just fell in love with it in the GTA — this part of Chennora Brampton will feel like a hug.

+
    +
  • • Creamy, tomato-based gravies
  • +
  • • Onion- and yogurt-based curries with layered spices
  • +
  • • Paneer (Indian cottage cheese) dishes for vegetarians
  • +
  • • Chicken, lamb, or goat options for meat lovers
  • +
+

South Indian–Inspired Dishes and Street-Style Snacks

+

While North Indian mains tend to steal the spotlight, a lot of people head to Chennora Brampton for the snacks and starters.

+
    +
  • • Crispy, fried snacks that pair well with drinks
  • +
  • • Tangy, chutney-loaded plates inspired by Indian street food
  • +
  • • South Indian–inspired bites with spices and textures that wake up your taste buds
  • +
+

Tandoor Grills, Bar Bites, and Sharing Plates

+

Because Chennora Brampton is also a bar, grilled items and bar-style food are a big part of the experience.

+
    +
  • • Juicy, marinated meats cooked at high heat
  • +
  • • Smoky, charred edges with tender centers
  • +
  • • Grilled paneer or veggie options for non-meat eaters
  • +
  • • Tandoor-baked breads that are soft, chewy, and slightly smoky
  • +
+

Drinks, Mocktails, and the Bar Side of Chennora Brampton

+

Food is the main attraction, but the bar is a big part of what makes Chennora Brampton different from a typical takeout spot.

+
    +
  • • A range of cocktails and mixed drinks
  • +
  • • Non-alcoholic mocktails for designated drivers
  • +
+

Why Brampton Locals Keep Coming Back

+

A few reasons keep coming up in local conversations:

+
    +
  • Location that makes sense
  • +
  • Versatility
  • +
  • Comfort food with a modern feel
  • +
+

Planning Your Visit to Chennora Brampton

+

Location: Unit 66, 11665 McVean Dr, Brampton, Ontario

+

Call Us: +1(647) 856-2878

+

Order Online: www.chennora.com

""" + }, + { + "slug": "how-authentic-is-chennoras-south-indian-food-in-brampton", + "title": "How Authentic Is Chennora's South Indian Food in Brampton?", + "category": "Food Authenticity", + "excerpt": "Explore Chennora in Brampton for authentic South Indian dosas, idlis, vadas, and home-style flavours.", + "image": "/dine360_theme_chennora/static/src/img/south-big-img.webp", + "date": "2026-11-22", + "content": """
+

You type "South Indian food in Brampton" into Google, scroll past a few ads, open a couple of tabs and then pause at Chennora Indian Kitchen Bar. The photos look legit. The dosas look crispy. The idlis look fluffy. But is it actually authentic or just "regular Indian"?

+

Let's break it down honestly — from ingredients to flavours to the overall experience — and see how Chennora's South Indian food in Brampton really stacks up.

+
+

What Does "Authentic" South Indian Food Even Mean?

+

When we talk about authentic South Indian cuisine, we're usually looking for a few key things:

+
    +
  • • Proper use of rice and lentils
  • +
  • • Long, natural fermentation for dosa and idli batter
  • +
  • • Real ghee and fresh curry leaves
  • +
  • • Sambar that tastes like it simmered — not microwaved
  • +
  • • Chutneys made fresh, not poured from a jar
  • +
+

Chennora's Story: South India to Brampton

+

Chennora isn't a random chain; it's a local Brampton restaurant with roots in South Indian flavours. The team behind Chennora has put clear focus on bringing authentic South Indian cuisine into a casual, family-friendly setting.

+

The Little Details That Make Food Taste Like Home

+

Authenticity often hides in the details — things you won't see on a poster, but you'll taste in a single bite.

+

1. Batter, Fermentation & Texture

+

At Chennora, dosas tend to have that crisp edge and soft center you're looking for, and idlis are usually soft and spongy — a good sign that fermentation wasn't skipped.

+ +

2. Sambar That Actually Tastes Like Sambar

+

Chennora's sambar has that "home-style" depth and aroma that's closer to what many South Indian families are used to.

+ +

3. Real Chutneys

+

At Chennora, you'll usually find more than just one generic "white chutney." That's another sign of authenticity.

+ +

Dosa, Idli, Vada & More – How Do They Compare?

+

Dosa in Brampton: Chennora's dosas are thin, crisp, and golden, exactly what South Indian families expect.

+

Idli Vada in Brampton: Idlis are soft and medu vadas have a proper crunch.

+ +

Practical Stuff Brampton Locals Actually Care About

+

Ordering & Takeout: You can place orders through their Order Now page.

+

Family-Friendly Vibes: Comfortable for kids and grandparents.

+ +

Conclusion

+

If you're craving South Indian food in Brampton that feels real — not "just okay" — Chennora is absolutely worth a visit.

""" + }, + { + "slug": "how-authentic-is-chennoras-dosa-and-what-varieties-should-you-try-in-brampton", + "title": "How Authentic Is Chennora's Dosa — And What Varieties Should You Try in Brampton?", + "category": "Food Authenticity", + "excerpt": "Explore authentic dosa varieties at Chennora Brampton - from classic masala to special fusion options.", + "image": "/dine360_theme_chennora/static/src/img/dosa-big-img.webp", + "date": "2026-11-26", + "content": """
+

Dosa Cravings in Brampton? You're Not Alone

+

If you live anywhere in the northeast part of Brampton — near McVean Dr, Castlemore, or up toward Mayfield — you've probably had this moment craving a hot, crispy dosa.

+

This guide digs into how authentic the dosas are at Chennora Brampton, and which varieties are genuinely worth your time.

+
+

So How Authentic Is the Dosa at Chennora Brampton?

+

The Batter: Where Real Dosa Begins

+

At Chennora Brampton, the dosa batter tastes like it's been fermented properly, giving that gentle tang and light texture.

+

Classic Dosa Varieties to Try First

+

1. Plain Dosa & Ghee Roast: A Plain Dosa lets the batter speak for itself. Ghee Roast adds a nutty aroma and extra crispiness.

+

2. Masala Dosa: The comfort classic with well-spiced potato filling.

+

Special & Fusion Dosas

+
    +
  • • Onion Dosa – with caramelized onions
  • +
  • • Mysore Masala Dosa – spicier version with red chutney
  • +
  • • Cheese or Paneer Dosa – popular with kids
  • +
+

Final Thoughts

+

Whether you're driving down from Springdale or meeting friends halfway, Chennora Brampton is an easy yes for your next dosa night.

""" + }, + { + "slug": "what-are-the-top-5-dishes-at-chennora-brampton-and-what-makes-them-special", + "title": "What Are the Top 5 Dishes at Chennora Brampton — And What Makes Them Special?", + "category": "Top 5 must-try", + "excerpt": "Explore the top 5 must-try dishes at Chennora Brampton - authentic South Indian dosa, idli, vada, biryani and tiffin combos.", + "image": "/dine360_theme_chennora/static/src/img/top5-big-img.webp", + "date": "2026-11-26", + "content": """
+

Craving Real South Indian Food in Brampton? Start at Chennora

+

Chennora Brampton has quietly become that go-to spot for people who crave real South Indian food.

+
+

Dish #1: Masala Dosa – The Icon

+

Crisp, golden-brown crepe with gently spiced potato filling. It's thin, crunchy, and served with fresh sambar and chutneys.

+

Dish #2: Soft, Fluffy Idli

+

Steamed rice and lentil cakes that are soft, light, and easy to digest. At Chennora, they are like little white pillows.

+

Dish #3: Medu Vada – Crispy and Golden

+

Savoury lentil fritters with a crunch on the outside and softness on the inside.

+

Dish #4: Biryani That Tastes Like Home

+

Fragrant basmati rice with balanced spices and well-marinated meat or veg.

+

Dish #5: South Indian Tiffin Combos

+

The best way to sample everything: idli, vada, mini dosa, sambar, and chutneys all on one plate.

+

Final Thoughts

+

These five dishes are what keep people saying, "Let's just go to Chennora Brampton tonight."

""" + }, + { + "slug": "your-new-favourite-spot-for-premium-south-indian-food-in-brampton", + "title": "Your New Favourite Spot for Premium South Indian Food in Brampton", + "category": "New Favourite Spot", + "excerpt": "Craving authentic South Indian food? Chennora brings premium dosas, fluffy idlis, and spicy biryanis right to Brampton.", + "image": "/dine360_theme_chennora/static/src/img/fav-big-img.webp", + "date": "2026-12-05", + "content": """
+

Your Search for Premium South Indian Food in Brampton Might Be Over

+

Chennora Brampton is a fresh, premium spot focused on truly authentic flavours and a beautiful dining experience.

+
+

Why Chennora Stands Out

+
    +
  • • Authentic recipes that respect regional roots
  • +
  • • Premium ingredients and fresh batters
  • +
  • • Beautiful ambiance and warm service
  • +
+

The Best Filter Coffee in Brampton

+

Strong, smooth, and brewed slowly in a traditional filter with frothy milk. The perfect finish to any meal.

+

Conclusion

+

Brampton finally has its own serious contender for premium South Indian food. You no longer have to drive to Mississauga for that perfect dosa!

""" + } +] + +for p in blog_posts: + vals = { + 'title': p['title'], + 'slug': p['slug'], + 'category': p['category'], + 'excerpt': p['excerpt'], + 'image': p['image'], + 'date': p['date'], + 'content': p['content'], + } + existing = env['chennora.blog.post'].search([('slug', '=', p['slug'])]) + if existing: + existing.write(vals) + print(f"Updated: {p['title']}") + else: + env['chennora.blog.post'].create(vals) + print(f"Created: {p['title']}") + +env.cr.commit() +print("Import completed successfully!") diff --git a/addons/dine360_theme_chennora/models/__init__.py b/addons/dine360_theme_chennora/models/__init__.py new file mode 100644 index 0000000..d759253 --- /dev/null +++ b/addons/dine360_theme_chennora/models/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- +from . import product_template +from . import blog_post diff --git a/addons/dine360_theme_chennora/models/__pycache__/__init__.cpython-310.pyc b/addons/dine360_theme_chennora/models/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000..be2fc5b Binary files /dev/null and b/addons/dine360_theme_chennora/models/__pycache__/__init__.cpython-310.pyc differ diff --git a/addons/dine360_theme_chennora/models/__pycache__/blog_post.cpython-310.pyc b/addons/dine360_theme_chennora/models/__pycache__/blog_post.cpython-310.pyc new file mode 100644 index 0000000..ba00031 Binary files /dev/null and b/addons/dine360_theme_chennora/models/__pycache__/blog_post.cpython-310.pyc differ diff --git a/addons/dine360_theme_chennora/models/__pycache__/product_template.cpython-310.pyc b/addons/dine360_theme_chennora/models/__pycache__/product_template.cpython-310.pyc new file mode 100644 index 0000000..9e46393 Binary files /dev/null and b/addons/dine360_theme_chennora/models/__pycache__/product_template.cpython-310.pyc differ diff --git a/addons/dine360_theme_chennora/models/blog_post.py b/addons/dine360_theme_chennora/models/blog_post.py new file mode 100644 index 0000000..c128554 --- /dev/null +++ b/addons/dine360_theme_chennora/models/blog_post.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +from odoo import models, fields, api +from datetime import datetime + +class ChennoraBlogPost(models.Model): + _name = 'chennora.blog.post' + _description = 'Chennora Blog Post' + _order = 'date desc, id desc' + + title = fields.Char(string='Title', required=True) + slug = fields.Char(string='URL Slug', required=True, help="Used in the URL e.g. 'my-first-post'") + category = fields.Char(string='Category', default='Restaurant Spotlight') + excerpt = fields.Text(string='Excerpt', help="Short summary for the blog card") + content = fields.Html(string='Content', sanitize=True) + image = fields.Char(string='Image URL', default='/dine360_theme_chennora/static/src/img/blog-1.png') + date = fields.Date(string='Publish Date', default=fields.Date.context_today) + active = fields.Boolean(default=True) + + # Computed fields for the blog card date badge + day = fields.Char(compute='_compute_date_parts', store=True) + month = fields.Char(compute='_compute_date_parts', store=True) + + _sql_constraints = [ + ('slug_unique', 'unique(slug)', 'The slug must be unique!') + ] + + @api.depends('date') + def _compute_date_parts(self): + for record in self: + if record.date: + dt = fields.Date.from_string(record.date) + record.day = dt.strftime('%d') + record.month = dt.strftime('%b').upper() + else: + record.day = '' + record.month = '' diff --git a/addons/dine360_theme_chennora/models/product_template.py b/addons/dine360_theme_chennora/models/product_template.py new file mode 100644 index 0000000..28a26a8 --- /dev/null +++ b/addons/dine360_theme_chennora/models/product_template.py @@ -0,0 +1,7 @@ +# -*- coding: utf-8 -*- +from odoo import models, fields + +class ProductTemplate(models.Model): + _inherit = 'product.template' + + is_popular_deal = fields.Boolean(string='Is Popular Deal', default=False, help='Check this to show this product in Popular Deals section on Homepage') diff --git a/addons/dine360_theme_chennora/static/description/cover.png b/addons/dine360_theme_chennora/static/description/cover.png new file mode 100644 index 0000000..97377a9 Binary files /dev/null and b/addons/dine360_theme_chennora/static/description/cover.png differ diff --git a/addons/dine360_theme_chennora/static/description/icon.png b/addons/dine360_theme_chennora/static/description/icon.png new file mode 100644 index 0000000..d7b8d4f Binary files /dev/null and b/addons/dine360_theme_chennora/static/description/icon.png differ diff --git a/addons/dine360_theme_chennora/static/src/img/about-banner-bg.png b/addons/dine360_theme_chennora/static/src/img/about-banner-bg.png new file mode 100644 index 0000000..8d212de Binary files /dev/null and b/addons/dine360_theme_chennora/static/src/img/about-banner-bg.png differ diff --git a/addons/dine360_theme_chennora/static/src/img/about-banner-new.png b/addons/dine360_theme_chennora/static/src/img/about-banner-new.png new file mode 100644 index 0000000..8d212de Binary files /dev/null and b/addons/dine360_theme_chennora/static/src/img/about-banner-new.png differ diff --git a/addons/dine360_theme_chennora/static/src/img/about-basil-float.png b/addons/dine360_theme_chennora/static/src/img/about-basil-float.png new file mode 100644 index 0000000..fbe9f4b Binary files /dev/null and b/addons/dine360_theme_chennora/static/src/img/about-basil-float.png differ diff --git a/addons/dine360_theme_chennora/static/src/img/about-bellpepper.png b/addons/dine360_theme_chennora/static/src/img/about-bellpepper.png new file mode 100644 index 0000000..8daade1 Binary files /dev/null and b/addons/dine360_theme_chennora/static/src/img/about-bellpepper.png differ diff --git a/addons/dine360_theme_chennora/static/src/img/about-leaves.png b/addons/dine360_theme_chennora/static/src/img/about-leaves.png new file mode 100644 index 0000000..fbe9f4b Binary files /dev/null and b/addons/dine360_theme_chennora/static/src/img/about-leaves.png differ diff --git a/addons/dine360_theme_chennora/static/src/img/about-lemon-float.png b/addons/dine360_theme_chennora/static/src/img/about-lemon-float.png new file mode 100644 index 0000000..fd3454f Binary files /dev/null and b/addons/dine360_theme_chennora/static/src/img/about-lemon-float.png differ diff --git a/addons/dine360_theme_chennora/static/src/img/about-lemon.png b/addons/dine360_theme_chennora/static/src/img/about-lemon.png new file mode 100644 index 0000000..fd3454f Binary files /dev/null and b/addons/dine360_theme_chennora/static/src/img/about-lemon.png differ diff --git a/addons/dine360_theme_chennora/static/src/img/about-main-dish.png b/addons/dine360_theme_chennora/static/src/img/about-main-dish.png new file mode 100644 index 0000000..497c8c2 Binary files /dev/null and b/addons/dine360_theme_chennora/static/src/img/about-main-dish.png differ diff --git a/addons/dine360_theme_chennora/static/src/img/about-new-basil.png b/addons/dine360_theme_chennora/static/src/img/about-new-basil.png new file mode 100644 index 0000000..fbe9f4b Binary files /dev/null and b/addons/dine360_theme_chennora/static/src/img/about-new-basil.png differ diff --git a/addons/dine360_theme_chennora/static/src/img/about-new-lemon.png b/addons/dine360_theme_chennora/static/src/img/about-new-lemon.png new file mode 100644 index 0000000..fd3454f Binary files /dev/null and b/addons/dine360_theme_chennora/static/src/img/about-new-lemon.png differ diff --git a/addons/dine360_theme_chennora/static/src/img/about-new-main.png b/addons/dine360_theme_chennora/static/src/img/about-new-main.png new file mode 100644 index 0000000..497c8c2 Binary files /dev/null and b/addons/dine360_theme_chennora/static/src/img/about-new-main.png differ diff --git a/addons/dine360_theme_chennora/static/src/img/about-new-pepper.png b/addons/dine360_theme_chennora/static/src/img/about-new-pepper.png new file mode 100644 index 0000000..21ffbed Binary files /dev/null and b/addons/dine360_theme_chennora/static/src/img/about-new-pepper.png differ diff --git a/addons/dine360_theme_chennora/static/src/img/about-pepper-float.png b/addons/dine360_theme_chennora/static/src/img/about-pepper-float.png new file mode 100644 index 0000000..21ffbed Binary files /dev/null and b/addons/dine360_theme_chennora/static/src/img/about-pepper-float.png differ diff --git a/addons/dine360_theme_chennora/static/src/img/about-platter.png b/addons/dine360_theme_chennora/static/src/img/about-platter.png new file mode 100644 index 0000000..ab0eadf Binary files /dev/null and b/addons/dine360_theme_chennora/static/src/img/about-platter.png differ diff --git a/addons/dine360_theme_chennora/static/src/img/blog-1.png b/addons/dine360_theme_chennora/static/src/img/blog-1.png new file mode 100644 index 0000000..a71222f Binary files /dev/null and b/addons/dine360_theme_chennora/static/src/img/blog-1.png differ diff --git a/addons/dine360_theme_chennora/static/src/img/blog-2.png b/addons/dine360_theme_chennora/static/src/img/blog-2.png new file mode 100644 index 0000000..d8af39d Binary files /dev/null and b/addons/dine360_theme_chennora/static/src/img/blog-2.png differ diff --git a/addons/dine360_theme_chennora/static/src/img/blog-3.png b/addons/dine360_theme_chennora/static/src/img/blog-3.png new file mode 100644 index 0000000..4cb2245 Binary files /dev/null and b/addons/dine360_theme_chennora/static/src/img/blog-3.png differ diff --git a/addons/dine360_theme_chennora/static/src/img/cat-beverages.png b/addons/dine360_theme_chennora/static/src/img/cat-beverages.png new file mode 100644 index 0000000..812ef22 Binary files /dev/null and b/addons/dine360_theme_chennora/static/src/img/cat-beverages.png differ diff --git a/addons/dine360_theme_chennora/static/src/img/cat-biryani.png b/addons/dine360_theme_chennora/static/src/img/cat-biryani.png new file mode 100644 index 0000000..f21df78 Binary files /dev/null and b/addons/dine360_theme_chennora/static/src/img/cat-biryani.png differ diff --git a/addons/dine360_theme_chennora/static/src/img/cat-curries.png b/addons/dine360_theme_chennora/static/src/img/cat-curries.png new file mode 100644 index 0000000..d6ae501 Binary files /dev/null and b/addons/dine360_theme_chennora/static/src/img/cat-curries.png differ diff --git a/addons/dine360_theme_chennora/static/src/img/cat-desserts.png b/addons/dine360_theme_chennora/static/src/img/cat-desserts.png new file mode 100644 index 0000000..8675583 Binary files /dev/null and b/addons/dine360_theme_chennora/static/src/img/cat-desserts.png differ diff --git a/addons/dine360_theme_chennora/static/src/img/cat-dosa.png b/addons/dine360_theme_chennora/static/src/img/cat-dosa.png new file mode 100644 index 0000000..794df1a Binary files /dev/null and b/addons/dine360_theme_chennora/static/src/img/cat-dosa.png differ diff --git a/addons/dine360_theme_chennora/static/src/img/chen-banner-1.webp b/addons/dine360_theme_chennora/static/src/img/chen-banner-1.webp new file mode 100644 index 0000000..7228c13 Binary files /dev/null and b/addons/dine360_theme_chennora/static/src/img/chen-banner-1.webp differ diff --git a/addons/dine360_theme_chennora/static/src/img/chen-banner-2.webp b/addons/dine360_theme_chennora/static/src/img/chen-banner-2.webp new file mode 100644 index 0000000..6d579d8 Binary files /dev/null and b/addons/dine360_theme_chennora/static/src/img/chen-banner-2.webp differ diff --git a/addons/dine360_theme_chennora/static/src/img/chen-banner-3.webp b/addons/dine360_theme_chennora/static/src/img/chen-banner-3.webp new file mode 100644 index 0000000..a415ae2 Binary files /dev/null and b/addons/dine360_theme_chennora/static/src/img/chen-banner-3.webp differ diff --git a/addons/dine360_theme_chennora/static/src/img/choose-left-accent.png b/addons/dine360_theme_chennora/static/src/img/choose-left-accent.png new file mode 100644 index 0000000..b62564f Binary files /dev/null and b/addons/dine360_theme_chennora/static/src/img/choose-left-accent.png differ diff --git a/addons/dine360_theme_chennora/static/src/img/choose-main-dish.png b/addons/dine360_theme_chennora/static/src/img/choose-main-dish.png new file mode 100644 index 0000000..378e9ab Binary files /dev/null and b/addons/dine360_theme_chennora/static/src/img/choose-main-dish.png differ diff --git a/addons/dine360_theme_chennora/static/src/img/choose-pepper-float.png b/addons/dine360_theme_chennora/static/src/img/choose-pepper-float.png new file mode 100644 index 0000000..0e3200f Binary files /dev/null and b/addons/dine360_theme_chennora/static/src/img/choose-pepper-float.png differ diff --git a/addons/dine360_theme_chennora/static/src/img/choose-right-accent.png b/addons/dine360_theme_chennora/static/src/img/choose-right-accent.png new file mode 100644 index 0000000..0fda454 Binary files /dev/null and b/addons/dine360_theme_chennora/static/src/img/choose-right-accent.png differ diff --git a/addons/dine360_theme_chennora/static/src/img/contact-banner-bg.png b/addons/dine360_theme_chennora/static/src/img/contact-banner-bg.png new file mode 100644 index 0000000..609837e Binary files /dev/null and b/addons/dine360_theme_chennora/static/src/img/contact-banner-bg.png differ diff --git a/addons/dine360_theme_chennora/static/src/img/contact-side-img-new.png b/addons/dine360_theme_chennora/static/src/img/contact-side-img-new.png new file mode 100644 index 0000000..fdad080 Binary files /dev/null and b/addons/dine360_theme_chennora/static/src/img/contact-side-img-new.png differ diff --git a/addons/dine360_theme_chennora/static/src/img/contact-side-img.png b/addons/dine360_theme_chennora/static/src/img/contact-side-img.png new file mode 100644 index 0000000..fdad080 Binary files /dev/null and b/addons/dine360_theme_chennora/static/src/img/contact-side-img.png differ diff --git a/addons/dine360_theme_chennora/static/src/img/crispy-gobi-65.png b/addons/dine360_theme_chennora/static/src/img/crispy-gobi-65.png new file mode 100644 index 0000000..517d4aa Binary files /dev/null and b/addons/dine360_theme_chennora/static/src/img/crispy-gobi-65.png differ diff --git a/addons/dine360_theme_chennora/static/src/img/deal-coffee.png b/addons/dine360_theme_chennora/static/src/img/deal-coffee.png new file mode 100644 index 0000000..d91b777 Binary files /dev/null and b/addons/dine360_theme_chennora/static/src/img/deal-coffee.png differ diff --git a/addons/dine360_theme_chennora/static/src/img/deal-dosa.png b/addons/dine360_theme_chennora/static/src/img/deal-dosa.png new file mode 100644 index 0000000..a15ed6e Binary files /dev/null and b/addons/dine360_theme_chennora/static/src/img/deal-dosa.png differ diff --git a/addons/dine360_theme_chennora/static/src/img/deal-kothu.png b/addons/dine360_theme_chennora/static/src/img/deal-kothu.png new file mode 100644 index 0000000..7f0310a Binary files /dev/null and b/addons/dine360_theme_chennora/static/src/img/deal-kothu.png differ diff --git a/addons/dine360_theme_chennora/static/src/img/deal-nuggets.png b/addons/dine360_theme_chennora/static/src/img/deal-nuggets.png new file mode 100644 index 0000000..88c0b4e Binary files /dev/null and b/addons/dine360_theme_chennora/static/src/img/deal-nuggets.png differ diff --git a/addons/dine360_theme_chennora/static/src/img/faq-banner-bg.png b/addons/dine360_theme_chennora/static/src/img/faq-banner-bg.png new file mode 100644 index 0000000..1ac99e8 Binary files /dev/null and b/addons/dine360_theme_chennora/static/src/img/faq-banner-bg.png differ diff --git a/addons/dine360_theme_chennora/static/src/img/faq-new-1.png b/addons/dine360_theme_chennora/static/src/img/faq-new-1.png new file mode 100644 index 0000000..6c63edd Binary files /dev/null and b/addons/dine360_theme_chennora/static/src/img/faq-new-1.png differ diff --git a/addons/dine360_theme_chennora/static/src/img/faq-new-2.png b/addons/dine360_theme_chennora/static/src/img/faq-new-2.png new file mode 100644 index 0000000..e618b1a Binary files /dev/null and b/addons/dine360_theme_chennora/static/src/img/faq-new-2.png differ diff --git a/addons/dine360_theme_chennora/static/src/img/faq-new-3.png b/addons/dine360_theme_chennora/static/src/img/faq-new-3.png new file mode 100644 index 0000000..6c63edd Binary files /dev/null and b/addons/dine360_theme_chennora/static/src/img/faq-new-3.png differ diff --git a/addons/dine360_theme_chennora/static/src/img/faq-slide-1.png b/addons/dine360_theme_chennora/static/src/img/faq-slide-1.png new file mode 100644 index 0000000..b0c560d Binary files /dev/null and b/addons/dine360_theme_chennora/static/src/img/faq-slide-1.png differ diff --git a/addons/dine360_theme_chennora/static/src/img/faq-slide-2.png b/addons/dine360_theme_chennora/static/src/img/faq-slide-2.png new file mode 100644 index 0000000..f464034 Binary files /dev/null and b/addons/dine360_theme_chennora/static/src/img/faq-slide-2.png differ diff --git a/addons/dine360_theme_chennora/static/src/img/faq-slide-3.png b/addons/dine360_theme_chennora/static/src/img/faq-slide-3.png new file mode 100644 index 0000000..7a69370 Binary files /dev/null and b/addons/dine360_theme_chennora/static/src/img/faq-slide-3.png differ diff --git a/addons/dine360_theme_chennora/static/src/img/fiery-fish-curry.png b/addons/dine360_theme_chennora/static/src/img/fiery-fish-curry.png new file mode 100644 index 0000000..0352bd0 Binary files /dev/null and b/addons/dine360_theme_chennora/static/src/img/fiery-fish-curry.png differ diff --git a/addons/dine360_theme_chennora/static/src/img/french-fries-accent.png b/addons/dine360_theme_chennora/static/src/img/french-fries-accent.png new file mode 100644 index 0000000..278142f Binary files /dev/null and b/addons/dine360_theme_chennora/static/src/img/french-fries-accent.png differ diff --git a/addons/dine360_theme_chennora/static/src/img/gallery-1.png b/addons/dine360_theme_chennora/static/src/img/gallery-1.png new file mode 100644 index 0000000..16d0f70 Binary files /dev/null and b/addons/dine360_theme_chennora/static/src/img/gallery-1.png differ diff --git a/addons/dine360_theme_chennora/static/src/img/gallery-2.png b/addons/dine360_theme_chennora/static/src/img/gallery-2.png new file mode 100644 index 0000000..982fead Binary files /dev/null and b/addons/dine360_theme_chennora/static/src/img/gallery-2.png differ diff --git a/addons/dine360_theme_chennora/static/src/img/gallery-3.png b/addons/dine360_theme_chennora/static/src/img/gallery-3.png new file mode 100644 index 0000000..edb03fe Binary files /dev/null and b/addons/dine360_theme_chennora/static/src/img/gallery-3.png differ diff --git a/addons/dine360_theme_chennora/static/src/img/subtitle-icon.png b/addons/dine360_theme_chennora/static/src/img/subtitle-icon.png new file mode 100644 index 0000000..b552c8c Binary files /dev/null and b/addons/dine360_theme_chennora/static/src/img/subtitle-icon.png differ diff --git a/addons/dine360_theme_chennora/static/src/img/testimonial-accent-right.png b/addons/dine360_theme_chennora/static/src/img/testimonial-accent-right.png new file mode 100644 index 0000000..93b5ce3 Binary files /dev/null and b/addons/dine360_theme_chennora/static/src/img/testimonial-accent-right.png differ diff --git a/addons/dine360_theme_chennora/static/src/img/testimonial-main.jpg b/addons/dine360_theme_chennora/static/src/img/testimonial-main.jpg new file mode 100644 index 0000000..66ab0e0 Binary files /dev/null and b/addons/dine360_theme_chennora/static/src/img/testimonial-main.jpg differ diff --git a/addons/dine360_theme_chennora/static/src/img/unlimited-thali.png b/addons/dine360_theme_chennora/static/src/img/unlimited-thali.png new file mode 100644 index 0000000..1027854 Binary files /dev/null and b/addons/dine360_theme_chennora/static/src/img/unlimited-thali.png differ diff --git a/addons/dine360_theme_chennora/static/src/js/category_slider.js b/addons/dine360_theme_chennora/static/src/js/category_slider.js new file mode 100644 index 0000000..7a5bdc4 --- /dev/null +++ b/addons/dine360_theme_chennora/static/src/js/category_slider.js @@ -0,0 +1,89 @@ +/** @odoo-module **/ + +import publicWidget from "@web/legacy/js/public/public_widget"; + +publicWidget.registry.CategoryCarousel = publicWidget.Widget.extend({ + selector: '.s_category_slider', + start: function () { + this.$track = this.$('.category-track'); + this.$items = this.$('.category-item'); + + if (!this.$track.length || !this.$items.length) { + return; + } + + this.currentIndex = 0; + this.totalOriginal = this.$items.length; + + // Clone all items and append for seamless loop + // We ensure we have enough content to scroll endlessly + const itemsToClone = this.$items.clone(); + this.$track.append(itemsToClone); + + // Update items list + this.$newItems = this.$('.category-item'); + + // 3 seconds interval + this._startAutoSlide(); + + // Pause on hover + this.$el.on('mouseenter', () => this._stopAutoSlide()); + this.$el.on('mouseleave', () => this._startAutoSlide()); + + // Handle window resize to reset alignment + $(window).on('resize', () => { + this._slide(true); + }); + + return this._super.apply(this, arguments); + }, + + _startAutoSlide: function () { + if (this.interval) clearInterval(this.interval); + this.interval = setInterval(this._slide.bind(this), 3000); // 3 seconds + }, + + _stopAutoSlide: function () { + if (this.interval) clearInterval(this.interval); + }, + + _slide: function (resize = false) { + if (resize) { + // Just reset position on resize to avoid misalignment + const itemWidth = this.$newItems.first().outerWidth(true); + this.$track.css({ + 'transition': 'none', + 'transform': `translateX(-${this.currentIndex * itemWidth}px)` + }); + return; + } + + // Get current item width (responsive) + const itemWidth = this.$newItems.first().outerWidth(true); + + this.currentIndex++; + + this.$track.css({ + 'transition': 'transform 0.5s ease-in-out', + 'transform': `translateX(-${this.currentIndex * itemWidth}px)` + }); + + // Loop check + // If we have moved past the original set + if (this.currentIndex >= this.totalOriginal) { + setTimeout(() => { + // Snap back to 0 (visually identical position) + // We use 0 because 0 is the start of Original Set + // When currentIndex == totalOriginal, we are at the start of Cloned Set + // Cloned Set is identical to Original Set. + this.$track.css({ + 'transition': 'none', + 'transform': 'translateX(0)' + }); + this.currentIndex = 0; + }, 500); // Wait for transition to finish + } + } +}); + +export default publicWidget.registry.CategoryCarousel; diff --git a/addons/dine360_theme_chennora/static/src/js/deal_switcher.js b/addons/dine360_theme_chennora/static/src/js/deal_switcher.js new file mode 100644 index 0000000..6cd623d --- /dev/null +++ b/addons/dine360_theme_chennora/static/src/js/deal_switcher.js @@ -0,0 +1,98 @@ +/** @odoo-module **/ + +import publicWidget from "@web/legacy/js/public/public_widget"; + +publicWidget.registry.DealSwitcher = publicWidget.Widget.extend({ + selector: '.s_popular_deals_premium', + events: { + 'mouseenter .deal-item': '_onDealHover', + }, + + /** + * @override + */ + start: function () { + this.$centerImg = this.$('#dealCenterImg'); + return this._super.apply(this, arguments); + }, + + //-------------------------------------------------------------------------- + // Handlers + //-------------------------------------------------------------------------- + + /** + * @private + * @param {Event} ev + */ + _onDealHover: function (ev) { + const $item = $(ev.currentTarget); + const newImg = $item.data('deal-img'); + + if (newImg && this.$centerImg.length) { + // Remove active class from others + this.$('.deal-item').removeClass('active'); + // Add active to current + $item.addClass('active'); + + // Fade out, change src, fade in + this.$centerImg.css('opacity', '0'); + setTimeout(() => { + this.$centerImg.attr('src', newImg); + this.$centerImg.css('opacity', '1'); + }, 300); + } + }, +}); + + +publicWidget.registry.GallerySlider = publicWidget.Widget.extend({ + selector: '.s_gallery_slider_premium', + + start: function () { + this.$track = this.$('.gallery-track'); + this.slideWidth = 315; // 300px width + 15px gap + this.currentIndex = 0; + this.totalOriginal = 6; + + // Start auto-slide + this._startAutoSlide(); + + // Pause on hover + this.$el.on('mouseenter', () => this._stopAutoSlide()); + this.$el.on('mouseleave', () => this._startAutoSlide()); + + return this._super.apply(this, arguments); + }, + + _startAutoSlide: function () { + this.interval = setInterval(this._slide.bind(this), 2000); + }, + + _stopAutoSlide: function () { + clearInterval(this.interval); + }, + + _slide: function () { + this.currentIndex++; + this.$track.css({ + 'transition': 'transform 0.8s cubic-bezier(0.165, 0.84, 0.44, 1)', + 'transform': `translateX(-${this.currentIndex * this.slideWidth}px)` + }); + + // Seamless loop reset + if (this.currentIndex >= this.totalOriginal) { + setTimeout(() => { + this.$track.css({ + 'transition': 'none', + 'transform': 'translateX(0)' + }); + this.currentIndex = 0; + }, 800); // Match transition duration + } + } +}); + +export default { + DealSwitcher: publicWidget.registry.DealSwitcher, + GallerySlider: publicWidget.registry.GallerySlider, +}; diff --git a/addons/dine360_theme_chennora/static/src/scss/primary_variables.scss b/addons/dine360_theme_chennora/static/src/scss/primary_variables.scss new file mode 100644 index 0000000..9004d05 --- /dev/null +++ b/addons/dine360_theme_chennora/static/src/scss/primary_variables.scss @@ -0,0 +1,11 @@ +$o-color-palettes: ( + 'chennora-palette': ('o-color-1': #FECD4F, // Yellow (Primary) + 'o-color-2': #2BB1A5, // Teal (Secondary) + 'o-color-3': #04121D, // Dark Accent + 'o-color-4': #FFFFFF, // White + 'o-color-5': #F4F1EA, // Light Sand + ), +); + +// Map the newly created palette to the primary one +$o-selected-color-palette: 'chennora-palette'; \ No newline at end of file diff --git a/addons/dine360_theme_chennora/static/src/scss/shop.scss b/addons/dine360_theme_chennora/static/src/scss/shop.scss new file mode 100644 index 0000000..d4e2aed --- /dev/null +++ b/addons/dine360_theme_chennora/static/src/scss/shop.scss @@ -0,0 +1,613 @@ +/* Chennora Shop Page - Exact Clone of the Classic Food Theme UI */ + +:root { + --food-green: #2BB1A5; + --food-yellow: #FECD4F; + --food-text: #333333; + --food-light-grey: #f1f1f1; + --food-border: #e6e6e6; + --food-shadow: 0 10px 25px rgba(0, 0, 0, 0.06); +} + +.form-control, +.form-select { + background-color: #f8f9fa !important; + border: 1px solid #FECD4F !important; + border-radius: 10px !important; + padding: 14px 18px !important; + font-size: 15px !important; + color: #04121D !important; + transition: all 0.3s ease; +} + +.oe_website_sale { + background-color: #ffffff !important; + padding-top: 40px; + padding-bottom: 80px; + + /* Sidebar Navigation */ + #products_grid_before { + background: transparent !important; + padding-right: 30px !important; + + .food-sidebar-section { + margin-bottom: 40px; + + .section-title { + display: flex; + align-items: center; + font-size: 1.1rem; + font-weight: 800; + color: var(--food-text); + text-transform: uppercase; + margin-bottom: 25px; + letter-spacing: 1px; + + &::before { + content: ''; + display: inline-block; + width: 3px; + height: 18px; + background: var(--food-green); + margin-right: 10px; + } + } + + /* Categories List */ + .category-list { + list-style: none; + padding: 0; + + .category-item { + margin-bottom: 15px; + + a { + display: flex; + align-items: center; + text-decoration: none; + color: #666; + font-weight: 600; + font-size: 0.9rem; + text-transform: uppercase; + transition: color 0.3s ease; + + img { + width: 20px; + margin-right: 15px; + opacity: 0.7; + } + + &.active, + &:hover { + color: var(--food-green); + background-color: transparent !important; + + img { + opacity: 1; + } + } + + &.active, + &.nav-link.active { + color: #000000 !important; + background-color: transparent !important; + border: none !important; + box-shadow: none !important; + + span { + color: #000000 !important; + } + + img { + filter: none !important; + opacity: 1 !important; + } + } + } + } + } + + /* Price Filter */ + .price-slider-wrapper { + .slider-rail { + height: 4px; + background: #eee; + position: relative; + margin: 20px 0; + + .slider-track { + position: absolute; + height: 100%; + background: var(--food-green); + } + + .slider-handle { + width: 14px; + height: 14px; + background: var(--food-green); + border-radius: 50%; + position: absolute; + top: -5px; + } + } + + .price-label-row { + display: flex; + justify-content: space-between; + align-items: center; + + .price-text { + font-size: 0.85rem; + color: #666; + + span { + font-weight: 700; + color: #333; + } + } + + .btn-filter { + background: var(--food-green); + color: white !important; + border: none; + padding: 6px 18px; + border-radius: 4px; + font-weight: 700; + font-size: 0.8rem; + text-transform: uppercase; + } + } + } + + /* New Arrivals */ + .arrival-list { + .arrival-item { + display: flex; + gap: 15px; + margin-bottom: 20px; + + .arrival-img { + width: 60px; + height: 60px; + background: #f9f9f9; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + padding: 5px; + + img { + width: 100%; + } + } + + .arrival-info { + .rating { + color: var(--food-yellow); + font-size: 0.7rem; + margin-bottom: 4px; + } + + .name { + font-weight: 700; + color: #333; + font-size: 0.85rem; + line-height: 1.2; + margin-bottom: 4px; + } + + .price { + font-size: 0.8rem; + + del { + color: #aaa; + margin-right: 6px; + } + + span { + color: var(--food-green); + font-weight: 800; + } + } + } + } + } + } + } + + /* Top Bar Control */ + .food-top-bar { + background: white; + padding: 15px 25px; + border-radius: 8px; + box-shadow: 0 4px 20px rgba(0, 0, 0, 0.03); + margin-bottom: 30px; + display: flex; + justify-content: space-between; + align-items: center; + border: 1px solid #f5f5f5; + + .control-left { + display: flex; + align-items: center; + gap: 20px; + + .btn-filtering { + background: transparent; + border: 1px solid #eee; + padding: 8px 15px; + border-radius: 4px; + color: #333; + font-size: 0.85rem; + font-weight: 700; + + i { + color: var(--food-green); + margin-right: 8px; + } + } + + .result-count { + font-size: 0.85rem; + color: #888; + + span { + font-weight: 700; + color: var(--food-green); + } + } + } + + .control-right { + display: flex; + align-items: center; + gap: 25px; + + .sort-by-wrapper { + font-size: 0.85rem; + color: #888; + + span { + color: #333; + font-weight: 700; + margin-left: 8px; + } + } + + .view-switcher { + display: flex; + gap: 5px; + + .view-btn { + width: 32px; + height: 32px; + display: flex; + align-items: center; + justify-content: center; + border: 1px solid #eee; + border-radius: 4px; + color: #aaa; + + &.active { + background: #f5f5f5; + color: var(--food-green); + border-color: #ddd; + } + } + } + } + } + + /* Product Cards Grid */ + #products_grid { + .oe_product { + padding: 15px !important; + + .oe_product_cart { + border: none !important; + background: white !important; + border-radius: 12px !important; + box-shadow: var(--food-shadow) !important; + overflow: hidden !important; + transition: transform 0.4s ease !important; + position: relative !important; + + &:hover { + transform: translateY(-10px) !important; + + .btn-add-to-cart-overlay { + opacity: 1; + transform: translateY(0); + } + } + + /* Highlighted Cards (Yellow BG) */ + &.card-highlighted { + background: var(--food-yellow) !important; + + .o_wsale_product_information { + background: var(--food-yellow) !important; + } + + .btn-add-to-cart-overlay { + background: var(--food-text) !important; + color: white !important; + } + } + + .oe_product_image { + height: 240px !important; + position: relative !important; + background: transparent !important; + padding: 0 !important; + + img { + object-fit: contain !important; + height: 100% !important; + width: 100% !important; + transition: transform 0.5s ease; + } + + .wishlist-btn { + position: absolute; + top: 15px; + left: 15px; + width: 36px; + height: 36px; + background: #333; + color: white !important; + border-radius: 6px; + display: flex; + align-items: center; + justify-content: center; + font-size: 0.9rem; + z-index: 10; + } + + .discount-badge { + position: absolute; + top: 15px; + right: 15px; + background: var(--food-yellow); + color: #333; + font-weight: 800; + padding: 4px 8px; + border-radius: 4px; + font-size: 0.75rem; + z-index: 10; + } + } + + .o_wsale_product_information { + padding: 15px 20px 25px !important; + text-align: center !important; + background: white !important; + + .btn-add-to-cart-overlay { + background: #FECD4F !important; + color: #000000 !important; + padding: 10px; + border-radius: 6px; + font-weight: 700; + font-size: 0.85rem; + text-transform: uppercase; + display: flex; + align-items: center; + justify-content: center; + gap: 10px; + margin-bottom: 15px; + opacity: 0; + transform: translateY(10px); + transition: all 0.3s ease; + text-decoration: none; + + i { + font-size: 1rem; + } + } + + .price-row { + margin-bottom: 8px; + + del { + color: #aaa; + margin-right: 8px; + font-size: 0.8rem; + } + + span { + color: #333; + font-weight: 800; + font-size: 1rem; + } + } + + .o_wsale_products_item_title { + margin-bottom: 10px !important; + + a { + font-size: 0.95rem !important; + font-weight: 800 !important; + color: var(--food-text) !important; + text-transform: uppercase; + letter-spacing: 0.5px; + } + } + + .star-rating { + color: var(--food-yellow); + font-size: 0.75rem; + display: flex; + justify-content: center; + gap: 2px; + } + } + } + } + } + + /* Custom Pagination */ + .products_pager { + margin-top: 60px; + + ul.pagination { + justify-content: center !important; + gap: 10px; + + li.page-item { + .page-link { + width: 40px; + height: 40px; + display: flex; + align-items: center; + justify-content: center; + border: 1px solid #eee; + border-radius: 50% !important; + color: #666; + font-weight: 700; + font-size: 0.9rem; + background: white; + + &:hover { + background: #f5f5f5; + border-color: #ddd; + } + } + + &.active .page-link { + background: var(--food-green) !important; + color: white !important; + border-color: var(--food-green) !important; + box-shadow: 0 5px 15px rgba(0, 104, 55, 0.2); + } + } + } + } +} + +/* Product Details Page Styling */ +#product_detail { + padding-top: 50px; + + /* Breadcrumb Color */ + .breadcrumb-item a { + color: #FECD4F !important; + font-weight: 700 !important; + } + + .product-details-wrapper { + .display-5 { + font-weight: 800; + color: var(--food-text); + letter-spacing: -0.5px; + } + + .product-price { + h2 { + color: var(--food-green); + font-family: inherit; + } + } + + .css_quantity { + border: 2px solid #eee !important; + border-radius: 50px !important; + overflow: visible !important; + display: inline-flex; + margin-right: 15px; + background: white !important; + height: 45px !important; + align-items: center; + + + .btn { + border: none !important; + background: transparent !important; + padding: 0 15px !important; + color: #333 !important; + + &:hover { + background: #f9f9f9 !important; + } + } + + .quantity { + border: none !important; + width: 80px !important; + max-width: 80px !important; + text-align: center !important; + font-weight: 900 !important; + font-size: 20px !important; + background: #ffffff !important; + color: #000000 !important; + padding: 0 !important; + margin: 0 !important; + height: 45px !important; + display: inline-block !important; + vertical-align: middle !important; + line-height: 45px !important; + box-shadow: none !important; + outline: none !important; + appearance: none !important; + -webkit-appearance: none !important; + } + + + } + + #add_to_cart { + background: #FECD4F !important; + color: #000000 !important; + border: none !important; + border-radius: 50px !important; + padding: 12px 40px !important; + font-weight: 800 !important; + text-transform: uppercase !important; + letter-spacing: 1px !important; + transition: all 0.3s !important; + box-shadow: 0 10px 20px rgba(254, 205, 79, 0.2) !important; + + &:hover { + background: #e5b945 !important; + transform: translateY(-2px) !important; + } + } + } +} + +/* Hide Duplicate Odoo Elements on Product Page */ +#product_details { + display: flex !important; + flex-direction: column !important; + + /* Hide ANY title, price, or description that is NOT inside our custom wrapper */ + >h1:not(.display-5), + >.product_price, + >#product_attributes_simple, + >.text-muted:not(.chennora-premium-content *), + >div[data-name="description_sale"] { + display: none !important; + } + + /* Target the Terms and Conditions block */ + >hr+div, + >div:has(a[href*="terms"]), + .o_not_editable { + /* Only hide if it's not the ones we want */ + } + + /* Dedicated hide for Odoo's extra info */ + hr+div, + a[href*="terms-and-conditions"] { + display: none !important; + } + + /* Force Add to Cart to theme yellow everywhere in shop */ + #add_to_cart, + .a-submit, + .btn-add-to-cart-overlay { + background: #FECD4F !important; + color: #000000 !important; + border: none !important; + } +} \ No newline at end of file diff --git a/addons/dine360_theme_chennora/static/src/scss/theme.scss b/addons/dine360_theme_chennora/static/src/scss/theme.scss new file mode 100644 index 0000000..8def81a --- /dev/null +++ b/addons/dine360_theme_chennora/static/src/scss/theme.scss @@ -0,0 +1,1377 @@ +/* Chennora Theme Custom Styles */ + +/* Header Navigation Styles */ +header { + + // Navigation Links + .navbar-nav { + .nav-link { + color: #FECD4F !important; + font-weight: 600; + transition: all 0.3s ease; + + &:hover { + color: #2BB1A5 !important; + transform: translateY(-2px); + } + + &.active, + &.active-item { + color: #2BB1A5 !important; + border-bottom: 2px solid #2BB1A5; + } + } + + .nav-item.active .nav-link, + .nav-item .nav-link.active, + .nav-item .nav-link.active-item { + color: #2BB1A5 !important; + } + } + + // Top header links (phone, search, cart, etc.) + .o_header_affix_top { + a:not(.btn):not(.btn-primary) { + color: #FECD4F !important; + transition: all 0.3s ease; + position: relative; + + &:hover { + color: #111 !important; + background-color: #FECD4F !important; + border-radius: 50px; + } + } + + .fa, + .oi { + color: #FECD4F !important; + } + + // Cart badge color + .o_wsale_cart_quantity { + background-color: #2BB1A5 !important; + color: white !important; + border: none; + } + } + + // Contact Us Button - Odoo CTA Button + .btn, + .btn-primary, + .o_header_cta_btn, + .btn-contact, + a.btn[href="/contactus"], + a.btn[href*="contact"] { + background-color: #FECD4F !important; + color: #04121D !important; + border: none !important; + border-radius: 8px !important; + padding: 10px 25px !important; + font-weight: 700 !important; + text-transform: uppercase !important; + transition: all 0.3s ease !important; + box-shadow: 0 4px 10px rgba(254, 205, 79, 0.3) !important; + text-decoration: none !important; + + &:hover { + background-color: #04121D !important; + color: #FECD4F !important; + transform: translateY(-2px) !important; + box-shadow: 0 6px 15px rgba(0, 0, 0, 0.3) !important; + } + } + + // All header links (excluding buttons) + a:not(.btn):not(.btn-primary):not(.o_header_cta_btn) { + color: #FECD4F !important; + + &:hover { + color: #2BB1A5 !important; + } + } + + // Header icons + i.fa { + color: #FECD4F !important; + } +} + +// Hero Button Hover +.btn-lg.flat:hover, +.btn-custom:hover { + background-color: #2BB1A5 !important; + color: white !important; + transform: translateY(-3px); + transition: all 0.3s ease; +} + +// Category Card Hover +.category-item { + transition: all 0.3s ease; + cursor: pointer; + + &:hover { + transform: translateY(-10px); + + .category-img { + border-color: #FECD4F !important; + box-shadow: 0 10px 20px rgba(0, 0, 0, 0.1); + } + } +} + +// Background Text Overlay +.bg-text-overlay { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 100%; + text-align: center; + z-index: 0; + pointer-events: none; + + h1 { + font-size: 8rem; + font-weight: 900; + color: rgba(0, 0, 0, 0.03); // Very subtle + white-space: nowrap; + text-transform: uppercase; + margin: 0; + } +} + +// Hero Shape Animation +.hero-shape-accent { + position: absolute; + top: 5%; + left: 2%; + width: 350px; + z-index: 1; + opacity: 0.1; + pointer-events: none; + filter: brightness(0) invert(1); // Make it white/light + animation: shapeFloat 15s ease-in-out infinite; +} + +@keyframes shapeFloat { + + 0%, + 100% { + transform: translateY(0) rotate(0deg) scale(1); + } + + 33% { + transform: translateY(-20px) rotate(3deg) scale(1.05); + } + + 66% { + transform: translateY(10px) rotate(-2deg) scale(0.98); + } +} + +// Hero Floating Elements +.hero-tomato-right { + position: absolute; + top: 5%; + right: 2%; + width: 200px; + z-index: 2; + pointer-events: none; + animation: shapeFloat 8s ease-in-out infinite; +} + +.hero-leaf-right { + position: absolute; + top: 15%; + right: 8%; + width: 80px; + z-index: 1; + pointer-events: none; + animation: shapeFloat 10s ease-in-out infinite reverse; +} + +.hero-lettuce-left { + position: absolute; + bottom: 5%; + left: -2%; + width: 250px; + z-index: 2; + pointer-events: none; + animation: shapeFloat 12s ease-in-out infinite; +} + +.hero-sketches-left { + position: absolute; + top: 2%; + left: 2%; + width: 300px; + z-index: 1; + pointer-events: none; + opacity: 0.2; + animation: shapeFloat 20s linear infinite; +} + +.hero-onion-mid { + position: absolute; + bottom: 20%; + left: 40%; + width: 120px; + z-index: 1; + pointer-events: none; + opacity: 0.6; + animation: shapeFloat 9s ease-in-out infinite; +} + +// Section Headers +section h2.display-3, +section h2.display-4 { + font-size: 40px !important; + font-weight: 900 !important; + line-height: 50px !important; + text-transform: uppercase; + letter-spacing: -0.5px; + + @media (max-width: 991px) { + font-size: 32px !important; + line-height: 42px !important; + } + + @media (max-width: 767px) { + font-size: 28px !important; + line-height: 38px !important; + } +} + +.section-title-wrapper { + position: relative; + z-index: 1; + text-align: center; + margin-bottom: 50px; + + .title-icon { + width: 40px; + margin: 0 10px; + filter: brightness(0.8); + } +} + +// Marquee Animation +.quee-container { + overflow: hidden; + position: relative; + background: #f4f1ea; + padding: 40px 0; + + .quee-content { + display: flex; + width: 200%; + animation: marquee 30s linear infinite; + + h1 { + font-size: 6rem; + font-weight: 900; + color: rgba(0, 0, 0, 0.05); + white-space: nowrap; + text-transform: uppercase; + margin: 0; + padding-right: 100px; + letter-spacing: 5px; + } + } +} + +@keyframes marquee { + 0% { + transform: translateX(0); + } + + 100% { + transform: translateX(-50%); + } +} + +// Slider Adjustments +#categoryCarousel { + .carousel-inner { + padding-bottom: 20px; + } +} + +// About Section Styles +.s_about_premium { + position: relative; + overflow: hidden; + background-color: #F4F1EA !important; + padding: 100px 0; + + .floating-lemon { + position: absolute; + left: -40px; + top: 35%; + width: 150px; + z-index: 10; + animation: float 6s ease-in-out infinite; + } + + .floating-leaves { + position: absolute; + left: 80px; + bottom: 8%; + width: 180px; + z-index: 10; + animation: float 8s ease-in-out infinite; + } + + .floating-bellpepper { + position: absolute; + right: -30px; + top: 80px; + width: 140px; + z-index: 10; + animation: float 7s ease-in-out infinite; + } + + .about-image-wrapper { + position: relative; + display: inline-block; + + &::before { + content: ""; + position: absolute; + left: -15px; + top: -15px; + width: 100%; + height: 100%; + z-index: 0; + pointer-events: none; + } + + img { + position: relative; + z-index: 5; + max-width: 100%; + height: auto; + display: block; + } + } + + .about-content { + h2 { + font-size: 2.8rem; + font-weight: 900; + color: #04121D; + line-height: 1.2; + margin-bottom: 25px; + } + + h5 { + font-size: 1.2rem; + font-weight: 700; + color: #04121D; + margin-bottom: 20px; + } + + p { + font-size: 15px; + color: rgba(4, 18, 29, 0.7); + line-height: 1.8; + margin-bottom: 20px; + } + } +} + +@keyframes float { + 0% { + transform: translateY(0px) rotate(0deg); + } + + 50% { + transform: translateY(-20px) rotate(5deg); + } + + 100% { + transform: translateY(0px) rotate(0deg); + } +} + +/* Contact Section Premium */ +.s_contact_premium { + background-color: #F4F1EA !important; + padding: 100px 0; + position: relative; + overflow: hidden; + + .contact-image-wrapper { + position: relative; + display: inline-block; + + &::before { + content: ""; + position: absolute; + left: -15px; + top: -15px; + width: 100%; + height: 100%; + z-index: 0; + pointer-events: none; + } + + img { + position: relative; + z-index: 5; + max-width: 100%; + height: auto; + display: block; + } + } + + .contact-form-card { + background: white; + padding: 50px; + border-radius: 15px; + box-shadow: 0 15px 40px rgba(0, 0, 0, 0.05); + + h2 { + font-size: 2.2rem; + font-weight: 800; + color: #04121D; + line-height: 1.3; + margin-bottom: 35px; + } + + .s_website_form_label { + font-size: 14px; + font-weight: 500; + color: #666; + margin-bottom: 8px; + display: block; + text-align: left !important; + width: auto !important; + padding: 0 !important; + + .s_website_form_mark { + color: #FECD4F; + margin-left: 3px; + } + } + + .form-control, + .form-select { + background-color: #f8f9fa !important; + border: 1px solid #FECD4F !important; + border-radius: 10px !important; + padding: 14px 18px !important; + font-size: 15px !important; + color: #04121D !important; + transition: all 0.3s ease; + + &::placeholder { + color: #adb5bd; + } + + &:focus { + border-color: rgba(43, 177, 165, 0.3) !important; + background-color: white !important; + box-shadow: 0 5px 15px rgba(43, 177, 165, 0.1) !important; + } + } + + .s_website_form_send { + background-color: #FECD4F !important; + color: #04121D !important; + border: none !important; + border-radius: 10px !important; + padding: 16px !important; + font-weight: 800 !important; + font-size: 15px !important; + text-transform: uppercase !important; + letter-spacing: 1px !important; + width: 100% !important; + margin-top: 15px !important; + display: flex !important; + align-items: center !important; + justify-content: center !important; + gap: 10px; + transition: all 0.3s ease !important; + box-shadow: 0 4px 10px rgba(254, 205, 79, 0.2) !important; + + &:hover { + background-color: #04121D !important; + color: #FECD4F !important; + transform: translateY(-2px) !important; + box-shadow: 0 8px 20px rgba(0, 0, 0, 0.2) !important; + } + + &::after { + content: "\2192"; + font-size: 18px; + } + } + } +} + +// Why Choose Section +.s_why_choose_premium { + background-color: #04121D; + position: relative; + overflow: hidden; + + .choose-left-accent { + position: absolute; + left: 0; + bottom: -20px; + width: 180px; + z-index: 1; + opacity: 0.9; + } + + .choose-right-accent { + position: absolute; + right: 0; + top: 10%; + width: 250px; + z-index: 1; + opacity: 0.9; + } + + .choose-pepper-float { + position: absolute; + left: 5%; + top: 10%; + width: 80px; + z-index: 2; + animation: float 5s ease-in-out infinite; + } + + .choose-main-dish-wrapper { + position: relative; + z-index: 5; + + &::after { + content: ""; + position: absolute; + top: -20px; + right: 20%; + width: 300px; + height: 200px; + background: radial-gradient(circle, rgba(255, 255, 255, 0.05) 0%, transparent 70%); + z-index: -1; + } + + img { + filter: drop-shadow(0 30px 50px rgba(0, 0, 0, 0.5)); + } + } + + .choose-content { + position: relative; + z-index: 10; + + h6 { + font-weight: 800; + letter-spacing: 1px; + } + + h2 { + letter-spacing: -1px; + margin-bottom: 25px; + } + + p { + line-height: 1.8; + opacity: 0.8; + } + } +} + +// Popular Deals Section +.s_popular_deals_premium { + background-color: white; + + .deal-item { + display: flex; + align-items: center; + margin-bottom: 10px; + transition: all 0.3s ease; + padding: 10px; + border-radius: 8px; + cursor: pointer; + + &:hover, + &.active { + background-color: #f8f9fa; + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.05); + + h6 { + color: #2BB1A5 !important; + } + } + + .deal-img-wrapper { + width: 80px; + height: 80px; + flex-shrink: 0; + background: #f8f9fa; + border-radius: 4px; + overflow: hidden; + margin-right: 15px; + + img { + width: 100%; + height: 100%; + object-fit: cover; + } + } + + .deal-details { + flex-grow: 1; + + h6 { + font-size: 18px; + font-weight: 800; + color: #04121D; + margin-bottom: 2px; + } + + p { + font-size: 12px; + color: #888; + margin: 0; + } + } + + .deal-price { + font-size: 16px; + font-weight: 800; + color: #04121D; + white-space: nowrap; + } + } + + .deal-center-image { + position: relative; + padding: 20px; + + &::before { + content: ""; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: #e9ecef; + z-index: 0; + border-radius: 4px; + } + + img { + position: relative; + z-index: 1; + width: 100%; + border-radius: 50%; + box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1); + } + } +} + +// Testimonials Section +.s_testimonials_premium { + background-color: #04121D; + position: relative; + overflow: hidden; + + .testimonial-main-image-wrapper { + position: relative; + border-radius: 0 400px 400px 0; + overflow: hidden; + border-right: 15px solid #FECD4F; + + img { + width: 100%; + height: 100%; + object-fit: cover; + } + + .video-btn-wrapper { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + z-index: 20; + + .play-btn { + width: 150px; + height: 150px; + background: transparent; + border: none; + position: relative; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + + .play-icon { + width: 70px; + height: 70px; + background: white; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + color: #04121D; + font-size: 24px; + box-shadow: 0 0 20px rgba(0, 0, 0, 0.3); + z-index: 5; + } + + .rotating-text { + position: absolute; + width: 100%; + height: 100%; + animation: rotate 15s linear infinite; + + img { + width: 100%; + height: 100%; + object-fit: contain; + } + } + } + } + } + + .testimonial-content-side { + padding: 80px 40px; + position: relative; + z-index: 10; + color: white; + + .google-reviews-logo { + width: 180px; + margin-bottom: 25px; + } + + .testimonial-carousel { + .carousel-item { + p { + font-size: 18px; + line-height: 1.8; + font-style: italic; + color: rgba(255, 255, 255, 0.8); + } + } + } + + .testimonial-controls { + display: flex; + gap: 15px; + margin-top: 40px; + + .control-btn { + width: 50px; + height: 50px; + border: 1px solid rgba(255, 255, 255, 0.3); + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + color: white; + background: transparent; + transition: all 0.3s ease; + + &:hover { + background: #FECD4F; + border-color: #FECD4F; + color: #04121D; + } + + &.next-btn { + background: #FECD4F; + border-color: #FECD4F; + color: #04121D; + } + } + } + } + + .testimonial-accent-right { + position: absolute; + right: 0; + bottom: 0; + width: 150px; + z-index: 5; + } +} + +@keyframes rotate { + from { + transform: rotate(0deg); + } + + to { + transform: rotate(360deg); + } +} + +// FAQ Section +.s_faq_premium { + background-color: #F4F1EA; + + .faq-accordion { + .accordion-item { + background-color: white; + border: none; + border-radius: 12px !important; + margin-bottom: 20px; + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.05); + overflow: hidden; + + .accordion-button { + background-color: white; + color: #04121D; + font-weight: 700; + padding: 20px 25px; + border: none; + box-shadow: none; + position: relative; + font-size: 18px; + + &:not(.collapsed) { + color: #2BB1A5; + + &::after { + content: "-"; + transform: none; + background-image: none; + color: #FECD4F; + font-size: 30px; + line-height: 1; + } + } + + &::after { + content: "+"; + background-image: none; + color: #FECD4F; + font-size: 24px; + font-weight: 300; + display: flex; + align-items: center; + justify-content: center; + } + } + + .accordion-body { + padding: 0 25px 25px; + color: #555; + font-size: 15px; + line-height: 1.6; + } + } + } + + .faq-carousel-wrapper { + border-radius: 15px; + overflow: hidden; + box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1); + + .carousel-control-prev, + .carousel-control-next { + width: 40px; + height: 40px; + background: #FECD4F; + border-radius: 50%; + top: 50%; + transform: translateY(-50%); + opacity: 0.9; + + span { + color: #04121D; + font-size: 12px; + } + } + + .carousel-control-prev { + left: 15px; + } + + .carousel-control-next { + right: 15px; + } + } + + .know-more-btn { + background-color: #FECD4F; + color: #04121D; + font-weight: 700; + padding: 12px 30px; + border-radius: 4px; + text-transform: uppercase; + display: inline-flex; + align-items: center; + gap: 10px; + margin-top: 30px; + text-decoration: none; + + span { + background: black; + color: white; + width: 24px; + height: 24px; + display: flex; + align-items: center; + justify-content: center; + border-radius: 2px; + font-size: 12px; + } + } +} + +// Blog Section +.s_blog_premium { + background-color: #F4F1EA; + position: relative; + overflow: hidden; + + .blog-card { + background: white; + border-radius: 12px; + overflow: hidden; + height: 100%; + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.05); + transition: all 0.4s cubic-bezier(0.165, 0.84, 0.44, 1); + position: relative; + color: #04121D; + + .blog-img-wrapper { + position: relative; + height: 280px; + overflow: hidden; + + img { + width: 100%; + height: 100%; + object-fit: cover; + transition: transform 0.6s cubic-bezier(0.165, 0.84, 0.44, 1); + } + + .date-badge { + position: absolute; + bottom: -20px; + left: 20px; + width: 60px; + height: 60px; + background: white; + border: 2px solid #2BB1A5; + border-radius: 8px; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + font-weight: 700; + z-index: 5; + box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1); + transition: all 0.3s ease; + + span { + display: block; + line-height: 1; + + &:first-child { + font-size: 20px; + color: #04121D; + transition: color 0.3s; + } + + &:last-child { + font-size: 10px; + color: #2BB1A5; + text-transform: uppercase; + transition: color 0.3s; + } + } + } + } + + .blog-body { + padding: 40px 25px 30px; + transition: all 0.3s ease; + + .category-line { + font-size: 11px; + text-transform: uppercase; + letter-spacing: 1px; + color: #888; + margin-bottom: 20px; + display: inline-block; + padding: 4px 12px; + background: #f8f9fa; + border-radius: 4px; + transition: all 0.3s ease; + } + + h4 { + font-size: 20px; + font-weight: 800; + margin-bottom: 15px; + line-height: 1.4; + transition: color 0.3s ease; + } + + .blog-excerpt { + font-size: 14px; + line-height: 1.6; + color: #666; + transition: color 0.3s ease; + } + } + + &:hover { + transform: translateY(-10px); + box-shadow: 0 15px 35px rgba(0, 0, 0, 0.15); + + .blog-img-wrapper { + img { + transform: scale(1.1); + } + + .date-badge { + border: 2px dashed #2BB1A5; + } + } + + .blog-body { + h4 { + color: #2BB1A5; + } + } + } + } + + .fries-accent { + position: absolute; + bottom: -20px; + left: -30px; + width: 250px; + z-index: 10; + pointer-events: none; + } +} + +// Gallery Slider Section +.s_gallery_slider_premium { + background-color: #F4F1EA; + padding: 30px 0; + overflow: hidden; + position: relative; + border-top: 1px solid rgba(0, 0, 0, 0.05); + + .gallery-container { + display: flex; + align-items: center; + } + + .gallery-track { + display: flex; + gap: 15px; + transition: transform 0.8s cubic-bezier(0.165, 0.84, 0.44, 1); + } + + .gallery-item { + width: 300px; + height: 300px; + flex-shrink: 0; + overflow: hidden; + border-radius: 8px; + box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1); + + img { + width: 100%; + height: 100%; + object-fit: cover; + transition: transform 0.5s ease; + } + + &:hover img { + transform: scale(1.1); + } + } +} + +// Footer +// Footer Refinement +footer#bottom { + background-color: #04121D !important; + color: white; + position: relative; + padding-top: 120px; // Space for the floating bar + overflow: visible; + + // Floating Teal Bar + .footer-cta-bar-wrapper { + position: absolute; + top: -60px; + left: 0; + right: 0; + z-index: 20; + + .footer-cta-bar { + background-color: #2BB1A5; + border-radius: 20px; + padding: 30px 50px; + box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2); + display: flex; + justify-content: space-between; + align-items: center; + + .cta-item { + display: flex; + align-items: center; + gap: 20px; + color: white; + + .icon-circle { + width: 50px; + height: 50px; + background: white; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + color: #2BB1A5; + font-size: 20px; + } + + strong { + display: block; + font-size: 14px; + opacity: 0.8; + } + + p { + margin: 0; + font-weight: 700; + font-size: 16px; + } + } + } + } + + .footer-title { + font-size: 24px; + font-weight: 800; + margin-bottom: 30px; + position: relative; + padding-bottom: 10px; + + &::after { + content: ''; + position: absolute; + left: 0; + bottom: 0; + width: 50px; + height: 3px; + background: #2BB1A5; + } + } + + .footer-logo { + max-width: 180px; + } + + .social-links { + display: flex; + gap: 10px; + + a { + width: 35px; + height: 35px; + border: 1px solid rgba(255, 255, 255, 0.2); + border-radius: 4px; + display: flex; + align-items: center; + justify-content: center; + color: white !important; + transition: all 0.3s; + + &:hover { + background: #FECD4F; + border-color: #FECD4F; + color: #04121D; + } + } + } + + .footer-list { + list-style: none; + padding: 0; + margin: 0; + + li { + margin-bottom: 15px; + display: flex; + align-items: flex-start; + gap: 10px; + + i { + color: #2BB1A5; + font-size: 12px; + margin-top: 5px; + } + + a { + color: white !important; + text-decoration: none; + transition: color 0.3s; + + &:hover { + color: #FECD4F; + } + } + } + } + + .footer-accent-left { + position: absolute; + left: 0; + bottom: 100px; + width: 200px; + opacity: 0.8; + pointer-events: none; + } + + .footer-accent-right { + position: absolute; + right: 40px; + top: 40%; + transform: translateY(-50%); + width: 250px; + opacity: 0.8; + pointer-events: none; + border-radius: 50%; + } + + .footer-copyright-bar { + background-color: #FECD4F; + color: #04121D; + text-align: center; + padding: 15px; + font-weight: 700; + margin-top: 80px; + } +} + +// Mobile Responsive Footer +@media (max-width: 991px) { + footer#bottom { + padding-top: 200px; + + .footer-cta-bar-wrapper { + top: -150px; + + .footer-cta-bar { + flex-direction: column; + gap: 20px; + padding: 30px; + } + } + + .footer-accent-left, + .footer-accent-right { + display: none; + } + } +} + +/* About Us Hero Banner */ +.about-hero-banner { + background: linear-gradient(rgba(4, 18, 29, 0.4), rgba(4, 18, 29, 0.4)), url('/dine360_theme_chennora/static/src/img/about-banner-bg.png') no-repeat center center !important; + background-size: cover !important; + min-height: 450px !important; + display: flex !important; + align-items: center !important; + justify-content: center !important; + text-align: center; + position: relative; + padding: 100px 0 !important; + + h1 { + font-size: 5rem !important; + font-weight: 900 !important; + color: white !important; + text-transform: uppercase; + margin-bottom: 5px !important; + letter-spacing: 2px; + } + + .breadcrumb-container { + font-size: 1.1rem; + font-weight: 600; + color: white; + + a { + color: white; + text-decoration: none; + transition: color 0.3s; + + &:hover { + color: #FECD4F; + } + } + + .separator { + margin: 0 10px; + opacity: 0.7; + } + + .active-item { + color: #FECD4F; + } + } +} + +/* Global Red Color Removal & Theme Alignment */ +.text-danger { + color: #2BB1A5 !important; // Replace red text with theme teal +} + +.bg-danger, +.btn-danger { + background-color: #2BB1A5 !important; + border-color: #2BB1A5 !important; + color: white !important; +} + +.badge-danger { + background-color: #FECD4F !important; + color: #04121D !important; +} + +// Force Shop category sidebar active item to NOT be red +#products_grid_before .nav-link.active { + background-color: #2BB1A5 !important; + color: white !important; +} + +// Global Link Hover & Active Color Fix +a:hover, +a:hover *, +.btn-link:hover, +.btn-link:hover * { + color: #2BB1A5 !important; +} + +.active, +.nav-link.active, +.nav-pills .nav-link.active { + color: #2BB1A5 !important; +} + +// Special case for buttons or text that should be white on teal background +.nav-pills .nav-link.active, +.category-list .active, +.category-list .active span { + color: white !important; +} \ No newline at end of file diff --git a/addons/dine360_theme_chennora/views/about_page.xml b/addons/dine360_theme_chennora/views/about_page.xml new file mode 100644 index 0000000..5a7f245 --- /dev/null +++ b/addons/dine360_theme_chennora/views/about_page.xml @@ -0,0 +1,94 @@ + + + + + + diff --git a/addons/dine360_theme_chennora/views/blog_detail_page.xml b/addons/dine360_theme_chennora/views/blog_detail_page.xml new file mode 100644 index 0000000..51e7939 --- /dev/null +++ b/addons/dine360_theme_chennora/views/blog_detail_page.xml @@ -0,0 +1,118 @@ + + + + + + + diff --git a/addons/dine360_theme_chennora/views/blog_page.xml b/addons/dine360_theme_chennora/views/blog_page.xml new file mode 100644 index 0000000..c3f3c75 --- /dev/null +++ b/addons/dine360_theme_chennora/views/blog_page.xml @@ -0,0 +1,65 @@ + + + + + + diff --git a/addons/dine360_theme_chennora/views/contact_page.xml b/addons/dine360_theme_chennora/views/contact_page.xml new file mode 100644 index 0000000..7bf06b6 --- /dev/null +++ b/addons/dine360_theme_chennora/views/contact_page.xml @@ -0,0 +1,227 @@ + + + + + + + + + + diff --git a/addons/dine360_theme_chennora/views/faq_page.xml b/addons/dine360_theme_chennora/views/faq_page.xml new file mode 100644 index 0000000..7b9321f --- /dev/null +++ b/addons/dine360_theme_chennora/views/faq_page.xml @@ -0,0 +1,213 @@ + + + + + + diff --git a/addons/dine360_theme_chennora/views/layout.xml b/addons/dine360_theme_chennora/views/layout.xml new file mode 100644 index 0000000..9531522 --- /dev/null +++ b/addons/dine360_theme_chennora/views/layout.xml @@ -0,0 +1,285 @@ + + + + + Chennora Main Layout + qweb + + + + + + + + + + + + + + + + + + main_object if main_object and main_object._name == 'website.page' and not request.session.debug and not editable and not translatable else None + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Header + extra_items_toggle_aria_label + + + + + + + + + + Chennora Main Layout Extra + qweb + + + + + + + None if website.is_menu_cache_disabled() else (xmlid,website,website.is_public_user()) + + + + + + + + + + Contact Us + /contactus + Extra items button + + + +
+ +
+
+ + + + + + + + + + + + + + + +