{# ═══════════════════════════════════════════════════════════════════════════
Central Header — HoneyBee Ecosystem
Scandinavian SaaS design · single source of truth for all public pages
═══════════════════════════════════════════════════════════════════════════ #}
{% if not include_html is defined %}
{% set include_html = 1 %}
{% if app.request.request.get('skipHTML') != '' %}{% set include_html = 0 %}{% endif %}
{% if app.request.query.get('skipHTML') != '' %}{% set include_html = 0 %}{% endif %}
{% endif %}
{% if include_html == 1 %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, minimal-ui">
<meta name="description"
content="{{ og_description is defined ? og_description : 'HoneyBee — The digital operating layer for EPC, energy, and multi-site industrial operations. Unify finance, projects, IoT, Edge+ site intelligence, billing and AI reporting. From €7.99/user/month.' }}">
<meta name="keywords"
content="HoneyBee, EPC software, system integrator platform, energy asset management, IoT Edge+ deployment, project lifecycle software, industrial operations, DATEV accounting, multi-site management">
<meta name="author" content="HoneyBee Ecosystem">
<title id="pageTitle">{{ page_title }}</title>
<meta property="og:title" content="{{ og_title is defined ? og_title : page_title }}"/>
<meta property="og:description"
content="{{ og_description is defined ? og_description : 'HoneyBee — Operating system for EPC companies, system integrators, energy asset owners, and multi-site industrial businesses.' }}"/>
<meta property="og:image"
content="{{ og_image is defined ? (absolute_url(path('dashboard'))~og_image) : (absolute_url(path('dashboard'))~'honeybee_web_assets/icons/honeybeeicon.svg') }}"/>
{% set _noindex_routes = ['user_login','sign_up','reset_password','verify_email','verify_otp','reset_new_password','honeybee_otp_verification'] %}
{% if app.request.get('_route') in _noindex_routes %}
<meta name="robots" content="noindex, nofollow">
{% else %}
<meta name="robots" content="index, follow">
{% endif %}
{# ── Favicons ──────────────────────────────────────────────────────────── #}
<link rel="shortcut icon" type="image/x-icon"
href="{{ asset('favicon.ico') }}?v={{ constant('ApplicationBundle\\Constants\\GeneralConstant::ENTITY_APP_VERSION') }}">
<link rel="apple-touch-icon" sizes="180x180"
href="{{ asset('apple-icon.png') }}?v={{ constant('ApplicationBundle\\Constants\\GeneralConstant::ENTITY_APP_VERSION') }}">
<link rel="icon" type="image/png" sizes="32x32"
href="{{ asset('favicon-32x32.png') }}?v={{ constant('ApplicationBundle\\Constants\\GeneralConstant::ENTITY_APP_VERSION') }}">
<link rel="icon" type="image/png" sizes="16x16"
href="{{ asset('favicon-16x16.png') }}?v={{ constant('ApplicationBundle\\Constants\\GeneralConstant::ENTITY_APP_VERSION') }}">
<link rel="manifest" href="{{ asset('site.webmanifest') }}">
<link rel="mask-icon" href="{{ asset('safari-pinned-tab.svg') }}" color="#C07D2A">
<meta name="msapplication-TileColor" content="#1A1D2E">
<meta name="theme-color" content="#F7F5F0">
{# ── Fonts ─────────────────────────────────────────────────────────────── #}
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600;700;800&family=Montserrat:wght@500&display=swap"
rel="stylesheet">
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
{# ── Core stylesheets ──────────────────────────────────────────────────── #}
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.6.0/css/all.min.css"
integrity="sha512-Kc323vGBEqzTmouAECnVceyQqyqdsSiqLQISBL29aUW4U/M7pSPA/gEUZQqv1cwx4OnYxTxve5UMg5GT6L4JJg=="
crossorigin="anonymous" referrerpolicy="no-referrer">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.css">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css">
<link rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-material-datetimepicker/2.7.1/css/bootstrap-material-datetimepicker.min.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/selectize.js/0.13.3/css/selectize.css">
<link rel="stylesheet"
href="{{ absolute_url(path('dashboard')) }}honeybee_web_assets/css/bootstrap.css?v={{ constant('ApplicationBundle\\Constants\\GeneralConstant::ENTITY_APP_VERSION') }}">
<link rel="stylesheet"
href="{{ absolute_url(path('dashboard')) }}honeybee_web_assets/css/style.css?v={{ constant('ApplicationBundle\\Constants\\GeneralConstant::ENTITY_APP_VERSION') }}">
<link rel="stylesheet" id="dark-theme-css"
href="{{ absolute_url(path('dashboard')) }}honeybee_web_assets/css/dark.css?v={{ constant('ApplicationBundle\\Constants\\GeneralConstant::ENTITY_APP_VERSION') }}"
disabled="true">
<link rel="stylesheet"
href="{{ absolute_url(path('dashboard')) }}honeybee_web_assets/css/responsive.css?v={{ constant('ApplicationBundle\\Constants\\GeneralConstant::ENTITY_APP_VERSION') }}">
<link rel="stylesheet"
href="{{ absolute_url(path('dashboard')) }}honeybee_web_assets/css/central_responsive.css?v={{ constant('ApplicationBundle\\Constants\\GeneralConstant::ENTITY_APP_VERSION') }}">
<link rel="stylesheet"
href="{{ absolute_url(path('dashboard')) }}honeybee_web_assets/css/temporary_inline.css?v={{ constant('ApplicationBundle\\Constants\\GeneralConstant::ENTITY_APP_VERSION') }}">
{# ── Dev toolbar suppression ───────────────────────────────────────────── #}
<style>{% if app.session.get('devAdminMode') != 1 %}.sf-toolbar {
display: none !important
}{% endif %}</style>
{# ── Preloader ─────────────────────────────────────────────────────────── #}
<style>
#hb-preloader {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100vh;
background: #F7F5F0;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
z-index: 99999;
}
.hb-pre-logo {
display: flex;
align-items: center;
gap: 12px;
margin-bottom: 28px;
}
.hb-pre-logo img {
width: 34px;
height: 34px;
}
.hb-pre-logo span {
font-family: 'DM Sans', sans-serif;
font-size: 17px;
font-weight: 800;
color: #1A1D2E;
letter-spacing: -.01em;
}
.hb-pre-logo span b {
color: #C07D2A;
font-weight: 800;
}
.hb-pre-bar-wrap {
width: 120px;
height: 2px;
background: rgba(26, 29, 46, .08);
border-radius: 2px;
overflow: hidden;
}
.hb-pre-bar {
height: 100%;
width: 40%;
background: #C07D2A;
border-radius: 2px;
animation: hb-slide 1.5s ease-in-out infinite;
}
@keyframes hb-slide {
0% {
transform: translateX(-100%);
}
50% {
transform: translateX(250%);
}
100% {
transform: translateX(-100%);
}
}
</style>
{# ── Inline JS (runs before body paint) ───────────────────────────────── #}
<script>
var logger = (function () {
var _old = null, pub = {};
pub.enableLogger = function () {
if (_old) window['console']['log'] = _old;
};
pub.disableLogger = function () {
_old = console.log;
window['console']['log'] = function () {
};
};
return pub;
}());
{% if app.session.get('devAdminMode') != 1 %}
window['console']['log'] = function () {
};
{% endif %}
</script>
<script>
function changeTheme(isDark) {
var darkCss = document.getElementById('dark-theme-css');
var cb = document.getElementById('theme-toggle-checkbox');
var track = document.getElementById('hbThemeTrack');
document.querySelectorAll('img').forEach(function (img) {
if (isDark) {
img.src = img.src.replace('/honeybee_web_assets/', '/honeybee_web_assets/dark/');
} else {
img.src = img.src.replace('/honeybee_web_assets/dark/', '/honeybee_web_assets/');
}
});
if (darkCss) darkCss.disabled = !isDark;
if (cb) cb.checked = isDark;
if (track) track.classList.toggle('hb-dark', isDark);
localStorage.setItem('theme', isDark ? 'dark' : 'light');
}
</script>
<script>if (typeof module === 'object') {
window.module = module;
module = undefined;
}</script>
<script src="https://code.jquery.com/jquery-3.4.1.min.js"
integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script>
<script data-ad-client="ca-pub-8286883017903771" async
src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<script>var BaseURL = '{{ url('dashboard') }}';</script>
</head>
{# ── Google Analytics ──────────────────────────────────────────────────────── #}
<script async src="https://www.googletagmanager.com/gtag/js?id=G-V22132YMJ3"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() {
dataLayer.push(arguments);
}
gtag('js', new Date());
gtag('config', 'G-V22132YMJ3');
</script>
{# ── Resolve admin level & consultant flag ────────────────────────────────── #}
{% set BUDDYBEE_ADMIN_LEVEL = 0 %}
{% set isConsultant = 0 %}
{% if session[UserConstants.USER_ID] is defined %}
{% set isConsultant = session[UserConstants.IS_CONSULTANT] is defined ? session[UserConstants.IS_CONSULTANT] : 0 %}
{% set BUDDYBEE_ADMIN_LEVEL = session[UserConstants.BUDDYBEE_ADMIN_LEVEL] is defined ? session[UserConstants.BUDDYBEE_ADMIN_LEVEL] : 0 %}
{% endif %}
{# Single <body> tag — classes set in one place, no duplicate tags #}
{% if BUDDYBEE_ADMIN_LEVEL >= 1 %}
<body class="buddybee_body has_admin_bar body-mask">
{% elseif session[UserConstants.USER_ID] is defined %}
<body class="buddybee_body body-mask">
{% else %}
<body class="body-mask">
{% endif %}
{# ── Preloader ─────────────────────────────────────────────────────────────── #}
<div id="hb-preloader">
<div class="hb-pre-logo">
<img src="{{ absolute_url(path('dashboard')) }}honeybee_web_assets/icons/honeybeeicon.svg?v={{ constant('ApplicationBundle\\Constants\\GeneralConstant::ENTITY_APP_VERSION') }}"
alt="HoneyBee">
<span>Honey<b>Bee</b></span>
</div>
<div class="hb-pre-bar-wrap">
<div class="hb-pre-bar"></div>
</div>
</div>
{# ── Processing overlay (shown during AJAX) ────────────────────────────────── #}
<div id="buddybee_processing_loader">
<div><p>Processing</p></div>
</div>
{# ══════════════════════════════ NAVBAR ═══════════════════════════════════════
Scandinavian navbar: glass-morphism, fixed, minimal, fully responsive
═══════════════════════════════════════════════════════════════════════════ #}
<style>
/* ── Design tokens ──────────────────────────────────────────────────────────── */
:root {
--hb-ink: #1A1D2E;
--hb-ink-2: #252840;
--hb-amber: #C07D2A;
--hb-amber-lt: #D4954A;
--hb-muted: #6B6E7F;
--hb-border: rgba(26, 29, 46, .08);
--hb-border-md: rgba(26, 29, 46, .14);
--hb-cream: #F7F5F0;
--hb-white: #FFFFFF;
--hb-shadow: 0 2px 20px rgba(26, 29, 46, .07);
--hb-shadow-lg: 0 8px 32px rgba(26, 29, 46, .10);
--hb-radius: 10px;
--hb-font: 'DM Sans', 'Gilroy', system-ui, sans-serif;
}
/* ── Navbar shell ─────────────────────────────────────────────────────────── */
.hb-navbar {
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 9999;
background: rgba(247, 245, 240, .97);
backdrop-filter: blur(20px) saturate(180%);
-webkit-backdrop-filter: blur(20px) saturate(180%);
border-bottom: 1px solid var(--hb-border);
transition: box-shadow .2s, border-color .2s;
font-family: var(--hb-font);
}
.hb-navbar.hb-scrolled {
box-shadow: var(--hb-shadow);
border-color: var(--hb-border-md);
}
/* ── Inner container ──────────────────────────────────────────────────────── */
.hb-nav-inner {
max-width: 1280px;
margin: 0 auto;
padding: 0 28px;
height: 64px;
display: flex;
align-items: center;
gap: 24px;
}
/* ── Brand ────────────────────────────────────────────────────────────────── */
.hb-brand {
display: flex;
align-items: center;
gap: 9px;
text-decoration: none;
flex-shrink: 0;
}
.hb-brand img {
height: 30px;
width: auto;
}
.hb-brand-name {
font-size: 15.5px;
font-weight: 800;
color: var(--hb-ink);
letter-spacing: -.01em;
line-height: 1;
}
.hb-brand-name b {
color: var(--hb-amber);
font-weight: 800;
}
/* ── Nav links ────────────────────────────────────────────────────────────── */
.hb-links {
display: flex;
align-items: center;
gap: 2px;
list-style: none;
margin: 0;
padding: 0;
flex: 1;
}
.hb-links .hb-link > a,
.hb-links .hb-drop > a {
display: inline-flex;
align-items: center;
gap: 5px;
padding: 7px 11px;
font-size: 13.5px;
font-weight: 500;
color: var(--hb-muted);
text-decoration: none;
border-radius: 7px;
white-space: nowrap;
transition: color .15s, background .15s;
position: relative;
}
.hb-links .hb-link > a:hover,
.hb-links .hb-drop > a:hover {
color: var(--hb-ink);
background: rgba(26, 29, 46, .04);
}
.hb-links .hb-link > a.active {
color: var(--hb-ink);
font-weight: 600;
}
.hb-links .hb-link > a.active::after {
content: '';
position: absolute;
bottom: 2px;
left: 11px;
right: 11px;
height: 1.5px;
background: var(--hb-amber);
border-radius: 2px;
}
/* ── Dropdown ─────────────────────────────────────────────────────────────── */
.hb-drop {
position: relative;
}
.hb-caret {
font-size: 9px;
opacity: .5;
transition: transform .2s;
}
.hb-drop:hover .hb-caret {
transform: rotate(180deg);
}
.hb-dd-menu {
position: absolute;
top: 100%;
left: 50%;
transform: translateX(-50%) translateY(0);
min-width: 195px;
background: var(--hb-white);
border: 1px solid var(--hb-border-md);
border-radius: var(--hb-radius);
box-shadow: var(--hb-shadow-lg);
padding: 6px;
padding-top: 12px; /* gap lives inside → no dead zone */
opacity: 0;
pointer-events: none;
transition: opacity .16s, transform .16s;
transition-delay: 0s, 0s; /* show instantly */
list-style: none;
margin: 0;
z-index: 10001;
}
.hb-drop:hover .hb-dd-menu,
.hb-dd-menu:hover {
opacity: 1;
pointer-events: all;
transform: translateX(-50%) translateY(0);
}
.hb-drop:not(:hover) .hb-dd-menu:not(:hover) {
transition-delay: .12s;
}
/* slight lag on hide */
.hb-dd-menu li a {
display: block;
padding: 8px 12px;
font-size: 13px;
font-weight: 500;
color: var(--hb-muted);
text-decoration: none;
border-radius: 6px;
transition: color .12s, background .12s;
}
.hb-dd-menu li a:hover {
color: var(--hb-ink);
background: rgba(26, 29, 46, .04);
}
.hb-dd-menu li a.active {
color: var(--hb-ink);
font-weight: 600;
}
.hb-dd-div {
height: 1px;
background: var(--hb-border);
margin: 4px 6px;
}
/* ── Right side ───────────────────────────────────────────────────────────── */
.hb-nav-right {
display: flex;
align-items: center;
gap: 6px;
flex-shrink: 0;
}
/* ── Language switcher ────────────────────────────────────────────────────── */
.hb-lang {
position: relative;
}
.hb-lang-btn {
display: flex;
align-items: center;
gap: 5px;
padding: 6px 10px;
font-size: 12.5px;
font-weight: 600;
color: var(--hb-muted);
background: none;
border: 1px solid var(--hb-border);
border-radius: 7px;
cursor: pointer;
transition: all .15s;
font-family: var(--hb-font);
}
.hb-lang-btn:hover {
color: var(--hb-ink);
border-color: var(--hb-border-md);
background: rgba(26, 29, 46, .03);
}
.hb-lang-menu {
position: absolute;
top: 100%;
right: 0;
min-width: 155px;
background: var(--hb-white);
border: 1px solid var(--hb-border-md);
border-radius: var(--hb-radius);
box-shadow: var(--hb-shadow-lg);
padding: 6px;
padding-top: 10px; /* gap lives inside → no dead zone */
opacity: 0;
pointer-events: none;
transform: translateY(0);
transition: opacity .15s;
z-index: 10001;
list-style: none;
margin: 0;
}
.hb-lang:hover .hb-lang-menu,
.hb-lang-menu:hover {
opacity: 1;
pointer-events: all;
}
.hb-lang:not(:hover) .hb-lang-menu:not(:hover) {
transition-delay: .12s;
}
.hb-lang-menu li a {
display: block;
padding: 7px 12px;
font-size: 13px;
font-weight: 500;
color: var(--hb-muted);
text-decoration: none;
border-radius: 6px;
transition: all .12s;
}
.hb-lang-menu li a:hover {
color: var(--hb-ink);
background: rgba(26, 29, 46, .04);
}
/* ── User dropdown ────────────────────────────────────────────────────────── */
.hb-user {
position: relative;
}
.hb-user-btn {
display: flex;
align-items: center;
gap: 7px;
background: none;
border: none;
cursor: pointer;
padding: 4px 6px;
border-radius: 8px;
transition: background .15s;
}
.hb-user-btn:hover {
background: rgba(26, 29, 46, .05);
}
.hb-user-avatar {
width: 30px;
height: 30px;
border-radius: 50%;
background-size: cover !important;
background-position: center !important;
border: 1.5px solid var(--hb-border-md);
flex-shrink: 0;
}
.hb-user-name {
font-size: 13px;
font-weight: 600;
color: var(--hb-ink);
max-width: 110px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.hb-user-menu {
position: absolute;
top: 100%;
right: 0;
min-width: 185px;
background: var(--hb-white);
border: 1px solid var(--hb-border-md);
border-radius: var(--hb-radius);
box-shadow: var(--hb-shadow-lg);
padding: 6px;
padding-top: 12px; /* gap lives inside → no dead zone */
opacity: 0;
pointer-events: none;
transform: translateY(0);
transition: opacity .15s;
z-index: 10001;
list-style: none;
margin: 0;
}
.hb-user:hover .hb-user-menu {
opacity: 1;
pointer-events: all;
}
.hb-user:not(:hover) .hb-user-menu:not(:hover) {
transition-delay: .12s;
}
.hb-user-menu li a {
display: flex;
align-items: center;
gap: 8px;
padding: 8px 12px;
font-size: 13px;
font-weight: 500;
color: var(--hb-muted);
text-decoration: none;
border-radius: 6px;
transition: all .12s;
}
.hb-user-menu li a:hover {
color: var(--hb-ink);
background: rgba(26, 29, 46, .04);
}
.hb-user-menu li a i {
font-size: 12px;
width: 14px;
opacity: .5;
}
.hb-u-div {
height: 1px;
background: var(--hb-border);
margin: 4px 6px;
}
/* ── Auth + Companies buttons ─────────────────────────────────────────────── */
.hb-btn-login {
padding: 7px 16px;
font-size: 13px;
font-weight: 600;
color: var(--hb-ink);
background: none;
border: 1.5px solid var(--hb-border-md);
border-radius: 8px;
text-decoration: none;
transition: all .15s;
}
.hb-btn-login:hover {
color: var(--hb-ink);
border-color: var(--hb-ink);
background: rgba(26, 29, 46, .03);
}
.hb-btn-signup {
padding: 7px 16px;
font-size: 13px;
font-weight: 700;
color: #fff;
background: var(--hb-ink);
border: 1.5px solid transparent;
border-radius: 8px;
text-decoration: none;
transition: all .15s;
}
.hb-btn-signup:hover {
color: #fff;
background: var(--hb-ink-2);
box-shadow: 0 4px 14px rgba(26, 29, 46, .2);
}
.hb-btn-companies {
display: inline-flex;
align-items: center;
gap: 6px;
padding: 7px 15px;
font-size: 13px;
font-weight: 700;
color: #fff;
background: var(--hb-amber);
border: none;
border-radius: 8px;
text-decoration: none;
transition: all .15s;
}
.hb-btn-companies:hover {
color: #fff;
background: var(--hb-amber-lt);
box-shadow: 0 4px 14px rgba(192, 125, 42, .28);
}
/* ── Switch-user panel (admin only) ──────────────────────────────────────── */
.hb-switch {
position: relative;
}
.hb-switch-btn {
padding: 6px 11px;
font-size: 12px;
font-weight: 600;
color: var(--hb-muted);
background: none;
border: 1px solid var(--hb-border);
border-radius: 7px;
cursor: pointer;
font-family: var(--hb-font);
transition: all .15s;
}
.hb-switch-btn:hover {
color: var(--hb-ink);
border-color: var(--hb-border-md);
}
.hb-switch-panel {
position: absolute;
top: 100%;
right: 0;
min-width: 225px;
background: var(--hb-white);
border: 1px solid var(--hb-border-md);
border-radius: var(--hb-radius);
box-shadow: var(--hb-shadow-lg);
padding: 10px;
padding-top: 14px; /* gap lives inside → no dead zone */
opacity: 0;
pointer-events: none;
transform: translateY(0);
transition: opacity .15s;
z-index: 10001;
list-style: none;
margin: 0;
}
.hb-switch:hover .hb-switch-panel {
opacity: 1;
pointer-events: all;
}
.hb-switch:not(:hover) .hb-switch-panel:not(:hover) {
transition-delay: .12s;
}
.hb-switch-panel li a {
display: block;
padding: 8px 10px;
font-size: 13px;
font-weight: 500;
color: var(--hb-muted);
text-decoration: none;
border-radius: 6px;
transition: all .12s;
}
.hb-switch-panel li a:hover {
color: var(--hb-ink);
background: rgba(26, 29, 46, .04);
}
.hb-sw-div {
height: 1px;
background: var(--hb-border);
margin: 6px 0;
}
.hb-switch-panel select {
width: 100%;
font-size: 12px;
font-family: var(--hb-font);
border: 1px solid var(--hb-border-md);
border-radius: 6px;
padding: 6px 8px;
color: var(--hb-ink);
background: var(--hb-cream);
}
/* ── Theme toggle ─────────────────────────────────────────────────────────── */
.hb-theme {
display: flex;
align-items: center;
gap: 6px;
padding: 0 2px;
}
.hb-theme-img {
width: 14px;
height: 14px;
opacity: .45;
display: block;
}
#theme-toggle-checkbox {
display: none;
}
.hb-theme-track {
position: relative;
width: 34px;
height: 19px;
background: rgba(26, 29, 46, .14);
border-radius: 10px;
cursor: pointer;
transition: background .2s;
flex-shrink: 0;
display: block;
}
.hb-theme-track::after {
content: '';
position: absolute;
top: 2px;
left: 2px;
width: 15px;
height: 15px;
background: white;
border-radius: 50%;
box-shadow: 0 1px 4px rgba(0, 0, 0, .18);
transition: transform .2s;
}
.hb-theme-track.hb-dark {
background: var(--hb-amber);
}
.hb-theme-track.hb-dark::after {
transform: translateX(15px);
}
/* ── Mobile hamburger ─────────────────────────────────────────────────────── */
.hb-toggler {
display: none;
background: none;
border: none;
cursor: pointer;
padding: 8px;
flex-direction: column;
gap: 5px;
border-radius: 7px;
margin-left: auto;
flex-shrink: 0;
transition: background .15s;
}
.hb-toggler:hover {
background: rgba(26, 29, 46, .06);
}
.hb-toggler span {
display: block;
width: 21px;
height: 1.5px;
background: var(--hb-ink);
border-radius: 2px;
transition: all .22s;
}
.hb-toggler.hb-open span:nth-child(1) {
transform: rotate(45deg) translate(4.5px, 4.5px);
}
.hb-toggler.hb-open span:nth-child(2) {
opacity: 0;
transform: scaleX(0);
}
.hb-toggler.hb-open span:nth-child(3) {
transform: rotate(-45deg) translate(4.5px, -4.5px);
}
/* ── Responsive ───────────────────────────────────────────────────────────── */
@media (max-width: 1024px) {
.hb-toggler {
display: flex;
}
.hb-links, .hb-nav-right {
display: none;
}
.hb-nav-inner {
height: 56px;
}
.hb-navbar.hb-open .hb-nav-inner {
height: auto;
flex-wrap: wrap;
padding-top: 12px;
padding-bottom: 14px;
align-items: flex-start;
}
.hb-navbar.hb-open .hb-links {
display: flex;
flex-direction: column;
align-items: flex-start;
width: 100%;
flex: 0 0 100%;
gap: 2px; /* flex: 0 0 100% overrides base flex:1 to force row wrap */
}
.hb-navbar.hb-open .hb-links .hb-link,
.hb-navbar.hb-open .hb-links .hb-drop {
width: 100%;
}
.hb-navbar.hb-open .hb-links .hb-link > a,
.hb-navbar.hb-open .hb-links .hb-drop > a {
width: 100%;
justify-content: space-between;
}
.hb-navbar.hb-open .hb-dd-menu {
position: static;
transform: none;
opacity: 0;
pointer-events: none;
display: none;
box-shadow: none;
border: none;
background: rgba(26, 29, 46, .03);
border-radius: 7px;
margin: 2px 0 2px 12px;
}
.hb-navbar.hb-open .hb-drop.hb-mob-open .hb-dd-menu {
display: block;
opacity: 1;
pointer-events: all;
}
.hb-navbar.hb-open .hb-nav-right {
display: flex;
flex-wrap: wrap;
width: 100%;
flex: 0 0 100%;
gap: 8px;
padding-top: 12px;
border-top: 1px solid var(--hb-border);
margin-top: 4px;
}
}
/* ── Body offset for fixed navbar ─────────────────────────────────────────── */
body {
padding-top: 64px;
}
@media (max-width: 1024px) {
body {
padding-top: 56px;
}
}
/* ── Processing loader ────────────────────────────────────────────────────── */
#buddybee_processing_loader {
position: fixed;
inset: 0;
background: rgba(247, 245, 240, .88);
backdrop-filter: blur(4px);
z-index: 999999;
display: none;
align-items: center;
justify-content: center;
}
#buddybee_processing_loader div {
background: var(--hb-white);
border-radius: 14px;
padding: 28px 44px;
box-shadow: 0 12px 40px rgba(26, 29, 46, .12);
text-align: center;
}
#buddybee_processing_loader p {
color: var(--hb-ink);
font-weight: 700;
font-size: 12px;
letter-spacing: .1em;
text-transform: uppercase;
margin: 0;
font-family: var(--hb-font);
}
a:hover {
text-decoration: none;
}
</style>
<nav class="hb-navbar" id="hbNavbar">
<div class="hb-nav-inner">
{# Brand #}
<a class="hb-brand" href="{{ url('dashboard') }}">
<img src="{{ absolute_url(path('dashboard')) }}honeybee_web_assets/icons/honeybeeicon.svg?v={{ constant('ApplicationBundle\\Constants\\GeneralConstant::ENTITY_APP_VERSION') }}"
alt="HoneyBee">
<span class="hb-brand-name">Honey<b>Bee</b></span>
</a>
{# Mobile hamburger #}
<button class="hb-toggler" id="hbToggler" aria-label="Open menu" type="button">
<span></span><span></span><span></span>
</button>
{# Primary navigation #}
<ul class="hb-links">
<li class="hb-link">
<a href="{{ url('honeybee_product') }}"
class="{{ app.request.get('_route') == 'honeybee_product' ? 'active' : '' }} trn"
data-trn-key="_PRODUCTS_">Product</a>
</li>
<li class="hb-link">
<a href="{{ url('honeybee_solutions') }}"
class="{{ app.request.get('_route') == 'honeybee_solutions' ? 'active' : '' }}">Solutions</a>
</li>
<li class="hb-link">
<a href="{{ url('honeybee_pricing') }}"
class="{{ app.request.get('_route') == 'honeybee_pricing' ? 'active' : '' }} trn"
data-trn-key="_PRICING_">Pricing</a>
</li>
<li class="hb-link">
<a href="{{ url('honeybee_partners') }}"
class="{{ app.request.get('_route') == 'honeybee_partners' ? 'active' : '' }}">Partners</a>
</li>
<li class="hb-drop">
<a href="#">Company <i class="fa-solid fa-chevron-down hb-caret"></i></a>
<ul class="hb-dd-menu">
<li><a href="{{ url('honeybee_about_us') }}"
class="{{ app.request.get('_route') == 'honeybee_about_us' ? 'active' : '' }}">About</a></li>
<li><a href="{{ url('honeybee_FAQ') }}"
class="{{ app.request.get('_route') == 'honeybee_FAQ' ? 'active' : '' }}">FAQ</a></li>
<li><a href="{{ url('honeybee_contact') }}"
class="{{ app.request.get('_route') == 'honeybee_contact' ? 'active' : '' }}">Contact</a>
</li>
</ul>
</li>
</ul>
{# Right-side controls #}
<div class="hb-nav-right">
{# Language switcher #}
<div class="hb-lang">
<button class="hb-lang-btn" type="button">
<i class="fa-solid fa-globe" style="font-size:12px"></i>
<span class="curr_locale_text">en</span>
<i class="fa-solid fa-chevron-down" style="font-size:8px;opacity:.5"></i>
</button>
<ul class="hb-lang-menu">
<li><a href="#" class="locale_changer en" data-locale="en">🇬🇧 English</a></li>
<li><a href="#" class="locale_changer bn" data-locale="bn">🇧🇩 বাংলা</a></li>
<li><a href="#" class="locale_changer it" data-locale="it">🇮🇹 Italiano</a></li>
<li><a href="#" class="locale_changer de" data-locale="de">🇩🇪 Deutsch</a></li>
<li><a href="#" class="locale_changer fr" data-locale="fr">🇫🇷 Français</a></li>
<li><a href="#" class="locale_changer sp" data-locale="sp">🇪🇸 Español</a></li>
<li><a href="#" class="locale_changer cn" data-locale="cn">🇨🇳 中文</a></li>
</ul>
</div>
{# Admin only: switch user #}
{% if session[UserConstants.USER_ID] is defined and (BUDDYBEE_ADMIN_LEVEL >= 1 or session['actualUserIsAdmin'] is defined) %}
<div class="hb-switch">
<button class="hb-switch-btn" type="button">Switch User</button>
<ul class="hb-switch-panel">
<li>
<a href="{{ absolute_url(path('view_as_user_central')) }}/{{ session['actualUserId'] is defined ? session['actualUserId'] : session['userId'] }}">
↩ Back to Mine
</a>
</li>
<li class="hb-sw-div"></li>
<li style="padding:2px 0"><select name="viewAsId" id="viewAsId"></select></li>
</ul>
</div>
{% endif %}
{% if session[UserConstants.USER_ID] is defined %}
{# Authenticated: user avatar + dropdown #}
<div class="hb-user">
<button class="hb-user-btn" type="button">
<div class="hb-user-avatar"
{% if session[UserConstants.USER_IMAGE] != '' and session[UserConstants.USER_IMAGE] is not null %}
style="background:url('{{ url('dashboard') }}{{ session[UserConstants.USER_IMAGE] }}?v={{ constant('ApplicationBundle\\Constants\\GeneralConstant::ENTITY_APP_VERSION') }}')"
{% else %}
style="background:url('{{ url('dashboard') }}honeybee_web_assets/images/profiles/profile.png?v={{ constant('ApplicationBundle\\Constants\\GeneralConstant::ENTITY_APP_VERSION') }}')"
{% endif %}
></div>
<span class="hb-user-name">{{ session[UserConstants.USER_NAME] }}</span>
<i class="fa-solid fa-chevron-down" style="font-size:9px;color:var(--hb-muted);opacity:.55"></i>
</button>
<ul class="hb-user-menu">
<li>
<a href="{{ url('honeybee_my_freelancer_profile') }}"
class="{{ app.request.get('_route') == 'honeybee_my_freelancer_profile' ? 'active' : '' }}">
<i class="fa-regular fa-circle-user"></i> Profile
</a>
</li>
<li>
<a href="{{ url('ticket_list') }}"
class="{{ app.request.get('_route') == 'ticket_list' ? 'active' : '' }}">
<i class="fa-regular fa-ticket"></i> <span class="trn" data-trn-key="_MY_TICKETS_">My Tickets</span>
</a>
</li>
<li>
<a href="{{ url('central_landing') }}"
class="{{ app.request.get('_route') == 'central_landing' ? 'active' : '' }}">
<i class="fas fa-border-all"></i> <span class="trn" data-trn-key="_MY_COMPANIES_">My Companies</span>
</a>
</li>
{% if BUDDYBEE_ADMIN_LEVEL >= 1 %}
<li class="hb-u-div"></li>
<li>
<a href="{{ url('super_admin_command_center') }}"
class="{{ app.request.get('_route') == 'super_admin_command_center' ? 'active' : '' }}">
<i class="fa-solid fa-gauge-high"></i> Super Admin
</a>
</li>
<li class="hb-u-div"></li>
<li>
<a href="{{ url('datev_home') }}"
class="{{ app.request.get('_route') == 'datev_home' ? 'active' : '' }}">
<i class="fa-solid fa-gauge-high"></i> Datev Control
</a>
</li>
{% endif %}
{% if BUDDYBEE_ADMIN_LEVEL > 1 %}
<li class="hb-u-div"></li>
<li>
<a href="{{ url('admin_demo_pending_list') }}"
class="{{ app.request.get('_route') in ['admin_demo_pending_list','admin_demo_request_detail'] ? 'active' : '' }}">
<i class="fa-solid fa-calendar-check"></i> Demo Requests
</a>
</li>
<li>
<a href="{{ url('admin_demo_all_list') }}"
class="{{ app.request.get('_route') == 'admin_demo_all_list' ? 'active' : '' }}">
<i class="fa-solid fa-list-check"></i> All Bookings
</a>
</li>
{% endif %}
<li class="hb-u-div"></li>
<li>
<a href="{{ url('user_logout') }}" style="color:#B04030">
<i class="fa-solid fa-right-from-bracket"></i> Logout
</a>
</li>
</ul>
</div>
{# Companies shortcut #}
<a href="{{ url('central_landing') }}" class="hb-btn-companies trn" data-trn-key="_COMPANIES_">
<i class="fa-solid fa-building" style="font-size:11px"></i>
<span>Companies</span>
</a>
{# Book Demo CTA (authenticated) #}
<a href="{{ url('honeybee_contact') }}" class="hb-btn-companies" style="background:var(--hb-amber)">Book
Demo</a>
{% else %}
{# Guest: login + get started + book demo #}
<a href="{{ url('user_login') }}" class="hb-btn-login trn" data-trn-key="_LOGIN_">Login</a>
<a href="{{ url('sign_up') }}" class="hb-btn-signup trn" data-trn-key="_CREATE_ACCOUNT_">Get Started</a>
<a href="{{ url('honeybee_contact') }}" class="hb-btn-companies" style="background:var(--hb-amber)">Book
Demo</a>
{% endif %}
{# Dark / Light mode toggle #}
{# <div class="hb-theme"> #}
{# <img class="hb-theme-img" src="{{ absolute_url(asset('honeybee_web_assets/icons/sun.svg')) }}" alt="Light mode"> #}
{# <input type="checkbox" id="theme-toggle-checkbox"> #}
{# <label for="theme-toggle-checkbox" class="hb-theme-track" id="hbThemeTrack"></label> #}
{# <img class="hb-theme-img" src="{{ absolute_url(asset('honeybee_web_assets/icons/moon.svg')) }}" alt="Dark mode"> #}
{# </div> #}
</div>{# /hb-nav-right #}
</div>{# /hb-nav-inner #}
</nav>
{# ── Apply saved theme immediately (no flash of wrong theme) ─────────────── #}
<script>
(function () {
var saved = localStorage.getItem('theme') || 'light';
if (saved === 'dark') {
var css = document.getElementById('dark-theme-css');
var cb = document.getElementById('theme-toggle-checkbox');
var track = document.getElementById('hbThemeTrack');
if (css) css.disabled = false;
if (cb) cb.checked = true;
if (track) track.classList.add('hb-dark');
}
}());
</script>
{# ── Navbar interaction scripts ───────────────────────────────────────────── #}
<script>
(function () {
var navbar = document.getElementById('hbNavbar');
var toggler = document.getElementById('hbToggler');
window.addEventListener('scroll', function () {
navbar.classList.toggle('hb-scrolled', window.scrollY > 6);
}, {passive: true});
if (toggler) {
toggler.addEventListener('click', function () {
navbar.classList.toggle('hb-open');
toggler.classList.toggle('hb-open');
});
}
navbar.querySelectorAll('.hb-drop > a').forEach(function (a) {
a.addEventListener('click', function (e) {
if (window.innerWidth <= 1024) {
e.preventDefault();
a.closest('.hb-drop').classList.toggle('hb-mob-open');
}
});
});
var cb = document.getElementById('theme-toggle-checkbox');
var track = document.getElementById('hbThemeTrack');
if (cb && track) {
track.addEventListener('click', function () {
changeTheme(!cb.checked);
});
}
}());
</script>
{# ── Preloader: hide on load ──────────────────────────────────────────────── #}
<script>
document.body.style.overflow = 'hidden';
window.addEventListener('load', function () {
var pre = document.getElementById('hb-preloader');
if (pre) {
pre.style.transition = 'opacity .35s ease';
pre.style.opacity = '0';
setTimeout(function () {
pre.style.display = 'none';
}, 360);
}
document.body.style.overflow = 'auto';
});
</script>
{% set full_js_included = 0 %}
{% endif %}{# /include_html #}
<input type="hidden" id="timeStampOnHeaderLoad" value="{{ 'now'|date('U') }}">
{% include '@Application/inc/ajax_route_library.html.twig' %}
{# Date-picker scripts #}
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-material-datetimepicker/2.7.1/js/bootstrap-material-datetimepicker.min.js"></script>