tag coverted from Markdown. + margin-bottom: 0; + } + ol, ul { // adding padding to nested lists + padding-top: 16px; + li:last-child { // removing the padding from the last item of nested lists + padding-bottom: 0px; + } + } + } + ol { + counter-reset: custom-counter; + list-style-type: none; + padding-inline-start: 0px; + padding: 0; + margin-top: 16px; + margin-bottom: 20px; + ul > li { + text-indent: 0px; + margin-left: 0px; + } + > li { + counter-increment: custom-counter; + margin-left: 36px; + text-indent: -36px; + padding-left: 0px; + margin-bottom: 16px; + code:not(.nohighlight):not(.mermaid) { + display: inline; + } + p { + display: inline; + margin-bottom: 0px; + } + blockquote { + text-indent: 0px; + } + } + > li::before { + content: counter(custom-counter); + background-color: #E2E4EA; + width: 24px; + font-size: 13px; + display: inline-block; + border-radius: 50%; + margin-right: 10px; + padding: 2px 4px; + text-align: center; + line-height: 20px; + text-indent: 0px; + } + } + a > code:not(.hljs):not(.nohighlight):not(.mermaid) { + color: inherit; + text-decoration: inherit; + } + code:not(.bash):not(.hljs):not(.nohighlight):not(.mermaid) { + background: #F1F0FF; + padding: 4px 8px; + font-family: @code-font; + font-size: 13px; + line-height: 16px; + color: @core-fleet-black; + } + pre { + code { + background: none; + padding: 0px; + font-family: @code-font; + font-size: 13px; + line-height: 16px; + color: @core-fleet-black; + } + padding: 24px; + border: 1px solid #E2E4EA; + border-radius: 6px; + margin: 0px 0px 40px; + font-family: @code-font; + background: #F9FAFC; + white-space: break-spaces; + } + code.mermaid:not([data-processed='true']) { + opacity: 0; + } + code.mermaid { + color: @core-fleet-black-75; + margin-bottom: 16px; + font-family: @code-font; + display: inline-block; + margin-left: auto; + margin-right: auto; + background: #fff; + svg { + max-height: 600px; + } + } + blockquote { + display: block; + position: relative; + } + [purpose='quote'] { + margin: 72px 0 32px 0px; + font-style: italic; + line-height: 150%; + font-size: 20px; + max-width: 640px; + p { + margin-top: 8px; + } + } + [purpose='large-quote'] { + margin: 72px 0 32px 0px; + font-style: italic; + line-height: 150%; + margin-bottom: 24px; + font-size: 16px; + p:last-of-type { + margin-bottom: 0px; + } + strong { + color: #515774; + font-family: Inter; + font-size: 12px; + font-style: normal; + font-weight: 700; + line-height: 18px; + } + } + [purpose='large-quote']::before, [purpose='quote']::before { + content: ' '; + background-image: url('/images/icon-quote-21x17@2x.png'); + background-repeat: no-repeat; + background-size: 21px 17px; + display: block; + position: relative; + top: -16px; + left: 0px; + width: 21px; + height: 17px; + } + [purpose='attribution-quote'], [purpose='large-quote'] { + margin: 72px 0 32px 0px; + p { + font-style: italic; + line-height: 150%; + margin-bottom: 24px; + font-size: 20px; + } + p:last-of-type { + margin-bottom: 0px; + } + strong { + color: #515774; + font-family: Inter; + font-size: 12px; + font-style: normal; + font-weight: 700; + line-height: 18px; + } + } + [purpose='attribution-quote']::before { + content: ' '; + background-image: url('/images/icon-quote-21x17@2x.png'); + background-repeat: no-repeat; + background-size: 21px 17px; + display: block; + position: relative; + top: -16px; + left: 0px; + width: 21px; + height: 17px; + } + [purpose='checklist'] { + margin-bottom: 32px; + p { + font-size: 16px; + line-height: 150%; + font-style: normal; + font-weight: 400; + padding-left: 40px; + text-indent: -40px; + margin-bottom: 16px; + padding-top: 12px; + padding-bottom: 12px; + &:last-of-type { + margin-bottom: 0px; + } + } + p::before { + content: ' '; + background-image: url('/images/icon-checkbox-checked-24x24@2x.png'); + background-size: 24px 24px; + display: inline-block; + position: relative; + top: 7px; + margin-right: 16px; + width: 24px; + height: 24px; + } + } + [purpose='tip'] { + margin: 16px 0 32px; + background: #F7F7FC; + border: 1px solid @core-vibrant-blue-50; + padding: 16px; + border-radius: 8px; + display: flex; + img { + display: flex; + margin: 4px 12px 0 0; + height: 16px; + width: 16px; + padding: 0px; + } + p { + display: block; + margin-bottom: 16px; + line-height: 24px; + font-size: 16px; + } + p:only-child, p:last-child { + margin-bottom: 0px; + } + ul:last-child { + margin-bottom: 0px; + } + li:last-child { + padding-bottom: 0px; + } + :first-child {// Remove top padding from the first element inside purpose="tip" blockquotes + padding-top: 0; + } + } + [purpose='embedded-content'] { + position: relative; + margin-bottom: 40px; + width: 100%; + padding-bottom: 57%; + iframe { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + } + } + [purpose='embedded-document'] { + margin-bottom: 40px; + width: 100%; + height: 800px; + } + table { + table-layout: auto; + border: 1px solid @border-lt-gray; + border-collapse: collapse; + font-size: 16px; + line-height: 28px; + margin-bottom: 16px; + max-width: 100%; + th { + font-weight: @bold; + border: 1px solid @border-lt-gray; + padding: 8px 7px 7px 8px; + } + td { + border: 1px solid @border-lt-gray; + padding: 8px 7px 7px 8px; + } + } + } + [purpose='social-share-and-edit-buttons'] { + padding-top: 24px; + margin-top: 64px; + border-top: 1px solid #E2E4EA; + [purpose='social-share-buttons'] { + gap: 16px; + img { + width: 20px; + height: 20px; + padding: 0; + } + } + [purpose='edit-link'] { + a { + font-size: 14px; + line-height: 20px; + display: flex; + flex-direction: row; + align-items: center; + gap: 12px; + text-decoration: none; + img { + width: 16px; + padding: 0; + height: 16px; + } + } + + } + + + } + + @media (max-width: 991px) { + [purpose='page-container'] { + max-width: 1200px; + padding: 48px; + } + [purpose='right-sidebar'] { + margin-top: 64px; + margin-bottom: 48px; + width: 100%; + } + .header-hidden { + transform: translateY(0); + } + + [purpose='article-container'] { + max-width: 100%; + padding-right: 0px; + display: flex; + flex-direction: column; + } + [purpose='article-content'] { + padding-bottom: 0px; + } + [purpose='webinar-recording-form'] { + max-width: 324px; + } + [purpose='article-title-and-introduction'] { + margin-bottom: 0px; + padding-top: 0px; + width: 100%; + } + [purpose='article-title-and-image'] { + display: flex; + flex-direction: column; + gap: 48px; + justify-content: center; + align-items: center; + } + [purpose='article-image'] { + width: 100%; + img { + height: unset; + width: 100%; + } + } + } + + @media (max-width: 769px) { + [purpose='article-title'] { + padding-top: 40px; + margin-bottom: 8px; + h1 { + font-size: 28px; + line-height: 38px; + } + } + [purpose='article-content'] { + img { + padding-bottom: 0px; + } + img + em { // Image captions + top: 4px; + margin-bottom: 16px; + } + } + + } + @media (max-width: 575px) { + [purpose='page-container'] { + padding: 32px 24px; + } + [purpose='article-title-and-introduction'] { + h1 { + color: #192147; + + /* Heading/H1 */ + font-family: Inter; + font-size: 32px; + font-style: normal; + font-weight: 800; + line-height: 120%; + } + + } + [purpose='article-content'] { + h2 { + color: #192147; + + /* Heading/H2 */ + font-family: Inter; + font-size: 24px; + font-style: normal; + font-weight: 800; + line-height: 120%; + } + h3 { + color: #192147; + + /* Heading/H3 */ + font-family: Inter; + font-size: 20px; + font-style: normal; + font-weight: 800; + line-height: 120%; + } + } + } + +} diff --git a/website/config/policies.js b/website/config/policies.js index 448fff8115..fc98f82e9f 100644 --- a/website/config/policies.js +++ b/website/config/policies.js @@ -77,4 +77,5 @@ module.exports.policies = { 'deliver-whitepaper-download-request': true, 'deliver-partner-registration-submission': true, 'view-partners': true, + 'deliver-webinar-access-request': true, }; diff --git a/website/config/routes.js b/website/config/routes.js index b20a2a6bdf..55710812c9 100644 --- a/website/config/routes.js +++ b/website/config/routes.js @@ -626,6 +626,23 @@ module.exports.routes = { } }, + + 'GET /webinars/:slug': { + action: 'articles/view-basic-webinar', + locals: { + displayVideo: false, + } + }, + + 'GET /webinars/:slug/watch': { + action: 'articles/view-basic-webinar', + locals: { + displayVideo: true, + disableChatbotAndIndexing: true, + hideFooterLinks: true, + } + }, + // ╦ ╔═╗╔═╗╔═╗╔═╗╦ ╦ ╦═╗╔═╗╔╦╗╦╦═╗╔═╗╔═╗╔╦╗╔═╗ // ║ ║╣ ║ ╦╠═╣║ ╚╦╝ ╠╦╝║╣ ║║║╠╦╝║╣ ║ ║ ╚═╗ // ╩═╝╚═╝╚═╝╩ ╩╚═╝ ╩ ╩╚═╚═╝═╩╝╩╩╚═╚═╝╚═╝ ╩ ╚═╝ @@ -1351,6 +1368,7 @@ module.exports.routes = { 'POST /api/v1/deliver-gitops-request': { action: 'deliver-gitops-workshop-request' }, 'POST /api/v1/admin/reset-one-fleet-premium-local-trial': { action: 'admin/reset-one-fleet-premium-local-trial' }, 'POST /api/v1/deliver-whitepaper-download-request': { action: 'deliver-whitepaper-download-request' }, + 'POST /api/v1/deliver-webinar-access-request': { action: 'deliver-webinar-access-request' }, 'POST /api/v1/deliver-partner-registration-submission': { action: 'deliver-partner-registration-submission' }, // ╔╦╗╦╔═╗╦═╗╔═╗╔═╗╔═╗╔═╗╔╦╗ ╔═╗╦═╗╔═╗═╗ ╦╦ ╦ ╔═╗╔╗╔╔╦╗╔═╗╔═╗╦╔╗╔╔╦╗╔═╗ diff --git a/website/scripts/build-static-content.js b/website/scripts/build-static-content.js index 945c84159d..10988c3ffb 100644 --- a/website/scripts/build-static-content.js +++ b/website/scripts/build-static-content.js @@ -666,7 +666,7 @@ module.exports = { throw new Error(`Failed compiling markdown content: An article page is missing a category meta tag () at "${path.join(topLvlRepoPath, pageSourcePath)}". To resolve, add a meta tag with the category of the article`); } else { // Throwing an error if the article has an invalid category. - let validArticleCategories = ['deploy', 'articles', 'security', 'engineering', 'success stories', 'announcements', 'guides', 'releases', 'podcasts', 'report', 'case study', 'comparison', 'whitepaper' ]; + let validArticleCategories = ['deploy', 'articles', 'security', 'engineering', 'success stories', 'announcements', 'guides', 'releases', 'podcasts', 'report', 'case study', 'comparison', 'whitepaper', 'webinar' ]; if(!validArticleCategories.includes(embeddedMetadata.category)) { throw new Error(`Failed compiling markdown content: An article page has an invalid category meta tag () at "${path.join(topLvlRepoPath, pageSourcePath)}". To resolve, change the meta tag to a valid category, one of: ${validArticleCategories}`); } @@ -764,6 +764,22 @@ module.exports = { } } } + // If this is a webinar article, we'll check to make sure it has a webinarEmbeddedVideoUrl meta tag. + if(embeddedMetadata.category === 'webinar') { + if(!embeddedMetadata.webinarEmbeddedVideoUrl){ + throw new Error(`Failed compiling markdown content: A webinar article is missing a 'webinarEmbeddedVideoUrl' meta tag at ${path.join(topLvlRepoPath, pageSourcePath)}. To resolve, add a webinarEmbeddedVideoUrl meta tag with a value that is the URL of the webinar this article is presenting, and try running this script again.`); + } else { + let parsedVideoUrl; + try { + parsedVideoUrl = URL.parse(embeddedMetadata.webinarEmbeddedVideoUrl); + } catch(err) { + throw new Error(`Failed compiling markdown content: A webinar article has an invalid "webinarEmbeddedVideoUrl" value (${embeddedMetadata.webinarEmbeddedVideoUrl}) at ${path.join(topLvlRepoPath, pageSourcePath)}. Please change this value to be a valid URL of the webinar recording with no query strings.`, err); + } + if(parsedVideoUrl.search) { + throw new Error(`Failed compiling markdown content: A webinar article has a "webinarEmbeddedVideoUrl" value that contains query strings (${parsedVideoUrl.search}) at ${path.join(topLvlRepoPath, pageSourcePath)}. To resolve, remove the query strings from this value and try running this script again. `); + } + } + } // If this is a comparison article, we will require a different set of meta tags and will determine the URL of the page using the articleSlugInCategory meta tag. if(embeddedMetadata.category === 'comparison') { if(!embeddedMetadata.articleSlugInCategory){ @@ -780,7 +796,7 @@ module.exports = { // If the article is categorized as 'product' we'll replace the category with 'use-cases', or if it is categorized as 'success story' we'll replace it with 'device-management' rootRelativeUrlPath = ( '/' + - (encodeURIComponent(embeddedMetadata.category === 'success stories' ? 'success-stories' : embeddedMetadata.category === 'security' ? 'securing' : embeddedMetadata.category === 'whitepaper' ? 'whitepapers' : embeddedMetadata.category === 'case study' ? 'case-study' : embeddedMetadata.category)) + '/' + + (encodeURIComponent(embeddedMetadata.category === 'success stories' ? 'success-stories' : embeddedMetadata.category === 'security' ? 'securing' : embeddedMetadata.category === 'whitepaper' ? 'whitepapers' : embeddedMetadata.category === 'webinar' ? 'webinars' : embeddedMetadata.category === 'case study' ? 'case-study' : embeddedMetadata.category)) + '/' + (pageUnextensionedUnwhitespacedLowercasedRelPath.split(/\//).map((fileOrFolderName) => encodeURIComponent(fileOrFolderName.replace(/^[0-9]+[\-]+/,'').replace(/\./g, '-'))).join('/')) ); } diff --git a/website/views/layouts/layout.ejs b/website/views/layouts/layout.ejs index 0d04f3a8f2..cbe85f87a8 100644 --- a/website/views/layouts/layout.ejs +++ b/website/views/layouts/layout.ejs @@ -889,6 +889,7 @@ + diff --git a/website/views/pages/articles/basic-webinar.ejs b/website/views/pages/articles/basic-webinar.ejs new file mode 100644 index 0000000000..dc9d4c854f --- /dev/null +++ b/website/views/pages/articles/basic-webinar.ejs @@ -0,0 +1,97 @@ +
<%- thisPage.meta.introductionTextBlockOne %>
<%}%> + <%if(thisPage.meta.introductionTextBlockTwo){%><%- thisPage.meta.introductionTextBlockTwo %>
<%}%> ++ Please enter your work or school email address. +
+Fleet is the single endpoint management platform for macOS, iOS, Android, Windows, Linux, ChromeOS, and cloud infrastructure. Trusted by over 1,300 organizations, Fleet empowers IT and security teams to accelerate productivity, build verifiable trust, and optimize costs.
+ +By bringing infrastructure-as-code (IaC) practices to device management, Fleet ensures endpoints remain secure and operational, freeing engineering teams to focus on strategic initiatives.
+ +Fleet offers total deployment flexibility: on-premises, air-gapped, container-native (Docker and Kubernetes), or cloud-agnostic (AWS, Azure, GCP, DigitalOcean). Organizations can also choose fully managed SaaS via Fleet Cloud, ensuring complete control over data residency and legal jurisdiction.
+