Footer ui updated

This commit is contained in:
Alaguraj0361 2026-02-02 22:55:24 +05:30
parent ad48c93063
commit de84edb9c2
2 changed files with 257 additions and 72 deletions

View File

@ -814,11 +814,185 @@
} }
// Footer // Footer
// Footer Refinement
footer#bottom { footer#bottom {
background-color: #04121D !important; background-color: #04121D !important;
color: white; color: white;
position: relative;
padding-top: 120px; // Space for the floating bar
overflow: visible;
a:hover { // Floating Teal Bar
color: #FECD4F !important; .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;
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;
text-decoration: none;
transition: color 0.3s;
&:hover {
color: #FECD4F;
}
}
}
}
.footer-accent-left {
position: absolute;
left: -50px;
bottom: 100px;
width: 200px;
opacity: 0.8;
pointer-events: none;
}
.footer-accent-right {
position: absolute;
right: -50px;
top: 0;
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;
}
} }
} }

View File

@ -17,19 +17,6 @@
</xpath> </xpath>
<xpath expr="//head" position="attributes"> <xpath expr="//head" position="attributes">
<!--
Cache the <head> of the website.layout:
- For each individual website.page record (their css/js might be the
same but their title will not for example). Arguably we could do this
for any record (not only website.page) but this t-cache was originally
added to replace the website.page own cache system. For other records,
it could probably depend on each individual access right.
- Only for non-designers (especially visitors) (hence the "editable or
translatable" check).
- Only if not in any debug mode (we want any correct value of debug mode
to correctly appear in the `odoo` object + assets may depend on this
(e.g. debug=assets or debug=tests)).
-->
<attribute name="t-cache">main_object if main_object and main_object._name == 'website.page' and not request.session.debug and not editable and not translatable else None</attribute> <attribute name="t-cache">main_object if main_object and main_object._name == 'website.page' and not request.session.debug and not editable and not translatable else None</attribute>
</xpath> </xpath>
<xpath expr="//head/*[1]" position="before"> <xpath expr="//head/*[1]" position="before">
@ -60,7 +47,6 @@
<meta t-if="meta_keywords or editable" name="keywords" t-att-content="meta_keywords"/> <meta t-if="meta_keywords or editable" name="keywords" t-att-content="meta_keywords"/>
<t t-if="seo_object"> <t t-if="seo_object">
<meta name="default_description" t-att-content="website_meta_description or website_meta.get('meta_description')" groups="website.group_website_designer"/> <meta name="default_description" t-att-content="website_meta_description or website_meta.get('meta_description')" groups="website.group_website_designer"/>
<!-- OpenGraph tags for Facebook sharing -->
<t t-set="opengraph_meta" t-value="website_meta.get('opengraph_meta')"/> <t t-set="opengraph_meta" t-value="website_meta.get('opengraph_meta')"/>
<t t-if="opengraph_meta"> <t t-if="opengraph_meta">
<t t-foreach="opengraph_meta" t-as="property"> <t t-foreach="opengraph_meta" t-as="property">
@ -74,7 +60,6 @@
</t> </t>
</t> </t>
</t> </t>
<!-- Twitter tags for sharing -->
<t t-set="twitter_meta" t-value="website_meta.get('twitter_meta')"/> <t t-set="twitter_meta" t-value="website_meta.get('twitter_meta')"/>
<t t-if="opengraph_meta"> <t t-if="opengraph_meta">
<t t-foreach="twitter_meta" t-as="t_meta"> <t t-foreach="twitter_meta" t-as="t_meta">
@ -82,7 +67,6 @@
</t> </t>
</t> </t>
</t> </t>
<!-- `alternate`/`canonical` mainly useful to crawlers/bots/SEO tools, which test the website as public user -->
<t t-if="request and request.is_frontend_multilang and website and website.is_public_user()"> <t t-if="request and request.is_frontend_multilang and website and website.is_public_user()">
<t t-set="alternate_languages" t-value="website._get_alternate_languages(canonical_params=canonical_params)"/> <t t-set="alternate_languages" t-value="website._get_alternate_languages(canonical_params=canonical_params)"/>
<t t-foreach="alternate_languages" t-as="lg"> <t t-foreach="alternate_languages" t-as="lg">
@ -90,9 +74,6 @@
</t> </t>
</t> </t>
<link t-if="request and website and website.is_public_user()" rel="canonical" t-att-href="website._get_canonical_url(canonical_params=canonical_params)"/> <link t-if="request and website and website.is_public_user()" rel="canonical" t-att-href="website._get_canonical_url(canonical_params=canonical_params)"/>
<!-- TODO: Once we have style in DB, add this preconnect only if a
google font is actually used. Note that if no font is used, the
preconnect is actually not connecting to the google servers. -->
<link rel="preconnect" href="https://fonts.gstatic.com/" crossorigin=""/> <link rel="preconnect" href="https://fonts.gstatic.com/" crossorigin=""/>
</xpath> </xpath>
@ -102,9 +83,6 @@
</xpath> </xpath>
<xpath expr="//header/t[@t-cache]" position="attributes"> <xpath expr="//header/t[@t-cache]" position="attributes">
<!-- website.is_public_user() is needed for menus having a page with
restricted visibility (only shown to logged in user): public users and
logged in users can't share the menu cache. -->
<attribute name="t-cache">None if website.is_menu_cache_disabled() else (xmlid,website,website.is_public_user())</attribute> <attribute name="t-cache">None if website.is_menu_cache_disabled() else (xmlid,website,website.is_public_user())</attribute>
</xpath> </xpath>
@ -114,23 +92,79 @@
<t t-set="extra_items_toggle_aria_label">Extra items button</t> <t t-set="extra_items_toggle_aria_label">Extra items button</t>
</xpath> </xpath>
<xpath expr="//footer" position="attributes"> <xpath expr="//footer[@id='bottom']" position="replace">
<attribute name="data-name">Footer</attribute> <footer id="bottom" data-anchor="true" data-name="Footer" class="o_footer o_colored_level o_cc">
<!-- Background now controlled by css configuration, using color combinations --> <div id="footer" class="oe_structure oe_structure_solo">
<attribute name="t-attf-class" add="o_colored_level o_cc" remove="bg-light" separator=" "/> <section class="s_footer_premium pt80">
<!-- Add the main object as a cache key so that the footer_visible page <div class="container footer-cta-bar-wrapper">
option is properly reflected across pages. Controllers and other objects <div class="footer-cta-bar">
do not have any page option (yet) so they can share the same cache --> <div class="cta-item">
<attribute name="t-cache" add="website,main_object._name == 'website.page' and main_object"/> <div class="icon-circle"><i class="fa fa-map-marker"></i></div>
</xpath> <div>
<xpath expr="//div[hasclass('o_footer_copyright')]" position="attributes"> <strong>Address</strong>
<attribute name="data-name">Copyright</attribute> <p>Unit 66, 11665 McVean Dr, Brampton, Canada.</p>
<!-- Background now controlled by css configuration, using color combinations --> </div>
<attribute name="class" add="o_colored_level o_cc" separator=" "/> </div>
</xpath> <div class="cta-item">
<xpath expr="//t[@t-call='web.brand_promotion']/.." position="attributes"> <div class="icon-circle"><i class="fa fa-envelope"></i></div>
<attribute name="class" add="o_not_editable" separator=" "/> <div>
<attribute name="t-if">not editable</attribute> <strong>Send Email</strong>
<p>chennorakitchen@gmail.com</p>
</div>
</div>
<div class="cta-item">
<div class="icon-circle"><i class="fa fa-phone"></i></div>
<div>
<strong>Call Us</strong>
<p>+1(647)856-2878</p>
</div>
</div>
</div>
</div>
<div class="container main-footer-content mt-5">
<div class="row">
<div class="col-lg-3 col-md-6 mb-5">
<h2 class="fw-bold mb-4" style="color: #FECD4F;">Chennora</h2>
<p class="text-white-50 mb-4">Chennora brings Chennai's authentic flavors to Brampton where every dish tells a story of South Indian heritage.</p>
<div class="social-links">
<a href="#"><i class="fa fa-facebook"></i></a>
<a href="#"><i class="fa fa-instagram"></i></a>
<a href="#"><i class="fa fa-tiktok"></i></a>
<a href="#"><i class="fa fa-youtube"></i></a>
<a href="#"><i class="fa fa-twitter"></i></a>
</div>
</div>
<div class="col-lg-3 col-md-6 mb-5">
<h4 class="footer-title">Hours</h4>
<ul class="footer-list">
<li><span>Sunday - Thursday: <span style="color: #2BB1A5;">12pm - 9pm</span></span></li>
<li><span>Friday &amp; Saturday: <span style="color: #2BB1A5;">12pm - 11pm</span></span></li>
</ul>
</div>
<div class="col-lg-3 col-md-6 mb-5">
<h4 class="footer-title">Quick Links</h4>
<ul class="footer-list">
<li><i class="fa fa-chevron-right"></i><a href="/about">About Us</a></li>
<li><i class="fa fa-chevron-right"></i><a href="/blog">Our Blogs</a></li>
<li><i class="fa fa-chevron-right"></i><a href="/contactus">Contact Us</a></li>
</ul>
</div>
<div class="col-lg-3 col-md-6 mb-5">
<h4 class="footer-title">Contact</h4>
<div class="mb-3 d-flex align-items-center"><i class="fa fa-phone me-3" style="color: #2BB1A5;"></i><span>+1(647)856-2878</span></div>
<h5 class="fw-bold mt-4 mb-2">Address</h5>
<div class="d-flex align-items-start"><i class="fa fa-map-marker me-3 mt-1" style="color: #2BB1A5;"></i><span>Chennora Indian Kitchen Bar, Unit 66, 11665 McVean Dr, Brampton</span></div>
</div>
</div>
</div>
<img src="/dine360_theme_chennora/static/src/img/about-leaves.png" class="footer-accent-left d-none d-lg-block" alt=""/>
<img src="/dine360_theme_chennora/static/src/img/gallery-2.png" class="footer-accent-right d-none d-lg-block" alt=""/>
<div class="footer-copyright-bar">
Copyright 2026 @ Chennora. Powered by MetatronCube. All Right Reserved.
</div>
</section>
</div>
</footer>
</xpath> </xpath>
<xpath expr="//div[@id='wrapwrap']" position="after"> <xpath expr="//div[@id='wrapwrap']" position="after">
@ -146,7 +180,7 @@
'analytics_storage': 'denied', 'analytics_storage': 'denied',
}); });
gtag('js', new Date()); gtag('js', new Date());
gtag('config', '&lt;t t-esc="website.google_analytics_key"/&gt;'); gtag('config', '<t t-esc="website.google_analytics_key"/>');
function allConsentsGranted() { function allConsentsGranted() {
gtag('consent', 'update', { gtag('consent', 'update', {
'ad_storage': 'granted', 'ad_storage': 'granted',
@ -172,12 +206,9 @@
</t> </t>
</xpath> </xpath>
<!-- Page options -->
<xpath expr="//div[@id='wrapwrap']" position="before"> <xpath expr="//div[@id='wrapwrap']" position="before">
<t groups="website.group_website_restricted_editor"> <t groups="website.group_website_restricted_editor">
<t t-foreach="['header_overlay', 'header_color', 'header_text_color', 'header_visible', 'footer_visible']" t-as="optionName"> <t t-foreach="['header_overlay', 'header_color', 'header_text_color', 'header_visible', 'footer_visible']" t-as="optionName">
<!-- Firefox autocomplete is too aggressive and works on hidden inputs,
so we need to disable it (https://bugzilla.mozilla.org/show_bug.cgi?id=520561) -->
<input t-if="main_object and optionName in main_object" type="hidden" class="o_page_option_data" autocomplete="off" t-att-name="optionName" t-att-value="main_object[optionName]"/> <input t-if="main_object and optionName in main_object" type="hidden" class="o_page_option_data" autocomplete="off" t-att-name="optionName" t-att-value="main_object[optionName]"/>
</t> </t>
</t> </t>
@ -191,39 +222,19 @@
<t t-set="header_text_color_is_class" t-value="'text-' in header_text_color"/> <t t-set="header_text_color_is_class" t-value="'text-' in header_text_color"/>
<t t-set="header_text_color_class" t-value="header_text_color_is_class and header_text_color or ''"/> <t t-set="header_text_color_class" t-value="header_text_color_is_class and header_text_color or ''"/>
<t t-set="header_text_color_style" t-value="(not header_text_color_is_class) and header_text_color or ''"/> <t t-set="header_text_color_style" t-value="(not header_text_color_is_class) and header_text_color or ''"/>
<div groups="base.group_user" class="o_frontend_to_backend_nav position-fixed d-none">
<svg xmlns="http://www.w3.org/2000/svg" class="o_frontend_to_backend_icon position-absolute" width="24px" height="24px" viewBox="-7 -7 24 24" preserveAspectRatio="xMinYMin">
<path fill="#FFF" d="M8 8V1a1 1 0 1 1 2 0v8a1 1 0 0 1-1 1H1a1 1 0 1 1 0-2h7z"/>
</svg>
<div class="o_frontend_to_backend_buttons d-flex">
<a href="#" title="Go to your Odoo Apps" class="o_frontend_to_backend_apps_btn fa fa-th d-flex align-items-center justify-content-center text-decoration-none" data-bs-toggle="dropdown"/>
<div class="dropdown-menu o_frontend_to_backend_apps_menu" role="menu">
<a role="menuitem" class="dropdown-item" t-esc="menu['name']" t-as="menu" t-foreach="env['ir.ui.menu'].with_context(force_action=True).load_menus_root()['children']" t-attf-href="/web#menu_id=#{menu['id']}&amp;action=#{menu['action'] and menu['action'].split(',')[1] or ''}"/>
</div>
<a groups="website.group_website_restricted_editor" href="#" title="Edit this content" class="o_frontend_to_backend_edit_btn px-3 d-flex align-items-center justify-content-center text-decoration-none">
<img src="/website/static/description/icon.png" alt=""/>Editor
</a>
</div>
</div>
</xpath> </xpath>
<xpath expr="//div[@id='wrapwrap']" position="attributes"> <xpath expr="//div[@id='wrapwrap']" position="attributes">
<attribute name="t-attf-class" add="#{'o_header_overlay' if main_object and 'header_overlay' in main_object and main_object.header_overlay else ''}" separator=" "/> <attribute name="t-attf-class" add="#{'o_header_overlay' if main_object and 'header_overlay' in main_object and main_object.header_overlay else ''}" separator=" "/>
</xpath> </xpath>
<xpath expr="//header" position="attributes"> <xpath expr="//header" position="attributes">
<attribute name="t-attf-class" add="#{header_bg_color_class}" separator=" "/> <attribute name="t-attf-class" add="#{header_bg_color_class} #{header_text_color_class}" separator=" "/>
<attribute name="t-attf-style" add="#{header_bg_color_style and ('background-color: %s;' % header_bg_color_style)}" separator=" "/> <attribute name="t-attf-style" add="#{header_bg_color_style and ('background-color: %s;' % header_bg_color_style)} #{header_text_color_style and ('color: %s;' % header_text_color_style)}" separator=" "/>
<attribute name="t-attf-class" add="#{header_text_color_class}" separator=" "/>
<attribute name="t-attf-style" add="#{header_text_color_style and ('color: %s;' % header_text_color_style)}" separator=" "/>
</xpath> </xpath>
<xpath expr="//header" position="attributes"> <xpath expr="//header" position="attributes">
<attribute name="t-attf-class" add="#{'d-none o_snippet_invisible' if main_object and 'header_visible' in main_object and not main_object.header_visible else ''}" separator=" "/> <attribute name="t-attf-class" add="#{'d-none o_snippet_invisible' if main_object and 'header_visible' in main_object and not main_object.header_visible else ''}" separator=" "/>
<attribute name="t-att-data-invisible">'1' if main_object and 'header_visible' in main_object and not main_object.header_visible else None</attribute> <attribute name="t-att-data-invisible">'1' if main_object and 'header_visible' in main_object and not main_object.header_visible else None</attribute>
</xpath> </xpath>
<xpath expr="//footer[@id='bottom']" position="attributes">
<attribute name="t-attf-class" add="#{'d-none o_snippet_invisible' if main_object and 'footer_visible' in main_object and not main_object.footer_visible else ''}" separator=" "/>
<attribute name="t-att-data-invisible">'1' if main_object and 'footer_visible' in main_object and not main_object.footer_visible else None</attribute>
</xpath>
</template> </template>
</data> </data>
</odoo> </odoo>