Website: Update /try-fleet (#17608)

Changes:
- Added `/start`, a page where users can choose whether to run a local
demo of Fleet, or purchase a Fleet Premium license
- Updated all "Try it now" links to go to the `/register` page.
- Updated the URL and added redirects:
   - `/customers/new-license` » `/new-license`
   - `/try-fleet/fleetctl-preview` » `/try-fleet`
   - `/customers/register` » `/register`
   - `/customers/login` » `/login`
- Removed the `/try-fleet/login` and `/try-fleet/register` pages
- Updated the /try-fleet/explore-data pages to redirect logged-out-users
to the /register page
- Updated policies, routes, and importer.less

---------

Co-authored-by: Mike Thomas <78363703+mike-j-thomas@users.noreply.github.com>
This commit is contained in:
Eric 2024-03-14 10:28:23 -05:00 committed by GitHub
parent 7e4964385c
commit b36256a053
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
38 changed files with 326 additions and 656 deletions

View File

@ -24,7 +24,7 @@ module.exports = {
fn: async function () {
if (this.req.me) {
throw {redirect: '/customers/new-license'};
throw {redirect: '/start'};
}
return {};

View File

@ -56,7 +56,7 @@ module.exports = {
// If the requesting user is not logged in, redirect them to the /try-fleet/register page with the specified hostPlatform added as a query parameter.
if(!this.req.me){
throw {redirect: `/try-fleet/register?targetPlatform=${encodeURIComponent(hostPlatform)}` };
throw {redirect: `/register?targetPlatform=${encodeURIComponent(hostPlatform)}` };
}
if(!sails.config.custom.queryIdsByTableName){

View File

@ -1,38 +0,0 @@
module.exports = {
friendlyName: 'View register',
description: 'Display "Register" page. Note: This page is the "signup" page skinned for Fleet Sandbox.',
exits: {
success: {
viewTemplatePath: 'pages/try-fleet/register'
},
redirect: {
description: 'The requesting user is already logged in.',
responseType: 'redirect'
}
},
fn: async function () {
// If the user is logged in, redirect them to the Fleet sandbox page.
// FUTURE: once all Sandbox instances have expired, redirect users to the fleetctl-preview page.
if (this.req.me) {
throw {redirect: '/try-fleet/sandbox'};
}
// Respond with view.
return {};
}
};

View File

@ -1,38 +0,0 @@
module.exports = {
friendlyName: 'View Sandbox login',
description: 'Display the "Sandbox Login" page. Note: This page is the "login" page skinned for Fleet Sandbox.',
exits: {
success: {
viewTemplatePath: 'pages/try-fleet/sandbox-login'
},
redirect: {
description: 'The requesting user is already logged in.',
responseType: 'redirect'
}
},
fn: async function () {
// If the user is logged in, redirect them to the Fleet sandbox page.
if (this.req.me) {
throw {redirect: '/try-fleet/sandbox'};
}
// Respond with view.
return {};
}
};

27
website/api/controllers/view-start.js vendored Normal file
View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

View File

@ -25,6 +25,17 @@ parasails.registerPage('login', {
// Server error state for the form
cloudError: '',
showCustomerLogin: true,
// For redirecting users who come to this page from a /try-fleet/explore-data/* page back to the page they were visiting before they were redirected.
exploreDataRedirectSlug: undefined,
// Used for the 'create an account' link
registrationSlug: '/register',
// Possible /try-fleet/explore-data/ redirects
redirectSlugsByTargetPlatform: {
'macos': 'macos/account_policy_data',
'windows': 'windows/appcompat_shims',
'linux': 'linux/apparmor_events',
},
},
// ╦ ╦╔═╗╔═╗╔═╗╦ ╦╔═╗╦ ╔═╗
@ -34,6 +45,18 @@ parasails.registerPage('login', {
if(window.location.search === '?admin') {
this.showCustomerLogin = false;
}
// If the user navigated to this page from an /explore-data page, we'll keep track of the page this user came from so we can redirect them, and we'll strip all query parameters from the URL.
if(window.location.search) {
// https://caniuse.com/mdn-api_urlsearchparams_get
let possibleSearchParamsToFilterBy = new URLSearchParams(window.location.search);
let posibleRedirect = possibleSearchParamsToFilterBy.get('targetPlatform');
// If the provided platform matches a key in the userFriendlyPlatformNames array, we'll set this.selectedPlatform.
if(posibleRedirect && this.redirectSlugsByTargetPlatform[posibleRedirect] !== undefined){
this.registrationSlug +=`?targetPlatform=${posibleRedirect}`;
this.exploreDataRedirectSlug = `/try-fleet/explore-data/${this.redirectSlugsByTargetPlatform[posibleRedirect]}`;
}
window.history.replaceState({}, document.title, '/login' );
}
},
mounted: async function() {
//…
@ -49,7 +72,12 @@ parasails.registerPage('login', {
// > (Note that we re-enable the syncing state here. This is on purpose--
// > to make sure the spinner stays there until the page navigation finishes.)
this.syncing = true;
window.location = '/customers/new-license?login';
if(this.exploreDataRedirectSlug){
window.location = this.exploreDataRedirectSlug;
} else {
window.location = '/start';
}
},
}

View File

@ -24,13 +24,33 @@ parasails.registerPage('signup', {
cloudError: '',
// For displaying the full signup form.
showFullForm: false,
exploreDataRedirectSlug: undefined,
// Used for the 'I have an account' link
loginSlug: '/login',
// Possible /try-fleet/explore-data/ redirects
redirectSlugsByTargetPlatform: {
'macos': 'macos/account_policy_data',
'windows': 'windows/appcompat_shims',
'linux': 'linux/apparmor_events',
},
},
// ╦ ╦╔═╗╔═╗╔═╗╦ ╦╔═╗╦ ╔═╗
// ║ ║╠╣ ║╣ ║ ╚╦╝║ ║ ║╣
// ╩═╝╩╚ ╚═╝╚═╝ ╩ ╚═╝╩═╝╚═╝
beforeMount: function() {
//…
// If the user navigated to this page from an /explore-data page, we'll keep track of the page this user came from so we can redirect them, and we'll strip all query parameters from the URL.
if(window.location.search){
// https://caniuse.com/mdn-api_urlsearchparams_get
let possibleSearchParamsToFilterBy = new URLSearchParams(window.location.search);
let posibleRedirect = possibleSearchParamsToFilterBy.get('targetPlatform');
// If the provided platform matches a key in the userFriendlyPlatformNames array, we'll set this.selectedPlatform.
if(posibleRedirect && this.redirectSlugsByTargetPlatform[posibleRedirect] !== undefined){
this.loginSlug +=`?targetPlatform=${posibleRedirect}`;
this.exploreDataRedirectSlug = `/try-fleet/explore-data/${this.redirectSlugsByTargetPlatform[posibleRedirect]}`;
}
window.history.replaceState({}, document.title, '/register' );
}
},
mounted: async function() {
//…
@ -56,11 +76,15 @@ parasails.registerPage('signup', {
},
submittedSignUpForm: async function() {
// redirect to the new-license page.
// redirect to the /start page.
// > (Note that we re-enable the syncing state here. This is on purpose--
// > to make sure the spinner stays there until the page navigation finishes.)
this.syncing = true;
window.location = '/customers/new-license?signup';
if(this.exploreDataRedirectSlug){
window.location = this.exploreDataRedirectSlug;
} else {
window.location = '/start';
}
}

25
website/assets/js/pages/start.page.js vendored Normal file
View File

@ -0,0 +1,25 @@
parasails.registerPage('start', {
// ╦╔╗╔╦╔╦╗╦╔═╗╦ ╔═╗╔╦╗╔═╗╔╦╗╔═╗
// ║║║║║ ║ ║╠═╣║ ╚═╗ ║ ╠═╣ ║ ║╣
// ╩╝╚╝╩ ╩ ╩╩ ╩╩═╝ ╚═╝ ╩ ╩ ╩ ╩ ╚═╝
data: {
//…
},
// ╦ ╦╔═╗╔═╗╔═╗╦ ╦╔═╗╦ ╔═╗
// ║ ║╠╣ ║╣ ║ ╚╦╝║ ║ ║╣
// ╩═╝╩╚ ╚═╝╚═╝ ╩ ╚═╝╩═╝╚═╝
beforeMount: function() {
//…
},
mounted: async function() {
//…
},
// ╦╔╗╔╔╦╗╔═╗╦═╗╔═╗╔═╗╔╦╗╦╔═╗╔╗╔╔═╗
// ║║║║ ║ ║╣ ╠╦╝╠═╣║ ║ ║║ ║║║║╚═╗
// ╩╝╚╝ ╩ ╚═╝╩╚═╩ ╩╚═╝ ╩ ╩╚═╝╝╚╝╚═╝
methods: {
//…
}
});

View File

@ -1,87 +0,0 @@
parasails.registerPage('register', {
// ╦╔╗╔╦╔╦╗╦╔═╗╦ ╔═╗╔╦╗╔═╗╔╦╗╔═╗
// ║║║║║ ║ ║╠═╣║ ╚═╗ ║ ╠═╣ ║ ║╣
// ╩╝╚╝╩ ╩ ╩╩ ╩╩═╝ ╚═╝ ╩ ╩ ╩ ╩ ╚═╝
data: {
formData: { /* … */ },
// For tracking client-side validation errors in our form.
// > Has property set to `true` for each invalid property in `formData`.
formErrors: { /* … */ },
// Form rules
formRules: {
firstName: {required: true},
lastName: {required: true},
organization: {required: true},
emailAddress: {required: true, isEmail: true},
password: {required: true, minLength: 8},
},
// Syncing / loading state
syncing: false,
// Server error state
cloudError: '',
// Modal
modal: '',
// For redirecting users who come to this page from a /try-fleet/explore-data/* page back to the page they were visiting before they were redirected.
exploreDataRedirectSlug: undefined,
// Used for the 'I have an account' link
loginSlug: '/try-fleet/login',
// Possible /try-fleet/explore-data/ redirects
redirectSlugsByTargetPlatform: {
'macos': 'macos/account_policy_data',
'windows': 'windows/appcompat_shims',
'linux': 'linux/apparmor_events',
},
},
// ╦ ╦╔═╗╔═╗╔═╗╦ ╦╔═╗╦ ╔═╗
// ║ ║╠╣ ║╣ ║ ╚╦╝║ ║ ║╣
// ╩═╝╩╚ ╚═╝╚═╝ ╩ ╚═╝╩═╝╚═╝
beforeMount: function() {
// If the user navigated to this page from an /explore-data page, we'll keep track of the page this user came from so we can redirect them, and we'll strip all query parameters from the URL.
if(window.location.search){
// https://caniuse.com/mdn-api_urlsearchparams_get
let possibleSearchParamsToFilterBy = new URLSearchParams(window.location.search);
let posibleRedirect = possibleSearchParamsToFilterBy.get('targetPlatform');
// If the provided platform matches a key in the userFriendlyPlatformNames array, we'll set this.selectedPlatform.
if(posibleRedirect && this.redirectSlugsByTargetPlatform[posibleRedirect] !== undefined){
this.loginSlug +=`?targetPlatform=${posibleRedirect}`;
this.exploreDataRedirectSlug = `/try-fleet/explore-data/${this.redirectSlugsByTargetPlatform[posibleRedirect]}`;
}
window.history.replaceState({}, document.title, '/try-fleet/register' );
}
},
mounted: async function() {
//…
},
// ╦╔╗╔╔╦╗╔═╗╦═╗╔═╗╔═╗╔╦╗╦╔═╗╔╗╔╔═╗
// ║║║║ ║ ║╣ ╠╦╝╠═╣║ ║ ║║ ║║║║╚═╗
// ╩╝╚╝ ╩ ╚═╝╩╚═╩ ╩╚═╝ ╩ ╩╚═╝╝╚╝╚═╝
methods: {
// Using handle-submitting to add firstName, and lastName values to our formData before sending it to signup.js
handleSubmittingRegisterForm: async function(argins) {
argins.signupReason = 'Try Fleet';
return await Cloud.signup.with(argins);
},
// After the form is submitted, we'll redirect the user to the fleetctl preview page.
submittedRegisterForm: async function() {
this.syncing = true;
if(this.exploreDataRedirectSlug){
window.location = this.exploreDataRedirectSlug;
} else {
window.location = '/try-fleet/explore-data';
}
},
clickOpenVideoModal: function() {
this.modal = 'video';
},
closeModal: function() {
this.modal = '';
},
}
});

View File

@ -1,84 +0,0 @@
parasails.registerPage('sandbox-login', {
// ╦╔╗╔╦╔╦╗╦╔═╗╦ ╔═╗╔╦╗╔═╗╔╦╗╔═╗
// ║║║║║ ║ ║╠═╣║ ╚═╗ ║ ╠═╣ ║ ║╣
// ╩╝╚╝╩ ╩ ╩╩ ╩╩═╝ ╚═╝ ╩ ╩ ╩ ╩ ╚═╝
data: {
// Main syncing/loading state for this page.
syncing: false,
// Form data
formData: { },
// For tracking client-side validation errors in our form.
// > Has property set to `true` for each invalid property in `formData`.
formErrors: { /* … */ },
// A set of validation rules for our form.
// > The form will not be submitted if these are invalid.
formRules: {
emailAddress: { required: true, isEmail: true },
password: { required: true },
},
// Server error state for the form
cloudError: '',
// Modal
modal: '',
// For redirecting users who come to this page from a /try-fleet/explore-data/* page back to the page they were visiting before they were redirected.
exploreDataRedirectSlug: undefined,
// Used for the 'create an account' link
registrationSlug: '/try-fleet/register',
// Possible /try-fleet/explore-data/ redirects
redirectSlugsByTargetPlatform: {
'macos': 'macos/account_policy_data',
'windows': 'windows/appcompat_shims',
'linux': 'linux/apparmor_events',
},
},
// ╦ ╦╔═╗╔═╗╔═╗╦ ╦╔═╗╦ ╔═╗
// ║ ║╠╣ ║╣ ║ ╚╦╝║ ║ ║╣
// ╩═╝╩╚ ╚═╝╚═╝ ╩ ╚═╝╩═╝╚═╝
beforeMount: function() {
// If the user navigated to this page from an /explore-data page, we'll keep track of the page this user came from so we can redirect them, and we'll strip all query parameters from the URL.
if(window.location.search) {
// https://caniuse.com/mdn-api_urlsearchparams_get
let possibleSearchParamsToFilterBy = new URLSearchParams(window.location.search);
let posibleRedirect = possibleSearchParamsToFilterBy.get('targetPlatform');
// If the provided platform matches a key in the userFriendlyPlatformNames array, we'll set this.selectedPlatform.
if(posibleRedirect && this.redirectSlugsByTargetPlatform[posibleRedirect] !== undefined){
this.registrationSlug +=`?targetPlatform=${posibleRedirect}`;
this.exploreDataRedirectSlug = `/try-fleet/explore-data/${this.redirectSlugsByTargetPlatform[posibleRedirect]}`;
}
window.history.replaceState({}, document.title, '/try-fleet/login' );
}
},
mounted: async function() {
//…
},
// ╦╔╗╔╔╦╗╔═╗╦═╗╔═╗╔═╗╔╦╗╦╔═╗╔╗╔╔═╗
// ║║║║ ║ ║╣ ╠╦╝╠═╣║ ║ ║║ ║║║║╚═╗
// ╩╝╚╝ ╩ ╚═╝╩╚═╩ ╩╚═╝ ╩ ╩╚═╝╝╚╝╚═╝
methods: {
submittedLoginForm: async function() {
this.syncing = true;
if(this.exploreDataRedirectSlug){
window.location = this.exploreDataRedirectSlug;
} else {
window.location = '/try-fleet/explore-data';
}
},
clickOpenVideoModal: function() {
this.modal = 'video';
},
closeModal: function() {
this.modal = '';
},
}
});

View File

@ -49,8 +49,6 @@
@import 'pages/498.less';
@import 'pages/customers/new-license.less';
@import 'pages/customers/dashboard.less';
@import 'pages/try-fleet/sandbox-login.less';
@import 'pages/try-fleet/register.less';
@import 'pages/try-fleet/sandbox-teleporter.less';
@import 'pages/try-fleet/sandbox-expired.less';
@import 'pages/query-detail.less';
@ -78,6 +76,7 @@
@import 'pages/integrations.less';
@import 'pages/try-fleet/query-report.less';
@import 'pages/try-fleet/explore-data.less';
@import 'pages/start.less';
// Imagine = landing pages for Marketing

View File

@ -7,7 +7,8 @@
line-height: 38px;
}
a {
color: @core-vibrant-blue;
color: @core-fleet-black-75;
text-decoration: underline;
}
[purpose='customer-login-container'] {
max-width: 560px;

View File

@ -5,7 +5,8 @@
line-height: 38px;
}
a {
color: @core-vibrant-blue;
color: @core-fleet-black-75;
text-decoration: underline;
}
[purpose='page-heading'] {
padding-left: 30px;

96
website/assets/styles/pages/start.less vendored Normal file
View File

@ -0,0 +1,96 @@
#start {
background: linear-gradient(180deg, #E8F1F6 0%, #FFF 16.49%);
a {
color: @core-fleet-black-75;
}
h1 {
font-size: 32px;
font-weight: 800;
line-height: 150%;
}
[purpose='page-container'] {
padding-top: 80px;
padding-left: 64px;
padding-right: 64px;
display: flex;
flex-direction: column;
}
[purpose='start-cards'] {
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
margin-top: 40px;
margin-bottom: 40px;
}
[purpose='card'] {
width: 252px;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
text-decoration: none;
padding: 43px 52px;
background: #FFF;
color: @core-fleet-black-75;
border-radius: 12px;
border: 1px solid @core-vibrant-blue-15;
text-align: center;
img {
height: 64px;
margin-bottom: 16px;
}
h2 {
font-size: 16px;
font-weight: 800;
line-height: 120%;
margin-bottom: 4px;
}
p {
font-size: 12px;
font-weight: 400;
line-height: 150%;
white-space: nowrap;
margin-bottom: 0px;
}
&:first-of-type {
margin-right: 20px;
}
&:hover {
box-shadow: 0px 4px 16px 0px rgba(0, 0, 0, 0.10);
}
}
@media (max-width: 991px) {
[purpose='page-container'] {
padding-top: 60px;
padding-left: 40px;
padding-right: 40px;
}
}
@media (max-width: 768px) {
[purpose='page-container'] {
padding-top: 40px;
padding-left: 24px;
padding-right: 24px;
}
}
@media (max-width: 575px) {
[purpose='start-cards'] {
flex-direction: column;
padding-bottom: 120px;
}
[purpose='card']:first-of-type {
margin-right: unset;
margin-bottom: 20px;
}
}
@media (max-width: 375px) {
h1 {
font-size: 28px;
}
}
}

View File

@ -1,114 +0,0 @@
#register {
p {
font-size: 14px;
line-height: 20px;
color: @core-fleet-black-75;
}
h2 {
font-size: 32px;
font-style: normal;
font-weight: 800;
line-height: 38.4px;
margin-bottom: 16px;
}
a {
color: @core-vibrant-blue;
cursor: pointer;
}
input {
padding: 16px;
border-radius: 12px;
}
input:focus-visible {
border: 1px solid @core-vibrant-blue;
outline: none;
}
input::placeholder {
color: #8B8FA2;
}
[purpose='legal-text'] {
font-size: 12px;
font-style: normal;
font-weight: 400;
line-height: 18px;
text-align: center;
}
[purpose='sandbox-mdm-note'] {
padding: 16px 24px;
background: #F1F0FF;
border: 1px solid #B4B2FE;
box-shadow: 0px 3px 4px rgba(25, 33, 71, 0.22);
border-radius: 8px;
margin-bottom: 24px;
p {
line-height: 17px;
font-weight: 700;
color: #515774;
}
a {
font-weight: 400;
text-decoration: none;
}
}
[purpose='sandbox-image'] {
width: 300px;
margin-right: 65px;
}
[purpose='error-message'] {
font-size: 16px;
}
[parasails-component='cloud-error'] {
padding: 16px 10px 16px 16px;
}
[parasails-component='ajax-button'] {
border-radius: 12px;
font-size: 16px;
line-height: 18px;
padding-top: 17.5px;
padding-bottom: 17.5px;
}
[parasails-component='modal'] {
[purpose='modal-content'] {
margin-top: 0px;
max-width: 100vw;
height: 100vh;
width: 100vw;
background-color: #192147;
border: 0;
padding: 120px;
box-shadow: none;
overflow: hidden;
[purpose='modal-close-button'] {
margin-top: 40px;
margin-right: 40px;
color: #FFF;
opacity: 1;
}
}
[purpose='modal-dialog'] {
max-width: 100%;
margin: 0;
}
[purpose='embedded-content'] {
position: relative;
padding-bottom: 54.5%;
padding-top: 25px;
width: 100%;
iframe {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
}
}
@media (max-width: 768px) {
padding-top: 0px;
[purpose='sandbox-image'] {
margin-right: 0px;
margin-bottom: 16px;
width: 250px;
}
}
}

View File

@ -1,97 +0,0 @@
#sandbox-login {
p {
font-size: 14px;
line-height: 20px;
color: @core-fleet-black-75;
}
h2 {
font-size: 32px;
font-style: normal;
font-weight: 800;
line-height: 38.4px;
margin-bottom: 16px;
}
a {
color: @core-vibrant-blue;
cursor: pointer;
}
input {
padding: 16px;
border-radius: 12px;
}
input:focus-visible {
border: 1px solid @core-vibrant-blue;
outline: none;
}
input::placeholder {
color: #8B8FA2;
}
[purpose='legal-text'] {
font-size: 12px;
font-style: normal;
font-weight: 400;
line-height: 18px;
text-align: center;
}
[purpose='sandbox-image'] {
width: 300px;
margin-right: 65px;
}
[purpose='error-message'] {
font-size: 14px;
}
[parasails-component='cloud-error'] {
padding: 16px 10px 16px 16px;
}
[parasails-component='ajax-button'] {
border-radius: 12px;
font-size: 16px;
line-height: 18px;
padding-top: 17.5px;
padding-bottom: 17.5px;
}
[parasails-component='modal'] {
[purpose='modal-content'] {
margin-top: 0px;
max-width: 100vw;
height: 100vh;
width: 100vw;
background-color: #192147;
border: 0;
padding: 120px;
box-shadow: none;
overflow: hidden;
[purpose='modal-close-button'] {
margin-top: 40px;
margin-right: 40px;
color: #FFF;
opacity: 1;
}
}
[purpose='modal-dialog'] {
max-width: 100%;
margin: 0;
}
[purpose='embedded-content'] {
position: relative;
padding-bottom: 54.5%;
padding-top: 25px;
width: 100%;
iframe {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
}
}
@media (max-width: 768px) {
padding-top: 0px;
[purpose='sandbox-image'] {
margin-right: 0px;
margin-bottom: 16px;
width: 250px;
}
}
}

View File

@ -23,7 +23,6 @@ module.exports.policies = {
'view-homepage-or-redirect': true,
'view-faq': true,
'view-contact': true,
'view-fleetctl-preview': true,// Redirects not-logged-in users to /try-fleet/login
'view-pricing': true,
'legal/view-terms': true,
'legal/view-privacy': true,
@ -38,8 +37,6 @@ module.exports.policies = {
'deliver-demo-signup': true,
'articles/*': true,
'reports/*': true,
'try-fleet/view-register': true,
'try-fleet/view-sandbox-login': true,
'try-fleet/view-sandbox-teleporter-or-redirect-because-expired-or-waitlist': true,
'create-or-update-one-newsletter-subscription': true,
'unsubscribe-from-all-newsletters': true,

View File

@ -29,9 +29,11 @@ module.exports.routes = {
}
},
'GET /try-fleet/fleetctl-preview': {
'GET /try-fleet': {
action: 'view-fleetctl-preview',
locals: {
hideHeaderLinks: true,
hideFooterLinks: true,
pageTitleForMeta: 'fleetctl preview | Fleet',
pageDescriptionForMeta: 'Learn about getting started with Fleet using fleetctl.'
}
@ -104,7 +106,7 @@ module.exports.routes = {
pageDescriptionForMeta: 'Learn what data osquery can see.',
}
},
'GET /customers/new-license': {
'GET /new-license': {
action: 'customers/view-new-license',
locals: {
hideHeaderLinks: true,
@ -113,22 +115,22 @@ module.exports.routes = {
pageDescriptionForMeta: 'Generate your quote and start using Fleet Premium today.',
}
},
'GET /customers/register': {
'GET /register': {
action: 'entrance/view-signup',
locals: {
hideHeaderLinks: true,
hideFooterLinks: true,
pageTitleForMeta: 'Sign up | Fleet',
pageDescriptionForMeta: 'Sign up for a Fleet Premium license.',
pageDescriptionForMeta: 'Sign up for a Fleet account.',
}
},
'GET /customers/login': {
'GET /login': {
action: 'entrance/view-login',
locals: {
hideHeaderLinks: true,
hideFooterLinks: true,
pageTitleForMeta: 'Log in | Fleet',
pageDescriptionForMeta: 'Log in to the Fleet customer portal.',
pageDescriptionForMeta: 'Log in to Fleet.',
}
},
'GET /customers/dashboard': {
@ -167,24 +169,6 @@ module.exports.routes = {
}
},
'GET /try-fleet/register': {
action: 'try-fleet/view-register',
locals: {
hideFooterLinks: true,
pageTitleForMeta: 'Try Fleet | Fleet',
pageDescriptionForMeta: 'Get up and running in minutes to try out Fleet.',
}
},
'GET /try-fleet/login': {
action: 'try-fleet/view-sandbox-login',
locals: {
hideFooterLinks: true,
pageTitleForMeta: 'Sign in | Fleet',
pageDescriptionForMeta: 'Log in to Fleet.',
}
},
'GET /try-fleet/explore-data': {
action: 'try-fleet/view-explore-data',
locals: {
@ -301,6 +285,16 @@ module.exports.routes = {
}
},
'GET /start': {
action: 'view-start',
locals: {
hideHeaderLinks: true,
hideFooterLinks: true,
pageTitleForMeta: 'Start | Fleet',
pageDescriptionForMeta: 'Get Started with Fleet. Spin up a local demo or get your premium license key.',
}
},
// ╦╔╦╗╔═╗╔═╗╦╔╗╔╔═╗ ┌─┬ ┌─┐┌┐┌┌┬┐┬┌┐┌┌─┐ ┌─┐┌─┐┌─┐┌─┐┌─┐─┐
// ║║║║╠═╣║ ╦║║║║║╣ │ │ ├─┤│││ │││││││ ┬ ├─┘├─┤│ ┬├┤ └─┐ │
@ -353,7 +347,6 @@ module.exports.routes = {
// ```
// 'GET /docs/using-fleet/learn-how-to-use-fleet': '/docs/using-fleet/fleet-for-beginners',
// ```
'GET /try-fleet': '/get-started',
'GET /try': '/get-started',
'GET /docs/deploying/fleet-public-load-testing': '/docs/deploying/load-testing',
'GET /handbook/customer-experience': '/handbook/customers',
@ -469,7 +462,11 @@ module.exports.routes = {
'GET /docs/using-fleet/mdm-macos-updates': '/docs/using-fleet/mdm-os-updates',
'GET /example-windows-profile': 'https://github.com/fleetdm/fleet-gitops/blob/860dcf2609e2b25a6d6becf8006a7118a19cd615/lib/windows-screenlock.xml',// « resuable link for OS settings doc page
'GET /docs/using-fleet/mdm-custom-macos-settings': '/docs/using-fleet/mdm-custom-os-settings',
'GET /customers/login': '/login',
'GET /customers/register': '/register',
'GET /try-fleet/login': '/login',
'GET /try-fleet/register': '/register',
'GET /customers/new-license': '/new-license',
// ╔╦╗╦╔═╗╔═╗ ╦═╗╔═╗╔╦╗╦╦═╗╔═╗╔═╗╔╦╗╔═╗ ┬ ╔╦╗╔═╗╦ ╦╔╗╔╦ ╔═╗╔═╗╔╦╗╔═╗
// ║║║║╚═╗║ ╠╦╝║╣ ║║║╠╦╝║╣ ║ ║ ╚═╗ ┌┼─ ║║║ ║║║║║║║║ ║ ║╠═╣ ║║╚═╗
// ╩ ╩╩╚═╝╚═╝ ╩╚═╚═╝═╩╝╩╩╚═╚═╝╚═╝ ╩ ╚═╝ └┘ ═╩╝╚═╝╚╩╝╝╚╝╩═╝╚═╝╩ ╩═╩╝╚═╝
@ -490,22 +487,21 @@ module.exports.routes = {
'GET /legal': '/legal/terms',
'GET /terms': '/legal/terms',
'GET /handbook/security/github': '/handbook/security#git-hub-security',
'GET /login': '/customers/login',
'GET /slack': 'https://join.slack.com/t/osquery/shared_invite/zt-1wkw5fzba-lWEyke60sjV6C4cdinFA1w',// Note: This redirect is used on error pages and email templates in the Fleet UI.
'GET /docs/using-fleet/updating-fleet': '/docs/deploying/upgrading-fleet',
'GET /blog': '/articles',
'GET /brand': '/logos',
'GET /get-started': '/try-fleet/explore-data',
'GET /get-started': '/try-fleet',
'GET /g': (req,res)=> { let originalQueryStringWithAmp = req.url.match(/\?(.+)$/) ? '&'+req.url.match(/\?(.+)$/)[1] : ''; return res.redirect(301, sails.config.custom.baseUrl+'/?meet-fleet'+originalQueryStringWithAmp); },
'GET /test-fleet-sandbox': '/try-fleet/register',
'GET /test-fleet-sandbox': '/register',
'GET /unsubscribe': (req,res)=> { let originalQueryString = req.url.match(/\?(.+)$/) ? req.url.match(/\?(.+)$/)[1] : ''; return res.redirect(301, sails.config.custom.baseUrl+'/api/v1/unsubscribe-from-all-newsletters?'+originalQueryString);},
'GET /tables': '/tables/account_policy_data',
'GET /imagine/launch-party': 'https://www.eventbrite.com/e/601763519887',
'GET /blackhat2023': 'https://github.com/fleetdm/fleet/tree/main/tools/blackhat-mdm', // Assets from @marcosd4h & @zwass Black Hat 2023 talk
'GET /fleetctl-preview': '/try-fleet/fleetctl-preview',
'GET /try-fleet/sandbox-expired': '/try-fleet/fleetctl-preview',
'GET /try-fleet/sandbox': '/try-fleet/fleetctl-preview',
'GET /try-fleet/waitlist': '/try-fleet/fleetctl-preview',
'GET /fleetctl-preview': '/try-fleet',
'GET /try-fleet/sandbox-expired': '/try-fleet',
'GET /try-fleet/sandbox': '/try-fleet',
'GET /try-fleet/waitlist': '/try-fleet',
'GET /mdm': '/device-management',// « alias for radio ad
'GET /endpoint-operations': '/endpoint-ops',// « just in case we type it the wrong way

View File

@ -220,7 +220,7 @@ module.exports = {
<p>Vitae architecto reiciendis in temporibus consequatur doloremque reprehenderit perferendis? Eaque quod voluptates earum corporis, quo labore reprehenderit libero sint.</p>
<div purpose="button-row" class="d-flex flex-sm-row flex-column justify-content-center align-items-center">
<a purpose="cta-button" href="/contact">Talk to us</a>
<a purpose="animated-arrow-button-red" href="/pricing">Try it out</a>
<a purpose="animated-arrow-button-red" href="/register">Try it out</a>
</div>
</div>
</div>
@ -275,7 +275,7 @@ module.exports = {
<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="/contact">Talk to us</a>
<a purpose="animated-arrow-button-red" href="/pricing">Try it out</a>
<a purpose="animated-arrow-button-red" href="/register">Try it out</a>
</div>
</div>
@ -297,7 +297,7 @@ module.exports = {
<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="/contact">Talk to us</a>
<a purpose="animated-arrow-button-red" href="/pricing">Try it out</a>
<a purpose="animated-arrow-button-red" href="/register">Try it out</a>
</div>
</div>
</div>

View File

@ -372,17 +372,43 @@
</div>
<% } else { %>
<div purpose="reduced-nav-footer" data-nosnippet>
<div style="font-size: 11px; line-height: 18px;" class="d-sm-flex d-block flex-sm-row align-items-center justify-content-center">
<div class="d-flex flex-row align-items-center pb-2 pb-sm-0">
<img alt="Creative Commons Licence CC BY-SA 4.0" src="/images/logo-creative-commons-greyscale-80x16@2x.png" style="width: 80px; height: 15px; margin-right: 8px;"/>
<a purpose="footer-trust-link" class="d-flex flex-row align-items-center" href="/trust" target="_blank"><img alt="a small checkmark" style="width: 9px; height: auto; margin-right: 6px;" src="/images/icon-checkmark-fleet-black-75-9x7@2x.png">SOC2 Type 2 certified</a>
<div purpose="legal-and-social-nav" class="d-flex flex-md-row flex-column align-items-lg-center justify-content-md-between">
<div purpose="legal-section" class="d-flex flex-column justify-content-start align-items-start flex-sm-row pr-sm-0">
<div purpose="license-information" class="d-flex flex-row align-items-center">
<img purpose="creative-commons-license" alt="Creative Commons Licence CC BY-SA 4.0" src="/images/logo-creative-commons-greyscale-80x16@2x.png" />
<a purpose="footer-trust-link" class="d-flex flex-row align-items-center" href="/trust" target="_blank"><img alt="a small checkmark" src="/images/icon-checkmark-fleet-black-75-9x7@2x.png">SOC2 Type 2 certified</a>
</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 class="d-flex">
© <%= (new Date()).getFullYear() %> <%= corporationDisplayName %>
<a style="margin-left: 12px; font-size: 12px; text-underline-offset: 2.5px; text-decoration: underline; color: #515774" href="/legal/privacy">Privacy</a>
<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">
<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">
<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">
<img alt="LinkedIn logo" src="/images/logo-linkedin-24x24@2x.png" />
</a>
<a target="_blank" href="https://twitter.com/fleetctl" class="mr-4">
<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">
<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">
<img alt="Mastadon logo" src="/images/logo-mastadon-24x23@2x.png"/>
</a>
</div>
</div>
</div>
</div>
<% } %>
</div>
@ -504,13 +530,12 @@
<script src="/js/pages/query-detail.page.js"></script>
<script src="/js/pages/query-library.page.js"></script>
<script src="/js/pages/reports/state-of-device-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/explore-data.page.js"></script>
<script src="/js/pages/try-fleet/query-report.page.js"></script>
<script src="/js/pages/try-fleet/register.page.js"></script>
<script src="/js/pages/try-fleet/sandbox-expired.page.js"></script>
<script src="/js/pages/try-fleet/sandbox-login.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/upgrade.page.js"></script>

View File

@ -26,7 +26,7 @@
<a href="/contact" class="d-flex btn btn-primary justify-content-center align-items-center" purpose="next-steps-button">
Talk to us
</a>
<a href="/pricing" purpose="animated-arrow-button-red">
<a href="/register" purpose="animated-arrow-button-red">
Try it out
</a>
</div>

View File

@ -19,7 +19,7 @@
<p>You can use Fleets API to customize every aspect of conditional access even the stuff your CISO hasnt thought of yet.</p>
<div purpose="button-row" class="d-flex flex-md-row flex-column justify-content-start align-items-center">
<a purpose="cta-button" href="/contact">Talk to us</a>
<a purpose="animated-arrow-button-red" href="/pricing">Try it out</a>
<a purpose="animated-arrow-button-red" href="/register">Try it out</a>
</div>
</div>
</div>
@ -207,7 +207,7 @@
<h2>Manage everything in one place</h2>
<div purpose="button-row" style="margin-top: 32px;" class="d-flex flex-md-row flex-column justify-content-center align-items-center mx-auto">
<a purpose="cta-button" href="/contact">Talk to us</a>
<a purpose="animated-arrow-button-red" href="/pricing">Try it out</a>
<a purpose="animated-arrow-button-red" href="/register">Try it out</a>
</div>
</div>
</div>

View File

@ -19,7 +19,7 @@
<p>You dont need to be an osquery expert to get the answers you need from your devices, Fleet does some of that for you.</p>
<div purpose="button-row" class="d-flex flex-md-row flex-column justify-content-start align-items-center">
<a purpose="cta-button" href="/contact">Talk to us</a>
<a purpose="animated-arrow-button-red" href="/pricing">Try it out</a>
<a purpose="animated-arrow-button-red" href="/register">Try it out</a>
</div>
</div>
</div>
@ -195,7 +195,7 @@
<h3>A consistent interface</h3>
<div purpose="button-row" style="margin-top: 32px;" class="d-flex flex-md-row flex-column justify-content-center align-items-center mx-auto">
<a purpose="cta-button" href="/contact">Talk to us</a>
<a purpose="animated-arrow-button-red" href="/pricing">Try it out</a>
<a purpose="animated-arrow-button-red" href="/register">Try it out</a>
</div>
</div>
</div>

View File

@ -12,7 +12,7 @@
<ajax-form class="customers-login" action="login" :syncing.sync="syncing" :cloud-error.sync="cloudError" :form-data="formData" :form-rules="formRules" :form-errors.sync="formErrors" @submitted="submittedForm()">
<div class="form-group">
<label for="email">Email</label>
<span style="float: right" class="text-right small" v-if="showCustomerLogin"><a href="/customers/register">Create an account</a></span>
<span style="float: right" class="text-right small" v-if="showCustomerLogin"><a :href="registrationSlug">Create an account</a></span>
<input type="email" class="form-control" :class="[formErrors.emailAddress ? 'is-invalid' : '']" v-model.trim="formData.emailAddress" autocomplete="email" focus-first>
<div class="invalid-feedback" v-if="formErrors.emailAddress">Please provide a valid email address.</div>
</div>

View File

@ -1,14 +1,14 @@
<div id="signup" v-cloak>
<div style="max-width: 560px;" class="container-fluid pb-5 px-lg-0 px-3">
<div purpose="page-heading">
<h1 class="text-center">Welcome to Premium</h1>
<p class="text-center pb-2">We just need a few details in order to get you a self-hosted Fleet Premium license key.</p>
<h1 class="text-center">Welcome to Fleet</h1>
<p class="text-center pb-2">We just need a few details in order to get started.</p>
</div>
<div purpose="customer-portal-form" class="card card-body">
<ajax-form action="signup" class="self-service-register" :syncing.sync="syncing" :cloud-error.sync="cloudError" :form-errors.sync="formErrors" :form-data="formData" :form-rules="formRules" @submitted="submittedSignUpForm()">
<div class="form-group">
<label for="email-address">Email</label>
<span style="float: right" class="text-right small"><a href="/customers/login">I have an account</a></span>
<span style="float: right" class="text-right small"><a :href="loginSlug">I have an account</a></span>
<input class="form-control" id="email-address" :class="[formErrors.emailAddress ? 'is-invalid' : '']" v-model.trim="formData.emailAddress" @input="typeClearOneFormError('emailAddress')">
<div class="invalid-feedback" v-if="formErrors.emailAddress" focus-first>This doesnt appear to be a valid email address</div>
</div>

View File

@ -102,7 +102,7 @@
</div>
</div>
</div>
<h2>Next steps</h2>
<h2 class="pt-0">Next steps</h2>
<div purpose="next-steps" class="d-flex flex-sm-row flex-column align-items-center">
<a purpose="docs-button" href="/docs" class="btn btn-primary">
Read the docs

View File

@ -11,7 +11,7 @@
<p>Replace the sprawl with open-source code that works the way you want.</p>
<div purpose="button-row" class="d-flex flex-sm-row flex-column justify-content-center align-items-center">
<a purpose="cta-button" href="/contact">Talk to us</a>
<a purpose="animated-arrow-button-red" href="/pricing">Try it out</a>
<a purpose="animated-arrow-button-red" href="/register">Try it out</a>
</div>
</div>
</div>
@ -321,7 +321,7 @@
<h1><%- partial('../partials/primary-tagline.partial.ejs') %></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="/contact">Talk to us</a>
<a purpose="animated-arrow-button-red" href="/pricing">Try it out</a>
<a purpose="animated-arrow-button-red" href="/register">Try it out</a>
</div>
</div>
</div>

View File

@ -9,7 +9,7 @@
<p>Automate security workflows in a single application by creating or installing policies to identify which devices comply with your security guidelines.</p>
<div purpose="button-row" class="d-flex flex-sm-row flex-column justify-content-center align-items-center">
<a purpose="cta-button" href="/contact">Talk to us</a>
<a purpose="animated-arrow-button-red" href="/pricing">Try it out</a>
<a purpose="animated-arrow-button-red" href="/register">Try it out</a>
</div>
</div>
</div>
@ -64,7 +64,7 @@
<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="/contact">Talk to us</a>
<a purpose="animated-arrow-button-red" href="/pricing">Try it out</a>
<a purpose="animated-arrow-button-red" href="/register">Try it out</a>
</div>
</div>
@ -86,7 +86,7 @@
<h1>Think for yourself</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="/contact">Talk to us</a>
<a purpose="animated-arrow-button-red" href="/pricing">Try it out</a>
<a purpose="animated-arrow-button-red" href="/register">Try it out</a>
</div>
</div>
</div>

View File

@ -9,7 +9,7 @@
<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="/contact">Talk to us</a>
<a purpose="animated-arrow-button-red" href="/pricing">Try it out</a>
<a purpose="animated-arrow-button-red" href="/register">Try it out</a>
</div>
</div>
</div>
@ -38,7 +38,7 @@
<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="/contact">Talk to us</a>
<a purpose="animated-arrow-button-red" href="/pricing">Try it out</a>
<a purpose="animated-arrow-button-red" href="/register">Try it out</a>
</div>
</div>
@ -60,7 +60,7 @@
<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="/contact">Talk to us</a>
<a purpose="animated-arrow-button-red" href="/pricing">Try it out</a>
<a purpose="animated-arrow-button-red" href="/register">Try it out</a>
</div>
</div>
</div>

View File

@ -9,7 +9,7 @@
<p>Fleet, an open-source security platform, empowers you to take control of vulnerability management for your organization. Designed with modern DevOps practices in mind, Fleet offers superior visibility, rapid response capabilities, and seamless integration with your existing workflows.</p>
<div purpose="button-row" class="d-flex flex-sm-row flex-column justify-content-center align-items-center">
<a purpose="cta-button" href="/contact">Talk to us</a>
<a purpose="animated-arrow-button-red" href="/pricing">Try it out</a>
<a purpose="animated-arrow-button-red" href="/register">Try it out</a>
</div>
</div>
</div>
@ -79,7 +79,7 @@
<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="/contact">Talk to us</a>
<a purpose="animated-arrow-button-red" href="/pricing">Try it out</a>
<a purpose="animated-arrow-button-red" href="/register">Try it out</a>
</div>
</div>
@ -101,7 +101,7 @@
<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="/contact">Talk to us</a>
<a purpose="animated-arrow-button-red" href="/pricing">Try it out</a>
<a purpose="animated-arrow-button-red" href="/register">Try it out</a>
</div>
</div>
</div>

View File

@ -9,7 +9,7 @@
<p>Fleet, the leading open-source, flexible device management solution, offers unprecedented visibility into your IT infrastructure, making it the ideal tool to discover and manage unused software licenses. This capability is essential to unlocking more IT budget, enhancing security, and ultimately improving the employee experience.</p>
<div purpose="button-row" class="d-flex flex-sm-row flex-column justify-content-center align-items-center">
<a purpose="cta-button" href="/contact">Talk to us</a>
<a purpose="animated-arrow-button-red" href="/pricing">Try it out</a>
<a purpose="animated-arrow-button-red" href="/register">Try it out</a>
</div>
</div>
</div>
@ -65,7 +65,7 @@
<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="/contact">Talk to us</a>
<a purpose="animated-arrow-button-red" href="/pricing">Try it out</a>
<a purpose="animated-arrow-button-red" href="/register">Try it out</a>
</div>
</div>

View File

@ -332,7 +332,7 @@
</div>
<div purpose="cta-btns" class="mx-auto d-flex flex-sm-row flex-column justify-content-center">
<a purpose="get-started-btn" class="d-sm-flex align-items-center justify-content-center btn btn-primary mx-auto mr-sm-4 ml-sm-0" href="/contact">Talk to us</a>
<a purpose="animated-arrow-btn-red" style="max-width: 220px;" class="btn btn-lg btn-white mr-2 pl-0 mx-auto mx-sm-0 mt-2 mt-sm-0" href="/pricing">Try it out
<a purpose="animated-arrow-btn-red" style="max-width: 220px;" class="btn btn-lg btn-white mr-2 pl-0 mx-auto mx-sm-0 mt-2 mt-sm-0" href="/register">Try it out
</a>
</div>
</div>
@ -544,7 +544,7 @@
</div>
<div purpose="cta-btns" class="mx-auto d-flex flex-sm-row flex-column justify-content-center">
<a purpose="get-started-btn" class="d-sm-flex align-items-center justify-content-center btn btn-primary mx-auto mr-sm-4 ml-sm-0" href="/contact">Talk to us</a>
<a purpose="animated-arrow-btn-red" style="max-width: 220px;" class="btn btn-lg mr-2 pl-0 mx-auto mx-sm-0 mt-2 mt-sm-0" href="/pricing">Try it out
<a purpose="animated-arrow-btn-red" style="max-width: 220px;" class="btn btn-lg mr-2 pl-0 mx-auto mx-sm-0 mt-2 mt-sm-0" href="/register">Try it out
</a>
</div>
</div>

21
website/views/pages/start.ejs vendored Normal file
View File

@ -0,0 +1,21 @@
<div id="start" v-cloak>
<div class="d-flex container" purpose="page-container">
<div class="text-center mx-auto">
<h1>Welcome to Fleet</h1>
<p class="mb-0">Spin up a local demo or get your Fleet Premium license key.</p>
</div>
<div purpose="start-cards">
<a purpose="card" href="/try-fleet">
<img alt="Run a local demo of Fleet" src="/images/start-try-fleet-64x64@2x.png">
<h2>Try Fleet</h2>
<p>Run a local demo of Fleet</p>
</a>
<a purpose="card" href="/new-license">
<img alt="Purchase a Fleet Premium license" src="/images/start-purchase-license-64x64@2x.png">
<h2>Start</h2>
<p>Purchase a Fleet Premium license</p>
</a>
</div>
</div>
</div>
<%- /* Expose server-rendered data as window.SAILS_LOCALS :: */ exposeLocalsToBrowser() %>

View File

@ -1,65 +0,0 @@
<div id="register" v-cloak>
<div style="max-width: 800px; padding-top: 80px; padding-bottom: 80px;" class="container d-flex flex-md-row flex-column justify-content-center align-items-center mx-auto px-4 px-md-3">
<div style="max-width: 400px;" class="flex-column d-flex">
<h2>Explore real data</h2>
<p class="mb-4">
See live data collected from a real device enrolled in Fleet.
</p>
<div>
<ajax-form :handle-submitting="handleSubmittingRegisterForm" class="sandbox-register" :syncing.sync="syncing" :cloud-error.sync="cloudError" :form-errors.sync="formErrors" :form-data="formData" :form-rules="formRules" @submitted="submittedRegisterForm()">
<div class="form-group mb-3">
<div class="d-flex flex-row">
<div class="d-flex flex-column mr-2">
<input id="firstName" type="text" class="form-control d-flex" :class="[formErrors.firstName ? 'is-invalid' : '']" v-model.trim="formData.firstName" placeholder="First name">
<div class="invalid-feedback mt-2" v-if="formErrors.firstName === 'required'">Please enter your first name.</div>
</div>
<div class="d-flex flex-column">
<input id="lastName" type="text" class="form-control d-flex" :class="[formErrors.lastName ? 'is-invalid' : '']" v-model.trim="formData.lastName" placeholder="Last name">
<div class="invalid-feedback mt-2" v-if="formErrors.lastName === 'required'">Please enter your last name.</div>
</div>
</div>
</div>
<div class="form-group mb-3">
<input id="organization" type="text" class="form-control d-flex w-100" :class="[formErrors.organization ? 'is-invalid' : '']" v-model.trim="formData.organization" placeholder="Company">
<div class="invalid-feedback mt-2" v-if="formErrors.organization === 'required'">Please enter the name of your organization.</div>
</div>
<div class="form-group mb-3">
<input id="emailAddress" type="text" class="form-control d-flex w-100" :class="[formErrors.emailAddress ? 'is-invalid' : '']" v-model.trim="formData.emailAddress" placeholder="Email address">
<div class="invalid-feedback mt-2">This doesnt appear to be a valid email address</div>
</div>
<div class="form-group mb-3">
<input id="password" type="password" class="form-control d-flex w-100" :class="[formErrors.password ? 'is-invalid' : '']" v-model.trim="formData.password" placeholder="Choose a password">
<div class="invalid-feedback mt-2" v-if="formErrors.password === 'minLength'">Password too short.</div>
<div class="invalid-feedback mt-2" v-if="formErrors.password === 'required'">Please enter a password.</div>
</div>
<ajax-button style="height: 53px;" purpose="submit-button" spinner="true" type="submit" :syncing="syncing" class="btn btn-block btn-lg btn-primary" v-if="!cloudError">Sign up</ajax-button>
<div class="d-flex flex-column" v-if="cloudError === 'emailAlreadyInUse'">
<cloud-error class="my-0">
<p purpose="error-message">This email is already linked to a Fleet account.</p>
</cloud-error>
<a class="mx-auto font-weight-bold d-flex align-items-center py-3" href="/try-fleet/login">Sign in with existing account <img alt="A blue arrow pointing right" style="height: 10px; margin-left: 6px;" src="/images/arrow-right-blue-18x10@2x.png"></a>
<ajax-button style="height: 53px;" purpose="submit-button" spinner="true" type="submit" :syncing="syncing" class="btn btn-block btn-lg btn-primary">Try again</ajax-button>
</div>
<cloud-error purpose="cloud-error" v-else-if="cloudError === 'requestToProvisionerTimedOut'">
<p purpose="error-message">Fleet Sandbox is experiencing unusually high activity. Please refresh the page in 13 seconds and try signing up again.</p>
</cloud-error>
<cloud-error purpose="cloud-error" v-else-if="cloudError"></cloud-error>
</ajax-form>
</div>
<div class="d-flex flex-column" v-if="!cloudError">
<a class="mx-auto d-flex py-3" :href="loginSlug">I have an account</a>
<p purpose="legal-text" class="pt-4">By signing in you agree to the <a href="https://docs.google.com/document/d/1OM6YDVIs7bP8wg6iA3VG13X086r64tWDqBSRudG4a0Y" target="_blank">terms of service</a> and <a href="https://docs.google.com/document/d/17i_g1aGpnuSmlqj35-yHJiwj7WRrLdC_Typc1Yb7aBE" target="_blank">privacy policy</a>.</p>
</div>
</div>
</div>
<modal v-if="modal === 'video'" @close="closeModal()" v-cloak>
<div style="height: 100%;" class="d-flex flex-column align-items-center justify-content-center">
<div purpose="embedded-content" class="container-lg">
<iframe id="ytplayer" type="text/html"
src="https://www.youtube.com/embed/iQtdpZYxiqI?autoplay=1&controls=1&modestbranding=1&playsinline=1&color=white"
frameborder="0" allowfullscreen autoplay></iframe>
</div>
</div>
</modal>
</div>
<%- /* Expose server-rendered data as window.SAILS_LOCALS :: */ exposeLocalsToBrowser() %>

View File

@ -1,47 +0,0 @@
<div id="sandbox-login" v-cloak>
<div style="max-width: 800px; padding-top: 80px; padding-bottom: 80px;" class="container d-flex flex-md-row flex-column justify-content-center align-items-center mx-auto px-4 px-md-3">
<div style="max-width: 400px;" class="flex-column d-flex">
<h2>Explore real data</h2>
<p class="mb-4">
See live data collected from a real device enrolled in Fleet.
</p>
<div>
<ajax-form action="login" class="sandbox-login" :syncing.sync="syncing" :cloud-error.sync="cloudError" :form-errors.sync="formErrors" :form-data="formData" :form-rules="formRules" @submitted="submittedLoginForm()" >
<div class="form-group mb-3">
<input id="emailAddress" type="text" class="form-control d-flex w-100" :class="[formErrors.emailAddress ? 'is-invalid' : '']" v-model.trim="formData.emailAddress" placeholder="Email">
<div class="invalid-feedback mt-2">This doesnt appear to be a valid email address</div>
</div>
<div class="form-group mb-3">
<input id="password" type="password" class="form-control d-flex w-100" :class="[formErrors.password ? 'is-invalid' : '']" v-model.trim="formData.password" placeholder="Password">
<div class="invalid-feedback mt-2" v-if="formErrors.password === 'minLength'">Password too short.</div>
<div class="invalid-feedback mt-2" v-if="formErrors.password === 'required'">Please enter a password.</div>
</div>
<cloud-error v-if="cloudError==='badCombo' || cloudError==='noUser'">
<p purpose="error-message">Something's not right with your email or password</p>
</cloud-error>
<cloud-error purpose="cloud-error" v-else-if="cloudError"></cloud-error>
<ajax-button style="height: 53px;" purpose="submit-button" spinner="true" type="submit" :syncing="syncing" class="btn btn-block btn-lg btn-primary">Sign in</ajax-button>
</ajax-form>
</div>
<div class="d-flex flex-column">
<div class="mx-sm-auto d-flex flex-column flex-sm-row justify-content-start align-items-start justify-content-sm-center py-3">
<a href="/customers/forgot-password">Forgot your password?</a>
<span class="d-none d-sm-inline">&ensp;|&ensp;</span>
<a class="pt-2 pt-sm-0" :href="registrationSlug">Create an account</a>
</div>
<p purpose="legal-text">By signing in you agree to the <a href="https://docs.google.com/document/d/1OM6YDVIs7bP8wg6iA3VG13X086r64tWDqBSRudG4a0Y" target="_blank">terms of service</a> and <a href="https://docs.google.com/document/d/17i_g1aGpnuSmlqj35-yHJiwj7WRrLdC_Typc1Yb7aBE" target="_blank">privacy policy</a>.</p>
</div>
</div>
</div>
<modal v-if="modal === 'video'" @close="closeModal()" v-cloak>
<div style="height: 100%;" class="d-flex flex-column align-items-center justify-content-center">
<div purpose="embedded-content" class="container-lg">
<iframe id="ytplayer" type="text/html"
src="https://www.youtube.com/embed/iQtdpZYxiqI?autoplay=1&controls=1&modestbranding=1&playsinline=1&color=white"
frameborder="0" allowfullscreen autoplay></iframe>
</div>
</div>
</modal>
</div>
<%- /* Expose server-rendered data as window.SAILS_LOCALS :: */ exposeLocalsToBrowser() %>

View File

@ -19,7 +19,7 @@
<p>Use open data and APIs to connect your vulnerability solution with osquery, the agent you might already have deployed.</p>
<div purpose="button-row" class="d-flex flex-md-row flex-column justify-content-start align-items-center">
<a purpose="cta-button" href="/contact">Talk to us</a>
<a purpose="animated-arrow-button-red" href="/pricing">Try it out</a>
<a purpose="animated-arrow-button-red" href="/register">Try it out</a>
</div>
</div>
</div>
@ -142,7 +142,7 @@
<h2>Build the vulnerability program you actually want</h2>
<div purpose="button-row" style="margin-top: 32px;" class="d-flex flex-md-row flex-column justify-content-center align-items-center mx-auto">
<a purpose="cta-button" href="/contact">Talk to us</a>
<a purpose="animated-arrow-button-red" href="/pricing">Try it out</a>
<a purpose="animated-arrow-button-red" href="/register">Try it out</a>
</div>
</div>
</div>