Create jamf alternative landing page (#13066)

# Checklist for submitter

If some of the following don't apply, delete the relevant line.

- [ ] Changes file added for user-visible changes in `changes/` or
`orbit/changes/`.
See [Changes
files](https://fleetdm.com/docs/contributing/committing-changes#changes-files)
for more information.
- [ ] Documented any API changes (docs/Using-Fleet/REST-API.md or
docs/Contributing/API-for-contributors.md)
- [ ] Documented any permissions changes
- [ ] Input data is properly validated, `SELECT *` is avoided, SQL
injection is prevented (using placeholders for values in statements)
- [ ] Added support on fleet's osquery simulator `cmd/osquery-perf` for
new osquery data ingestion features.
- [ ] Added/updated tests
- [ ] Manual QA for all new/changed functionality
  - For Orbit and Fleet Desktop changes:
- [ ] Manual QA must be performed in the three main OSs, macOS, Windows
and Linux.
- [ ] Auto-update manual QA, from released version of component to new
version (see [tools/tuf/test](../tools/tuf/test/README.md)).

---------

Co-authored-by: Eric <eashaw@sailsjs.com>
This commit is contained in:
Andrew Baker 2023-08-01 18:03:10 -04:00 committed by GitHub
parent 55c5681618
commit 864b8dd44c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 489 additions and 0 deletions

View file

@ -0,0 +1,27 @@
module.exports = {
friendlyName: 'View jamf alternative',
description: 'Display "Jamf alternative" page.',
exits: {
success: {
viewTemplatePath: 'pages/imagine/jamf-alternative'
}
},
fn: async function () {
// Respond with view.
return {};
}
};

View file

@ -0,0 +1,29 @@
parasails.registerPage('jamf-alternative', {
// ╦╔╗╔╦╔╦╗╦╔═╗╦ ╔═╗╔╦╗╔═╗╔╦╗╔═╗
// ║║║║║ ║ ║╠═╣║ ╚═╗ ║ ╠═╣ ║ ║╣
// ╩╝╚╝╩ ╩ ╩╩ ╩╩═╝ ╚═╝ ╩ ╩ ╩ ╩ ╚═╝
data: {
//…
},
// ╦ ╦╔═╗╔═╗╔═╗╦ ╦╔═╗╦ ╔═╗
// ║ ║╠╣ ║╣ ║ ╚╦╝║ ║ ║╣
// ╩═╝╩╚ ╚═╝╚═╝ ╩ ╚═╝╩═╝╚═╝
beforeMount: function() {
//…
},
mounted: async function() {
//…
},
// ╦╔╗╔╔╦╗╔═╗╦═╗╔═╗╔═╗╔╦╗╦╔═╗╔╗╔╔═╗
// ║║║║ ║ ║╣ ╠╦╝╠═╣║ ║ ║║ ║║║║╚═╗
// ╩╝╚╝ ╩ ╚═╝╩╚═╩ ╩╚═╝ ╩ ╩╚═╝╝╚╝╚═╝
methods: {
clickOpenChatWidget: function() {
if(window.HubSpotConversations && window.HubSpotConversations.widget){
window.HubSpotConversations.widget.open();
}
},
}
});

View file

@ -84,3 +84,4 @@
@import 'pages/imagine/higher-education.less';
@import 'pages/imagine/rapid-7-alternative.less';
@import 'pages/imagine/defcon-31.less';
@import 'pages/imagine/jamf-alternative.less';

View file

@ -0,0 +1,347 @@
#jamf-alternative {
h1 {
font-weight: 800;
font-size: 64px;
line-height: 76px;
}
h2 {
font-weight: 800;
font-size: 32px;
line-height: 38px;
margin-bottom: 40px;
}
h3 {
font-weight: 800;
font-size: 24px;
line-height: 32px;
}
h4 {
font-family: 'Roboto Mono';
font-style: normal;
font-weight: 400;
font-size: 18px;
line-height: 24px;
color: @core-fleet-black-75;
margin-bottom: 4px;
}
p {
font-size: 16px;
line-height: 24px;
}
[purpose='hero-background'] {
background: linear-gradient(180deg, #E8F1F7 3.37%, #FFFFFF 60%);
padding-top: 120px;
padding-bottom: 40px;
}
[purpose='hero-container'] {
max-width: 1200px;
}
[purpose='hero-text'] {
text-align: center;
max-width: 940px;
padding: 0 40px;
h1 {
margin-bottom: 32px;
}
p {
font-size: 18px;
line-height: 27px;
max-width: 640px;
margin: 0 auto 32px;
}
}
[purpose='button-row'] {
a {
font-weight: 700;
font-size: 16px;
line-height: 24px;
}
[purpose='cta-button'] {
cursor: pointer;
margin-right: 32px;
background: @core-vibrant-red;
border-radius: 8px;
padding-left: 32px;
padding-right: 32px;
height: 48px;
display: flex;
justify-content: center;
align-items: center;
color: #FFF;
position: relative;
text-decoration: none;
}
[purpose='cta-button']::before {
background: linear-gradient(180deg, rgba(255, 255, 255, 0.2) 0%, rgba(255, 255, 255, 0) 100%);
opacity: 1;
content: ' ';
position: absolute;
top: 0;
left: -5px;
width: 50%;
height: 100%;
transform: skew(-10deg);
transition: left 0.5s ease-in, opacity 0.50s ease-in, width 0.5s ease-in;
}
[purpose='cta-button']:hover:before {
opacity: 0;
left: 160px;
width: 110%;
}
[purpose='animated-arrow-button-red'] {
display: inline;
padding-right: 40px;
cursor: pointer;
position: relative;
width: fit-content;
min-width: 125px;
font-weight: bold;
user-select: none;
transition: 0.2s ease-in-out;
-o-transition: 0.2s ease-in-out;
-ms-transition: 0.2s ease-in-out;
-moz-transition: 0.2s ease-in-out;
-webkit-transition: 0.2s ease-in-out;
color: @core-fleet-black;
text-decoration: none;
&:after {
content: url('/images/arrow-right-red-16x16@2x.png');
transform: scale(0.5);
position: absolute;
top: -5px;
left: 80%; // <--- here
transition: 0.2s ease-in-out;
-o-transition: 0.2s ease-in-out;
-ms-transition: 0.2s ease-in-out;
-moz-transition: 0.2s ease-in-out;
-webkit-transition: 0.2s ease-in-out;
/* opacity: 0; */
}
&:hover:after {
left: 82%; // <--- here
transition: 0.2s ease-in-out;
-o-transition: 0.2s ease-in-out;
-ms-transition: 0.2s ease-in-out;
-moz-transition: 0.2s ease-in-out;
-webkit-transition: 0.2s ease-in-out;
/* opacity:1; */
}
}
}
[purpose='page-container'] {
padding-left: 40px;
padding-right: 40px;
padding-bottom: 120px;
}
[purpose='feature'] {
margin-top: 120px;
max-width: 960px;
h3 {
margin-bottom: 24px;
}
div {
max-width: 480px;
}
}
[purpose='feature-image'] {
img {
max-height: 300px;
}
}
[purpose='large-feature-image'] {
img {
max-height: 250px;
}
}
[purpose='checklists'] {
margin-top: 40px;
margin-bottom: 80px;
}
[purpose='checklist'] {
p {
padding-left: 28px;
text-indent: -28px;
}
p::before {
content: ' ';
background-image: url('/images/icon-checkmark-circle.svg');
background-size: 16px 16px;
display: inline-block;
position: relative;
top: 2px;
margin-right: 12px;
width: 16px;
height: 16px;
}
}
[purpose='tweets-container'] {
padding-top: 120px;
padding-bottom: 120px;
}
[purpose='bottom-gradient'] {
background: linear-gradient(180deg, #FFFFFF 0%, #E9F4F4 100%);
}
[purpose='bottom-cloud-city-banner'] {
background: linear-gradient(180deg, #E9F4F4 0%, #FFFFFF 100%);
img {
width: 100%;
}
}
@media (min-width: 1200px) {
[purpose='page-container'] {
padding-left: 120px;
padding-right: 120px;
}
}
@media (max-width: 1200px) {
[purpose='logos'] {
height: 58px;
margin-left: auto;
margin-right: auto;
img {
margin-top: 23.5px;
margin-bottom: 23.5px;
padding-left: 25px;
padding-right: 25px;
}
[purpose='snowflake-logo'] {
height: 21px;
}
[purpose='wayfair-logo'] {
height: 23px;
}
[purpose='uber-logo'] {
height: 20px;
}
[purpose='atlassian-logo'] {
height: 16px;
}
[purpose='segment-logo'] {
height: 22px;
}
}
}
@media (max-width: 991px) {
[purpose='button-row'] {
margin-right: auto;
margin-left: auto;
}
[purpose='hero-background'] {
padding-top: 120px;
padding-bottom: 80px;
padding-left: 0px;
padding-right: 0px;
}
[purpose='logos'] {
height: 58px;
margin-left: 20px;
margin-right: 20px;
img {
margin-top: 17.5px;
margin-bottom: 17.5px;
padding-left: 10px;
padding-right: 10px;
}
}
}
@media (max-width: 768px) {
h1 {
font-size: 48px;
line-height: 54px;
}
[purpose='page-container'] {
padding-left: 40px;
padding-right: 40px;
}
[purpose='checklists'] {
margin-bottom: 40px;
}
[purpose='feature'] {
margin-top: 80px;
}
[purpose='feature-image'], [purpose='large-feature-image'] {
margin-bottom: 40px;
img {
max-height: 100%;
max-width: 100%;
}
}
[purpose='hero-background'] {
padding-top: 60px;
padding-bottom: 60px;
padding-left: 20px;
padding-right: 20px;
}
[purpose='hero-text'] {
text-align: center;
max-width: 480px;
}
[purpose='tweets-container'] {
padding-top: 80px;
padding-bottom: 80px;
padding-left: 40px;
padding-right: 40px;
}
[purpose='logos'] {
height: auto;
}
}
@media (max-width: 575px) {
[purpose='button-row'] {
max-width: 100%;
[purpose='cta-button'] {
margin-right: 0px;
width: 100%;
margin-bottom: 24px;
}
}
[purpose='feature'] {
margin-top: 60px;
}
[purpose='page-container'] {
padding-left: 20px;
padding-right: 20px;
}
[purpose='tweets-container'] {
padding-left: 20px;
padding-right: 20px;
}
[parasails-component='scrollable-tweets'] [purpose='tweets'] {
margin-top: 40px;
}
}
}

View file

@ -328,6 +328,13 @@ module.exports.routes = {
pageDescriptionForMeta: 'Find Fleet at DefCon and get a custom tee shirt.',
}
},
'GET /imagine/jamf-alternative': {
action: 'imagine/view-jamf-alternative',
locals: {
pageTitleForMeta: 'An open-source alternative to Jamf',
pageDescriptionForMeta: 'Simplify vulnerability management with Fleet, an open-source platform with superior visibility.',
}
},
// ╦ ╔═╗╔═╗╔═╗╔═╗╦ ╦ ╦═╗╔═╗╔╦╗╦╦═╗╔═╗╔═╗╔╦╗╔═╗
// ║ ║╣ ║ ╦╠═╣║ ╚╦╝ ╠╦╝║╣ ║║║╠╦╝║╣ ║ ║ ╚═╗

View file

@ -252,6 +252,7 @@
<script src="/js/pages/homepage.page.js"></script>
<script src="/js/pages/imagine/defcon-31.page.js"></script>
<script src="/js/pages/imagine/higher-education.page.js"></script>
<script src="/js/pages/imagine/jamf-alternative.page.js"></script>
<script src="/js/pages/imagine/launch-party.page.js"></script>
<script src="/js/pages/imagine/rapid-7-alternative.page.js"></script>
<script src="/js/pages/imagine/unused-software.page.js"></script>

View file

@ -252,6 +252,7 @@
<script src="/js/pages/homepage.page.js"></script>
<script src="/js/pages/imagine/defcon-31.page.js"></script>
<script src="/js/pages/imagine/higher-education.page.js"></script>
<script src="/js/pages/imagine/jamf-alternative.page.js"></script>
<script src="/js/pages/imagine/launch-party.page.js"></script>
<script src="/js/pages/imagine/rapid-7-alternative.page.js"></script>
<script src="/js/pages/imagine/unused-software.page.js"></script>

View file

@ -379,6 +379,7 @@
<script src="/js/pages/homepage.page.js"></script>
<script src="/js/pages/imagine/defcon-31.page.js"></script>
<script src="/js/pages/imagine/higher-education.page.js"></script>
<script src="/js/pages/imagine/jamf-alternative.page.js"></script>
<script src="/js/pages/imagine/launch-party.page.js"></script>
<script src="/js/pages/imagine/rapid-7-alternative.page.js"></script>
<script src="/js/pages/imagine/unused-software.page.js"></script>

View file

@ -452,6 +452,7 @@
<script src="/js/pages/homepage.page.js"></script>
<script src="/js/pages/imagine/defcon-31.page.js"></script>
<script src="/js/pages/imagine/higher-education.page.js"></script>
<script src="/js/pages/imagine/jamf-alternative.page.js"></script>
<script src="/js/pages/imagine/launch-party.page.js"></script>
<script src="/js/pages/imagine/rapid-7-alternative.page.js"></script>
<script src="/js/pages/imagine/unused-software.page.js"></script>

View file

@ -0,0 +1,74 @@
<div id="jamf-alternative" v-cloak>
<div purpose="hero-background" class="container-lg d-flex justify-content-center">
<div purpose="hero-container" class="d-flex flex-column align-items-center">
<div purpose="hero-text">
<h4 class="mb-2">Device management built for IT, security approved</h4>
<h1>Fleet brings GitOps to MDM</h1>
<p>Bringh-your-own MDM. Enjoy enterprise-ready open-source MDM and leverage the best of DevOps and GitOps inside a full-featured Macbook MDM.</p>
<div purpose="button-row" class="d-flex flex-sm-row flex-column justify-content-center align-items-center">
<a purpose="cta-button" href="/try-fleet/register?tryitnow">Try Fleet today</a>
<a @click="clickOpenChatWidget()" purpose="animated-arrow-button-red">Talk to an expert</a>
</div>
</div>
</div>
</div>
<div purpose="page-container" class="container-lg">
<div purpose="feature" class="d-flex flex-md-row flex-column-reverse justify-content-between mx-auto align-items-center">
<div class="d-flex flex-column">
<h3>Finally a transparent and open-source MDM.</h3>
<p>Don't waste money buying new Protection plans from your MDM provider.</p>
</div>
<div purpose="feature-image" class="ml-md-5">
<img alt="A Fleet orb scanning a Laptop" src="/images/device-management-realtime-visibility-320x294@2x.png">
</div>
</div>
<div purpose="feature" class="d-flex flex-md-row flex-column justify-content-between mx-auto align-items-center">
<div purpose="feature-image" class="mr-md-5">
<img alt="A bento box featuring all the tools Fleet can bring together" src="/images/device-management-bento-logos-320x295@2x.png">
</div>
<div class="d-flex flex-column">
<h3>JAMF and Intune are never perfect out of the box, so why not bring your own MDM?</h3>
<p>A transparent and programmable MDM to build the solution that's best for your team.</p>
</div>
</div>
<div purpose="button-row" style="margin-top: 60px;" class="d-flex flex-sm-row flex-column justify-content-center align-items-center mx-auto">
<a purpose="cta-button" href="/try-fleet/register?tryitnow">Try Fleet today</a>
<a @click="clickOpenChatWidget()" purpose="animated-arrow-button-red">Talk to an expert</a>
</div>
</div>
<div purpose="bottom-gradient">
<div purpose="tweets-container" class="container-fluid px-md-0 pb-0 d-flex flex-column justify-content-center">
<div purpose="section-heading" style="max-width: 720px" class="mx-auto text-center">
<h4>Dont know osquery?</h4>
<h2>Dedicated support from osquery experts</h2>
<p>Osquery is the open-source agent that powers Fleet. And we have the most osquery experts around. Well help you realize the potential of this tool for your organization.</p>
</div>
</div>
<scrollable-tweets></scrollable-tweets>
<div purpose="page-container" class="pb-0 container">
<div purpose="bottom-cta" class="text-center">
<h4>Open-source device management</h4>
<h1>Lighter than air</h1>
<div purpose="button-row" style="margin-top: 60px;" class="d-flex flex-sm-row flex-column justify-content-center align-items-center mx-auto">
<a purpose="cta-button" href="/try-fleet/register?tryitnow">Try it out</a>
<a @click="clickOpenChatWidget()" purpose="animated-arrow-button-red">Talk to an expert</a>
</div>
</div>
</div>
</div>
<div class="d-flex flex-column" purpose="bottom-cloud-city-banner">
<img alt="A glass city floating on top of fluffy white clouds" class="d-none d-lg-flex" src="/images/homepage-cloud-city-banner-lg-1600x375@2x.png">
<img alt="A glass city floating on top of fluffy white clouds" class="d-none d-md-flex d-lg-none" src="/images/homepage-cloud-city-banner-md-990x375@2x.png">
<img alt="A glass city floating on top of fluffy white clouds" class="d-flex d-md-none" src="/images/homepage-cloud-city-banner-sm-375x168@2x.png">
</div>
</div>
<%- /* Expose server-rendered data as window.SAILS_LOCALS :: */ exposeLocalsToBrowser() %>