]> _ Git - fluidbook-v3.git/commitdiff
wip #7257 @3
authorVincent Vanwaelscappel <vincent@cubedesigners.com>
Mon, 17 Feb 2025 16:06:43 +0000 (17:06 +0100)
committerVincent Vanwaelscappel <vincent@cubedesigners.com>
Mon, 17 Feb 2025 16:06:43 +0000 (17:06 +0100)
.docker/production/docker-compose.yml
.docker/production/update
.idea/workspace.xml
framework/application/Bootstrap.php
framework/application/configs/application.ini
framework/library/CubeIT/Bootstrap/Navigation.php
less/104-nav.less

index d277fc20f35373b48c5b16ca8e5382d36102429f..f66b5e114d794de0d1301e78e739ca006c50fad2 100644 (file)
 version: '3.1'
 services:
-    fluidbook-v3-httpd:
-        container_name: fluidbook-v3-httpd
-        build: './images/httpd'
-        working_dir: /application
-        volumes:
-            - './www/:/usr/local/apache2/htdocs'
-            - './www/:/application/'
-            - './config/httpd/httpd.conf:/usr/local/apache2/conf/httpd.conf'
-        environment:
-            VIRTUAL_HOST: www.fluidbook.com,en.fluidbook.com,fluidbook.com,elearning.fluidbook.com,fr.elearning.fluidbook.com
-            LETSENCRYPT_HOST: www.fluidbook.com,en.fluidbook.com,fluidbook.com,elearning.fluidbook.com,fr.elearning.fluidbook.com
-        restart: unless-stopped
-        networks:
-          - nginxproxy
-          - fluidbook-v3
+  fluidbook-v3-httpd:
+    container_name: fluidbook-v3-httpd
+    build: './images/httpd'
+    working_dir: /application
+    volumes:
+      - './www/:/usr/local/apache2/htdocs'
+      - './www/:/application/'
+      - './config/httpd/httpd.conf:/usr/local/apache2/conf/httpd.conf'
+    environment:
+      VIRTUAL_HOST: www.fluidbook.com,en.fluidbook.com,fluidbook.com,elearning.fluidbook.com,fr.elearning.fluidbook.com
+      LETSENCRYPT_HOST: www.fluidbook.com,en.fluidbook.com,fluidbook.com,elearning.fluidbook.com,fr.elearning.fluidbook.com
+    restart: unless-stopped
+    networks:
+      - nginxproxy
+      - fluidbook-v3
 
-    fluidbook-v3:
-        container_name: fluidbook-v3
-        hostname: fluidbook-v3
-        build: './images/php-fpm'
-        working_dir: /application
-        volumes:
-            # SSH
-            - './config/ssh/root/:/root/.ssh/'
-            - './config/ssh/user/:/application/.ssh/'
-            - './config/ssh/server/:/etc/ssh/'
-            # Rsyslog
-            - './config/rsyslog/rsyslog.conf:/etc/rsyslog.conf'
-            - './config/rsyslog/50-default.conf:/etc/rsyslog.d/50-default.conf'
-            # Composer
-            - './config/composer/:/root/.config/composer/'
-            - './config/composer/:/application/.config/composer/'
-            # Sudoers
-            - './config/sudoers:/etc/sudoers.d/fluidbook-v3'
-            # ImageMagick
-            - './config/imagemagick/policy.xml:/etc/ImageMagick-6/policy.xml'
-            # Passwords
-            - './config/passwords:/root/passwords'
-            # Cron
-            - './config/cron/crontab:/etc/crontab'
-            # PHP
-            - './config/php.ini:/etc/php/8.3/fpm/conf.d/99-overrides.ini'
-            # Web path
-            - './www:/application'
-        tmpfs:
-            - /home/tmp
-            - /application/framework/data/temp
-        ports:
-          - '38840:22'
-        restart: unless-stopped
-        networks:
-          - fluidbook-v3
+  fluidbook-v3:
+    container_name: fluidbook-v3
+    hostname: fluidbook-v3
+    build: './images/php-fpm'
+    working_dir: /application
+    volumes:
+      # SSH
+      - './config/ssh/root/:/root/.ssh/'
+      - './config/ssh/user/:/application/.ssh/'
+      - './config/ssh/server/:/etc/ssh/'
+      # Rsyslog
+      - './config/rsyslog/rsyslog.conf:/etc/rsyslog.conf'
+      - './config/rsyslog/50-default.conf:/etc/rsyslog.d/50-default.conf'
+      # Composer
+      - './config/composer/:/root/.config/composer/'
+      - './config/composer/:/application/.config/composer/'
+      # Sudoers
+      - './config/sudoers:/etc/sudoers.d/fluidbook-v3'
+      # ImageMagick
+      - './config/imagemagick/policy.xml:/etc/ImageMagick-6/policy.xml'
+      # Passwords
+      - './config/passwords:/root/passwords'
+      # Cron
+      - './config/cron/crontab:/etc/crontab'
+      # PHP
+      - './config/php.ini:/etc/php/8.3/fpm/conf.d/99-overrides.ini'
+      # Web path
+      - './www:/application'
+    tmpfs:
+      - /home/tmp
+      - /application/framework/data/temp
+    ports:
+      - '38840:22'
+    restart: unless-stopped
+    networks:
+      - fluidbook-v3
 
-    adminer:
-      image: 'adminer:latest'
-      container_name: fluidbook-v3-adminer
-      restart: unless-stopped
-      environment:
-        ADMINER_DEFAULT_SERVER: fluidbook-v3-mariadb
-        VIRTUAL_HOST: adminer.fluidbook.com
-        LETSENCRYPT_HOST: adminer.fluidbook.
-      networks:
-        - fluidbook-v3
+  adminer:
+    image: 'adminer:latest'
+    container_name: fluidbook-v3-adminer
+    restart: unless-stopped
+    environment:
+      ADMINER_DEFAULT_SERVER: fluidbook-v3-mariadb
+      VIRTUAL_HOST: adminer.fluidbook.com
+      LETSENCRYPT_HOST: adminer.fluidbook.com
+    networks:
+      - fluidbook-v3
+      - nginxproxy
 
-    fluidbook-v3-mariadb:
-        container_name: fluidbook-v3-mariadb
-        image: 'mariadb:latest'
-        restart: unless-stopped
-        environment:
-          MARIADB_ROOT_PASSWORD: FB8qVD7R0jqsXYNR
-          MARIADB_DATABASE: fluidbook-v3
-          MARIADB_AUTO_UPGRADE: 1
-        volumes:
-          - "./database/dump.sql:/docker-entrypoint-initdb.d/dump.sql"
-          - "./database/scripts/:/usr/local/bin/scripts/"
-          - "./database/data:/var/lib/mysql"
-          - './config/mariadb:/etc/mysql/conf.d:z'
-        logging:
-          driver: json-file
-          options:
-            max-size: 10M
-            max-file: 10
-        networks:
-          - fluidbook-v3
+  fluidbook-v3-mariadb:
+    container_name: fluidbook-v3-mariadb
+    image: 'mariadb:latest'
+    restart: unless-stopped
+    environment:
+      MARIADB_ROOT_PASSWORD: FB8qVD7R0jqsXYNR
+      MARIADB_DATABASE: fluidbook-v3
+      MARIADB_AUTO_UPGRADE: 1
+    volumes:
+      - "./database/dump.sql:/docker-entrypoint-initdb.d/dump.sql"
+      - "./database/scripts/:/usr/local/bin/scripts/"
+      - "./database/data:/var/lib/mysql"
+      - './config/mariadb:/etc/mysql/conf.d:z'
+    logging:
+      driver: json-file
+      options:
+        max-size: 10M
+        max-file: 10
+    networks:
+      - fluidbook-v3
 
-    mysqlbackup:
-      image: selim13/automysqlbackup
-      container_name: fluidbook-v3-automysqlbackup
-      volumes:
-        - "./database/backup:/backup"
-      environment:
-        USERNAME: root
-        PASSWORD: FB8qVD7R0jqsXYNR
-        DBHOST: fluidbook-v3-mariadb
-        DBEXCLUDE: "performance_schema information_schema"
-        CRON_SCHEDULE: "0 0 * * *"
-        EXTRA_OPTS: "--single-transaction"
-      networks:
-        - fluidbook-v3
+  mysqlbackup:
+    image: selim13/automysqlbackup
+    container_name: fluidbook-v3-automysqlbackup
+    volumes:
+      - "./database/backup:/backup"
+    environment:
+      USERNAME: root
+      PASSWORD: FB8qVD7R0jqsXYNR
+      DBHOST: fluidbook-v3-mariadb
+      DBEXCLUDE: "performance_schema information_schema"
+      CRON_SCHEDULE: "0 0 * * *"
+      EXTRA_OPTS: "--single-transaction"
+    networks:
+      - fluidbook-v3
 
 networks:
   nginxproxy:
index a413e510bf166aa2d84278d5983bcf1ee4973b62..63c1bcfd2659c63f310f82c6aa932909e8ca5c4d 100644 (file)
@@ -9,6 +9,7 @@ COMPOSE_DOCKER_CLI_BUILD=1 DOCKER_BUILDKIT=1 docker compose pull
 COMPOSE_DOCKER_CLI_BUILD=1 DOCKER_BUILDKIT=1 docker compose build
 
 docker compose down -v
+rm -f ./database/data/tc.log
 docker compose up -d
 
 ufw-docker allow fluidbook-v3
\ No newline at end of file
index 2fd453f602de128e44180d1d254edfe4767ce0d5..f0eb2ccb69d7025e05f3e6e5e5a038d41edb1acd 100644 (file)
@@ -4,13 +4,14 @@
     <option name="autoReloadType" value="SELECTIVE" />
   </component>
   <component name="ChangeListManager">
-    <list default="true" id="530ffb50-16c9-4bb3-ad22-e76f531eb78c" name="Default" comment="wip #7257 @0.75">
+    <list default="true" id="530ffb50-16c9-4bb3-ad22-e76f531eb78c" name="Default" comment="wip #7264 @2">
+      <change beforePath="$PROJECT_DIR$/.docker/production/docker-compose.yml" beforeDir="false" afterPath="$PROJECT_DIR$/.docker/production/docker-compose.yml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/.docker/production/update" beforeDir="false" afterPath="$PROJECT_DIR$/.docker/production/update" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/framework/application/views/scripts/common/body.phtml" beforeDir="false" afterPath="$PROJECT_DIR$/framework/application/views/scripts/common/body.phtml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/framework/library/CubeIT/Bootstrap/Db.php" beforeDir="false" afterPath="$PROJECT_DIR$/framework/library/CubeIT/Bootstrap/Db.php" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/application/Bootstrap.php" beforeDir="false" afterPath="$PROJECT_DIR$/framework/application/Bootstrap.php" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/framework/application/configs/application.ini" beforeDir="false" afterPath="$PROJECT_DIR$/framework/application/configs/application.ini" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/framework/library/CubeIT/Bootstrap/Navigation.php" beforeDir="false" afterPath="$PROJECT_DIR$/framework/library/CubeIT/Bootstrap/Navigation.php" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/framework/library/Zend/View/Helper/Navigation/Sitemap.php" beforeDir="false" afterPath="$PROJECT_DIR$/framework/library/Zend/View/Helper/Navigation/Sitemap.php" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/framework/library/Zend/Xml/Security.php" beforeDir="false" afterPath="$PROJECT_DIR$/framework/library/Zend/Xml/Security.php" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/less/104-nav.less" beforeDir="false" afterPath="$PROJECT_DIR$/less/104-nav.less" afterDir="false" />
     </list>
     <option name="SHOW_DIALOG" value="false" />
     <option name="HIGHLIGHT_CONFLICTS" value="true" />
     <option name="hideEmptyMiddlePackages" value="true" />
     <option name="showLibraryContents" value="true" />
   </component>
-  <component name="PropertiesComponent"><![CDATA[{
-  "keyToString": {
-    "RunOnceActivity.OpenProjectViewOnStart": "true",
-    "RunOnceActivity.git.unshallow": "true",
-    "WebServerToolWindowFactoryState": "true",
-    "WebServerToolWindowPanel.toolwindow.highlight.mappings": "true",
-    "WebServerToolWindowPanel.toolwindow.highlight.symlinks": "true",
-    "WebServerToolWindowPanel.toolwindow.show.date": "false",
-    "WebServerToolWindowPanel.toolwindow.show.permissions": "false",
-    "WebServerToolWindowPanel.toolwindow.show.size": "false",
-    "git-widget-placeholder": "master",
-    "ignore.virus.scanning.warn.message": "true",
-    "kotlin-language-version-configured": "true",
-    "last_opened_file_path": "D:/Works/FluidbookWebV3/framework/library/CubeIT/Bootstrap",
-    "node.js.detected.package.eslint": "true",
-    "node.js.detected.package.tslint": "true",
-    "node.js.selected.package.eslint": "(autodetect)",
-    "node.js.selected.package.tslint": "(autodetect)",
-    "nodejs_package_manager_path": "npm",
-    "project.structure.last.edited": "Project",
-    "project.structure.proportion": "0.0",
-    "project.structure.side.proportion": "0.2",
-    "ruby.rails.projectView.checked": "true",
-    "settings.editor.selected.configurable": "project.propVCSSupport.DirectoryMappings",
-    "vue.rearranger.settings.migration": "true"
+  <component name="PropertiesComponent">{
+  &quot;keyToString&quot;: {
+    &quot;RunOnceActivity.OpenProjectViewOnStart&quot;: &quot;true&quot;,
+    &quot;RunOnceActivity.git.unshallow&quot;: &quot;true&quot;,
+    &quot;WebServerToolWindowFactoryState&quot;: &quot;true&quot;,
+    &quot;WebServerToolWindowPanel.toolwindow.highlight.mappings&quot;: &quot;true&quot;,
+    &quot;WebServerToolWindowPanel.toolwindow.highlight.symlinks&quot;: &quot;true&quot;,
+    &quot;WebServerToolWindowPanel.toolwindow.show.date&quot;: &quot;false&quot;,
+    &quot;WebServerToolWindowPanel.toolwindow.show.permissions&quot;: &quot;false&quot;,
+    &quot;WebServerToolWindowPanel.toolwindow.show.size&quot;: &quot;false&quot;,
+    &quot;git-widget-placeholder&quot;: &quot;master&quot;,
+    &quot;ignore.virus.scanning.warn.message&quot;: &quot;true&quot;,
+    &quot;kotlin-language-version-configured&quot;: &quot;true&quot;,
+    &quot;last_opened_file_path&quot;: &quot;D:/Works/FluidbookWebV3/framework/library/CubeIT/Bootstrap&quot;,
+    &quot;node.js.detected.package.eslint&quot;: &quot;true&quot;,
+    &quot;node.js.detected.package.tslint&quot;: &quot;true&quot;,
+    &quot;node.js.selected.package.eslint&quot;: &quot;(autodetect)&quot;,
+    &quot;node.js.selected.package.tslint&quot;: &quot;(autodetect)&quot;,
+    &quot;nodejs_package_manager_path&quot;: &quot;npm&quot;,
+    &quot;project.structure.last.edited&quot;: &quot;Project&quot;,
+    &quot;project.structure.proportion&quot;: &quot;0.0&quot;,
+    &quot;project.structure.side.proportion&quot;: &quot;0.2&quot;,
+    &quot;ruby.rails.projectView.checked&quot;: &quot;true&quot;,
+    &quot;settings.editor.selected.configurable&quot;: &quot;project.propVCSSupport.DirectoryMappings&quot;,
+    &quot;vue.rearranger.settings.migration&quot;: &quot;true&quot;
   }
-}]]></component>
+}</component>
   <component name="RecentsManager">
     <key name="CopyFile.RECENT_KEYS">
       <recent name="D:\Works\FluidbookWebV3\framework\library\CubeIT\Bootstrap" />
         <option name="Make" enabled="true" />
       </method>
     </configuration>
+    <configuration default="true" type="Application" factoryName="Application">
+      <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
+      <method v="2">
+        <option name="Make" enabled="true" />
+      </method>
+    </configuration>
     <configuration default="true" type="ArquillianJUnit" factoryName="">
       <option name="arquillianRunConfiguration">
         <value>
       <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
       <method v="2" />
     </configuration>
+    <configuration default="true" type="JUnit" factoryName="JUnit">
+      <option name="TEST_OBJECT" value="class" />
+      <option name="WORKING_DIRECTORY" value="$MODULE_DIR$" />
+      <method v="2">
+        <option name="Make" enabled="true" />
+      </method>
+    </configuration>
+    <configuration default="true" type="TestNG">
+      <option name="TEST_OBJECT" value="CLASS" />
+      <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
+      <properties />
+      <listeners />
+      <method v="2">
+        <option name="Make" enabled="true" />
+      </method>
+    </configuration>
+    <configuration default="true" type="js.build_tools.gulp">
+      <node-interpreter>project</node-interpreter>
+      <node-options />
+      <gulpfile />
+      <tasks />
+      <arguments />
+      <pass-parent-envs>true</pass-parent-envs>
+      <method v="2" />
+    </configuration>
     <configuration default="true" type="tests" factoryName="Attests">
       <option name="INTERPRETER_OPTIONS" value="" />
       <option name="PARENT_ENVS" value="true" />
       <workItem from="1728998686616" duration="8507000" />
       <workItem from="1731579305063" duration="12263000" />
       <workItem from="1739209041347" duration="1137000" />
-      <workItem from="1739539005844" duration="4203000" />
+      <workItem from="1739539005844" duration="4288000" />
+      <workItem from="1739788502594" duration="628000" />
+      <workItem from="1739800972227" duration="5782000" />
     </task>
     <task id="LOCAL-00117" summary="fix #1407 @1">
       <created>1494411210038</created>
       <option name="project" value="LOCAL" />
       <updated>1682409989659</updated>
     </task>
-    <option name="localTasksCounter" value="174" />
+    <option name="localTasksCounter" value="175" />
     <servers>
       <Redmine shared="true" url="https://team.cubedesigners.com/redmine">
         <option name="APIKey" value="ee454486fcd47aa38e5c99d5a7dc44cff1f65597" />
index 6e093aecb4f3d8eaad738aabc8e7dc72a09b0579..2f6e7793b895e606d1c41320540844f776432438 100644 (file)
@@ -33,15 +33,13 @@ class Bootstrap extends CubeIT_Bootstrap
 
     protected function _makeNavigationOnePage(&$navigation, $r, $t, $isAdmin, $locale = false)
     {
+
+        $page = parent::_makeNavigationOnePage($navigation, $r, $t, $isAdmin, $locale);
         // Remove all reference of the blog on the english version
         if ($r->template === 'blog' && $locale === 'en') {
-            if (!$isAdmin) {
-                return;
-            } else {
-                $r->online = false;
-            }
+            $page->setMenu(false);
+            $page->setSitemap(false);
         }
-        $page = parent::_makeNavigationOnePage($navigation, $r, $t, $isAdmin, $locale);
 
         if (!$page) return;
 
index 5afde8f6a32fb7f10fb5af2e909b3a6ab9015897..ced1009063a4c8edee820244233953785f1e72ce 100644 (file)
@@ -52,8 +52,6 @@ acl.roles[] = admin
 
 mail.test = APPLICATION_PATH "/../data/email/test"
 
-compat_ie = 9
-
 privacy.dnt = 1
 privacy.analytics = 1
 
index 4d374eea29b8200ab1e539855307c1b300b099c2..57a4213ac60bc0c46db8c7b3c1e422ea9c71fa39 100644 (file)
@@ -24,48 +24,39 @@ class CubeIT_Bootstrap_Navigation extends CubeIT_Bootstrap_Locale
         profile(__FILE__, __LINE__, 'Make Application navigation');
 
 
-        $cache = $this->getCoreCache();
-
         $isAdmin = $this->isAllowed('administration');
         $cacheId = $this->_getNavigationCacheId($isAdmin, $full);
 
-        $mtime = max(filemtime(CubeIT_Util_PHP::getFileDeclaring($this)), filemtime(__FILE__));
-        $meta = $cache->getMetadatas($cacheId);
-
-        if (!$this->_cacheNavigation || $refresh || !$cache->test($cacheId) || $mtime > $meta['mtime']) {
-            $navigation = $this->_createNavigation($isAdmin);
+        $navigation = $this->_createNavigation($isAdmin);
 
-            $r = $this->navRoot;
-            if ($full) {
-                $r = null;
-            }
+        $r = $this->navRoot;
+        if ($full) {
+            $r = null;
+        }
 
-            if ($this->isMultilang()) {
-                $this->_makeNavigationMultiLocale($navigation, $isAdmin, $r);
-            } else {
-                $this->_makeNavigationMonoLocale($navigation, $isAdmin, $r);
-            }
+        if ($this->isMultilang()) {
+            $this->_makeNavigationMultiLocale($navigation, $isAdmin, $r);
+        } else {
+            $this->_makeNavigationMonoLocale($navigation, $isAdmin, $r);
+        }
 
-            if (!$isAdmin) {
-                foreach ($this->_getNextRedirectionTemplates() as $template) {
-                    foreach ($navigation->findAllByTemplate($template) as $p) {
-                        $p->setUri($p->getFinalUri());
-                    }
-                }
-                foreach ($navigation->findAllByTemplate('pageredirection') as $p) {
-                    $p->setUri($p->getFinalUri());
-                }
-                foreach ($navigation->findAllByTemplate('subredirection') as $p) {
+        if (!$isAdmin) {
+            foreach ($this->_getNextRedirectionTemplates() as $template) {
+                foreach ($navigation->findAllByTemplate($template) as $p) {
                     $p->setUri($p->getFinalUri());
                 }
             }
-            if ($this->_cacheNavigation) {
-                $cache->save($navigation, $cacheId, array('navigation'));
-                $navigation->archive($this->getDb());
+            foreach ($navigation->findAllByTemplate('pageredirection') as $p) {
+                $p->setUri($p->getFinalUri());
+            }
+            foreach ($navigation->findAllByTemplate('subredirection') as $p) {
+                $p->setUri($p->getFinalUri());
             }
-        } else {
-            $navigation = $cache->load($cacheId, false);
         }
+        if ($this->_cacheNavigation) {
+            $navigation->archive($this->getDb());
+        }
+
         return $navigation;
     }
 
index a2ef367d1a0c688d04428b9d4937a7d3b779014e..201fcf42f1228af3bf0f49e422b245cf99fb4208 100644 (file)
 @import "000-imports";\r
 \r
 nav {\r
-       font-family: @montserrat;\r
-       font-weight: 300;\r
-       a {\r
-               text-transform: uppercase;\r
-               text-decoration: none;\r
-               font-size: 12px;\r
-               color: @color-header-grey;\r
-\r
-               &:hover {\r
-                       color: currentColor;\r
-               }\r
-       }\r
-       ul {\r
-               list-style: none;\r
-               li {\r
-                       display: inline-block;\r
-               }\r
-       }\r
+  font-family: @montserrat;\r
+  font-weight: 300;\r
+\r
+  a {\r
+    text-transform: uppercase;\r
+    text-decoration: none;\r
+    font-size: 12px;\r
+    color: @color-header-grey;\r
+\r
+    &:hover {\r
+      color: currentColor;\r
+    }\r
+  }\r
+\r
+  ul {\r
+    list-style: none;\r
+\r
+    li {\r
+      display: inline-block;\r
+    }\r
+  }\r
+\r
+  li:empty {\r
+    display: none;\r
+  }\r
 }\r
 \r
 nav#menu {\r
-       position: absolute;\r
-       top: 60px;\r
-       left: 44%; // Must be kept in sync with TweenMax value in 101-header.js\r
-       transform: translateX(-50%);\r
-       margin-left: 36px; // Extra spacing for logo symbol\r
-\r
-       @media @m1320 { // Left align menu\r
-               transform: none !important;\r
-               left: 0 !important;\r
-               top: 26px !important;\r
-       }\r
-\r
-       @media @bp-menu {\r
-               display: none;\r
-       }\r
-\r
-       a {\r
-               line-height: 9px;\r
-               border: 1px solid transparent;\r
-               padding-bottom: 13px;\r
-               display: inline-block;\r
-       }\r
-\r
-       > ul {\r
-               > li {\r
-\r
-                       margin: 0 25px;\r
-                       position: relative;\r
-\r
-                       @media @m1280 {\r
-                               margin: 0 15px;\r
-                       }\r
-\r
-                       @media (max-width: 900px) {\r
-                               margin: 0 7px;\r
-                       }\r
-\r
-                       > a {\r
-                               position: relative;\r
-                               &:after {\r
-                                       content: "";\r
-                                       height: 1px;\r
-                                       width: 0;\r
-                                       position: absolute;\r
-                                       background-color: @color-header-grey;\r
-                                       left: 0;\r
-                                       bottom: 0;\r
-                                       transition: @transition-time-buttons width;\r
-                               }\r
-                       }\r
-\r
-                       &.active > a, a:hover {\r
-                               color: @color-header-grey;\r
-                               &:after {\r
-                                       width: 100%;\r
-                               }\r
-                       }\r
-                       &:hover {\r
-                               > ul {\r
-                                       display: block;\r
-                               }\r
-                       }\r
-\r
-                       > ul {\r
-                               position: absolute;\r
-                               top: 40px;\r
-                               left: -20px;\r
-                               background-color: #fff;\r
-                               box-shadow: 0 2px 2px rgba(0, 0, 0, 0.2);\r
-                               white-space: nowrap;\r
-                               display: none;\r
-                               &:before {\r
-                                       content: "";\r
-                                       background-color: transparent;\r
-                                       height: 20px;\r
-                                       width: 100%;\r
-                                       top: -20px;\r
-                                       left: 0px;\r
-                                       position: absolute;\r
-                               }\r
-\r
-                               > li {\r
-                                       display: block;\r
-                                       text-align: left;\r
-\r
-                                       margin: 10px 20px;\r
-\r
-                                       a {\r
-                                               transition: @transition-time-buttons color;\r
-\r
-                                               header#h.light & {\r
-                                                       color: @color-header-grey;\r
-                                               }\r
-                                       }\r
-\r
-                                       &.active a, a:hover {\r
-                                               border-bottom-color: transparent;\r
-                                               color: @color-submenu-hover !important;\r
-                                       }\r
-                               }\r
-                       }\r
-               }\r
-       }\r
+  position: absolute;\r
+  top: 60px;\r
+  left: 44%; // Must be kept in sync with TweenMax value in 101-header.js\r
+  transform: translateX(-50%);\r
+  margin-left: 36px; // Extra spacing for logo symbol\r
+\r
+  @media @m1320 {\r
+    // Left align menu\r
+    transform: none !important;\r
+    left: 0 !important;\r
+    top: 26px !important;\r
+  }\r
+\r
+  @media @bp-menu {\r
+    display: none;\r
+  }\r
+\r
+  a {\r
+    line-height: 9px;\r
+    border: 1px solid transparent;\r
+    padding-bottom: 13px;\r
+    display: inline-block;\r
+  }\r
+\r
+  > ul {\r
+    > li {\r
+\r
+      margin: 0 25px;\r
+      position: relative;\r
+\r
+      @media @m1280 {\r
+        margin: 0 15px;\r
+      }\r
+\r
+      @media (max-width: 900px) {\r
+        margin: 0 7px;\r
+      }\r
+\r
+      > a {\r
+        position: relative;\r
+\r
+        &:after {\r
+          content: "";\r
+          height: 1px;\r
+          width: 0;\r
+          position: absolute;\r
+          background-color: @color-header-grey;\r
+          left: 0;\r
+          bottom: 0;\r
+          transition: @transition-time-buttons width;\r
+        }\r
+      }\r
+\r
+      &.active > a, a:hover {\r
+        color: @color-header-grey;\r
+\r
+        &:after {\r
+          width: 100%;\r
+        }\r
+      }\r
+\r
+      &:hover {\r
+        > ul {\r
+          display: block;\r
+        }\r
+      }\r
+\r
+      > ul {\r
+        position: absolute;\r
+        top: 40px;\r
+        left: -20px;\r
+        background-color: #fff;\r
+        box-shadow: 0 2px 2px rgba(0, 0, 0, 0.2);\r
+        white-space: nowrap;\r
+        display: none;\r
+\r
+        &:before {\r
+          content: "";\r
+          background-color: transparent;\r
+          height: 20px;\r
+          width: 100%;\r
+          top: -20px;\r
+          left: 0px;\r
+          position: absolute;\r
+        }\r
+\r
+        > li {\r
+          display: block;\r
+          text-align: left;\r
+\r
+          margin: 10px 20px;\r
+\r
+          a {\r
+            transition: @transition-time-buttons color;\r
+\r
+            header#h.light & {\r
+              color: @color-header-grey;\r
+            }\r
+          }\r
+\r
+          &.active a, a:hover {\r
+            border-bottom-color: transparent;\r
+            color: @color-submenu-hover !important;\r
+          }\r
+        }\r
+      }\r
+    }\r
+  }\r
 }\r
 \r
 nav#contactnav {\r
-       position: absolute;\r
-       right: 0;\r
-       bottom: 1px;\r
-\r
-       @media @bp-menu {\r
-               bottom: -10px;\r
-       }\r
-\r
-       @media @m768 {\r
-               bottom: 5px;\r
-       }\r
-\r
-       li {\r
-               margin-left: 19px;\r
-               @media (max-width: 900px ) {\r
-                       margin-left: 10px;\r
-               }\r
-       }\r
-       a {\r
-               .rounded-button();\r
-               &.quoteLink {\r
-                       .background-button-green();\r
-                       color: #fff;\r
-                       line-height: 1;\r
-                       @media @m640 {\r
-                               display: none;\r
-                       }\r
-\r
-                       position: relative;\r
-               }\r
-               &.agencies {\r
-                       .border-button-fill(@color-header-grey, #c2c4c7, 5%);\r
-                       line-height: 1;\r
-                       @media @bp-menu {\r
-                               display: none;\r
-                       }\r
-               }\r
-               .smallarrow-button(10px, 30px, 10px, 7px);\r
-\r
-               @media @m1024 {\r
-                       padding-left: 15px;\r
-                       padding-right: 15px;\r
-               }\r
-\r
-               @media @bp-menu {\r
-                       padding-left: 29px;\r
-                       padding-right: 29px;\r
-               }\r
-\r
-               @media @m768 {\r
-                       padding-left: 15px;\r
-                       padding-right: 15px;\r
-               }\r
-       }\r
+  position: absolute;\r
+  right: 0;\r
+  bottom: 1px;\r
+\r
+  @media @bp-menu {\r
+    bottom: -10px;\r
+  }\r
+\r
+  @media @m768 {\r
+    bottom: 5px;\r
+  }\r
+\r
+  li {\r
+    margin-left: 19px;\r
+    @media (max-width: 900px ) {\r
+      margin-left: 10px;\r
+    }\r
+  }\r
+\r
+  a {\r
+    .rounded-button();\r
+\r
+    &.quoteLink {\r
+      .background-button-green();\r
+      color: #fff;\r
+      line-height: 1;\r
+      @media @m640 {\r
+        display: none;\r
+      }\r
+\r
+      position: relative;\r
+    }\r
+\r
+    &.agencies {\r
+      .border-button-fill(@color-header-grey, #c2c4c7, 5%);\r
+      line-height: 1;\r
+      @media @bp-menu {\r
+        display: none;\r
+      }\r
+    }\r
+\r
+    .smallarrow-button(10px, 30px, 10px, 7px);\r
+\r
+    @media @m1024 {\r
+      padding-left: 15px;\r
+      padding-right: 15px;\r
+    }\r
+\r
+    @media @bp-menu {\r
+      padding-left: 29px;\r
+      padding-right: 29px;\r
+    }\r
+\r
+    @media @m768 {\r
+      padding-left: 15px;\r
+      padding-right: 15px;\r
+    }\r
+  }\r
 }\r
 \r
 .macaron {\r
-       box-sizing: border-box;\r
-       display: inline-block;\r
-       position: absolute;\r
-       top: -22px;\r
-       right: -25px;\r
-       width: 45px;\r
-       height: 45px;\r
-       border-radius: 50%;\r
-       background-color: #f7807e;\r
-       color: #fff;\r
-       font-family: "Times New Roman", "Times", serif;\r
-       font-size: 19px;\r
-       text-align: center;\r
-       padding-top: 13px;\r
-       sup {\r
-               font-size: 50%;\r
-       }\r
-       z-index: 1;\r
-\r
-       @media @m1024 {\r
-               width: 35px;\r
-               height: 35px;\r
-               font-size: 17px;\r
-               padding-top: 8px;\r
-               top: -12px;\r
-               right: -18px;\r
-               line-height:17px;\r
-       }\r
-\r
-       @media @m640 {\r
-               position: absolute;\r
-               top: 12px;\r
-               right: auto;\r
-               margin-left:20px;\r
-               padding-top:6px;\r
-       }\r
+  box-sizing: border-box;\r
+  display: inline-block;\r
+  position: absolute;\r
+  top: -22px;\r
+  right: -25px;\r
+  width: 45px;\r
+  height: 45px;\r
+  border-radius: 50%;\r
+  background-color: #f7807e;\r
+  color: #fff;\r
+  font-family: "Times New Roman", "Times", serif;\r
+  font-size: 19px;\r
+  text-align: center;\r
+  padding-top: 13px;\r
+\r
+  sup {\r
+    font-size: 50%;\r
+  }\r
+\r
+  z-index: 1;\r
+\r
+  @media @m1024 {\r
+    width: 35px;\r
+    height: 35px;\r
+    font-size: 17px;\r
+    padding-top: 8px;\r
+    top: -12px;\r
+    right: -18px;\r
+    line-height: 17px;\r
+  }\r
+\r
+  @media @m640 {\r
+    position: absolute;\r
+    top: 12px;\r
+    right: auto;\r
+    margin-left: 20px;\r
+    padding-top: 6px;\r
+  }\r
 }\r
 \r
 #nav-icon {\r
-       width: 31px;\r
-       height: 26px;\r
-       position: fixed;\r
-       transform: rotate(0deg);\r
-       cursor: pointer;\r
-       top: 36px;\r
-       left: 50px;\r
-       display: none;\r
-       z-index: 12;\r
-\r
-       @media @bp-menu {\r
-               display: block;\r
-       }\r
-\r
-       @media @m768 {\r
-               width: 18px;\r
-               height: 18px;\r
-               top: 25px;\r
-               left: 25px;\r
-       }\r
-\r
-       &.light {\r
-               span {\r
-                       background: #fff;\r
-                       .mm-opening & {\r
-                               background: #2a3743;\r
-                       }\r
-               }\r
-       }\r
-\r
-       span {\r
-               display: block;\r
-               position: absolute;\r
-               height: 2px;\r
-               width: 100%;\r
-               background: #2a3743;\r
-               border-radius: 0px;\r
-               opacity: 1;\r
-               left: 0;\r
-               transform: rotate(0deg);\r
-               transition: .25s ease-in-out;\r
-\r
-               &:nth-child(1) {\r
-                       top: 0px;\r
-               }\r
-               &:nth-child(2) {\r
-                       top: 12px;\r
-                       @media @m768 {\r
-                               top: 8px;\r
-                       }\r
-               }\r
-\r
-               &:nth-child(3) {\r
-                       top: 26px;\r
-                       @media @m768 {\r
-                               top: 16px;\r
-                       }\r
-               }\r
-       }\r
-\r
-       .mm-opened & {\r
-               span {\r
-                       &:nth-child(1) {\r
-                               top: 12px;\r
-                               transform: rotate(135deg);\r
-                               @media @m768 {\r
-                                       top: 8px;\r
-                               }\r
-                       }\r
-                       &:nth-child(2) {\r
-                               opacity: 0;\r
-                               left: -30px;\r
-                       }\r
-                       &:nth-child(3) {\r
-                               top: 12px;\r
-                               transform: rotate(-135deg);\r
-                               @media @m768 {\r
-                                       top: 8px;\r
-                               }\r
-                       }\r
-               }\r
-       }\r
+  width: 31px;\r
+  height: 26px;\r
+  position: fixed;\r
+  transform: rotate(0deg);\r
+  cursor: pointer;\r
+  top: 36px;\r
+  left: 50px;\r
+  display: none;\r
+  z-index: 12;\r
+\r
+  @media @bp-menu {\r
+    display: block;\r
+  }\r
+\r
+  @media @m768 {\r
+    width: 18px;\r
+    height: 18px;\r
+    top: 25px;\r
+    left: 25px;\r
+  }\r
+\r
+  &.light {\r
+    span {\r
+      background: #fff;\r
+\r
+      .mm-opening & {\r
+        background: #2a3743;\r
+      }\r
+    }\r
+  }\r
+\r
+  span {\r
+    display: block;\r
+    position: absolute;\r
+    height: 2px;\r
+    width: 100%;\r
+    background: #2a3743;\r
+    border-radius: 0px;\r
+    opacity: 1;\r
+    left: 0;\r
+    transform: rotate(0deg);\r
+    transition: .25s ease-in-out;\r
+\r
+    &:nth-child(1) {\r
+      top: 0px;\r
+    }\r
+\r
+    &:nth-child(2) {\r
+      top: 12px;\r
+      @media @m768 {\r
+        top: 8px;\r
+      }\r
+    }\r
+\r
+    &:nth-child(3) {\r
+      top: 26px;\r
+      @media @m768 {\r
+        top: 16px;\r
+      }\r
+    }\r
+  }\r
+\r
+  .mm-opened & {\r
+    span {\r
+      &:nth-child(1) {\r
+        top: 12px;\r
+        transform: rotate(135deg);\r
+        @media @m768 {\r
+          top: 8px;\r
+        }\r
+      }\r
+\r
+      &:nth-child(2) {\r
+        opacity: 0;\r
+        left: -30px;\r
+      }\r
+\r
+      &:nth-child(3) {\r
+        top: 12px;\r
+        transform: rotate(-135deg);\r
+        @media @m768 {\r
+          top: 8px;\r
+        }\r
+      }\r
+    }\r
+  }\r
 }\r
 \r
 header#h.light {\r
-       nav#menu {\r
-               a {\r
-                       color: #fff;\r
-               }\r
-\r
-               > ul > li > a:after {\r
-                       background-color: #fff;\r
-               }\r
-\r
-       }\r
-       nav#contactnav {\r
-               a {\r
-                       &.agencies {\r
-                               .border-button(#fff, #fff);\r
-                       }\r
-               }\r
-       }\r
+  nav#menu {\r
+    a {\r
+      color: #fff;\r
+    }\r
+\r
+    > ul > li > a:after {\r
+      background-color: #fff;\r
+    }\r
+\r
+  }\r
+\r
+  nav#contactnav {\r
+    a {\r
+      &.agencies {\r
+        .border-button(#fff, #fff);\r
+      }\r
+    }\r
+  }\r
 }\r
 \r
 @import "105-mmenu";\r