src/ApplicationBundle/Resources/views/inc/central_header.html.twig line 1

Open in your IDE?
  1. {# ═══════════════════════════════════════════════════════════════════════════
  2.    Central Header — HoneyBee Ecosystem
  3.    Scandinavian SaaS design · single source of truth for all public pages
  4.    ═══════════════════════════════════════════════════════════════════════════ #}
  5. {% if not include_html is defined %}
  6.     {% set include_html = 1 %}
  7.     {% if app.request.request.get('skipHTML') != '' %}{% set include_html = 0 %}{% endif %}
  8.     {% if app.request.query.get('skipHTML')   != '' %}{% set include_html = 0 %}{% endif %}
  9. {% endif %}
  10. {% if include_html == 1 %}
  11. <!DOCTYPE html>
  12. <html lang="en">
  13. <head>
  14.     <meta charset="UTF-8">
  15.     <meta http-equiv="X-UA-Compatible" content="IE=edge">
  16.     <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, minimal-ui">
  17.     <meta name="description"
  18.           content="{{ og_description is defined ? og_description : 'HoneyBee connects business operations, AI automation, industrial energy control, and solar engineering in one affordable ecosystem — Business Suite, HiveMind & Agents, HoneyCore 4.0, HoneyWatt.' }}">
  19.     <meta name="keywords"
  20.           content="HoneyBee, project ERP Germany, EPC ERP, ERP for engineering companies, business ERP for SMEs, ERP Singapore, HoneyCore EMS, HoneyCore 4.0 project quotation software, energy infrastructure intelligence, EMS, SCADA business integration, O&amp;M billing software, DATEV-ready ERP, NIS2-aware software governance">
  21.     <meta name="author" content="HoneyBee Ecosystem">
  22.     {% set page_title = page_title|default('HoneyBee Ecosystem') %}
  23.     <title id="pageTitle">{{ page_title }}</title>
  24.     <meta property="og:title" content="{{ og_title       is defined ? og_title       : page_title }}"/>
  25.     <meta property="og:description"
  26.           content="{{ og_description is defined ? og_description : 'HoneyBee — Operating system for EPC companies, system integrators, energy asset owners, and multi-site industrial businesses.' }}"/>
  27.     <meta property="og:image"
  28.           content="{{ og_image       is defined ? (absolute_url(path('dashboard'))~og_image) : (absolute_url(path('dashboard'))~'honeybee_web_assets/icons/honeybeeicon.svg') }}"/>
  29.     {% set _noindex_routes = ['user_login','sign_up','reset_password','verify_email','verify_otp','reset_new_password','honeybee_otp_verification','hb360_my_estimate','hb360_shared_estimate'] %}
  30.     {% if app.request.get('_route') in _noindex_routes %}
  31.         <meta name="robots" content="noindex, nofollow">
  32.     {% else %}
  33.         <meta name="robots" content="index, follow">
  34.         {# WEB-2.1 (audit: .com/.online/www duplicates split the index) — every indexable
  35.            page names its ONE canonical home on the .eu domain, so search consolidates the
  36.            duplicates even before the server-side 301s land (those remain the owner's DNS/
  37.            server task and still matter). #}
  38.         <link rel="canonical" href="https://ourhoneybee.eu{{ app.request.pathInfo }}">
  39.     {% endif %}
  40.     {# ── Favicons ──────────────────────────────────────────────────────────── #}
  41.     <link rel="shortcut icon" type="image/x-icon"
  42.           href="{{ asset('favicon.ico') }}?v={{ constant('ApplicationBundle\\Constants\\GeneralConstant::ENTITY_APP_VERSION') }}">
  43.     <link rel="apple-touch-icon" sizes="180x180"
  44.           href="{{ asset('apple-icon.png') }}?v={{ constant('ApplicationBundle\\Constants\\GeneralConstant::ENTITY_APP_VERSION') }}">
  45.     <link rel="icon" type="image/png" sizes="32x32"
  46.           href="{{ asset('favicon-32x32.png') }}?v={{ constant('ApplicationBundle\\Constants\\GeneralConstant::ENTITY_APP_VERSION') }}">
  47.     <link rel="icon" type="image/png" sizes="16x16"
  48.           href="{{ asset('favicon-16x16.png') }}?v={{ constant('ApplicationBundle\\Constants\\GeneralConstant::ENTITY_APP_VERSION') }}">
  49.     <link rel="manifest" href="{{ asset('site.webmanifest') }}">
  50.     <link rel="mask-icon" href="{{ asset('safari-pinned-tab.svg') }}" color="#C07D2A">
  51.     <meta name="msapplication-TileColor" content="#1A1D2E">
  52.     <meta name="theme-color" content="#F7F5F0">
  53.     {# ── Fonts ─────────────────────────────────────────────────────────────── #}
  54.     <link rel="preconnect" href="https://fonts.googleapis.com">
  55.     <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
  56.     <link href="https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600;700;800&family=Montserrat:wght@500;700;800;900&display=swap"
  57.           rel="stylesheet">
  58.     {# Material Icons served locally (web/css/iconfont/) — no external CDN, so icons never flicker/break when offline or the CDN is slow #}
  59.     <link rel="stylesheet" href="{{ asset('css/iconfont/material-icons.css') }}?v={{ constant('ApplicationBundle\\Constants\\GeneralConstant::ENTITY_APP_VERSION') }}">
  60.     {# ── Core stylesheets ──────────────────────────────────────────────────── #}
  61.     <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.6.0/css/all.min.css"
  62.           integrity="sha512-Kc323vGBEqzTmouAECnVceyQqyqdsSiqLQISBL29aUW4U/M7pSPA/gEUZQqv1cwx4OnYxTxve5UMg5GT6L4JJg=="
  63.           crossorigin="anonymous" referrerpolicy="no-referrer">
  64.     <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.css">
  65.     <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css">
  66.     <link rel="stylesheet"
  67.           href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-material-datetimepicker/2.7.1/css/bootstrap-material-datetimepicker.min.css">
  68.     <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/selectize.js/0.13.3/css/selectize.css">
  69.     <link rel="stylesheet"
  70.           href="{{ absolute_url(path('dashboard')) }}honeybee_web_assets/css/bootstrap.css?v={{ constant('ApplicationBundle\\Constants\\GeneralConstant::ENTITY_APP_VERSION') }}">
  71.     <link rel="stylesheet"
  72.           href="{{ absolute_url(path('dashboard')) }}honeybee_web_assets/css/style.css?v={{ constant('ApplicationBundle\\Constants\\GeneralConstant::ENTITY_APP_VERSION') }}">
  73.     <link rel="stylesheet" id="dark-theme-css"
  74.           href="{{ absolute_url(path('dashboard')) }}honeybee_web_assets/css/dark.css?v={{ constant('ApplicationBundle\\Constants\\GeneralConstant::ENTITY_APP_VERSION') }}"
  75.           disabled="true">
  76.     <link rel="stylesheet"
  77.           href="{{ absolute_url(path('dashboard')) }}honeybee_web_assets/css/responsive.css?v={{ constant('ApplicationBundle\\Constants\\GeneralConstant::ENTITY_APP_VERSION') }}">
  78.     <link rel="stylesheet"
  79.           href="{{ absolute_url(path('dashboard')) }}honeybee_web_assets/css/central_responsive.css?v={{ constant('ApplicationBundle\\Constants\\GeneralConstant::ENTITY_APP_VERSION') }}">
  80.     {# ── CW1 consolidated central-web spine (base=tokens, pages=marketing, admin=shell).
  81.          Replaces the retired temporary_inline.css; loaded last so tokens/utilities
  82.          are available to every central page. ──────────────────────────────────── #}
  83.     <link rel="stylesheet"
  84.           href="{{ absolute_url(path('dashboard')) }}honeybee_web_assets/css/base.css?v={{ constant('ApplicationBundle\\Constants\\GeneralConstant::ENTITY_APP_VERSION') }}">
  85.     <link rel="stylesheet"
  86.           href="{{ absolute_url(path('dashboard')) }}honeybee_web_assets/css/pages.css?v={{ constant('ApplicationBundle\\Constants\\GeneralConstant::ENTITY_APP_VERSION') }}">
  87.     <link rel="stylesheet"
  88.           href="{{ absolute_url(path('dashboard')) }}honeybee_web_assets/css/admin.css?v={{ constant('ApplicationBundle\\Constants\\GeneralConstant::ENTITY_APP_VERSION') }}">
  89.     {# ── Dev toolbar suppression ───────────────────────────────────────────── #}
  90.     <style>{% if app.session.get('devAdminMode') != 1 %}.sf-toolbar {
  91.             display: none !important
  92.         }{% endif %}</style>
  93.     {# ── Preloader ─────────────────────────────────────────────────────────── #}
  94.     <style>
  95.         #hb-preloader {
  96.             position: fixed;
  97.             top: 0;
  98.             left: 0;
  99.             width: 100%;
  100.             height: 100vh;
  101.             background: var(--hb-cream, #F7F5F0);
  102.             display: flex;
  103.             flex-direction: column;
  104.             justify-content: center;
  105.             align-items: center;
  106.             z-index: 99999;
  107.         }
  108.         .hb-pre-logo {
  109.             display: flex;
  110.             align-items: center;
  111.             gap: 12px;
  112.             margin-bottom: 28px;
  113.         }
  114.         .hb-pre-logo img {
  115.             width: 34px;
  116.             height: 34px;
  117.         }
  118.         .hb-pre-logo span {
  119.             font-family: 'DM Sans', sans-serif;
  120.             font-size: 17px;
  121.             font-weight: 800;
  122.             color: var(--hb-ink, #1A1D2E);
  123.             letter-spacing: -.01em;
  124.         }
  125.         .hb-pre-logo span b {
  126.             color: #C07D2A;
  127.             font-weight: 800;
  128.         }
  129.         .hb-pre-bar-wrap {
  130.             width: 120px;
  131.             height: 2px;
  132.             background: rgba(26, 29, 46, .08);
  133.             border-radius: 2px;
  134.             overflow: hidden;
  135.         }
  136.         .hb-pre-bar {
  137.             height: 100%;
  138.             width: 40%;
  139.             background: #C07D2A;
  140.             border-radius: 2px;
  141.             animation: hb-slide 1.5s ease-in-out infinite;
  142.         }
  143.         @keyframes hb-slide {
  144.             0% {
  145.                 transform: translateX(-100%);
  146.             }
  147.             50% {
  148.                 transform: translateX(250%);
  149.             }
  150.             100% {
  151.                 transform: translateX(-100%);
  152.             }
  153.         }
  154.     </style>
  155.     {# ── Inline JS (runs before body paint) ───────────────────────────────── #}
  156.     <script>
  157.         var logger = (function () {
  158.             var _old = null, pub = {};
  159.             pub.enableLogger = function () {
  160.                 if (_old) window['console']['log'] = _old;
  161.             };
  162.             pub.disableLogger = function () {
  163.                 _old = console.log;
  164.                 window['console']['log'] = function () {
  165.                 };
  166.             };
  167.             return pub;
  168.         }());
  169.         {% if app.session.get('devAdminMode') != 1 %}
  170.         window['console']['log'] = function () {
  171.         };
  172.         {% endif %}
  173.     </script>
  174.     <script>
  175.         function changeTheme(isDark) {
  176.             var darkCss = document.getElementById('dark-theme-css');
  177.             var cb = document.getElementById('theme-toggle-checkbox');
  178.             var track = document.getElementById('hbThemeTrack');
  179.             document.querySelectorAll('img').forEach(function (img) {
  180.                 if (isDark) {
  181.                     img.src = img.src.replace('/honeybee_web_assets/', '/honeybee_web_assets/dark/');
  182.                 } else {
  183.                     img.src = img.src.replace('/honeybee_web_assets/dark/', '/honeybee_web_assets/');
  184.                 }
  185.             });
  186.             if (darkCss) darkCss.disabled = !isDark;
  187.             if (cb) cb.checked = isDark;
  188.             if (track) track.classList.toggle('hb-dark', isDark);
  189.             localStorage.setItem('theme', isDark ? 'dark' : 'light');
  190.         }
  191.     </script>
  192.     <script>if (typeof module === 'object') {
  193.             window.module = module;
  194.             module = undefined;
  195.         }</script>
  196.     <script src="https://code.jquery.com/jquery-3.4.1.min.js"
  197.             integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script>
  198.     <script data-ad-client="ca-pub-8286883017903771" async
  199.             src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
  200.     <script>var BaseURL = '{{ url('dashboard') }}';</script>
  201. </head>
  202. {# ── Google Analytics ──────────────────────────────────────────────────────── #}
  203. <script async src="https://www.googletagmanager.com/gtag/js?id=G-V22132YMJ3"></script>
  204. <script>
  205.     window.dataLayer = window.dataLayer || [];
  206.     function gtag() {
  207.         dataLayer.push(arguments);
  208.     }
  209.     gtag('js', new Date());
  210.     gtag('config', 'G-V22132YMJ3');
  211. </script>
  212. {# ── Resolve admin level & consultant flag ────────────────────────────────── #}
  213. {% set BUDDYBEE_ADMIN_LEVEL = 0 %}
  214. {% set isConsultant         = 0 %}
  215. {% if session[UserConstants.USER_ID] is defined %}
  216.     {% set isConsultant         = session[UserConstants.IS_CONSULTANT]        is defined ? session[UserConstants.IS_CONSULTANT]        : 0 %}
  217.     {% set BUDDYBEE_ADMIN_LEVEL = session[UserConstants.BUDDYBEE_ADMIN_LEVEL] is defined ? session[UserConstants.BUDDYBEE_ADMIN_LEVEL] : 0 %}
  218. {% endif %}
  219. {# Single <body> tag — classes set in one place, no duplicate tags #}
  220. {% if BUDDYBEE_ADMIN_LEVEL >= 1 %}
  221. <body class="buddybee_body has_admin_bar body-mask">
  222. {% elseif session[UserConstants.USER_ID] is defined %}
  223. <body class="buddybee_body body-mask">
  224. {% else %}
  225. <body class="body-mask">
  226. {% endif %}
  227. {# ── Preloader ─────────────────────────────────────────────────────────────── #}
  228. <div id="hb-preloader">
  229.     <div class="hb-pre-logo">
  230.         <img src="{{ absolute_url(path('dashboard')) }}honeybee_web_assets/icons/honeybeeicon.svg?v={{ constant('ApplicationBundle\\Constants\\GeneralConstant::ENTITY_APP_VERSION') }}"
  231.              alt="HoneyBee">
  232.         <span>Honey<b>Bee</b></span>
  233.     </div>
  234.     <div class="hb-pre-bar-wrap">
  235.         <div class="hb-pre-bar"></div>
  236.     </div>
  237. </div>
  238. {# ── Processing overlay (shown during AJAX) ────────────────────────────────── #}
  239. <div id="buddybee_processing_loader">
  240.     <div><p>Processing</p></div>
  241. </div>
  242. {# ══════════════════════════════ NAVBAR ═══════════════════════════════════════
  243.    Scandinavian navbar: glass-morphism, fixed, minimal, fully responsive
  244.    ═══════════════════════════════════════════════════════════════════════════ #}
  245. <style>
  246.     /* ── Design tokens ──────────────────────────────────────────────────────────── */
  247.     :root {
  248.         --hb-ink: #1A1D2E;
  249.         --hb-ink-2: #252840;
  250.         --hb-amber: #C07D2A;
  251.         --hb-amber-lt: #D4954A;
  252.         --hb-muted: #6B6E7F;
  253.         --hb-border: rgba(26, 29, 46, .08);
  254.         --hb-border-md: rgba(26, 29, 46, .14);
  255.         --hb-cream: #F7F5F0;
  256.         --hb-white: #FFFFFF;
  257.         --hb-shadow: 0 2px 20px rgba(26, 29, 46, .07);
  258.         --hb-shadow-lg: 0 8px 32px rgba(26, 29, 46, .10);
  259.         --hb-radius: 10px;
  260.         --hb-font: 'DM Sans', 'Gilroy', system-ui, sans-serif;
  261.     }
  262.     /* ── Navbar shell ─────────────────────────────────────────────────────────── */
  263.     .hb-navbar {
  264.         position: fixed;
  265.         top: 0;
  266.         left: 0;
  267.         right: 0;
  268.         z-index: 9999;
  269.         background: rgba(247, 245, 240, .97);
  270.         backdrop-filter: blur(20px) saturate(180%);
  271.         -webkit-backdrop-filter: blur(20px) saturate(180%);
  272.         border-bottom: 1px solid var(--hb-border);
  273.         transition: box-shadow .2s, border-color .2s;
  274.         font-family: var(--hb-font);
  275.     }
  276.     .hb-navbar.hb-scrolled {
  277.         box-shadow: var(--hb-shadow);
  278.         border-color: var(--hb-border-md);
  279.     }
  280.     /* ── Inner container ──────────────────────────────────────────────────────── */
  281.     .hb-nav-inner {
  282.         max-width: 1280px;
  283.         margin: 0 auto;
  284.         padding: 0 28px;
  285.         height: 64px;
  286.         display: flex;
  287.         align-items: center;
  288.         gap: 24px;
  289.     }
  290.     /* ── Brand ────────────────────────────────────────────────────────────────── */
  291.     .hb-brand {
  292.         display: flex;
  293.         align-items: center;
  294.         gap: 9px;
  295.         text-decoration: none;
  296.         flex-shrink: 0;
  297.     }
  298.     .hb-brand img {
  299.         height: 30px;
  300.         width: auto;
  301.     }
  302.     .hb-brand-name {
  303.         font-size: 15.5px;
  304.         font-weight: 800;
  305.         color: var(--hb-ink);
  306.         letter-spacing: -.01em;
  307.         line-height: 1;
  308.     }
  309.     .hb-brand-name b {
  310.         color: var(--hb-amber);
  311.         font-weight: 800;
  312.     }
  313.     /* ── Nav links ────────────────────────────────────────────────────────────── */
  314.     .hb-links {
  315.         display: flex;
  316.         align-items: center;
  317.         gap: 2px;
  318.         list-style: none;
  319.         margin: 0;
  320.         padding: 0;
  321.         flex: 1;
  322.     }
  323.     .hb-links .hb-link > a,
  324.     .hb-links .hb-drop > a {
  325.         display: inline-flex;
  326.         align-items: center;
  327.         gap: 5px;
  328.         padding: 7px 11px;
  329.         font-size: 13.5px;
  330.         font-weight: 500;
  331.         color: var(--hb-muted);
  332.         text-decoration: none;
  333.         border-radius: 7px;
  334.         white-space: nowrap;
  335.         transition: color .15s, background .15s;
  336.         position: relative;
  337.     }
  338.     .hb-links .hb-link > a:hover,
  339.     .hb-links .hb-drop > a:hover {
  340.         color: var(--hb-ink);
  341.         background: rgba(26, 29, 46, .04);
  342.     }
  343.     .hb-links .hb-link > a.active {
  344.         color: var(--hb-ink);
  345.         font-weight: 600;
  346.     }
  347.     .hb-links .hb-link > a.active::after {
  348.         content: '';
  349.         position: absolute;
  350.         bottom: 2px;
  351.         left: 11px;
  352.         right: 11px;
  353.         height: 1.5px;
  354.         background: var(--hb-amber);
  355.         border-radius: 2px;
  356.     }
  357.     /* ── Dropdown ─────────────────────────────────────────────────────────────── */
  358.     .hb-drop {
  359.         position: relative;
  360.     }
  361.     .hb-caret {
  362.         font-size: 11px;
  363.         opacity: .5;
  364.         transition: transform .2s;
  365.     }
  366.     .hb-drop:hover .hb-caret {
  367.         transform: rotate(180deg);
  368.     }
  369.     .hb-dd-menu {
  370.         position: absolute;
  371.         top: 100%;
  372.         left: 50%;
  373.         transform: translateX(-50%) translateY(0);
  374.         min-width: 195px;
  375.         background: var(--hb-white);
  376.         border: 1px solid var(--hb-border-md);
  377.         border-radius: var(--hb-radius);
  378.         box-shadow: var(--hb-shadow-lg);
  379.         padding: 6px;
  380.         padding-top: 12px; /* gap lives inside → no dead zone */
  381.         opacity: 0;
  382.         pointer-events: none;
  383.         transition: opacity .16s, transform .16s;
  384.         transition-delay: 0s, 0s; /* show instantly */
  385.         list-style: none;
  386.         margin: 0;
  387.         z-index: 10001;
  388.     }
  389.     .hb-drop:hover .hb-dd-menu,
  390.     .hb-dd-menu:hover {
  391.         opacity: 1;
  392.         pointer-events: all;
  393.         transform: translateX(-50%) translateY(0);
  394.     }
  395.     .hb-drop:not(:hover) .hb-dd-menu:not(:hover) {
  396.         transition-delay: .12s;
  397.     }
  398.     /* slight lag on hide */
  399.     .hb-dd-menu li a {
  400.         display: block;
  401.         padding: 8px 12px;
  402.         font-size: var(--cp-fs-base, 13px);
  403.         font-weight: 500;
  404.         color: var(--hb-muted);
  405.         text-decoration: none;
  406.         border-radius: 6px;
  407.         transition: color .12s, background .12s;
  408.     }
  409.     .hb-dd-menu li a:hover {
  410.         color: var(--hb-ink);
  411.         background: rgba(26, 29, 46, .04);
  412.     }
  413.     .hb-dd-menu li a.active {
  414.         color: var(--hb-ink);
  415.         font-weight: 600;
  416.     }
  417.     .hb-dd-div {
  418.         height: 1px;
  419.         background: var(--hb-border);
  420.         margin: 4px 6px;
  421.     }
  422.     /* ── Right side ───────────────────────────────────────────────────────────── */
  423.     .hb-nav-right {
  424.         display: flex;
  425.         align-items: center;
  426.         gap: 6px;
  427.         flex-shrink: 0;
  428.     }
  429.     /* ── Language switcher ────────────────────────────────────────────────────── */
  430.     .hb-lang {
  431.         position: relative;
  432.     }
  433.     .hb-lang-btn {
  434.         display: flex;
  435.         align-items: center;
  436.         gap: 5px;
  437.         padding: 6px 10px;
  438.         font-size: var(--cp-fs-sm, 12.5px);
  439.         font-weight: 600;
  440.         color: var(--hb-muted);
  441.         background: none;
  442.         border: 1px solid var(--hb-border);
  443.         border-radius: 7px;
  444.         cursor: pointer;
  445.         transition: all .15s;
  446.         font-family: var(--hb-font);
  447.     }
  448.     .hb-lang-btn:hover {
  449.         color: var(--hb-ink);
  450.         border-color: var(--hb-border-md);
  451.         background: rgba(26, 29, 46, .03);
  452.     }
  453.     .hb-lang-menu {
  454.         position: absolute;
  455.         top: 100%;
  456.         right: 0;
  457.         min-width: 155px;
  458.         background: var(--hb-white);
  459.         border: 1px solid var(--hb-border-md);
  460.         border-radius: var(--hb-radius);
  461.         box-shadow: var(--hb-shadow-lg);
  462.         padding: 6px;
  463.         padding-top: 10px; /* gap lives inside → no dead zone */
  464.         opacity: 0;
  465.         pointer-events: none;
  466.         transform: translateY(0);
  467.         transition: opacity .15s;
  468.         z-index: 10001;
  469.         list-style: none;
  470.         margin: 0;
  471.     }
  472.     .hb-lang:hover .hb-lang-menu,
  473.     .hb-lang-menu:hover {
  474.         opacity: 1;
  475.         pointer-events: all;
  476.     }
  477.     .hb-lang:not(:hover) .hb-lang-menu:not(:hover) {
  478.         transition-delay: .12s;
  479.     }
  480.     .hb-lang-menu li a {
  481.         display: block;
  482.         padding: 7px 12px;
  483.         font-size: var(--cp-fs-base, 13px);
  484.         font-weight: 500;
  485.         color: var(--hb-muted);
  486.         text-decoration: none;
  487.         border-radius: 6px;
  488.         transition: all .12s;
  489.     }
  490.     .hb-lang-menu li a:hover {
  491.         color: var(--hb-ink);
  492.         background: rgba(26, 29, 46, .04);
  493.     }
  494.     /* ── User dropdown ────────────────────────────────────────────────────────── */
  495.     .hb-user {
  496.         position: relative;
  497.     }
  498.     .hb-user-btn {
  499.         display: flex;
  500.         align-items: center;
  501.         gap: 7px;
  502.         background: none;
  503.         border: none;
  504.         cursor: pointer;
  505.         padding: 4px 6px;
  506.         border-radius: 8px;
  507.         transition: background .15s;
  508.     }
  509.     .hb-user-btn:hover {
  510.         background: rgba(26, 29, 46, .05);
  511.     }
  512.     .hb-user-avatar {
  513.         width: 30px;
  514.         height: 30px;
  515.         border-radius: 50%;
  516.         background-size: cover !important;
  517.         background-position: center !important;
  518.         border: 1.5px solid var(--hb-border-md);
  519.         flex-shrink: 0;
  520.     }
  521.     .hb-user-name {
  522.         font-size: var(--cp-fs-base, 13px);
  523.         font-weight: 600;
  524.         color: var(--hb-ink);
  525.         max-width: 110px;
  526.         white-space: nowrap;
  527.         overflow: hidden;
  528.         text-overflow: ellipsis;
  529.     }
  530.     .hb-user-menu {
  531.         position: absolute;
  532.         top: 100%;
  533.         right: 0;
  534.         min-width: 185px;
  535.         background: var(--hb-white);
  536.         border: 1px solid var(--hb-border-md);
  537.         border-radius: var(--hb-radius);
  538.         box-shadow: var(--hb-shadow-lg);
  539.         padding: 6px;
  540.         padding-top: 12px; /* gap lives inside → no dead zone */
  541.         opacity: 0;
  542.         pointer-events: none;
  543.         transform: translateY(0);
  544.         transition: opacity .15s;
  545.         z-index: 10001;
  546.         list-style: none;
  547.         margin: 0;
  548.     }
  549.     .hb-user:hover .hb-user-menu {
  550.         opacity: 1;
  551.         pointer-events: all;
  552.     }
  553.     .hb-user:not(:hover) .hb-user-menu:not(:hover) {
  554.         transition-delay: .12s;
  555.     }
  556.     .hb-user-menu li a {
  557.         display: flex;
  558.         align-items: center;
  559.         gap: 8px;
  560.         padding: 8px 12px;
  561.         font-size: var(--cp-fs-base, 13px);
  562.         font-weight: 500;
  563.         color: var(--hb-muted);
  564.         text-decoration: none;
  565.         border-radius: 6px;
  566.         transition: all .12s;
  567.     }
  568.     .hb-user-menu li a:hover {
  569.         color: var(--hb-ink);
  570.         background: rgba(26, 29, 46, .04);
  571.     }
  572.     .hb-user-menu li a i {
  573.         font-size: 12px;
  574.         width: 14px;
  575.         opacity: .5;
  576.     }
  577.     .hb-u-div {
  578.         height: 1px;
  579.         background: var(--hb-border);
  580.         margin: 4px 6px;
  581.     }
  582.     /* ── Auth + Companies buttons ─────────────────────────────────────────────── */
  583.     .hb-btn-login {
  584.         padding: 7px 16px;
  585.         font-size: var(--cp-fs-base, 13px);
  586.         font-weight: 600;
  587.         color: var(--hb-ink);
  588.         background: none;
  589.         border: 1.5px solid var(--hb-border-md);
  590.         border-radius: 8px;
  591.         text-decoration: none;
  592.         transition: all .15s;
  593.     }
  594.     .hb-btn-login:hover {
  595.         color: var(--hb-ink);
  596.         border-color: var(--hb-ink);
  597.         background: rgba(26, 29, 46, .03);
  598.     }
  599.     .hb-btn-signup {
  600.         padding: 7px 16px;
  601.         font-size: var(--cp-fs-base, 13px);
  602.         font-weight: 700;
  603.         color: #fff;
  604.         background: var(--hb-ink);
  605.         border: 1.5px solid transparent;
  606.         border-radius: 8px;
  607.         text-decoration: none;
  608.         transition: all .15s;
  609.     }
  610.     .hb-btn-signup:hover {
  611.         color: #fff;
  612.         background: var(--hb-ink-2);
  613.         box-shadow: 0 4px 14px rgba(26, 29, 46, .2);
  614.     }
  615.     .hb-btn-companies {
  616.         display: inline-flex;
  617.         align-items: center;
  618.         gap: 6px;
  619.         padding: 7px 15px;
  620.         font-size: var(--cp-fs-base, 13px);
  621.         font-weight: 700;
  622.         color: #fff;
  623.         background: var(--hb-amber);
  624.         border: none;
  625.         border-radius: 8px;
  626.         text-decoration: none;
  627.         transition: all .15s;
  628.     }
  629.     .hb-btn-companies:hover {
  630.         color: #fff;
  631.         background: var(--hb-amber-lt);
  632.         box-shadow: 0 4px 14px rgba(192, 125, 42, .28);
  633.     }
  634.     /* ── Switch-user panel (admin only) ──────────────────────────────────────── */
  635.     .hb-switch {
  636.         position: relative;
  637.     }
  638.     .hb-switch-btn {
  639.         padding: 6px 11px;
  640.         font-size: 12px;
  641.         font-weight: 600;
  642.         color: var(--hb-muted);
  643.         background: none;
  644.         border: 1px solid var(--hb-border);
  645.         border-radius: 7px;
  646.         cursor: pointer;
  647.         font-family: var(--hb-font);
  648.         transition: all .15s;
  649.     }
  650.     .hb-switch-btn:hover {
  651.         color: var(--hb-ink);
  652.         border-color: var(--hb-border-md);
  653.     }
  654.     .hb-switch-panel {
  655.         position: absolute;
  656.         top: 100%;
  657.         right: 0;
  658.         min-width: 225px;
  659.         background: var(--hb-white);
  660.         border: 1px solid var(--hb-border-md);
  661.         border-radius: var(--hb-radius);
  662.         box-shadow: var(--hb-shadow-lg);
  663.         padding: 10px;
  664.         padding-top: 14px; /* gap lives inside → no dead zone */
  665.         opacity: 0;
  666.         pointer-events: none;
  667.         transform: translateY(0);
  668.         transition: opacity .15s;
  669.         z-index: 10001;
  670.         list-style: none;
  671.         margin: 0;
  672.     }
  673.     .hb-switch:hover .hb-switch-panel {
  674.         opacity: 1;
  675.         pointer-events: all;
  676.     }
  677.     .hb-switch:not(:hover) .hb-switch-panel:not(:hover) {
  678.         transition-delay: .12s;
  679.     }
  680.     .hb-switch-panel li a {
  681.         display: block;
  682.         padding: 8px 10px;
  683.         font-size: var(--cp-fs-base, 13px);
  684.         font-weight: 500;
  685.         color: var(--hb-muted);
  686.         text-decoration: none;
  687.         border-radius: 6px;
  688.         transition: all .12s;
  689.     }
  690.     .hb-switch-panel li a:hover {
  691.         color: var(--hb-ink);
  692.         background: rgba(26, 29, 46, .04);
  693.     }
  694.     .hb-sw-div {
  695.         height: 1px;
  696.         background: var(--hb-border);
  697.         margin: 6px 0;
  698.     }
  699.     .hb-switch-panel select {
  700.         width: 100%;
  701.         font-size: 12px;
  702.         font-family: var(--hb-font);
  703.         border: 1px solid var(--hb-border-md);
  704.         border-radius: 6px;
  705.         padding: 6px 8px;
  706.         color: var(--hb-ink);
  707.         background: var(--hb-cream);
  708.     }
  709.     /* ── Theme toggle ─────────────────────────────────────────────────────────── */
  710.     .hb-theme {
  711.         display: flex;
  712.         align-items: center;
  713.         gap: 6px;
  714.         padding: 0 2px;
  715.     }
  716.     .hb-theme-img {
  717.         width: 14px;
  718.         height: 14px;
  719.         opacity: .45;
  720.         display: block;
  721.     }
  722.     #theme-toggle-checkbox {
  723.         display: none;
  724.     }
  725.     .hb-theme-track {
  726.         position: relative;
  727.         width: 34px;
  728.         height: 19px;
  729.         background: rgba(26, 29, 46, .14);
  730.         border-radius: 10px;
  731.         cursor: pointer;
  732.         transition: background .2s;
  733.         flex-shrink: 0;
  734.         display: block;
  735.     }
  736.     .hb-theme-track::after {
  737.         content: '';
  738.         position: absolute;
  739.         top: 2px;
  740.         left: 2px;
  741.         width: 15px;
  742.         height: 15px;
  743.         background: white;
  744.         border-radius: 50%;
  745.         box-shadow: 0 1px 4px rgba(0, 0, 0, .18);
  746.         transition: transform .2s;
  747.     }
  748.     .hb-theme-track.hb-dark {
  749.         background: var(--hb-amber);
  750.     }
  751.     .hb-theme-track.hb-dark::after {
  752.         transform: translateX(15px);
  753.     }
  754.     /* ── Mobile hamburger ─────────────────────────────────────────────────────── */
  755.     .hb-toggler {
  756.         display: none;
  757.         background: none;
  758.         border: none;
  759.         cursor: pointer;
  760.         padding: 8px;
  761.         flex-direction: column;
  762.         gap: 5px;
  763.         border-radius: 7px;
  764.         margin-left: auto;
  765.         flex-shrink: 0;
  766.         transition: background .15s;
  767.     }
  768.     .hb-toggler:hover {
  769.         background: rgba(26, 29, 46, .06);
  770.     }
  771.     .hb-toggler span {
  772.         display: block;
  773.         width: 21px;
  774.         height: 1.5px;
  775.         background: var(--hb-ink);
  776.         border-radius: 2px;
  777.         transition: all .22s;
  778.     }
  779.     .hb-toggler.hb-open span:nth-child(1) {
  780.         transform: rotate(45deg) translate(4.5px, 4.5px);
  781.     }
  782.     .hb-toggler.hb-open span:nth-child(2) {
  783.         opacity: 0;
  784.         transform: scaleX(0);
  785.     }
  786.     .hb-toggler.hb-open span:nth-child(3) {
  787.         transform: rotate(-45deg) translate(4.5px, -4.5px);
  788.     }
  789.     /* ── Responsive ───────────────────────────────────────────────────────────── */
  790.     @media (max-width: 1024px) {
  791.         .hb-toggler {
  792.             display: flex;
  793.         }
  794.         .hb-links, .hb-nav-right {
  795.             display: none;
  796.         }
  797.         .hb-nav-inner {
  798.             height: 56px;
  799.         }
  800.         .hb-navbar.hb-open .hb-nav-inner {
  801.             height: auto;
  802.             flex-wrap: wrap;
  803.             padding-top: 12px;
  804.             padding-bottom: 14px;
  805.             align-items: flex-start;
  806.         }
  807.         .hb-navbar.hb-open .hb-links {
  808.             display: flex;
  809.             flex-direction: column;
  810.             align-items: flex-start;
  811.             width: 100%;
  812.             flex: 0 0 100%;
  813.             gap: 2px; /* flex: 0 0 100% overrides base flex:1 to force row wrap */
  814.         }
  815.         .hb-navbar.hb-open .hb-links .hb-link,
  816.         .hb-navbar.hb-open .hb-links .hb-drop {
  817.             width: 100%;
  818.         }
  819.         .hb-navbar.hb-open .hb-links .hb-link > a,
  820.         .hb-navbar.hb-open .hb-links .hb-drop > a {
  821.             width: 100%;
  822.             justify-content: space-between;
  823.         }
  824.         .hb-navbar.hb-open .hb-dd-menu {
  825.             position: static;
  826.             transform: none;
  827.             opacity: 0;
  828.             pointer-events: none;
  829.             display: none;
  830.             box-shadow: none;
  831.             border: none;
  832.             background: rgba(26, 29, 46, .03);
  833.             border-radius: 7px;
  834.             margin: 2px 0 2px 12px;
  835.         }
  836.         .hb-navbar.hb-open .hb-drop.hb-mob-open .hb-dd-menu {
  837.             display: block;
  838.             opacity: 1;
  839.             pointer-events: all;
  840.         }
  841.         .hb-navbar.hb-open .hb-nav-right {
  842.             display: flex;
  843.             flex-wrap: wrap;
  844.             width: 100%;
  845.             flex: 0 0 100%;
  846.             gap: 8px;
  847.             padding-top: 12px;
  848.             border-top: 1px solid var(--hb-border);
  849.             margin-top: 4px;
  850.         }
  851.     }
  852.     /* ── Body offset for fixed navbar ─────────────────────────────────────────── */
  853.     body {
  854.         padding-top: 64px;
  855.     }
  856.     @media (max-width: 1024px) {
  857.         body {
  858.             padding-top: 56px;
  859.         }
  860.     }
  861.     /* ── Processing loader ────────────────────────────────────────────────────── */
  862.     #buddybee_processing_loader {
  863.         position: fixed;
  864.         inset: 0;
  865.         background: rgba(247, 245, 240, .88);
  866.         backdrop-filter: blur(4px);
  867.         z-index: 999999;
  868.         display: none;
  869.         align-items: center;
  870.         justify-content: center;
  871.     }
  872.     #buddybee_processing_loader div {
  873.         background: var(--hb-white);
  874.         border-radius: 14px;
  875.         padding: 28px 44px;
  876.         box-shadow: 0 12px 40px rgba(26, 29, 46, .12);
  877.         text-align: center;
  878.     }
  879.     #buddybee_processing_loader p {
  880.         color: var(--hb-ink);
  881.         font-weight: 700;
  882.         font-size: 12px;
  883.         letter-spacing: .1em;
  884.         text-transform: uppercase;
  885.         margin: 0;
  886.         font-family: var(--hb-font);
  887.     }
  888.     a:hover {
  889.         text-decoration: none;
  890.     }
  891. </style>
  892. <nav class="hb-navbar" id="hbNavbar">
  893.     <div class="hb-nav-inner">
  894.         {# Brand #}
  895.         <a class="hb-brand" href="{{ url('dashboard') }}">
  896.             <img src="{{ absolute_url(path('dashboard')) }}honeybee_web_assets/icons/honeybeeicon.svg?v={{ constant('ApplicationBundle\\Constants\\GeneralConstant::ENTITY_APP_VERSION') }}"
  897.                  alt="HoneyBee">
  898.             <span class="hb-brand-name">Honey<b>Bee</b></span>
  899.         </a>
  900.         {# Mobile hamburger #}
  901.         <button class="hb-toggler" id="hbToggler" aria-label="Open menu" type="button">
  902.             <span></span><span></span><span></span>
  903.         </button>
  904.         {# Primary navigation — this single <ul> is BOTH the desktop nav and the
  905.            responsive hamburger menu (see the max-width:1024px block above, which
  906.            re-flows .hb-links to a column inside .hb-navbar.hb-open). Adding one
  907.            <li> here therefore surfaces the item in both, with no duplicate CSS. #}
  908.         {# WEB-1b (Conversion Spec §3): Products | Solutions | Pricing | Partners |
  909.            Resources | Company — buyers pick a PRODUCT or a PROBLEM, never an ERP module.
  910.            Investor material left the nav (footer/Company page carries it — spec §31);
  911.            the Tools fold into Resources. Items whose dedicated pages arrive with WEB-2
  912.            (/business-suite, /hivemind, /agents, /honeycore/*, /honeywatt) point at the
  913.            closest live page today and re-point when those pages ship. #}
  914.         <ul class="hb-links">
  915.             <li class="hb-drop">
  916.                 <a href="#">Products <i class="fa-solid fa-chevron-down hb-caret"></i></a>
  917.                 <ul class="hb-dd-menu">
  918.                     {# WEB-2: the dedicated product pages shipped — the dropdown now points at
  919.                        them (the WEB-1b placeholders pointed at the closest legacy page). #}
  920.                     <li><span style="display:block;padding:7px 14px 3px;font-size:10.5px;font-weight:800;letter-spacing:.08em;text-transform:uppercase;opacity:.5;">Business</span></li>
  921.                     <li><a href="{{ url('honeybee_business_suite') }}"
  922.                            class="{{ app.request.get('_route') == 'honeybee_business_suite' ? 'active' : '' }}">HoneyBee Business Suite</a></li>
  923.                     <li><a href="{{ url('honeybee_hivemind') }}"
  924.                            class="{{ app.request.get('_route') == 'honeybee_hivemind' ? 'active' : '' }}">HiveMind AI</a></li>
  925.                     <li><a href="{{ url('honeybee_agents') }}"
  926.                            class="{{ app.request.get('_route') == 'honeybee_agents' ? 'active' : '' }}">AI Agents</a></li>
  927.                     <li><span style="display:block;padding:9px 14px 3px;font-size:10.5px;font-weight:800;letter-spacing:.08em;text-transform:uppercase;opacity:.5;">Energy &amp; Industrial</span></li>
  928.                     <li><a href="{{ url('honeybee_honeycore') }}"
  929.                            class="{{ app.request.get('_route') == 'honeybee_honeycore' ? 'active' : '' }}">HoneyCore 4.0</a></li>
  930.                     <li><a href="{{ url('honeybee_honeycore_hybrid') }}"
  931.                            class="{{ app.request.get('_route') == 'honeybee_honeycore_hybrid' ? 'active' : '' }}">Hybrid Control</a></li>
  932.                     <li><a href="{{ url('honeybee_honeycore_ems') }}"
  933.                            class="{{ app.request.get('_route') == 'honeybee_honeycore_ems' ? 'active' : '' }}">EMS</a></li>
  934.                     <li><a href="{{ url('honeybee_honeycore_bms') }}"
  935.                            class="{{ app.request.get('_route') == 'honeybee_honeycore_bms' ? 'active' : '' }}">BMS</a></li>
  936.                     <li><span style="display:block;padding:9px 14px 3px;font-size:10.5px;font-weight:800;letter-spacing:.08em;text-transform:uppercase;opacity:.5;">Engineering</span></li>
  937.                     <li><a href="{{ url('honeybee_honeywatt') }}"
  938.                            class="{{ app.request.get('_route') == 'honeybee_honeywatt' ? 'active' : '' }}">HoneyWatt — Solar Design</a></li>
  939.                 </ul>
  940.             </li>
  941.             {# WEB-3 §4: Solutions organized around BUYERS, not technologies #}
  942.             <li class="hb-drop">
  943.                 <a href="{{ url('honeybee_solutions') }}"
  944.                    class="{{ app.request.get('_route') == 'honeybee_solutions' ? 'active' : '' }}">Solutions <i class="fa-solid fa-chevron-down hb-caret"></i></a>
  945.                 <ul class="hb-dd-menu">
  946.                     <li><a href="{{ url('honeybee_solution', {'slug': 'solar-epc'}) }}"
  947.                            class="{{ app.request.get('slug') == 'solar-epc' ? 'active' : '' }}">Solar EPC Companies</a></li>
  948.                     <li><a href="{{ url('honeybee_solution', {'slug': 'system-integrators'}) }}"
  949.                            class="{{ app.request.get('slug') == 'system-integrators' ? 'active' : '' }}">System Integrators</a></li>
  950.                     <li><a href="{{ url('honeybee_solution', {'slug': 'energy-asset-owners'}) }}"
  951.                            class="{{ app.request.get('slug') == 'energy-asset-owners' ? 'active' : '' }}">Energy Asset Owners</a></li>
  952.                     <li><a href="{{ url('honeybee_solution', {'slug': 'industrial-energy-management'}) }}"
  953.                            class="{{ app.request.get('slug') == 'industrial-energy-management' ? 'active' : '' }}">C&amp;I &amp; Industrial</a></li>
  954.                     <li><a href="{{ url('honeybee_solution', {'slug': 'multi-site-operations'}) }}"
  955.                            class="{{ app.request.get('slug') == 'multi-site-operations' ? 'active' : '' }}">Multi-Site Operations</a></li>
  956.                     <li><a href="{{ url('honeybee_solutions') }}"
  957.                            class="{{ app.request.get('_route') == 'honeybee_solutions' ? 'active' : '' }}">All solutions</a></li>
  958.                 </ul>
  959.             </li>
  960.             <li class="hb-link">
  961.                 <a href="{{ url('honeybee_pricing') }}"
  962.                    class="{{ app.request.get('_route') == 'honeybee_pricing' ? 'active' : '' }} trn"
  963.                    data-trn-key="_PRICING_">Pricing</a>
  964.             </li>
  965.             <li class="hb-link">
  966.                 <a href="{{ url('honeybee_partners') }}"
  967.                    class="{{ app.request.get('_route') == 'honeybee_partners' ? 'active' : '' }}">Partners</a>
  968.             </li>
  969.             <li class="hb-drop">
  970.                 <a href="#">Resources <i class="fa-solid fa-chevron-down hb-caret"></i></a>
  971.                 <ul class="hb-dd-menu">
  972.                     <li><a href="{{ url('honeybee_tool', {'slug': 'rooftop-estimate'}) }}"
  973.                            class="{{ app.request.get('slug') == 'rooftop-estimate' ? 'active' : '' }}">Instant Solar Estimate</a></li>
  974.                     {% if app.session.get('userType') == 8 %}
  975.                     <li><a href="{{ url('hb360_my_estimate') }}"
  976.                            class="{{ app.request.get('_route') == 'hb360_my_estimate' ? 'active' : '' }}">My Solar Estimates</a></li>
  977.                     {% endif %}
  978.                     <li><a href="{{ url('honeybee_tool', {'slug': 'cost-leakage-calculator'}) }}"
  979.                            class="{{ app.request.get('slug') == 'cost-leakage-calculator' ? 'active' : '' }}">Project Cost Leakage Calculator</a></li>
  980.                     <li><a href="{{ url('honeybee_tool', {'slug': 'roi-calculator'}) }}"
  981.                            class="{{ app.request.get('slug') == 'roi-calculator' ? 'active' : '' }}">ERP ROI Calculator</a></li>
  982.                     <li><a href="{{ url('honeybee_tool', {'slug': 'site-assessment-estimator'}) }}"
  983.                            class="{{ app.request.get('slug') == 'site-assessment-estimator' ? 'active' : '' }}">HoneyCore Site Assessment Estimator</a></li>
  984.                     {# WEB-4: the trust set — customers / implementation / security #}
  985.                     <li><a href="{{ url('honeybee_customers') }}"
  986.                            class="{{ app.request.get('_route') == 'honeybee_customers' ? 'active' : '' }}">Customer Stories</a></li>
  987.                     <li><a href="{{ url('honeybee_implementation') }}"
  988.                            class="{{ app.request.get('_route') == 'honeybee_implementation' ? 'active' : '' }}">Implementation</a></li>
  989.                     <li><a href="{{ url('honeybee_security') }}"
  990.                            class="{{ app.request.get('_route') == 'honeybee_security' ? 'active' : '' }}">Security</a></li>
  991.                     <li><a href="{{ url('honeybee_trust') }}"
  992.                            class="{{ app.request.get('_route') == 'honeybee_trust' ? 'active' : '' }}">Trust &amp; Governance</a></li>
  993.                     <li><a href="{{ url('honeybee_FAQ') }}"
  994.                            class="{{ app.request.get('_route') == 'honeybee_FAQ' ? 'active' : '' }}">FAQ</a></li>
  995.                 </ul>
  996.             </li>
  997.             <li class="hb-drop">
  998.                 <a href="#">Company <i class="fa-solid fa-chevron-down hb-caret"></i></a>
  999.                 <ul class="hb-dd-menu">
  1000.                     <li><a href="{{ url('honeybee_about_us') }}"
  1001.                            class="{{ app.request.get('_route') == 'honeybee_about_us' ? 'active' : '' }}">About</a></li>
  1002.                     <li><a href="{{ url('honeybee_experience') }}"
  1003.                            class="{{ app.request.get('_route') == 'honeybee_experience' ? 'active' : '' }}">Experience</a></li>
  1004.                     <li><a href="{{ url('honeybee_investor') }}"
  1005.                            class="{{ app.request.get('_route') == 'honeybee_investor' ? 'active' : '' }}">Investor Snapshot</a></li>
  1006.                     <li><a href="{{ url('honeybee_contact') }}"
  1007.                            class="{{ app.request.get('_route') == 'honeybee_contact' ? 'active' : '' }}">Contact</a>
  1008.                     </li>
  1009.                 </ul>
  1010.             </li>
  1011.             {# spec §28: the ONE primary conversion — visible on every page #}
  1012.             <li class="hb-link">
  1013.                 <a href="{{ url('honeybee_contact') }}"
  1014.                    style="background:var(--hb-amber, #C07D2A);color:#fff;border-radius:8px;padding:8px 18px;font-weight:700;">Book a Demo</a>
  1015.             </li>
  1016.         </ul>
  1017.         {# Right-side controls #}
  1018.         <div class="hb-nav-right">
  1019.             {# Language switcher #}
  1020.             <div class="hb-lang">
  1021.                 <button class="hb-lang-btn" type="button">
  1022.                     <i class="fa-solid fa-globe" style="font-size:12px"></i>
  1023.                     <span class="curr_locale_text">en</span>
  1024.                     <i class="fa-solid fa-chevron-down" style="font-size:8px;opacity:.5"></i>
  1025.                 </button>
  1026.                 <ul class="hb-lang-menu">
  1027.                     <li><a href="#" class="locale_changer en" data-locale="en">🇬🇧 English</a></li>
  1028.                     <li><a href="#" class="locale_changer bn" data-locale="bn">🇧🇩 বাংলা</a></li>
  1029.                     <li><a href="#" class="locale_changer it" data-locale="it">🇮🇹 Italiano</a></li>
  1030.                     <li><a href="#" class="locale_changer de" data-locale="de">🇩🇪 Deutsch</a></li>
  1031.                     <li><a href="#" class="locale_changer fr" data-locale="fr">🇫🇷 Français</a></li>
  1032.                     <li><a href="#" class="locale_changer sp" data-locale="sp">🇪🇸 Español</a></li>
  1033.                     <li><a href="#" class="locale_changer cn" data-locale="cn">🇨🇳 中文</a></li>
  1034.                 </ul>
  1035.             </div>
  1036.             {# Admin only: switch user #}
  1037.             {% if session[UserConstants.USER_ID] is defined and (BUDDYBEE_ADMIN_LEVEL >= 1 or session['actualUserIsAdmin'] is defined) %}
  1038.                 <div class="hb-switch">
  1039.                     <button class="hb-switch-btn" type="button">Switch User</button>
  1040.                     <ul class="hb-switch-panel">
  1041.                         <li>
  1042.                             <a href="{{ absolute_url(path('view_as_user_central')) }}/{{ session['actualUserId'] is defined ? session['actualUserId'] : session['userId'] }}">
  1043.                                 ↩ Back to Mine
  1044.                             </a>
  1045.                         </li>
  1046.                         <li class="hb-sw-div"></li>
  1047.                         <li style="padding:2px 0"><select name="viewAsId" id="viewAsId"></select></li>
  1048.                     </ul>
  1049.                 </div>
  1050.             {% endif %}
  1051.             {% if session[UserConstants.USER_ID] is defined %}
  1052.                 {# Authenticated: user avatar + dropdown #}
  1053.                 <div class="hb-user">
  1054.                     <button class="hb-user-btn" type="button">
  1055.                         <div class="hb-user-avatar"
  1056.                                 {% if session[UserConstants.USER_IMAGE] != '' and session[UserConstants.USER_IMAGE] is not null %}
  1057.                                     style="background:url('{{ url('dashboard') }}{{ session[UserConstants.USER_IMAGE] }}?v={{ constant('ApplicationBundle\\Constants\\GeneralConstant::ENTITY_APP_VERSION') }}')"
  1058.                                 {% else %}
  1059.                                     style="background:url('{{ url('dashboard') }}honeybee_web_assets/images/profiles/profile.png?v={{ constant('ApplicationBundle\\Constants\\GeneralConstant::ENTITY_APP_VERSION') }}')"
  1060.                                 {% endif %}
  1061.                         ></div>
  1062.                         <span class="hb-user-name">{{ session[UserConstants.USER_NAME] }}</span>
  1063.                         <i class="fa-solid fa-chevron-down" style="font-size:11px;color:var(--hb-muted);opacity:.55"></i>
  1064.                     </button>
  1065.                     <ul class="hb-user-menu">
  1066.                         <li>
  1067.                             <a href="{{ url('honeybee_my_freelancer_profile') }}"
  1068.                                class="{{ app.request.get('_route') == 'honeybee_my_freelancer_profile' ? 'active' : '' }}">
  1069.                                 <i class="fa-regular fa-circle-user"></i> Profile
  1070.                             </a>
  1071.                         </li>
  1072.                         <li>
  1073.                             <a href="{{ url('ticket_list') }}"
  1074.                                class="{{ app.request.get('_route') == 'ticket_list' ? 'active' : '' }}">
  1075.                                 <i class="fa-regular fa-ticket"></i> <span class="trn" data-trn-key="_MY_TICKETS_">My Tickets</span>
  1076.                             </a>
  1077.                         </li>
  1078.                         <li>
  1079.                             <a href="{{ url('central_landing') }}"
  1080.                                class="{{ app.request.get('_route') == 'central_landing' ? 'active' : '' }}">
  1081.                                 <i class="fas fa-border-all"></i> <span class="trn" data-trn-key="_MY_COMPANIES_">My Companies</span>
  1082.                             </a>
  1083.                         </li>
  1084.                         {% if BUDDYBEE_ADMIN_LEVEL >= 1 %}
  1085.                             <li class="hb-u-div"></li>
  1086.                             <li>
  1087.                                 <a href="{{ url('super_admin_command_center') }}"
  1088.                                    class="{{ app.request.get('_route') == 'super_admin_command_center' ? 'active' : '' }}">
  1089.                                     <i class="fa-solid fa-gauge-high"></i> Super Admin
  1090.                                 </a>
  1091.                             </li>
  1092.                             <li class="hb-u-div"></li>
  1093.                             <li>
  1094.                                 <a href="{{ url('datev_home') }}"
  1095.                                    class="{{ app.request.get('_route') == 'datev_home' ? 'active' : '' }}">
  1096.                                     <i class="fa-solid fa-gauge-high"></i> Datev Control
  1097.                                 </a>
  1098.                             </li>
  1099.                         {% endif %}
  1100.                         {% if BUDDYBEE_ADMIN_LEVEL > 1 %}
  1101.                             <li class="hb-u-div"></li>
  1102.                             <li>
  1103.                                 <a href="{{ url('admin_demo_pending_list') }}"
  1104.                                    class="{{ app.request.get('_route') in ['admin_demo_pending_list','admin_demo_request_detail'] ? 'active' : '' }}">
  1105.                                     <i class="fa-solid fa-calendar-check"></i> Demo Requests
  1106.                                 </a>
  1107.                             </li>
  1108.                             <li>
  1109.                                 <a href="{{ url('admin_demo_all_list') }}"
  1110.                                    class="{{ app.request.get('_route') == 'admin_demo_all_list' ? 'active' : '' }}">
  1111.                                     <i class="fa-solid fa-list-check"></i> All Bookings
  1112.                                 </a>
  1113.                             </li>
  1114.                         {% endif %}
  1115.                         <li class="hb-u-div"></li>
  1116.                         <li>
  1117.                             <a href="{{ url('user_logout') }}" style="color:#B04030">
  1118.                                 <i class="fa-solid fa-right-from-bracket"></i> Logout
  1119.                             </a>
  1120.                         </li>
  1121.                     </ul>
  1122.                 </div>
  1123.                 {# Companies shortcut #}
  1124.                 <a href="{{ url('central_landing') }}" class="hb-btn-companies trn" data-trn-key="_COMPANIES_">
  1125.                     <i class="fa-solid fa-building" style="font-size:12px"></i>
  1126.                     <span>Companies</span>
  1127.                 </a>
  1128.                 {# Book Demo CTA (authenticated) #}
  1129.                 <a href="{{ url('honeybee_contact') }}" class="hb-btn-companies" style="background:var(--hb-amber)">Book
  1130.                     Demo</a>
  1131.             {% else %}
  1132.                 {# Guest: login + get started + book demo #}
  1133.                 <a href="{{ url('user_login') }}" class="hb-btn-login trn" data-trn-key="_LOGIN_">Login</a>
  1134.                 <a href="{{ url('sign_up') }}" class="hb-btn-signup trn" data-trn-key="_CREATE_ACCOUNT_">Get Started</a>
  1135.                 <a href="{{ url('honeybee_contact') }}" class="hb-btn-companies" style="background:var(--hb-amber)">Book
  1136.                     Demo</a>
  1137.             {% endif %}
  1138.             {# Dark / Light mode toggle #}
  1139.             {#            <div class="hb-theme"> #}
  1140.             {#                <img class="hb-theme-img" src="{{ absolute_url(asset('honeybee_web_assets/icons/sun.svg')) }}" alt="Light mode"> #}
  1141.             {#                <input type="checkbox" id="theme-toggle-checkbox"> #}
  1142.             {#                <label for="theme-toggle-checkbox" class="hb-theme-track" id="hbThemeTrack"></label> #}
  1143.             {#                <img class="hb-theme-img" src="{{ absolute_url(asset('honeybee_web_assets/icons/moon.svg')) }}" alt="Dark mode"> #}
  1144.             {#            </div> #}
  1145.         </div>{# /hb-nav-right #}
  1146.     </div>{# /hb-nav-inner #}
  1147. </nav>
  1148. {# ── Apply saved theme immediately (no flash of wrong theme) ─────────────── #}
  1149. <script>
  1150.     (function () {
  1151.         var saved = localStorage.getItem('theme') || 'light';
  1152.         if (saved === 'dark') {
  1153.             var css = document.getElementById('dark-theme-css');
  1154.             var cb = document.getElementById('theme-toggle-checkbox');
  1155.             var track = document.getElementById('hbThemeTrack');
  1156.             if (css) css.disabled = false;
  1157.             if (cb) cb.checked = true;
  1158.             if (track) track.classList.add('hb-dark');
  1159.         }
  1160.     }());
  1161. </script>
  1162. {# ── Navbar interaction scripts ───────────────────────────────────────────── #}
  1163. <script>
  1164.     (function () {
  1165.         var navbar = document.getElementById('hbNavbar');
  1166.         var toggler = document.getElementById('hbToggler');
  1167.         window.addEventListener('scroll', function () {
  1168.             navbar.classList.toggle('hb-scrolled', window.scrollY > 6);
  1169.         }, {passive: true});
  1170.         if (toggler) {
  1171.             toggler.addEventListener('click', function () {
  1172.                 navbar.classList.toggle('hb-open');
  1173.                 toggler.classList.toggle('hb-open');
  1174.             });
  1175.         }
  1176.         navbar.querySelectorAll('.hb-drop > a').forEach(function (a) {
  1177.             a.addEventListener('click', function (e) {
  1178.                 if (window.innerWidth <= 1024) {
  1179.                     e.preventDefault();
  1180.                     a.closest('.hb-drop').classList.toggle('hb-mob-open');
  1181.                 }
  1182.             });
  1183.         });
  1184.         var cb = document.getElementById('theme-toggle-checkbox');
  1185.         var track = document.getElementById('hbThemeTrack');
  1186.         if (cb && track) {
  1187.             track.addEventListener('click', function () {
  1188.                 changeTheme(!cb.checked);
  1189.             });
  1190.         }
  1191.     }());
  1192. </script>
  1193. {# ── Preloader: hide on load ──────────────────────────────────────────────── #}
  1194. <script>
  1195.     document.body.style.overflow = 'hidden';
  1196.     window.addEventListener('load', function () {
  1197.         var pre = document.getElementById('hb-preloader');
  1198.         if (pre) {
  1199.             pre.style.transition = 'opacity .35s ease';
  1200.             pre.style.opacity = '0';
  1201.             setTimeout(function () {
  1202.                 pre.style.display = 'none';
  1203.             }, 360);
  1204.         }
  1205.         document.body.style.overflow = 'auto';
  1206.     });
  1207. </script>
  1208. {% set full_js_included = 0 %}
  1209. {% endif %}{# /include_html #}
  1210. <input type="hidden" id="timeStampOnHeaderLoad" value="{{ 'now'|date('U') }}">
  1211. {% include '@Application/inc/ajax_route_library.html.twig' %}
  1212. {# Date-picker scripts #}
  1213. <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
  1214. <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>
  1215. <script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-material-datetimepicker/2.7.1/js/bootstrap-material-datetimepicker.min.js"></script>
  1216. {# WEB-5 §33 — the first-party conversion beacon. Privacy-lean BY CONSTRUCTION: respects
  1217.    Do-Not-Track, sets no cookie, mints a random per-TAB session id (sessionStorage — gone
  1218.    when the tab closes), sends only whitelisted events (WebAnalyticsCore refuses the rest).
  1219.    Events: page_view on load · data-wa clicks · any .pp-cta = cta_click · form_start on
  1220.    first input in an intent form · form_complete fired by the form on success. #}
  1221. <script>
  1222. (function () {
  1223.     'use strict';
  1224.     if (navigator.doNotTrack === '1' || window.doNotTrack === '1') { return; }
  1225.     var URL_WA = "{{ url('honeybee_wa_event') }}";
  1226.     var sid = '';
  1227.     try {
  1228.         sid = sessionStorage.getItem('hb_wa_sid') || '';
  1229.         if (!sid) {
  1230.             sid = Array.from(crypto.getRandomValues(new Uint8Array(8)))
  1231.                 .map(function (b) { return b.toString(16).padStart(2, '0'); }).join('');
  1232.             sessionStorage.setItem('hb_wa_sid', sid);
  1233.         }
  1234.     } catch (e) { sid = ''; }
  1235.     var q = new URLSearchParams(window.location.search);
  1236.     function send(ev, meta) {
  1237.         try {
  1238.             var fd = new FormData();
  1239.             fd.append('event', ev);
  1240.             fd.append('page', window.location.pathname);
  1241.             if (meta) { fd.append('meta', String(meta).slice(0, 300)); }
  1242.             ['utm_source', 'utm_medium', 'utm_campaign'].forEach(function (k) {
  1243.                 var v = q.get(k); if (v) { fd.append(k, v); }
  1244.             });
  1245.             if (document.referrer) { fd.append('ref', document.referrer.slice(0, 160)); }
  1246.             if (sid) { fd.append('sid', sid); }
  1247.             if (!(navigator.sendBeacon && navigator.sendBeacon(URL_WA, fd))) {
  1248.                 fetch(URL_WA, { method: 'POST', body: fd, keepalive: true }).catch(function () {});
  1249.             }
  1250.         } catch (e) { /* analytics must never break a page */ }
  1251.     }
  1252.     window.hbWa = send;
  1253.     send('page_view');
  1254.     document.addEventListener('click', function (e) {
  1255.         var a = e.target && e.target.closest ? e.target.closest('a,button') : null;
  1256.         if (!a) { return; }
  1257.         var wa = a.getAttribute && a.getAttribute('data-wa');
  1258.         if (wa) { send(wa, a.getAttribute('href') || a.textContent.trim().slice(0, 80)); return; }
  1259.         if (a.className && String(a.className).indexOf('pp-cta') !== -1) {
  1260.             send(window.location.pathname === '/pricing' ? 'pricing_cta' : 'cta_click',
  1261.                 a.getAttribute('href') || a.textContent.trim().slice(0, 80));
  1262.         }
  1263.     }, true);
  1264.     var formStarted = false;
  1265.     document.addEventListener('focusin', function (e) {
  1266.         if (formStarted || !e.target || !e.target.closest) { return; }
  1267.         var f = e.target.closest('form.pp-form');
  1268.         if (f) { formStarted = true; send('form_start', f.getAttribute('data-intent') || ''); }
  1269.     }, true);
  1270. })();
  1271. </script>