fleet/website/views/layouts/layout.ejs
Eric be14f7c10d
Website: Add webinar article template page. (#43627)
Changes:
- Added support for a new article category: `webinar`.
- Added a template page for webinar articles.
- Added an additional route for webinar articles that users are taken to
to watch the webinar recording.
- Added `deliver-webinar-access-request`, an action that updates CRM
records when users fill out the form on the webinar template page.
- Updated the accepted `intentSignal` values in the
create-historical-event helper.
- Added an article for the "Beyond the hype, practical AI for device
management" webinar.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Public webinar pages (/webinars/:slug and /watch) with optional
embedded video and a new page template, script, and styles.
* Sidebar signup form (first name, last name, work email) with prefill
for signed-in users and improved scroll behavior.
* POST API to request webinar access: validates email domain, records a
webinar-request event, triggers background CRM sync, and returns a watch
view on success.
* Static-site build now recognizes webinar articles and enforces
embedded-video URL validation.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-04-16 09:14:28 -05:00

1095 lines
80 KiB
Text
Vendored

<%
// In case we're displaying the 404 or 500 page and relevant code in the "custom" hook was not able to run,
// we make sure certain view locals exist that are commonly used in this layout.ejs file. This ensures we
// don't have to do `typeof` checks below.
var me;
var isHomepage;
var currentSection;
var hideHeaderLinks;// Hides the header navigation links.
var hideFooterLinks;// Hides footer links, reduces the height of the footer to 60px;
var showAdminLinks;// Shows links to admin pages to admin users.
var showConfigurationProfileLayout;
var disableChatbotAndIndexing;// Disables the chatbot and adds a noindex meta tag. Used on pages linked to from Fleet.
// Applies personalization for who people come from ads, so that the website makes more sense for them:
var primaryBuyingSituation;
var defaultMetaDescription = 'Open-source '+(['it-major-mdm', 'it-gap-filler-mdm', 'it-misc'].includes(primaryBuyingSituation) ? 'IT' : ['security-misc','security-vm'].includes(primaryBuyingSituation) ? 'security' : 'IT and security')+' for teams with lots of '+(['it-major-mdm', 'it-gap-filler-mdm'].includes(primaryBuyingSituation) ? 'computers. (macOS, Windows, Linux, ChromeOS)' : 'workstations and servers. (Linux, macOS, Windows, cloud, data center, OT/ICS, Chrome)');
var corporationDisplayName = 'Fleet' + (['it-major-mdm', 'it-gap-filler-mdm'].includes(primaryBuyingSituation) ? ' Device Management' : '') + ' Inc.'; // « Fleet has a DBA as "Fleet", with an official Delaware corporation name of "Fleet Device Management Inc". -mikermcneil, 2024-03-01
%><!DOCTYPE html>
<html>
<head>
<title>Fleet | <% if (typeof pageTitleForMeta !== 'undefined') { %><%= pageTitleForMeta %><% } else { %><%- partial('../partials/primary-tagline.partial.ejs') %><% } %></title>
<meta name="description" content="<%= typeof pageDescriptionForMeta !== 'undefined' ? pageDescriptionForMeta : defaultMetaDescription %>" />
<% /* Viewport tag for sensible mobile support */ %>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<%// Twitter meta tags%>
<meta name="twitter:card" content="<%= typeof pageImageForMeta !== 'undefined' ? 'summary_large_image' : 'summary' %>" />
<meta name="twitter:site" content="https://fleetdm.com" />
<meta name="twitter:description" content="<%= typeof pageDescriptionForMeta !== 'undefined' ? pageDescriptionForMeta : defaultMetaDescription %>" />
<meta name="twitter:title" content="Fleet | <% if (typeof pageTitleForMeta !== 'undefined') { %><%= pageTitleForMeta %><% } else { %><%- partial('../partials/primary-tagline.partial.ejs') %><% } %>" />
<meta name="twitter:image" content="<%= typeof pageImageForMeta !== 'undefined' ? 'https://fleetdm.com' + pageImageForMeta : 'https://fleetdm.com/images/fleet-logo-white-square-1200x1200@2x.png' %>" />
<%// Meta tags for other social previews %>
<meta property="og:image" content="<%= typeof pageImageForMeta !== 'undefined' ? 'https://fleetdm.com' + pageImageForMeta : 'https://fleetdm.com/images/fleet-cloud-city-1200x627@2x.png' %>" />
<meta property="og:title" content="Fleet | <% if (typeof pageTitleForMeta !== 'undefined') { %><%= pageTitleForMeta %><% } else { %><%- partial('../partials/primary-tagline.partial.ejs') %><% } %>" />
<meta property="og:description" content="<%= typeof pageDescriptionForMeta !== 'undefined' ? pageDescriptionForMeta : defaultMetaDescription %>" />
<% if (sails.config.environment === 'production') { %>
<% /* Cookie consent banner */ %>
<script id="cookieyes" type="text/javascript" src="https://cdn-cookieyes.com/client_data/71bcdd51b166ceeb18bd0d28/script.js"></script>
<% } %>
<% /* Script tags should normally be included further down the page- but any
scripts that load fonts (e.g. Fontawesome ≥v5) are special exceptions to the
rule. (Include them up here along with any hard-coded «link» tags for Typekit,
Google Fonts, etc. - above the «body» to prevent the page flickering when fonts
load.) */ %>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@100;200;300;400;500;600;700;800;900&family=Roboto+Mono:ital,wght@0,200;0,300;0,400;0,500;0,700;1,200;1,300;1,400;1,500;1,700&family=Source+Code+Pro:ital,wght@0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap" rel="stylesheet">
<% /* Certain scripts, normally analytics tools like Google Tag Manager and
Google Analytics, should only be included in production: */
if (sails.config.environment === 'production') { %>
<% /* Rollbar */%>
<script>
var _rollbarConfig = {
accessToken: "20a8dbf5d8884b5480e58d99748ec127",
captureUncaught: true,
captureUnhandledRejections: true,
payload: {
environment: "production"
}
};
// Rollbar Snippet
!function(r){var e={};function o(n){if(e[n])return e[n].exports;var t=e[n]={i:n,l:!1,exports:{}};return r[n].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=e,o.d=function(r,e,n){o.o(r,e)||Object.defineProperty(r,e,{enumerable:!0,get:n})},o.r=function(r){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(r,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(r,"__esModule",{value:!0})},o.t=function(r,e){if(1&e&&(r=o(r)),8&e)return r;if(4&e&&"object"==typeof r&&r&&r.__esModule)return r;var n=Object.create(null);if(o.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:r}),2&e&&"string"!=typeof r)for(var t in r)o.d(n,t,function(e){return r[e]}.bind(null,t));return n},o.n=function(r){var e=r&&r.__esModule?function(){return r.default}:function(){return r};return o.d(e,"a",e),e},o.o=function(r,e){return Object.prototype.hasOwnProperty.call(r,e)},o.p="",o(o.s=0)}([function(r,e,o){"use strict";var n=o(1),t=o(5);_rollbarConfig=_rollbarConfig||{},_rollbarConfig.rollbarJsUrl=_rollbarConfig.rollbarJsUrl||"https://cdn.rollbar.com/rollbarjs/refs/tags/v2.22.0/rollbar.min.js",_rollbarConfig.async=void 0===_rollbarConfig.async||_rollbarConfig.async;var a=n.setupShim(window,_rollbarConfig),l=t(_rollbarConfig);window.rollbar=n.Rollbar,a.loadFull(window,document,!_rollbarConfig.async,_rollbarConfig,l)},function(r,e,o){"use strict";var n=o(2),t=o(3);function a(r){return function(){try{return r.apply(this,arguments)}catch(r){try{console.error("[Rollbar]: Internal error",r)}catch(r){}}}}var l=0;function i(r,e){this.options=r,this._rollbarOldOnError=null;var o=l++;this.shimId=function(){return o},"undefined"!=typeof window&&window._rollbarShims&&(window._rollbarShims[o]={handler:e,messages:[]})}var s=o(4),d=function(r,e){return new i(r,e)},c=function(r){return new s(d,r)};function u(r){return a((function(){var e=this,o=Array.prototype.slice.call(arguments,0),n={shim:e,method:r,args:o,ts:new Date};window._rollbarShims[this.shimId()].messages.push(n)}))}i.prototype.loadFull=function(r,e,o,n,t){var l=!1,i=e.createElement("script"),s=e.getElementsByTagName("script")[0],d=s.parentNode;i.crossOrigin="",i.src=n.rollbarJsUrl,o||(i.async=!0),i.onload=i.onreadystatechange=a((function(){if(!(l||this.readyState&&"loaded"!==this.readyState&&"complete"!==this.readyState)){i.onload=i.onreadystatechange=null;try{d.removeChild(i)}catch(r){}l=!0,function(){var e;if(void 0===r._rollbarDidLoad){e=new Error("rollbar.js did not load");for(var o,n,a,l,i=0;o=r._rollbarShims[i++];)for(o=o.messages||[];n=o.shift();)for(a=n.args||[],i=0;i<a.length;++i)if("function"==typeof(l=a[i])){l(e);break}}"function"==typeof t&&t(e)}()}})),d.insertBefore(i,s)},i.prototype.wrap=function(r,e,o){try{var n;if(n="function"==typeof e?e:function(){return e||{}},"function"!=typeof r)return r;if(r._isWrap)return r;if(!r._rollbar_wrapped&&(r._rollbar_wrapped=function(){o&&"function"==typeof o&&o.apply(this,arguments);try{return r.apply(this,arguments)}catch(o){var e=o;throw e&&("string"==typeof e&&(e=new String(e)),e._rollbarContext=n()||{},e._rollbarContext._wrappedSource=r.toString(),window._rollbarWrappedError=e),e}},r._rollbar_wrapped._isWrap=!0,r.hasOwnProperty))for(var t in r)r.hasOwnProperty(t)&&(r._rollbar_wrapped[t]=r[t]);return r._rollbar_wrapped}catch(e){return r}};for(var p="log,debug,info,warn,warning,error,critical,global,configure,handleUncaughtException,handleAnonymousErrors,handleUnhandledRejection,captureEvent,captureDomContentLoaded,captureLoad".split(","),f=0;f<p.length;++f)i.prototype[p[f]]=u(p[f]);r.exports={setupShim:function(r,e){if(r){var o=e.globalAlias||"Rollbar";if("object"==typeof r[o])return r[o];r._rollbarShims={},r._rollbarWrappedError=null;var l=new c(e);return a((function(){e.captureUncaught&&(l._rollbarOldOnError=r.onerror,n.captureUncaughtExceptions(r,l,!0),e.wrapGlobalEventHandlers&&t(r,l,!0)),e.captureUnhandledRejections&&n.captureUnhandledRejections(r,l,!0);var a=e.autoInstrument;return!1!==e.enabled&&(void 0===a||!0===a||"object"==typeof a&&a.network)&&r.addEventListener&&(r.addEventListener("load",l.captureLoad.bind(l)),r.addEventListener("DOMContentLoaded",l.captureDomContentLoaded.bind(l))),r[o]=l,l}))()}},Rollbar:c}},function(r,e,o){"use strict";function n(r,e,o,n){r._rollbarWrappedError&&(n[4]||(n[4]=r._rollbarWrappedError),n[5]||(n[5]=r._rollbarWrappedError._rollbarContext),r._rollbarWrappedError=null);var t=e.handleUncaughtException.apply(e,n);o&&o.apply(r,n),"anonymous"===t&&(e.anonymousErrorsPending+=1)}r.exports={captureUncaughtExceptions:function(r,e,o){if(r){var t;if("function"==typeof e._rollbarOldOnError)t=e._rollbarOldOnError;else if(r.onerror){for(t=r.onerror;t._rollbarOldOnError;)t=t._rollbarOldOnError;e._rollbarOldOnError=t}e.handleAnonymousErrors();var a=function(){var o=Array.prototype.slice.call(arguments,0);n(r,e,t,o)};o&&(a._rollbarOldOnError=t),r.onerror=a}},captureUnhandledRejections:function(r,e,o){if(r){"function"==typeof r._rollbarURH&&r._rollbarURH.belongsToShim&&r.removeEventListener("unhandledrejection",r._rollbarURH);var n=function(r){var o,n,t;try{o=r.reason}catch(r){o=void 0}try{n=r.promise}catch(r){n="[unhandledrejection] error getting `promise` from event"}try{t=r.detail,!o&&t&&(o=t.reason,n=t.promise)}catch(r){}o||(o="[unhandledrejection] error getting `reason` from event"),e&&e.handleUnhandledRejection&&e.handleUnhandledRejection(o,n)};n.belongsToShim=o,r._rollbarURH=n,r.addEventListener("unhandledrejection",n)}}}},function(r,e,o){"use strict";function n(r,e,o){if(e.hasOwnProperty&&e.hasOwnProperty("addEventListener")){for(var n=e.addEventListener;n._rollbarOldAdd&&n.belongsToShim;)n=n._rollbarOldAdd;var t=function(e,o,t){n.call(this,e,r.wrap(o),t)};t._rollbarOldAdd=n,t.belongsToShim=o,e.addEventListener=t;for(var a=e.removeEventListener;a._rollbarOldRemove&&a.belongsToShim;)a=a._rollbarOldRemove;var l=function(r,e,o){a.call(this,r,e&&e._rollbar_wrapped||e,o)};l._rollbarOldRemove=a,l.belongsToShim=o,e.removeEventListener=l}}r.exports=function(r,e,o){if(r){var t,a,l="EventTarget,Window,Node,ApplicationCache,AudioTrackList,ChannelMergerNode,CryptoOperation,EventSource,FileReader,HTMLUnknownElement,IDBDatabase,IDBRequest,IDBTransaction,KeyOperation,MediaController,MessagePort,ModalWindow,Notification,SVGElementInstance,Screen,TextTrack,TextTrackCue,TextTrackList,WebSocket,WebSocketWorker,Worker,XMLHttpRequest,XMLHttpRequestEventTarget,XMLHttpRequestUpload".split(",");for(t=0;t<l.length;++t)r[a=l[t]]&&r[a].prototype&&n(e,r[a].prototype,o)}}},function(r,e,o){"use strict";function n(r,e){this.impl=r(e,this),this.options=e,function(r){for(var e=function(r){return function(){var e=Array.prototype.slice.call(arguments,0);if(this.impl[r])return this.impl[r].apply(this.impl,e)}},o="log,debug,info,warn,warning,error,critical,global,configure,handleUncaughtException,handleAnonymousErrors,handleUnhandledRejection,_createItem,wrap,loadFull,shimId,captureEvent,captureDomContentLoaded,captureLoad".split(","),n=0;n<o.length;n++)r[o[n]]=e(o[n])}(n.prototype)}n.prototype._swapAndProcessMessages=function(r,e){var o,n,t;for(this.impl=r(this.options);o=e.shift();)n=o.method,t=o.args,this[n]&&"function"==typeof this[n]&&("captureDomContentLoaded"===n||"captureLoad"===n?this[n].apply(this,[t[0],o.ts]):this[n].apply(this,t));return this},r.exports=n},function(r,e,o){"use strict";r.exports=function(r){return function(e){if(!e&&!window._rollbarInitialized){for(var o,n,t=(r=r||{}).globalAlias||"Rollbar",a=window.rollbar,l=function(r){return new a(r)},i=0;o=window._rollbarShims[i++];)n||(n=o.handler),o.handler._swapAndProcessMessages(l,o.messages);window[t]=n,window._rollbarInitialized=!0}}}}]);
// End Rollbar Snippet
</script>
<% /* Google Analytics, Google Tag Manager, Snitcher etc. */ %>
<% /* Global site tag (gtag.js) - Google Analytics */%>
<script async src="https://www.googletagmanager.com/gtag/js?id=G-JC3DRNY1GV"></script>
<script>
window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-JC3DRNY1GV');
// Google Ads configuration (including Enhanced Conversions)
gtag('config', 'AW-10788733823', {'allow_enhanced_conversions': true});
</script>
<%/* LinkedIn insight tag*/%>
<script type="text/javascript">
_linkedin_partner_id = "4365817";
window._linkedin_data_partner_ids = window._linkedin_data_partner_ids || [];
window._linkedin_data_partner_ids.push(_linkedin_partner_id);
</script><script type="text/javascript">
(function(l) {
if (!l){window.lintrk = function(a,b){window.lintrk.q.push([a,b])};
window.lintrk.q=[]}
var s = document.getElementsByTagName("script")[0];
var b = document.createElement("script");
b.type = "text/javascript";b.async = true;
b.src = "https://snap.licdn.com/li.lms-analytics/insight.min.js";
s.parentNode.insertBefore(b, s);})(window.lintrk);
</script>
<noscript>
<img height="1" width="1" style="display:none;" alt="" src="https://px.ads.linkedin.com/collect/?pid=4365817&fmt=gif" />
</noscript>
<% /* Clay */ %>
<script src="https://static.claydar.com/init.v1.js?id=cwiBCPLMlD"></script>
<% /* Qualified */ %>
<% if(!disableChatbotAndIndexing) {%>
<script>
(function(w,q){w['QualifiedObject']=q;w[q]=w[q]||function(){
(w[q].q=w[q].q||[]).push(arguments)};})(window,'qualified')
</script>
<script async src="https://js.qualified.com/qualified.js?token=kdbyrPDkGjPxVmAd"></script>
<% } else {%>
<meta name="robots" content="noindex">
<% } %>
<% /* Snitcher */ %>
<script>
!function(s,n,i,t,c,h){s.SnitchObject=i;s[i]||(s[i]=function(){
(s[i].q=s[i].q||[]).push(arguments)});s[i].l=+new Date;c=n.createElement(t);
h=n.getElementsByTagName(t)[0];c.src='//snid.snitcher.com/8416878.js';
h.parentNode.insertBefore(c,h)}(window,document,'snid','script');
snid('verify', '8416878');
</script>
<% /* Hotjar code */ %>
<script>
(function(h,o,t,j,a,r){
h.hj=h.hj||function(){(h.hj.q=h.hj.q||[]).push(arguments)};
h._hjSettings={hjid:3068651,hjsv:6};
a=o.getElementsByTagName('head')[0];
r=o.createElement('script');r.async=1;
r.src=t+h._hjSettings.hjid+j+h._hjSettings.hjsv;
a.appendChild(r);
})(window,document,'https://static.hotjar.com/c/hotjar-','.js?sv=');
</script>
<% /* ActiveCampaign */ %>
<script>
(function(e,t,o,n,p,r,i){e.visitorGlobalObjectAlias=n;e[e.visitorGlobalObjectAlias]=e[e.visitorGlobalObjectAlias]||function(){(e[e.visitorGlobalObjectAlias].q=e[e.visitorGlobalObjectAlias].q||[]).push(arguments)};e[e.visitorGlobalObjectAlias].l=(new Date).getTime();r=t.createElement("script");r.src=o;r.async=true;i=t.getElementsByTagName("script")[0];i.parentNode.insertBefore(r,i)})(window,document,"https://diffuser-cdn.app-us1.com/diffuser/diffuser.js","vgo");
vgo('setAccount', '652899825');
vgo('setTrackByDefault', false);
vgo('process');
</script>
<% }
/* Otherwise, any such scripts are excluded, and we instead inject a
robots/noindex meta tag to help prevent any unwanted visits from search engines. */
else { %>
<meta name="robots" content="noindex">
<% } %>
<% /*
Stylesheets
========================
Stylesheets can be hard-coded as «link» tags, automatically injected
by the asset pipeline between "STYLES" and "STYLES END", or both.
(https://sailsjs.com/docs/concepts/assets/task-automation)
*/ %>
<% /* Auto-injected «link» tags: */ %>
<!--STYLES-->
<link rel="stylesheet" href="/dependencies/bootstrap-4/bootstrap-4.css">
<link rel="stylesheet" href="/dependencies/fontawesome.css">
<link rel="stylesheet" href="/styles/importer.css">
<!--STYLES END-->
</head>
<body>
<div purpose="page-wrap" class="<%= hideFooterLinks ? 'reduced-footer-links' : showConfigurationProfileLayout ? 'header-hidden' : '' %> collapse" id="navbarToggleExternalContent">
<%// Page header%>
<% if(!showConfigurationProfileLayout) {%>
<div class="header" purpose="header-container" hide-when-scrolled data-nosnippet>
<div purpose="header-background">
<% if(!hideHeaderLinks) { %>
<div purpose="page-header" class="container-fluid d-flex justify-content-between align-items-center">
<a purpose="header-logo" href="/">
<img alt="Fleet logo" src="/images/logo-blue-118x41@2x.png"/>
</a>
<%/* Mobile Navigation menu */%>
<div class="d-flex d-lg-none align-items-center">
<a purpose="mobile-nav-toggle-btn" class="d-flex flex-row align-items-center" data-toggle="collapse" data-target="#navbarToggleExternalContent">
<span>Menu</span>
<img class="align-self-center" alt="An icon indicating that interacting with this button will open the navigation menu." src="/images/icon-hamburger-blue-16x14@2x.png"/>
</a>
</div>
<div purpose="mobile-nav" always-visible-when-shown>
<div purpose="mobile-nav-header" class="d-flex justify-content-between align-items-center">
<a purpose="mobile-header-logo" href="/">
<img purpose="mobile-nav-logo" alt="Fleet logo" src="/images/logo-blue-118x41@2x.png" />
</a>
<a purpose="mobile-nav-close-btn" class="d-flex align-items-center" data-toggle="collapse" data-target="#navbarToggleExternalContent">
<img alt="An 'X' icon indicating that this can be interacted with to close the navigation menu." src="/images/icon-close-16x16@2x.png"/>
</a>
</div>
<div purpose="mobile-nav-container" id="mobileDropdowns">
<div purpose="mobile-dropdown-menus">
<div purpose="mobile-dropdown-toggle" class="d-flex flex-row justify-content-between align-items-center collapsed" data-toggle="collapse" data-target="#mobileNavbarToggleUseCases" aria-haspopup="true" aria-expanded="false">
<div><p>Solutions</p></div>
<div><img src="/images/icon-chevron-fleet-black-50-12x12@2x.png" alt="a small chevron"></div>
</div>
<div id="mobileNavbarToggleUseCases" purpose="mobile-dropdown" class="collapse align-items-start">
<a class="dropdown-item" purpose="dropdown-item" data-dropdown-option="device-management" href="/device-management">
<div purpose="dropdown-item-link">
<div purpose="dropdown-item-icon">
<img src="/images/nav-icon-device-management-40x40@2x.png" alt="Device management">
</div>
<div purpose="dropdown-item-text">
<p purpose="nav-item-heading">
Device management
</p>
<p purpose="nav-item-body">
Remotely manage, and protect laptops and mobile devices.
</p>
</div>
</div>
</a>
<a class="dropdown-item" purpose="dropdown-item" data-dropdown-option="orchestration" href="/orchestration">
<div purpose="dropdown-item-link">
<div purpose="dropdown-item-icon">
<img src="/images/nav-icon-orchestration-40x40@2x.png" alt="Orchestration">
</div>
<div purpose="dropdown-item-text">
<p purpose="nav-item-heading">
Orchestration
</p>
<p purpose="nav-item-body">
Automate tasks across devices, from app installs to scripts.
</p>
</div>
</div>
</a>
<a class="dropdown-item" purpose="dropdown-item" data-dropdown-option="software-management" href="/software-management">
<div purpose="dropdown-item-link">
<div purpose="dropdown-item-icon">
<img src="/images/nav-icon-software-40x40@2x.png" alt="Software management">
</div>
<div purpose="dropdown-item-text">
<p purpose="nav-item-heading">
Software management
</p>
<p purpose="nav-item-body">
Inventory, patch, and manage installed software.
</p>
</div>
</div>
</a>
<a class="dropdown-item" purpose="dropdown-item" data-dropdown-option="linux-management" href="/linux-management">
<div purpose="dropdown-item-link">
<div purpose="dropdown-item-icon">
<img src="/images/nav-icon-linux-management-40x40@2x.png" alt="Linux management">
</div>
<div purpose="dropdown-item-text">
<p purpose="nav-item-heading">
Linux device management
</p>
<p purpose="nav-item-body">
Manage Linux devices with full visibility and control.
</p>
</div>
</div>
</a>
<a class="dropdown-item" purpose="dropdown-item" data-dropdown-option="Fleet GitOps" href="/infrastructure-as-code">
<div purpose="dropdown-item-link">
<div purpose="dropdown-item-icon">
<img src="/images/nav-icon-gitops-40x40@2x.png" alt="GitOps">
</div>
<div purpose="dropdown-item-text">
<p purpose="nav-item-heading">
Infrastructure as code
</p>
<p purpose="nav-item-body">
See every change, undo any error, repeat every success.
</p>
</div>
</div>
</a>
<a class="dropdown-item" purpose="dropdown-item" data-dropdown-option="Deployment" href="/deployment">
<div purpose="dropdown-item-link">
<div purpose="dropdown-item-icon">
<img src="/images/nav-icon-deployment-40x40@2x.png" alt="Deployment">
</div>
<div purpose="dropdown-item-text">
<p purpose="nav-item-heading">
Deployment
</p>
<p purpose="nav-item-body">
Run Fleet the way that fits your team.
</p>
</div>
</div>
</a>
<a class="dropdown-item" purpose="dropdown-item" data-dropdown-option="integrations" href="/integrations">
<div purpose="dropdown-item-link">
<div purpose="dropdown-item-icon">
<img src="/images/nav-icon-integrations-40x40@2x.png" alt="Extend Fleet">
</div>
<div purpose="dropdown-item-text">
<p purpose="nav-item-heading">
Extend Fleet
</p>
<p purpose="nav-item-body">
Integrate your favorite tools with Fleet.
</p>
</div>
</div>
</a>
</div>
<hr>
<a purpose="mobile-dropdown-toggle" href="/customers" class="d-flex align-items-center">Customers</a>
<hr>
<a purpose="mobile-dropdown-toggle" href="/pricing" class="d-flex align-items-center">Pricing</a>
<hr>
<a purpose="mobile-dropdown-toggle" href="/partners" class="d-flex align-items-center">Partners</a>
<hr>
<div purpose="mobile-dropdown-toggle" class="d-flex flex-row justify-content-between align-items-center collapsed" data-toggle="collapse" data-target="#mobileNavbarToggleMore">
<div><p>More</p></div>
<div>
<img src="/images/icon-chevron-fleet-black-50-12x12@2x.png" alt="a small chevron">
</div>
</div>
<div id="mobileNavbarToggleMore" purpose="mobile-dropdown" class="collapse">
<a purpose="dropdown-item" class="dropdown-item" data-dropdown-option="Docs" href="/docs">
<div purpose="dropdown-item-link">
<div purpose="dropdown-item-icon">
<img src="/images/nav-icon-docs-40x40@2x.png" alt="Docs">
</div>
<div purpose="dropdown-item-text">
<p purpose="nav-item-heading">
Docs
</p>
</div>
</div>
</a>
<a purpose="dropdown-item" class="dropdown-item" data-dropdown-option="Guides" href="/guides">
<div purpose="dropdown-item-link">
<div purpose="dropdown-item-icon">
<img src="/images/nav-icon-guides-40x40@2x.png" alt="Guides">
</div>
<div purpose="dropdown-item-text">
<p purpose="nav-item-heading">
Guides
</p>
</div>
</div>
</a>
<a purpose="dropdown-item" class="dropdown-item" data-dropdown-option="Support" href="/support">
<div purpose="dropdown-item-link">
<div purpose="dropdown-item-icon">
<img src="/images/nav-icon-support-40x40@2x.png" alt="Support">
</div>
<div purpose="dropdown-item-text">
<p purpose="nav-item-heading">
Support
</p>
</div>
</div>
</a>
<a purpose="dropdown-item" class="dropdown-item" data-dropdown-option="Resources / blog" href="/articles">
<div purpose="dropdown-item-link">
<div purpose="dropdown-item-icon">
<img src="/images/nav-icon-news-40x40@2x.png" alt="Resources / blog">
</div>
<div purpose="dropdown-item-text">
<p purpose="nav-item-heading">
Resources / blog
</p>
</div>
</div>
</a>
<a purpose="dropdown-item" class="dropdown-item" data-dropdown-option="Get your license" href="/new-license">
<div purpose="dropdown-item-link">
<div purpose="dropdown-item-icon">
<img src="/images/nav-icon-license-40x40@2x.png" alt="Get your license">
</div>
<div purpose="dropdown-item-text">
<p purpose="nav-item-heading">
Get your license
</p>
</div>
</div>
</a>
<a purpose="dropdown-item" class="dropdown-item" data-dropdown-option="The handbook" href="/handbook">
<div purpose="dropdown-item-link">
<div purpose="dropdown-item-icon">
<img src="/images/nav-icon-handbook-40x40@2x.png" alt="The handbook">
</div>
<div purpose="dropdown-item-text">
<p purpose="nav-item-heading">
The handbook
</p>
</div>
</div>
</a>
<a purpose="dropdown-cta" data-dropdown-option="" href="/gitops-workshop" no-icon>
<div purpose="dropdown-cta-link">
<div purpose="dropdown-cta-image">
</div>
<div class="d-flex flex-column justify-content-center align-items-center">
<div purpose="dropdown-cta-text">
<p purpose="dropdown-cta-heading">
GitOps for device management
</p>
<p purpose="dropdown-cta-body">
In-person workshop for beginners.
</p>
<span href="/todo" purpose="cta-animated-arrow-button" target="_blank">
<span purpose="button-text">Join us</span>
<svg purpose="animated-arrow" xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
<path purpose="arrow-line" d="M1 6H9" stroke-width="2" stroke-linecap="round"/>
<path purpose="chevron" d="M1.35712 1L5.64283 6L1.35712 11" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</span>
</div>
</div>
</div>
</a>
</div>
<% if(_.has(me, 'id')) {%>
<hr>
<a purpose="mobile-dropdown-toggle" href="/logout" class="d-flex mt-2 text-decoration-none">Log out</a>
<% }%>
<%if(me && me.isSuperAdmin && showAdminLinks) {%>
<hr>
<a purpose="mobile-dropdown-toggle" class="d-flex align-items-center mr-4 collapsed" data-toggle="collapse" data-target="#mobileNavbarToggleAdmin">Admin</a>
<div id="mobileNavbarToggleAdmin" purpose="mobile-dropdown" class="collapse" data-parent="#mobileDropdowns">
<a purpose="mobile-dropdown-link" href="/query-generator">Generate queries</a>
<a purpose="mobile-dropdown-link" href="/admin/generate-license">License generator</a>
<a purpose="mobile-dropdown-link" href="/admin/email-preview">HTML Email preview tool</a>
<a purpose="mobile-dropdown-link" href="/admin/reset-trial">Reset local Fleet Premium trial</a>
</div>
<%}%>
</div>
<div purpose="mobile-nav-cta" class="d-flex flex-row align-items-center">
<a purpose="glass-header-btn" class="align-items-center d-flex" href="/contact" no-underline>Get a demo</a>
<!-- <a purpose="layout-animated-arrow-button" class="start-cta-continue-button" href="/try" no-underline>
Try it yourself
<svg purpose="animated-arrow" xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
<path purpose="arrow-line" d="M1 6H9" stroke-width="2" stroke-linecap="round"/>
<path purpose="chevron" d="M1.35712 1L5.64283 6L1.35712 11" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</a> -->
</div>
</div>
</div>
<%/* Desktop Navigation bar */%>
<div purpose="header-nav" class="d-none d-lg-flex align-items-center justify-content-around">
<div purpose="dropdown-button" class="btn-group">
<a purpose="header-nav-btn" class="dropdown-toggle align-items-center <%= typeof currentSection !== 'undefined' && currentSection === 'platform' ? 'current-section' : '' %>">
Solutions <img purpose="chevron" src="/images/icon-chevron-fleet-black-50-12x12@2x.png" alt="A small chevron">
</a>
<div purpose="header-dropdown" class="dropdown-menu solutions-dropdown flex-row">
<a class="dropdown-item" purpose="dropdown-item" data-dropdown-option="device-management" href="/device-management">
<div purpose="dropdown-item-link">
<div purpose="dropdown-item-icon">
<img src="/images/nav-icon-device-management-40x40@2x.png" alt="Device management">
</div>
<div purpose="dropdown-item-text">
<p purpose="nav-item-heading">
Device management</p>
<p purpose="nav-item-body">
Remotely manage, and protect laptops and mobile devices.
</p>
</div>
</div>
</a>
<a class="dropdown-item" purpose="dropdown-item" data-dropdown-option="Fleet GitOps" href="/infrastructure-as-code">
<div purpose="dropdown-item-link">
<div purpose="dropdown-item-icon">
<img src="/images/nav-icon-gitops-40x40@2x.png" alt="GitOps">
</div>
<div purpose="dropdown-item-text">
<p purpose="nav-item-heading">
Infrastructure as code
</p>
<p purpose="nav-item-body">
See every change, undo any error, repeat every success.
</p>
</div>
</div>
</a>
<a class="dropdown-item" purpose="dropdown-item" data-dropdown-option="orchestration" href="/orchestration">
<div purpose="dropdown-item-link">
<div purpose="dropdown-item-icon">
<img src="/images/nav-icon-orchestration-40x40@2x.png" alt="Orchestration">
</div>
<div purpose="dropdown-item-text">
<p purpose="nav-item-heading">
Orchestration
</p>
<p purpose="nav-item-body">
Automate tasks across devices, from app installs to scripts.
</p>
</div>
</div>
</a>
<a class="dropdown-item" purpose="dropdown-item" data-dropdown-option="Deployment" href="/deployment">
<div purpose="dropdown-item-link">
<div purpose="dropdown-item-icon">
<img src="/images/nav-icon-deployment-40x40@2x.png" alt="Deployment">
</div>
<div purpose="dropdown-item-text">
<p purpose="nav-item-heading">
Deployment
</p>
<p purpose="nav-item-body">
Run Fleet the way that fits your team.
</p>
</div>
</div>
</a>
<a class="dropdown-item" purpose="dropdown-item" data-dropdown-option="software-management" href="/software-management">
<div purpose="dropdown-item-link">
<div purpose="dropdown-item-icon">
<img src="/images/nav-icon-software-40x40@2x.png" alt="Software management">
</div>
<div purpose="dropdown-item-text">
<p purpose="nav-item-heading">
Software management
</p>
<p purpose="nav-item-body">
Inventory, patch, and manage installed software.
</p>
</div>
</div>
</a>
<a class="dropdown-item" purpose="dropdown-item" data-dropdown-option="integrations" href="/integrations">
<div purpose="dropdown-item-link">
<div purpose="dropdown-item-icon">
<img src="/images/nav-icon-integrations-40x40@2x.png" alt="Extend Fleet">
</div>
<div purpose="dropdown-item-text">
<p purpose="nav-item-heading">
Extend Fleet
</p>
<p purpose="nav-item-body">
Integrate your favorite tools with Fleet.
</p>
</div>
</div>
</a>
<a class="dropdown-item" purpose="dropdown-item" data-dropdown-option="linux-management" href="/linux-management">
<div purpose="dropdown-item-link">
<div purpose="dropdown-item-icon">
<img src="/images/nav-icon-linux-management-40x40@2x.png" alt="Linux management">
</div>
<div purpose="dropdown-item-text">
<p purpose="nav-item-heading">
Linux device management
</p>
<p purpose="nav-item-body">
Manage Linux devices with full visibility and control.
</p>
</div>
</div>
</a>
</div>
</div>
<a purpose="header-nav-btn" href="/customers" class="dropdown-toggle align-items-center <%= typeof currentSection !== 'undefined' && currentSection === 'customers' ? 'current-section' : '' %>">Customers</a>
<a purpose="header-nav-btn" button-text="Pricing" href="/pricing" class=" align-items-center <%= typeof currentSection !== 'undefined' && currentSection === 'pricing' ? 'current-section' : '' %>" style="width: 72px; text-decoration: none; line-height: 23px;">Pricing</a>
<a purpose="header-nav-btn" button-text="Partners" href="/partners" class=" align-items-center <%= typeof currentSection !== 'undefined' && currentSection === 'partners' ? 'current-section' : '' %>" style="width: 85px; text-decoration: none; line-height: 23px;">Partners</a>
<div purpose="dropdown-button" class="btn-group" >
<span purpose="header-nav-btn" button-text="More" class="dropdown-toggle align-items-center <%= typeof currentSection !== 'undefined' && currentSection === 'more' ? 'current-section' : '' %>" >More <img purpose="chevron" src="/images/icon-chevron-fleet-black-50-12x12@2x.png" alt="A small chevron"></span>
<div purpose="header-dropdown" class="dropdown-menu more-dropdown flex-row">
<div purpose="dropdown-cta-column">
<a purpose="dropdown-cta" data-dropdown-option="" href="/gitops-workshop" no-icon>
<div purpose="dropdown-cta-link">
<div purpose="dropdown-cta-image">
</div>
<div class="d-flex flex-column justify-content-center align-items-center">
<div purpose="dropdown-cta-text">
<p purpose="dropdown-cta-heading">
GitOps for device management
</p>
<p purpose="dropdown-cta-body">
In-person workshop for beginners.
</p>
<span href="/todo" purpose="cta-animated-arrow-button" target="_blank">
<span purpose="button-text">Join us</span>
<svg purpose="animated-arrow" xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
<path purpose="arrow-line" d="M1 6H9" stroke-width="2" stroke-linecap="round"/>
<path purpose="chevron" d="M1.35712 1L5.64283 6L1.35712 11" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</span>
</div>
</div>
</div>
</a>
</div>
<div purpose="dropdown-column">
<a purpose="dropdown-item" class="dropdown-item" data-dropdown-option="Docs" href="/docs">
<div purpose="dropdown-item-link">
<div purpose="dropdown-item-icon">
<img src="/images/nav-icon-docs-40x40@2x.png" alt="Docs">
</div>
<div purpose="dropdown-item-text">
<p purpose="nav-item-heading">
Docs
</p>
</div>
</div>
</a>
<a purpose="dropdown-item" class="dropdown-item" data-dropdown-option="Guides" href="/guides">
<div purpose="dropdown-item-link">
<div purpose="dropdown-item-icon">
<img src="/images/nav-icon-guides-40x40@2x.png" alt="Guides">
</div>
<div purpose="dropdown-item-text">
<p purpose="nav-item-heading">
Guides
</p>
</div>
</div>
</a>
<a purpose="dropdown-item" class="dropdown-item" data-dropdown-option="Support" href="/support">
<div purpose="dropdown-item-link">
<div purpose="dropdown-item-icon">
<img src="/images/nav-icon-support-40x40@2x.png" alt="Support">
</div>
<div purpose="dropdown-item-text">
<p purpose="nav-item-heading">
Support
</p>
</div>
</div>
</a>
</div>
<div purpose="dropdown-column">
<a purpose="dropdown-item" class="dropdown-item" data-dropdown-option="Resources / blog" href="/articles">
<div purpose="dropdown-item-link">
<div purpose="dropdown-item-icon">
<img src="/images/nav-icon-news-40x40@2x.png" alt="Resources / blog">
</div>
<div purpose="dropdown-item-text">
<p purpose="nav-item-heading">
Resources / blog
</p>
</div>
</div>
</a>
<a purpose="dropdown-item" class="dropdown-item" data-dropdown-option="Get your license" href="/new-license">
<div purpose="dropdown-item-link">
<div purpose="dropdown-item-icon">
<img src="/images/nav-icon-license-40x40@2x.png" alt="Get your license">
</div>
<div purpose="dropdown-item-text">
<p purpose="nav-item-heading">
Get your license
</p>
</div>
</div>
</a>
<a purpose="dropdown-item" class="dropdown-item" data-dropdown-option="The handbook" href="/handbook">
<div purpose="dropdown-item-link">
<div purpose="dropdown-item-icon">
<img src="/images/nav-icon-handbook-40x40@2x.png" alt="The handbook">
</div>
<div purpose="dropdown-item-text">
<p purpose="nav-item-heading">
The handbook
</p>
</div>
</div>
</a>
</div>
</div>
</div>
<!-- <a purpose="layout-animated-arrow-button" class="start-cta-continue-button" href="/try" no-underline>
Try it yourself
<svg purpose="animated-arrow" xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
<path purpose="arrow-line" d="M1 6H9" stroke-width="2" stroke-linecap="round"/>
<path purpose="chevron" d="M1.35712 1L5.64283 6L1.35712 11" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</a> -->
<a purpose="glass-header-btn" class="align-items-center d-flex" href="/contact" no-underline>Get a demo</a>
<% if(_.has(me, 'id')) {%>
<a purpose="log-out-button" href="/logout" class="justify-content-end text-decoration-none">Log out</a>
<% } %>
</div>
</div>
<% } else {%>
<div purpose="page-header" class="container-fluid d-flex align-items-center justify-content-between">
<a purpose="header-logo" href="/">
<img alt="Fleet logo" src="/images/logo-blue-118x41@2x.png"/>
</a>
<div purpose="header-nav">
<% if(_.has(me, 'id')) {%>
<a purpose="header-nav-btn" href="/logout" class="justify-content-end text-decoration-none">Log out</a>
<% }%>
</div>
</div>
<% } %>
<%if(me && me.isSuperAdmin && showAdminLinks) {%>
<div purpose="admin-nav" class="d-lg-flex d-none flex-row align-items-center justify-content-center py-2 px-1">
<div class="justify-self-start">
<span>Admin pages</span>
</div>
<div class="d-flex flex-row align-self-end justify-content-between">
<a purpose="admin-link" style="text-decoration: none; line-height: 23px;" href="/query-generator">Generate queries</a>
<a purpose="admin-link" style="text-decoration: none; line-height: 23px;" href="/admin/generate-license">License generator</a>
<a purpose="admin-link" style="text-decoration: none; line-height: 23px;" href="/admin/email-preview">HTML Email preview tool</a>
<a purpose="admin-link" style="text-decoration: none; line-height: 23px;" href="/admin/reset-trial">Reset Premium trial</a>
</div>
</div>
<%} %>
</div>
</div>
<% } %>
<%- body %>
<% if(!showConfigurationProfileLayout) {%>
<%/* Note: footer is hidden until the page is loaded. See «script» tag at the bottom of this file. */%>
<% if(!hideFooterLinks) { %>
<div class="invisible container-fluid" purpose="page-footer" data-hide-until-rendered data-nosnippet>
<div purpose="footer-content">
<div purpose="footer-nav" class="d-flex flex-row flex-wrap row">
<div purpose="footer-nav-column" class="d-lg-flex d-none col-3">
<a href="/">
<img purpose="footer-logo" alt="Fleet logo" src="/images/logo-blue-118x41@2x.png"/>
</a>
</div>
<div purpose="footer-nav-column" class="d-flex flex-column col-lg-3 col-md-4 col-sm-6 col-12">
<strong purpose="footer-nav-header">Solutions</strong>
<a href="/device-management">Device management</a>
<a href="/orchestration">Orchestration</a>
<a href="/software-management">Software management</a>
<a href="/integrations">Integrations</a>
<a href="/pricing">Pricing</a>
<a href="/partners">Partners</a>
</div>
<div purpose="footer-nav-column" class="d-flex flex-column col-lg-3 col-md-4 col-sm-6 col-12">
<strong purpose="footer-nav-header">Documentation</strong>
<a href="/support">Support</a>
<a href="/docs">Docs</a>
<a href="/docs/rest-api">API</a>
<a href="/releases">Release notes</a>
<a href="/new-license">Get your license</a><!-- «« FUTURE: Personalize this based on whether logged in -->
</div>
<div purpose="footer-nav-column" class="d-flex flex-column col-lg-3 col-md-4 col-sm-6 col-12">
<strong purpose="footer-nav-header">Company</strong>
<a href="/handbook/company">About</a>
<a href="/trust">Trust</a>
<a href="/apply">Jobs</a>
<a href="/logos">Logos/artwork</a>
<a href="/handbook/company/why-this-way#why-open-source">Why open source?</a>
</div>
</div>
<div purpose="footer-bottom">
<div purpose="legal-and-social-nav" class="d-flex flex-lg-row flex-column align-items-lg-center justify-content-lg-between">
<div class="d-flex flex-column">
<div purpose="legal-section" class="d-flex flex-column justify-content-start align-items-start align-items-sm-center flex-sm-row pr-sm-0">
<div purpose="license-information" class="d-flex flex-row align-items-center">
<a purpose="footer-trust-link" class="d-flex flex-row align-items-center" href="/trust" target="_blank" no-icon><img alt="a small checkmark" src="/images/icon-checkmark-fleet-black-75-9x7@2x.png">SOC2 Type 2</a>
<img purpose="creative-commons-license" alt="Creative Commons Licence CC BY-SA 4.0" src="/images/logo-creative-commons-greyscale-80x16@2x.png" />
</div>
<div class="text-sm-nowrap d-block d-sm-inline">
© <%= (new Date()).getFullYear() %> <a href="/handbook/company"><%= corporationDisplayName %></a>
<span purpose="legal-links">
<a href="/legal/privacy">Privacy</a>
</span>
</div>
</div>
<div purpose="cky-button-container" class="d-block">
</div>
</div>
<div purpose="footer-socials" class="flex-row d-inline-flex font-weight-bold order-first order-lg-last justify-content-start justify-content-lg-end pl-lg-3">
<a target="_blank" href="/slack" class="mr-4" no-icon>
<img alt="Slack logo" src="/images/logo-slack-dark-20x20@2x.png"/>
</a>
<a target="_blank" href="https://github.com/fleetdm/fleet" class="mr-4" no-icon>
<img alt="GitHub logo" src="/images/logo-github-dark-24x24@2x.png" />
</a>
<a target="_blank" href="https://www.linkedin.com/company/fleetdm" class="mr-4" no-icon>
<img alt="LinkedIn logo" src="/images/logo-linkedin-24x24@2x.png" />
</a>
<a target="_blank" href="https://twitter.com/fleetctl" class="mr-4" no-icon>
<img alt="X (Twitter) logo" src="/images/logo-x-24x24@2x.png"/>
</a>
<a target="_blank" href="https://www.youtube.com/channel/UCZyoqZ4exJvoibmTKJrQ-dQ" class="mr-4" no-icon>
<img alt="Youtube logo" src="/images/logo-youtube-29x20@2x.png" />
</a>
<a target="_blank" href="https://mastodon.social/@Fleet@discuss.systems" class="mr-4" no-icon>
<img alt="Mastadon logo" src="/images/logo-mastadon-24x23@2x.png"/>
</a>
</div>
</div>
</div>
</div>
</div>
<% } else { %>
<div purpose="reduced-nav-footer" data-nosnippet>
<div purpose="legal-and-social-nav" class="d-flex flex-md-row flex-column align-items-md-center justify-content-md-between">
<div purpose="legal-section" class="d-flex flex-column justify-content-start align-items-start align-items-sm-center flex-sm-row pr-sm-0">
<div purpose="license-information" class="d-flex flex-row align-items-center">
<a purpose="footer-trust-link" class="d-flex flex-row align-items-center" href="/trust" target="_blank" no-icon><img alt="a small checkmark" src="/images/icon-checkmark-fleet-black-75-9x7@2x.png">SOC2 Type 2</a>
<img purpose="creative-commons-license" alt="Creative Commons Licence CC BY-SA 4.0" src="/images/logo-creative-commons-greyscale-80x16@2x.png" />
</div>
<div purpose="copyright-and-legal-link" class="text-sm-nowrap d-block d-sm-inline">
© <%= (new Date()).getFullYear() %> <a href="/handbook/company"><%= corporationDisplayName %></a>
<span purpose="legal-links">
<a href="/legal/privacy">Privacy</a>
</span>
</div>
</div>
<div purpose="footer-socials" class="flex-row d-inline-flex font-weight-bold order-first order-md-last justify-content-start justify-content-lg-end pl-lg-3">
<a target="_blank" href="/slack" class="mr-4" no-icon>
<img alt="Slack logo" src="/images/logo-slack-dark-20x20@2x.png"/>
</a>
<a target="_blank" href="https://github.com/fleetdm/fleet" class="mr-4" no-icon>
<img alt="GitHub logo" src="/images/logo-github-dark-24x24@2x.png" />
</a>
<a target="_blank" href="https://www.linkedin.com/company/fleetdm" class="mr-4" no-icon>
<img alt="LinkedIn logo" src="/images/logo-linkedin-24x24@2x.png" />
</a>
<a target="_blank" href="https://twitter.com/fleetctl" class="mr-4" no-icon>
<img alt="X (Twitter) logo" src="/images/logo-x-24x24@2x.png"/>
</a>
<a target="_blank" href="https://www.youtube.com/channel/UCZyoqZ4exJvoibmTKJrQ-dQ" class="mr-4" no-icon>
<img alt="Youtube logo" src="/images/logo-youtube-29x20@2x.png" />
</a>
<a target="_blank" href="https://mastodon.social/@Fleet@discuss.systems" class="mr-4" no-icon>
<img alt="Mastadon logo" src="/images/logo-mastadon-24x23@2x.png"/>
</a>
</div>
</div>
</div>
<% } %>
<% } %>
</div>
<% /*
Client-side JavaScript
========================
Scripts can be hard-coded as «script» tags, automatically injected
by the asset pipeline between "SCRIPTS" and "SCRIPTS END", or both.
(https://sailsjs.com/docs/concepts/assets/task-automation)
*/ %>
<%/* Stripe.js */%>
<script src="https://js.stripe.com/v3/"></script>
<%/* bowser.js (for browser detection) -- included inline to avoid issues with minification that could affect the unsupported browser overlay */%>
<script>!function(e,i,s){if("undefined"!=typeof module&&module.exports)module.exports=s();else if("function"==typeof define&&define.amd)define(i,s);else e[i]=s()}(this,"bowser",function(){var e=true;function i(i){function s(e){var s=i.match(e);return s&&s.length>1&&s[1]||""}function o(e){var s=i.match(e);return s&&s.length>1&&s[2]||""}var r=s(/(ipod|iphone|ipad)/i).toLowerCase(),n=/like android/i.test(i),t=!n&&/android/i.test(i),a=/nexus\s*[0-6]\s*/i.test(i),d=!a&&/nexus\s*[0-9]+/i.test(i),l=/CrOS/.test(i),f=/silk/i.test(i),m=/sailfish/i.test(i),v=/tizen/i.test(i),p=/(web|hpw)os/i.test(i),c=/windows phone/i.test(i),u=/SamsungBrowser/i.test(i),h=!c&&/windows/i.test(i),w=!r&&!f&&/macintosh/i.test(i),b=!t&&!m&&!v&&!p&&/linux/i.test(i),g=o(/edg([ea]|ios)\/(\d+(\.\d+)?)/i),k=s(/version\/(\d+(\.\d+)?)/i),x=/tablet/i.test(i)&&!/tablet pc/i.test(i),y=!x&&/[^-]mobi/i.test(i),S=/xbox/i.test(i),B;if(/opera/i.test(i))B={name:"Opera",opera:e,version:k||s(/(?:opera|opr|opios)[\s\/](\d+(\.\d+)?)/i)};else if(/opr\/|opios/i.test(i))B={name:"Opera",opera:e,version:s(/(?:opr|opios)[\s\/](\d+(\.\d+)?)/i)||k};else if(/SamsungBrowser/i.test(i))B={name:"Samsung Internet for Android",samsungBrowser:e,version:k||s(/(?:SamsungBrowser)[\s\/](\d+(\.\d+)?)/i)};else if(/coast/i.test(i))B={name:"Opera Coast",coast:e,version:k||s(/(?:coast)[\s\/](\d+(\.\d+)?)/i)};else if(/yabrowser/i.test(i))B={name:"Yandex Browser",yandexbrowser:e,version:k||s(/(?:yabrowser)[\s\/](\d+(\.\d+)?)/i)};else if(/ucbrowser/i.test(i))B={name:"UC Browser",ucbrowser:e,version:s(/(?:ucbrowser)[\s\/](\d+(?:\.\d+)+)/i)};else if(/mxios/i.test(i))B={name:"Maxthon",maxthon:e,version:s(/(?:mxios)[\s\/](\d+(?:\.\d+)+)/i)};else if(/epiphany/i.test(i))B={name:"Epiphany",epiphany:e,version:s(/(?:epiphany)[\s\/](\d+(?:\.\d+)+)/i)};else if(/puffin/i.test(i))B={name:"Puffin",puffin:e,version:s(/(?:puffin)[\s\/](\d+(?:\.\d+)?)/i)};else if(/sleipnir/i.test(i))B={name:"Sleipnir",sleipnir:e,version:s(/(?:sleipnir)[\s\/](\d+(?:\.\d+)+)/i)};else if(/k-meleon/i.test(i))B={name:"K-Meleon",kMeleon:e,version:s(/(?:k-meleon)[\s\/](\d+(?:\.\d+)+)/i)};else if(c){B={name:"Windows Phone",osname:"Windows Phone",windowsphone:e};if(g){B.msedge=e;B.version=g}else{B.msie=e;B.version=s(/iemobile\/(\d+(\.\d+)?)/i)}}else if(/msie|trident/i.test(i))B={name:"Internet Explorer",msie:e,version:s(/(?:msie |rv:)(\d+(\.\d+)?)/i)};else if(l)B={name:"Chrome",osname:"Chrome OS",chromeos:e,chromeBook:e,chrome:e,version:s(/(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i)};else if(/edg([ea]|ios)/i.test(i))B={name:"Microsoft Edge",msedge:e,version:g};else if(/vivaldi/i.test(i))B={name:"Vivaldi",vivaldi:e,version:s(/vivaldi\/(\d+(\.\d+)?)/i)||k};else if(m)B={name:"Sailfish",osname:"Sailfish OS",sailfish:e,version:s(/sailfish\s?browser\/(\d+(\.\d+)?)/i)};else if(/seamonkey\//i.test(i))B={name:"SeaMonkey",seamonkey:e,version:s(/seamonkey\/(\d+(\.\d+)?)/i)};else if(/firefox|iceweasel|fxios/i.test(i)){B={name:"Firefox",firefox:e,version:s(/(?:firefox|iceweasel|fxios)[ \/](\d+(\.\d+)?)/i)};if(/\((mobile|tablet);[^\)]*rv:[\d\.]+\)/i.test(i)){B.firefoxos=e;B.osname="Firefox OS"}}else if(f)B={name:"Amazon Silk",silk:e,version:s(/silk\/(\d+(\.\d+)?)/i)};else if(/phantom/i.test(i))B={name:"PhantomJS",phantom:e,version:s(/phantomjs\/(\d+(\.\d+)?)/i)};else if(/slimerjs/i.test(i))B={name:"SlimerJS",slimer:e,version:s(/slimerjs\/(\d+(\.\d+)?)/i)};else if(/blackberry|\bbb\d+/i.test(i)||/rim\stablet/i.test(i))B={name:"BlackBerry",osname:"BlackBerry OS",blackberry:e,version:k||s(/blackberry[\d]+\/(\d+(\.\d+)?)/i)};else if(p){B={name:"WebOS",osname:"WebOS",webos:e,version:k||s(/w(?:eb)?osbrowser\/(\d+(\.\d+)?)/i)};/touchpad\//i.test(i)&&(B.touchpad=e)}else if(/bada/i.test(i))B={name:"Bada",osname:"Bada",bada:e,version:s(/dolfin\/(\d+(\.\d+)?)/i)};else if(v)B={name:"Tizen",osname:"Tizen",tizen:e,version:s(/(?:tizen\s?)?browser\/(\d+(\.\d+)?)/i)||k};else if(/qupzilla/i.test(i))B={name:"QupZilla",qupzilla:e,version:s(/(?:qupzilla)[\s\/](\d+(?:\.\d+)+)/i)||k};else if(/chromium/i.test(i))B={name:"Chromium",chromium:e,version:s(/(?:chromium)[\s\/](\d+(?:\.\d+)?)/i)||k};else if(/chrome|crios|crmo/i.test(i))B={name:"Chrome",chrome:e,version:s(/(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i)};else if(t)B={name:"Android",version:k};else if(/safari|applewebkit/i.test(i)){B={name:"Safari",safari:e};if(k)B.version=k}else if(r){B={name:"iphone"==r?"iPhone":"ipad"==r?"iPad":"iPod"};if(k)B.version=k}else if(/googlebot/i.test(i))B={name:"Googlebot",googlebot:e,version:s(/googlebot\/(\d+(\.\d+))/i)||k};else B={name:s(/^(.*)\/(.*) /),version:o(/^(.*)\/(.*) /)};if(!B.msedge&&/(apple)?webkit/i.test(i)){if(/(apple)?webkit\/537\.36/i.test(i)){B.name=B.name||"Blink";B.blink=e}else{B.name=B.name||"Webkit";B.webkit=e}if(!B.version&&k)B.version=k}else if(!B.opera&&/gecko\//i.test(i)){B.name=B.name||"Gecko";B.gecko=e;B.version=B.version||s(/gecko\/(\d+(\.\d+)?)/i)}if(!B.windowsphone&&(t||B.silk)){B.android=e;B.osname="Android"}else if(!B.windowsphone&&r){B[r]=e;B.ios=e;B.osname="iOS"}else if(w){B.mac=e;B.osname="macOS"}else if(S){B.xbox=e;B.osname="Xbox"}else if(h){B.windows=e;B.osname="Windows"}else if(b){B.linux=e;B.osname="Linux"}function O(e){switch(e){case"NT":return"NT";case"XP":return"XP";case"NT 5.0":return"2000";case"NT 5.1":return"XP";case"NT 5.2":return"2003";case"NT 6.0":return"Vista";case"NT 6.1":return"7";case"NT 6.2":return"8";case"NT 6.3":return"8.1";case"NT 10.0":return"10";default:return undefined}}var T="";if(B.windows)T=O(s(/Windows ((NT|XP)( \d\d?.\d)?)/i));else if(B.windowsphone)T=s(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i);else if(B.mac){T=s(/Mac OS X (\d+([_\.\s]\d+)*)/i);T=T.replace(/[_\s]/g,".")}else if(r){T=s(/os (\d+([_\s]\d+)*) like mac os x/i);T=T.replace(/[_\s]/g,".")}else if(t)T=s(/android[ \/-](\d+(\.\d+)*)/i);else if(B.webos)T=s(/(?:web|hpw)os\/(\d+(\.\d+)*)/i);else if(B.blackberry)T=s(/rim\stablet\sos\s(\d+(\.\d+)*)/i);else if(B.bada)T=s(/bada\/(\d+(\.\d+)*)/i);else if(B.tizen)T=s(/tizen[\/\s](\d+(\.\d+)*)/i);if(T)B.osversion=T;var P=!B.windows&&T.split(".")[0];if(x||d||"ipad"==r||t&&(3==P||P>=4&&!y)||B.silk)B.tablet=e;else if(y||"iphone"==r||"ipod"==r||t||a||B.blackberry||B.webos||B.bada)B.mobile=e;if(B.msedge||B.msie&&B.version>=10||B.yandexbrowser&&B.version>=15||B.vivaldi&&B.version>=1||B.chrome&&B.version>=20||B.samsungBrowser&&B.version>=4||B.firefox&&B.version>=20||B.safari&&B.version>=6||B.opera&&B.version>=10||B.ios&&B.osversion&&B.osversion.split(".")[0]>=6||B.blackberry&&B.version>=10.1||B.chromium&&B.version>=20)B.a=e;else if(B.msie&&B.version<10||B.chrome&&B.version<20||B.firefox&&B.version<20||B.safari&&B.version<6||B.opera&&B.version<10||B.ios&&B.osversion&&B.osversion.split(".")[0]<6||B.chromium&&B.version<20)B.c=e;else B.x=e;return B}var s=i("undefined"!==typeof navigator?navigator.userAgent||"":"");s.test=function(e){for(var i=0;i<e.length;++i){var o=e[i];if("string"===typeof o)if(o in s)return true}return false};function o(e){return e.split(".").length}function r(e,i){var s=[],o;if(Array.prototype.map)return Array.prototype.map.call(e,i);for(o=0;o<e.length;o++)s.push(i(e[o]));return s}function n(e){var i=Math.max(o(e[0]),o(e[1]));var s=r(e,function(e){var s=i-o(e);e+=new Array(s+1).join(".0");return r(e.split("."),function(e){return new Array(20-e.length).join("0")+e}).reverse()});while(--i>=0)if(s[0][i]>s[1][i])return 1;else if(s[0][i]===s[1][i]){if(0===i)return 0}else return-1}function t(e,o,r){var t=s;if("string"===typeof o){r=o;o=void 0}if(void 0===o)o=false;if(r)t=i(r);var a=""+t.version;for(var d in e)if(e.hasOwnProperty(d))if(t[d]){if("string"!==typeof e[d])throw new Error("Browser version in the minVersion map should be a string: "+d+": "+String(e));return n([a,e[d]])<0}return o}function a(e,i,s){return!t(e,i,s)}s.isUnsupportedBrowser=t;s.compareVersions=n;s.check=a;s._detect=i;s.detect=i;return s});</script>
<% /* Auto-injected «script» tags: */ %>
<!--SCRIPTS-->
<script src="/dependencies/sails.io.js"></script>
<script src="/dependencies/lodash.js"></script>
<script src="/dependencies/jquery.min.js"></script>
<script src="/dependencies/vue.js"></script>
<script src="/dependencies/vue-router.js"></script>
<script src="/dependencies/ace-editor/ace-editor.js"></script>
<script src="/dependencies/ace-editor/mode-xml.js"></script>
<script src="/dependencies/ace-editor/worker-xml.js"></script>
<script src="/dependencies/bootstrap-4/bootstrap-4.bundle.js"></script>
<script src="/dependencies/chart.min.js"></script>
<script src="/dependencies/cloud.js"></script>
<script src="/dependencies/docsearch.min.js"></script>
<script src="/dependencies/highlight.min.js"></script>
<script src="/dependencies/mermaid.min.js"></script>
<script src="/dependencies/moment.js"></script>
<script src="/dependencies/parasails.js"></script>
<script src="/js/cloud.setup.js"></script>
<script src="/js/components/ajax-button.component.js"></script>
<script src="/js/components/ajax-form.component.js"></script>
<script src="/js/components/animated-arrow-button.component.js"></script>
<script src="/js/components/bar-chart.component.js"></script>
<script src="/js/components/bubble.component.js"></script>
<script src="/js/components/call-to-action.component.js"></script>
<script src="/js/components/cloud-error.component.js"></script>
<script src="/js/components/docs-nav-and-search.component.js"></script>
<script src="/js/components/js-timestamp.component.js"></script>
<script src="/js/components/logo-carousel.component.js"></script>
<script src="/js/components/modal.component.js"></script>
<script src="/js/components/multifield.component.js"></script>
<script src="/js/components/open-positions.component.js"></script>
<script src="/js/components/parallax-city.component.js"></script>
<script src="/js/components/rituals.component.js"></script>
<script src="/js/components/scrollable-tweets.component.js"></script>
<script src="/js/components/stripe-card-element.component.js"></script>
<script src="/js/utilities/open-stripe-checkout.js"></script>
<script src="/js/pages/account/account-overview.page.js"></script>
<script src="/js/pages/account/edit-password.page.js"></script>
<script src="/js/pages/account/edit-profile.page.js"></script>
<script src="/js/pages/admin/email-preview.page.js"></script>
<script src="/js/pages/admin/email-templates.page.js"></script>
<script src="/js/pages/admin/generate-license.page.js"></script>
<script src="/js/pages/admin/query-generator.page.js"></script>
<script src="/js/pages/admin/reset-trial.page.js"></script>
<script src="/js/pages/admin/sandbox-waitlist.page.js"></script>
<script src="/js/pages/articles/articles.page.js"></script>
<script src="/js/pages/articles/basic-article.page.js"></script>
<script src="/js/pages/articles/basic-webinar.page.js"></script>
<script src="/js/pages/articles/basic-whitepaper.page.js"></script>
<script src="/js/pages/articles/case-study.page.js"></script>
<script src="/js/pages/configuration-builder.page.js"></script>
<script src="/js/pages/connect-vanta.page.js"></script>
<script src="/js/pages/contact.page.js"></script>
<script src="/js/pages/customers.page.js"></script>
<script src="/js/pages/customers/dashboard.page.js"></script>
<script src="/js/pages/customers/new-license.page.js"></script>
<script src="/js/pages/deals.page.js"></script>
<script src="/js/pages/device-management.page.js"></script>
<script src="/js/pages/docs/app-details.page.js"></script>
<script src="/js/pages/docs/app-library.page.js"></script>
<script src="/js/pages/docs/basic-documentation.page.js"></script>
<script src="/js/pages/docs/command-details.page.js"></script>
<script src="/js/pages/docs/mdm-commands.page.js"></script>
<script src="/js/pages/docs/os-settings.page.js"></script>
<script src="/js/pages/docs/osquery-table-details.page.js"></script>
<script src="/js/pages/docs/policy-details.page.js"></script>
<script src="/js/pages/docs/policy-library.page.js"></script>
<script src="/js/pages/docs/query-detail.page.js"></script>
<script src="/js/pages/docs/query-library.page.js"></script>
<script src="/js/pages/docs/script-details.page.js"></script>
<script src="/js/pages/docs/script-library.page.js"></script>
<script src="/js/pages/docs/vital-details.page.js"></script>
<script src="/js/pages/entrance/confirmed-email.page.js"></script>
<script src="/js/pages/entrance/forgot-password.page.js"></script>
<script src="/js/pages/entrance/login.page.js"></script>
<script src="/js/pages/entrance/new-password.page.js"></script>
<script src="/js/pages/entrance/signup.page.js"></script>
<script src="/js/pages/faq.page.js"></script>
<script src="/js/pages/fast-track.page.js"></script>
<script src="/js/pages/fleet-premium-trial.page.js"></script>
<script src="/js/pages/fleetctl-preview.page.js"></script>
<script src="/js/pages/handbook/basic-handbook.page.js"></script>
<script src="/js/pages/homepage.page.js"></script>
<script src="/js/pages/infrastructure-as-code.page.js"></script>
<script src="/js/pages/integrations.page.js"></script>
<script src="/js/pages/landing-pages/basic-comparison.page.js"></script>
<script src="/js/pages/landing-pages/deployment.page.js"></script>
<script src="/js/pages/landing-pages/gitops-workshop.page.js"></script>
<script src="/js/pages/landing-pages/linux-management.page.js"></script>
<script src="/js/pages/landing-pages/replace-jamf.page.js"></script>
<script src="/js/pages/legal/privacy.page.js"></script>
<script src="/js/pages/legal/terms.page.js"></script>
<script src="/js/pages/meetups.page.js"></script>
<script src="/js/pages/microsoft-proxy/remediate.page.js"></script>
<script src="/js/pages/microsoft-proxy/turn-on-mdm.page.js"></script>
<script src="/js/pages/observability.page.js"></script>
<script src="/js/pages/okta-conditional-access-error.page.js"></script>
<script src="/js/pages/partners.page.js"></script>
<script src="/js/pages/press-kit.page.js"></script>
<script src="/js/pages/pricing.page.js"></script>
<script src="/js/pages/reports/state-of-device-management.page.js"></script>
<script src="/js/pages/software-management.page.js"></script>
<script src="/js/pages/start.page.js"></script>
<script src="/js/pages/support.page.js"></script>
<script src="/js/pages/transparency.page.js"></script>
<script src="/js/pages/try-fleet/sandbox-expired.page.js"></script>
<script src="/js/pages/try-fleet/sandbox-teleporter.page.js"></script>
<script src="/js/pages/try-fleet/waitlist.page.js"></script>
<script src="/js/pages/vanta-authorization.page.js"></script>
<!--SCRIPTS END-->
<% /* Display an overlay if the current browser is not supported.
(Relies on `bowser`, which is loaded inline above.) */ %>
<script>
(function(){
if (typeof bowser !== 'undefined') {
// --------------------------------------------------------------------
// Additional compatibility tips:
//
// • The browser/OS compatibility below is determined by the needs of Vue.js and Bootstrap.js.
// • All browsers on Windows XP are probably unsupported (because of compatibility issues with modern SSL certs)
// • See https://getbootstrap.com/docs/4.0/getting-started/browsers-devices/
// • See also https://github.com/vuejs/vue/tree/0e5306658ad7b83c553a6a3eeedb15f9066ab063#browser-compatibility
// • For more info, see:
// - https://github.com/lancedikson/bowser/blob/1fb99ced0e8834fd9662604bad7e0f0c3eba2786/test/test.js#L110-L123
// - https://github.com/lancedikson/bowser/tree/1fb99ced0e8834fd9662604bad7e0f0c3eba2786#rendering-engine-flags
// --------------------------------------------------------------------
var LATEST_SUPPORTED_VERSION_BY_OS = {
iOS: '14',//« earliest version that suppports the embedded podcast player.
Android: '6' // « Note: the earliest version we can test for compatibility issues with on browserstack is Android 7, but Google's search crawler uses an Android 6 user agent.
};
var LATEST_SUPPORTED_VERSION_BY_USER_AGENT = {
msedge: '84',//« earliest version to support the gap css property.
safari: '14',//« earliest version that suppports the gap css property.
firefox: '103',//« earliest version to support the backdrop filter css property.
chrome: '84',//« earliest version to support the gap css property.
opera: '70',//« earliest version to support the gap css property.
};
var LATEST_SUPPORTED_VERSION_BY_BROWSER_NAME = {
'microsoft edge': LATEST_SUPPORTED_VERSION_BY_USER_AGENT.msedge,
'safari': LATEST_SUPPORTED_VERSION_BY_USER_AGENT.safari,
'firefox': LATEST_SUPPORTED_VERSION_BY_USER_AGENT.firefox,
'chrome': LATEST_SUPPORTED_VERSION_BY_USER_AGENT.chrome,
'opera': LATEST_SUPPORTED_VERSION_BY_USER_AGENT.opera
};
var isUnsupportedBrowser = (
bowser.isUnsupportedBrowser(LATEST_SUPPORTED_VERSION_BY_USER_AGENT, window.navigator.userAgent) || bowser.msie
);
var isUnsupportedOS = (
LATEST_SUPPORTED_VERSION_BY_OS[bowser.osname] &&
bowser.compareVersions([bowser.osversion, LATEST_SUPPORTED_VERSION_BY_OS[bowser.osname]]) < 0
);
if (isUnsupportedBrowser || isUnsupportedOS) {
document.body.innerHTML =
'<div class="container browser-warning-message text-center">'+
' <a href="https://fleetdm.com/company/contact">'+
'<img style="display: block; height: 40px; width: auto; margin: 0 auto 32px;" alt="Logo" src="/images/fleet-logo-black-118x40@2x.png"/>'+
'</a>'+
' <h5 class="card-title">This '+(isUnsupportedBrowser ? 'browser' : 'operating system')+' is not supported.</h5>'+
' <p style="max-width: 500px; margin: 0 auto 24px;">'+
' This app does not currently support '+(
isUnsupportedBrowser?
(bowser.msie?
'<strong>'+bowser.name+'</strong><br>'+ 'To continue, please use a supported browser, or download the <a href="https://www.google.com/chrome">latest version of Google Chrome</a>.'+
' </p>'+
' <a class="btn btn-primary" style="padding: 5px 10px" href="https://www.google.com/chrome">Download Chrome</a>'
:
'<strong>'+bowser.name+'</strong> for versions lower than <strong>v'+ LATEST_SUPPORTED_VERSION_BY_BROWSER_NAME[bowser.name.toLowerCase()]+'</strong>. '+
'To continue, please upgrade your browser to the newest version, or download the <a href="https://www.google.com/chrome">latest version of Google Chrome</a>.'+
' </p>'+
' <a class="btn btn-sm btn-primary" style="padding: 5px 10px" href="https://www.google.com/chrome">Download Chrome</a>'
)
:
'<strong>'+bowser.osname+'</strong> for versions lower than <strong>v'+ LATEST_SUPPORTED_VERSION_BY_OS[bowser.osname]+'</strong>. '+
'To continue, please use a different device, or <a href="'+(bowser.osname === 'iOS' ? 'https://support.apple.com/en-us/HT204204' : 'https://support.google.com/android/?hl=en#topic=7313011')+'">upgrade this device\'s software</a> to the latest compatible version.'+
' </p>'+
' <a class="btn btn-primary" style="padding: 5px 10px" href="/contact">Need help?</a>'
)+
'</div>';
document.body.style.padding = '75px 0';
}
}
})();
</script>
<script>
// Hide the header when the page is scrolled 1.5x the height of the browser window, and show it when the page is scrolled upwards.
// Note: this is done with an inline script tag here, because otherwise we would need to create a masthead component and include it on every page.
var lastScrollTop = 0;
var elementToHide = document.querySelector('[hide-when-scrolled]');
let alwaysVisibleWhenShownElement = document.querySelector('[always-visible-when-shown]');
$(window).scroll(()=>{
if(!elementToHide || !alwaysVisibleWhenShownElement){
return;
}
let isAlwaysVisibleElementShown = [...alwaysVisibleWhenShownElement.classList].includes('show');
if(isAlwaysVisibleElementShown) {
return;
}
let scrollTop = window.pageYOffset || document.documentElement.scrollTop;
if(scrollTop > lastScrollTop && scrollTop > window.innerHeight * 1.5) {
// If the user scrolls 1.5x the height of their browser window, hide the page header.
elementToHide.classList.add('translate-y-0');
lastScrollTop = scrollTop;
} else if(scrollTop < lastScrollTop - 60) {
// If the user scrolls 60 pixels upwards on the screen, we'll show the page header
elementToHide.classList.remove('translate-y-0');
lastScrollTop = scrollTop;
}
});
// Keep footer hidden until the document is ready (prevents flicker that is especially unattractive on mobile)
$(function() {
$('[data-hide-until-rendered]').removeClass('invisible'); // Note: invisible is a bootstrap 4 class
});
// Adding hover events to header dropdown menus.
$(function(){
$('[purpose=dropdown-button]').hover(
function() {
$(this).children('.dropdown-menu').addClass('show');
$(this).children('.dropdown-toggle').attr('aria-expanded', true);
},
function() {
$(this).children('.dropdown-menu').removeClass('show');
$(this).children('.dropdown-toggle').attr('aria-expanded', false);
});
});
// Add an event listener to watch for the cookie banner loading.
document.addEventListener("cookieyes_banner_load", function (eventData) {
// Check the value in the JSON eventData and perform the desired action.
if(eventData.detail) {
if(eventData.detail.activeLaw === 'ccpa'){
// If this user sees a cookieyes banner for CCPA, add a "Do not sell or share my personal information" link to the bottom of the website footer.
$('div[purpose="cky-button-container"]').append(
'<a purpose="cky-button">Do Not Sell or Share My Personal Information</a>'
);
// Add a click event to the added button to bring up the cookie yes menu.
$(function(){
$('a[purpose="cky-button"]').click(
function() {
revisitCkyConsent()
}
);
});
}
}
});
</script>
</body>
</html>