Website: add navigation and search bar to documentation pages (#25795)

Closes #25655

Changes:
- Created a new component: `<docs-nav-and-search>`, a component that
displays links to documentation pages and a search bar.
- Added the `<docs-nav-and-search>` component to documentation pages,
query pages, policy pages, vitals pages, app library pages, and osquery
schema documentation pages.
- Updated the documentation template page to match the latest
wireframes.
- Updated the osquery schema documentation pages to match the latest
wireframes.

---------

Co-authored-by: Mike Thomas <78363703+mike-j-thomas@users.noreply.github.com>
This commit is contained in:
Eric 2025-02-03 06:13:26 -06:00 committed by GitHub
parent 33e7af4fa6
commit 84d222d16d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
32 changed files with 1270 additions and 1112 deletions

View file

@ -52,6 +52,7 @@ module.exports = {
thisApp,
// pageDescriptionForMeta,
pageTitleForMeta,
algoliaPublicKey: sails.config.custom.algoliaPublicKey,
};
}

View file

@ -25,7 +25,10 @@ module.exports = {
let allApps = sails.config.builtStaticContent.appLibrary;
allApps = _.sortBy(allApps, 'name');
// Respond with view.
return {allApps};
return {
allApps,
algoliaPublicKey: sails.config.custom.algoliaPublicKey,
};
}

View file

@ -0,0 +1,107 @@
/**
* <docs-nav-and-search>
* -----------------------------------------------------------------------------
* A navigation bar with a search box.
*
* @type {Component}
*
* -----------------------------------------------------------------------------
*/
parasails.registerComponent('docsNavAndSearch', {
// ╔═╗╦═╗╔═╗╔═╗╔═╗
// ╠═╝╠╦╝║ ║╠═╝╚═╗
// ╩ ╩╚═╚═╝╩ ╚═╝
props: [
'searchFilter',
'algoliaPublicKey',
'currentSection',
],
// ╦╔╗╔╦╔╦╗╦╔═╗╦ ╔═╗╔╦╗╔═╗╔╦╗╔═╗
// ║║║║║ ║ ║╠═╣║ ╚═╗ ║ ╠═╣ ║ ║╣
// ╩╝╚╝╩ ╩ ╩╩ ╩╩═╝ ╚═╝ ╩ ╩ ╩ ╩ ╚═╝
data: function (){
return {
//…
};
},
// ╦ ╦╔╦╗╔╦╗╦
// ╠═╣ ║ ║║║║
// ╩ ╩ ╩ ╩ ╩╩═╝
template: `
<div class="d-block">
<div class="d-flex flex-row w-100 justify-content-between">
<div purpose="nav-link-container" class="d-flex align-items-center">
<div purpose="docs-links" class="d-flex flex-row">
<a :class="[currentSection === 'docs' ? 'active' : '']" purpose="docs-top-nav-menu-link" href="/docs" style="text-decoration: none; text-decoration-line: none;">Get started</a>
<a :class="[currentSection === 'vitals' ? 'active' : '']" purpose="docs-top-nav-menu-link" href="/vitals" style="text-decoration: none; text-decoration-line: none;">Vitals</a>
<a :class="[currentSection === 'queries' ? 'active' : '']" purpose="docs-top-nav-menu-link" href="/queries" style="text-decoration: none; text-decoration-line: none;">Queries</a>
<a :class="[currentSection === 'policies' ? 'active' : '']" purpose="docs-top-nav-menu-link" href="/policies" style="text-decoration: none; text-decoration-line: none;">Policies</a>
<a :class="[currentSection === 'software' ? 'active' : '']" purpose="docs-top-nav-menu-link" href="/app-library" style="text-decoration: none; text-decoration-line: none;">Software</a>
<a :class="[currentSection === 'tables' ? 'active' : '']" purpose="docs-top-nav-menu-link" href="/tables" style="text-decoration: none; text-decoration-line: none;">Data tables</a>
</div>
</div>
<div>
<div purpose="nav-bar-search" id="docsearch-query" class="d-flex" v-if="algoliaPublicKey">
<div purpose="disabled-search" class="d-flex">
<div class="input-group d-flex flex-nowrap">
<div class="input-group-prepend">
<span class="input-group-text border-0 bg-transparent" >
<img style="height: 16px; width: 16px;" class="search" alt="search" src="/images/icon-search-16x16@2x.png">
</span>
</div>
<div class="form-control border-0 ">
<input class="docsearch-input pr-1"
placeholder="Search" aria-label="Search"
/>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
`,
// ╦ ╦╔═╗╔═╗╔═╗╦ ╦╔═╗╦ ╔═╗
// ║ ║╠╣ ║╣ ║ ╚╦╝║ ║ ║╣
// ╩═╝╩╚ ╚═╝╚═╝ ╩ ╚═╝╩═╝╚═╝
beforeMount: function() {
//…
},
mounted: async function() {
let filterForSearch = {};
if(this.searchFilter){
let searchIndexesThatExist = ['docs', 'software', 'queries', 'vitals', 'policies', 'tables', 'handbook', 'software'];
if(!searchIndexesThatExist.includes(this.searchFilter)){
throw new Error(`Invalid 'searchFilter' value provided to <docs-nav-and-search> component. Please change the searchFilter value to one of: ${searchIndexesThatExist.join(', ')}`);
}
filterForSearch = {
'facetFilters': [`section:${this.searchFilter}`]
};
}
if(this.algoliaPublicKey) {
docsearch({
appId: 'NZXAYZXDGH',
apiKey: this.algoliaPublicKey,
indexName: 'fleetdm',
container: '#docsearch-query',
placeholder: 'Search',
debug: false,
searchParameters: filterForSearch,
});
}
},
beforeDestroy: function() {
//…
},
// ╦╔╗╔╔╦╗╔═╗╦═╗╔═╗╔═╗╔╦╗╦╔═╗╔╗╔╔═╗
// ║║║║ ║ ║╣ ╠╦╝╠═╣║ ║ ║║ ║║║║╚═╗
// ╩╝╚╝ ╩ ╚═╝╩╚═╩ ╩╚═╝ ╩ ╩╚═╝╝╚╝╚═╝
methods: {
//…
},
});

View file

@ -13,21 +13,6 @@ parasails.registerPage('app-details', {
//…
},
mounted: async function() {
if(this.algoliaPublicKey) { // Note: Docsearch will only be enabled if sails.config.custom.algoliaPublicKey is set. If the value is undefined, the documentation search will be disabled.
docsearch({
appId: 'NZXAYZXDGH',
apiKey: this.algoliaPublicKey,
indexName: 'fleetdm',
container: '#docsearch-query',
placeholder: 'Search',
debug: false,
searchParameters: {
'facetFilters': ['section:queries']
},
});
}
$('[purpose="copy-button"]').on('click', async function() {
let code = $(this).siblings('pre').find('code').text();
$(this).addClass('copied');

View file

@ -3,9 +3,6 @@ parasails.registerPage('basic-documentation', {
// ║║║║║ ║ ║╠═╣║ ╚═╗ ║ ╠═╣ ║ ║╣
// ╩╝╚╝╩ ╩ ╩╩ ╩╩═╝ ╚═╝ ╩ ╩ ╩ ╩ ╚═╝
data: {
isDocsLandingPage: false,
inputTextValue: '',
inputTimers: {},
searchString: '',
@ -19,6 +16,7 @@ parasails.registerPage('basic-documentation', {
scrollDistance: 0,
navSectionsByDocsSectionSlug: {},
lastScrollTop: 0,
modal: undefined,
},
computed: {
@ -31,9 +29,6 @@ parasails.registerPage('basic-documentation', {
// ║ ║╠╣ ║╣ ║ ╚╦╝║ ║ ║╣
// ╩═╝╩╚ ╚═╝╚═╝ ╩ ╚═╝╩═╝╚═╝
beforeMount: function() {
if (this.thisPage.url === '/docs') {
this.isDocsLandingPage = true;
}
this.breadcrumbs = _.trim(this.thisPage.url, /\//).split(/\//);
@ -80,31 +75,13 @@ parasails.registerPage('basic-documentation', {
return pagesBySectionSlug;
})();
// Adding a scroll event listener for scrolling sidebars and showing the back to top button.
if(!this.isDocsLandingPage){
window.addEventListener('scroll', this.handleScrollingInDocumentation);
}
window.addEventListener('scroll', this.handleScrollingInDocumentation);
},
mounted: async function() {
// Set a currentDocsSection value to display different Fleet premium CTAs based on what section is being viewed.
if(!this.isDocsLandingPage){
this.currentDocsSection = this.thisPage.url.split(/\//).slice(-2)[0];
}
// Algolia DocSearch
if(this.algoliaPublicKey) { // Note: Docsearch will only be enabled if sails.config.custom.algoliaPublicKey is set. If the value is undefined, the documentation search will be disabled.
docsearch({
appId: 'NZXAYZXDGH',
apiKey: this.algoliaPublicKey,
indexName: 'fleetdm',
container: (this.isDocsLandingPage ? '#docsearch-query-landing' : '#docsearch-query'),
clickAnalytics: true,
searchParameters: {
'facetFilters': ['section:docs']
},
});
}
this.currentDocsSection = this.thisPage.url.split(/\//).slice(-2)[0];
// Handle hashes in urls when coming from an external page.
if(window.location.hash){
@ -337,6 +314,16 @@ parasails.registerPage('basic-documentation', {
left: 0,
behavior: 'smooth',
});
},
clickOpenMobileSubtopicsNav: function() {
this.modal = 'subtopics';
},
clickOpenMobileDocsNav: function() {
this.modal = 'table-of-contents';
},
closeModal: async function() {
this.modal = '';
await this.forceRender();
}
}

View file

@ -4,7 +4,7 @@ parasails.registerPage('osquery-table-details', {
// ╩╝╚╝╩ ╩ ╩╩ ╩╩═╝ ╚═╝ ╩ ╩ ╩ ╩ ╚═╝
data: {
//…
selectedPlatform: 'all',
selectedPlatform: 'apple',
search: '',
showTableNav: false,
userFriendlyPlatformNames: {
@ -14,13 +14,15 @@ parasails.registerPage('osquery-table-details', {
'chrome': 'ChromeOS',
'all': 'All platforms'
},
modal: undefined,
},
computed: {
filteredTables: function () {
let platformToFilterBy = this.selectedPlatform !== 'apple' ? this.selectedPlatform : 'darwin';
return this.allTables.filter(
(table) =>
this._isIncluded(table.platforms, this.selectedPlatform)
table.platforms.includes(platformToFilterBy)
);
},
numberOfTablesDisplayed: function() {
@ -32,36 +34,15 @@ parasails.registerPage('osquery-table-details', {
// ║ ║╠╣ ║╣ ║ ╚╦╝║ ║ ║╣
// ╩═╝╩╚ ╚═╝╚═╝ ╩ ╚═╝╩═╝╚═╝
beforeMount: function() {
if(['#apple','#linux','#windows','#chrome'].includes(window.location.hash)){
this.selectedPlatform = window.location.hash.split('#')[1];
} else {
// otherwise, default the filter to be the first supported platform of the currently viewed table.
this.selectedPlatform = this.tableToDisplay.platforms[0] === 'darwin' ? 'apple' : this.tableToDisplay.platforms[0];
}
},
mounted: async function() {
// Algolia DocSearch
if(this.algoliaPublicKey) { // Note: Docsearch will only be enabled if sails.config.custom.algoliaPublicKey is set. If the value is undefined, the documentation search will be disabled.
docsearch({
appId: 'NZXAYZXDGH',
apiKey: this.algoliaPublicKey,
indexName: 'fleetdm',
container: '#docsearch-query',
placeholder: 'Search tables',
debug: false,
searchParameters: {
'facetFilters': ['section:tables']
},
});
}
// Check the URL to see if a platformFilter was provided.
if(window.location.search) {
// https://caniuse.com/mdn-api_urlsearchparams_get
let possibleSearchParamsToFilterBy = new URLSearchParams(window.location.search);
let platformToFilterBy = possibleSearchParamsToFilterBy.get('platformFilter');
// If the provided platform matches a key in the userFriendlyPlatformNames array, we'll set this.selectedPlatform.
if(platformToFilterBy && this.userFriendlyPlatformNames[platformToFilterBy]){
this.selectedPlatform = platformToFilterBy;
}
}
// sort the array of all tables
this.allTables = this.allTables.sort((a, b)=>{
return a.title > b.title ? 1 : -1;
@ -128,7 +109,7 @@ parasails.registerPage('osquery-table-details', {
await setTimeout(()=>{
let activeTableLink = $('[purpose="table-of-contents-link"].active')[0];
if(activeTableLink) {
$('[purpose="table-of-contents"]')[0].scrollTop = activeTableLink.offsetTop - 12;
$('[purpose="table-of-contents"]')[0].scrollTop = activeTableLink.offsetTop;
}
// Note: we're running this code after a 5ms delay to make sure the tables have been filtered, otherwise it will scroll the table of contents to the links posiiton in the full list of tables.
}, 5);
@ -141,11 +122,43 @@ parasails.registerPage('osquery-table-details', {
clickFilterByPlatform: async function(platform) {
this.selectedPlatform = platform;
},
clickSelectPlatform: function (platform) {
let platformToLookFor = platform;
if(platform === 'apple'){
platformToLookFor = 'darwin';
}
let currentTableAvailableOnNewPlatform = this.tableToDisplay.platforms.includes(platformToLookFor);
if(!currentTableAvailableOnNewPlatform){
if(platformToLookFor === 'chrome'){
this.goto('/tables/chrome_extensions#chrome');
} else if(platformToLookFor === 'darwin') {
this.goto('/tables/account_policy_data#apple');
} else if(platformToLookFor === 'linux') {
this.goto('/tables/apparmor_events#linux');
} else if(platformToLookFor === 'windows') {
this.goto('/tables/appcompat_shims#windows');
}
} else {
this.selectedPlatform = platform;
}
},
clickToggleTableNav: function() {
this.showTableNav = !this.showTableNav;
},
clickOpenTablesNav: async function() {
this.modal = 'table-of-contents';
await setTimeout(()=>{
let activeTableLink = $('[purpose="modal-table-of-contents-link"].active')[0];
if(activeTableLink) {
$('[purpose="modal-table-of-contents"]')[0].scrollTop = activeTableLink.offsetTop;
}
}, 250);
},
closeModal: async function() {
this.modal = '';
await this.forceRender();
},
_isIncluded: function (data, selectedOption) {
if (selectedOption.startsWith('all') || selectedOption === '') {
return true;

View file

@ -14,21 +14,6 @@ parasails.registerPage('policy-details', {
//…
},
mounted: async function () {
// Note: Docsearch will be disabled on this page until a search index has been created for it.
// Note: Docsearch will only be enabled if sails.config.custom.algoliaPublicKey is set. If the value is undefined, the documentation search will be disabled.
if(this.algoliaPublicKey) {
docsearch({
appId: 'NZXAYZXDGH',
apiKey: this.algoliaPublicKey,
indexName: 'fleetdm',
container: '#docsearch-query',
placeholder: 'Search',
debug: false,
searchParameters: {
'facetFilters': ['section:policies']
},
});
}
let columnNamesForThisQuery = [];
let tableNamesForThisQuery = [];
if(this.columnNamesForSyntaxHighlighting){

View file

@ -13,19 +13,7 @@ parasails.registerPage('policy-library', {
//…
},
mounted: async function () {
if(this.algoliaPublicKey) { // Note: Docsearch will only be enabled if sails.config.custom.algoliaPublicKey is set. If the value is undefined, the documentation search will be disabled.
docsearch({
appId: 'NZXAYZXDGH',
apiKey: this.algoliaPublicKey,
indexName: 'fleetdm',
container: '#docsearch-query',
placeholder: 'Search',
debug: false,
searchParameters: {
'facetFilters': ['section:policies']
},
});
}
//…
},
// ╦╔╗╔╔╦╗╔═╗╦═╗╔═╗╔═╗╔╦╗╦╔═╗╔╗╔╔═╗

View file

@ -15,19 +15,6 @@ parasails.registerPage('query-detail', {
},
mounted: async function () {
if(this.algoliaPublicKey) { // Note: Docsearch will only be enabled if sails.config.custom.algoliaPublicKey is set. If the value is undefined, the documentation search will be disabled.
docsearch({
appId: 'NZXAYZXDGH',
apiKey: this.algoliaPublicKey,
indexName: 'fleetdm',
container: '#docsearch-query',
placeholder: 'Search',
debug: false,
searchParameters: {
'facetFilters': ['section:queries']
},
});
}
let columnNamesForThisQuery = [];
let tableNamesForThisQuery = [];
if(this.columnNamesForSyntaxHighlighting){

View file

@ -13,19 +13,7 @@ parasails.registerPage('query-library', {
//…
},
mounted: async function () {
if(this.algoliaPublicKey) { // Note: Docsearch will only be enabled if sails.config.custom.algoliaPublicKey is set. If the value is undefined, the documentation search will be disabled.
docsearch({
appId: 'NZXAYZXDGH',
apiKey: this.algoliaPublicKey,
indexName: 'fleetdm',
container: '#docsearch-query',
placeholder: 'Search',
debug: false,
searchParameters: {
'facetFilters': ['section:queries']
},
});
}
//…
},
// ╦╔╗╔╔╦╗╔═╗╦═╗╔═╗╔═╗╔╦╗╦╔═╗╔╗╔╔═╗

View file

@ -21,20 +21,6 @@ parasails.registerPage('vital-details', {
if(['#apple','#linux','#windows','#chrome'].includes(window.location.hash)){
this.selectedPlatform = window.location.hash.split('#')[1];
}
// Note: Docsearch will only be enabled if sails.config.custom.algoliaPublicKey is set. If the value is undefined, the documentation search will be disabled.
if(this.algoliaPublicKey) {
docsearch({
appId: 'NZXAYZXDGH',
apiKey: this.algoliaPublicKey,
indexName: 'fleetdm',
container: '#docsearch-query',
placeholder: 'Search',
debug: false,
searchParameters: {
'facetFilters': ['section:vitals']
},
});
}
let columnNamesForThisQuery = [];
let tableNamesForThisQuery = [];
if(this.columnNamesForSyntaxHighlighting){

View file

@ -0,0 +1,263 @@
/**
* <docs-nav-and-search>
*
*/
[parasails-component='docs-nav-and-search'] {
margin-bottom: 48px;
margin-left: -8px;
[purpose='docs-links'] {
min-height: 36px;
display: flex;
align-items: center;
}
a {
height: 29px;
&[purpose='docs-top-nav-menu-link'] {
display: flex;
justify-content: center;
align-items: center;
padding: 4px 8px !important;//lesshint-disable-line importantRule
margin-right: 16px !important;//lesshint-disable-line importantRule
white-space: nowrap;
&:last-of-type {
margin-right: 0px !important;//lesshint-disable-line importantRule
}
color: #8B8FA2 !important;//lesshint-disable-line importantRule
font-size: 14px !important;//lesshint-disable-line importantRule
font-weight: 400 !important;//lesshint-disable-line importantRule
line-height: 150% !important;//lesshint-disable-line importantRule
text-decoration: none !important;//lesshint-disable-line importantRule
text-decoration-line: none !important;//lesshint-disable-line importantRule
&.active {
border-radius: 8px;
background: #F1F3F5;
color: #192147 !important;//lesshint-disable-line importantRule
}
&:hover {
border-radius: 8px;
background: #F1F3F5;
text-decoration: none;
}
}
}
width: 100%;
[purpose='nav-bar-search'] {
margin-left: 24px;
// Note: We're using classes here to override the default Docsearch styles;
button {
width: 100%;
cursor: text;
margin: 0;
}
.DocSearch-Button {
border-top-left-radius: 6px;
border-bottom-left-radius: 6px;
border-top-right-radius: 6px;
border-bottom-right-radius: 6px;
border: 1px solid @core-fleet-black-25;
background-color: #FFF;
padding: 8px 15px;
height: 36px;
margin: 0;
width: 190px;
}
.DocSearch-Button:hover {
box-shadow: none;
border: 1px solid @core-fleet-black-25;
color: @core-fleet-black-50;
}
.DocSearch-Search-Icon {
margin-left: 0px;
margin-right: 8px;
height: 16px;
width: 16px;
color: @core-fleet-black-50;
stroke-width: 3px;
}
.DocSearch-Button-Keys {
display: none;
}
.input-group:focus-within {
border: 1px solid @core-vibrant-blue;
}
.DocSearch-Button-Placeholder {
font-size: 16px;
line-height: 16px;
font-weight: 400;
padding-left: 0px;
}
[purpose='disabled-search'] {
input {
padding-top: 6px;
padding-bottom: 6px;
border: none;
}
&::placeholder {
font-size: 16px;
line-height: 24px;
color: #8B8FA2;
}
.input-group {
border-top-left-radius: 6px;
border-bottom-left-radius: 6px;
border-top-right-radius: 6px;
border-bottom-right-radius: 6px;
border: 1px solid @core-fleet-black-25;
background: #FFF;
}
.input-group:focus-within {
border: 1px solid @core-vibrant-blue;
}
.form-control {
border-radius: 6px;
padding: 6px;
height: 36px;
margin: 0;
width: 212px;
}
.docsearch-input:focus-visible {
outline: none;
}
.ds-input:focus {
outline: rgba(0, 0, 0, 0);
}
.input-group-text {
color: @core-fleet-black-50;
}
.form-control {
height: 36px;
padding: 0px;
font-size: 16px;
} &:focus {
border: none;
}
}
img {
height: 16px;
margin-right: 8px;
}
background: #FFF;
&::placeholder {
font-size: 16px;
color: @core-fleet-black-50;
}
}
@media (max-width: 991px) {
margin-bottom: 32px;
[purpose='nav-bar-search'] {
margin-left: 24px;
// Note: We're using classes here to override the default Docsearch styles;
button {
width: 100%;
cursor: pointer;
margin: 0;
}
.DocSearch-Button {
border-top-left-radius: 6px;
border-bottom-left-radius: 6px;
border-top-right-radius: 6px;
border-bottom-right-radius: 6px;
border: none;
background-color: transparent;
padding: 0px;
height: 36px;
margin: 0;
width: 16px;
}
.DocSearch-Button:hover {
box-shadow: none;
border: none;
color: @core-fleet-black-50;
}
.DocSearch-Search-Icon {
margin-left: 0px;
margin-right: 8px;
// padding: 8px 15px;
height: 16px;
width: 16px;
color: @core-fleet-black-75;
stroke-width: 3px;
}
.DocSearch-Button-Keys {
display: none;
}
.input-group:focus-within {
border: 1px solid @core-vibrant-blue;
}
.DocSearch-Button-Placeholder {
font-size: 16px;
line-height: 16px;
font-weight: 400;
padding-left: 0px;
display: none;
}
[purpose='disabled-search'] {
input {
padding-top: 6px;
padding-bottom: 6px;
border: none;
}
&::placeholder {
font-size: 16px;
line-height: 24px;
color: #8B8FA2;
}
.input-group {
border-top-left-radius: 6px;
border-bottom-left-radius: 6px;
border-top-right-radius: 6px;
border-bottom-right-radius: 6px;
border: 1px solid @core-fleet-black-25;
background: #FFF;
}
.input-group:focus-within {
border: 1px solid @core-vibrant-blue;
}
.form-control {
border-radius: 6px;
padding: 6px;
height: 36px;
margin: 0;
width: 212px;
}
.docsearch-input:focus-visible {
outline: none;
}
.ds-input:focus {
outline: rgba(0, 0, 0, 0);
}
.input-group-text {
color: @core-fleet-black-50;
}
.form-control {
height: 36px;
padding: 0px;
font-size: 16px;
} &:focus {
border: none;
}
}
img {
height: 16px;
margin-right: 8px;
}
background: none;
&::placeholder {
font-size: 16px;
color: @core-fleet-black-50;
}
}
}
@media (max-width: 768px) {
[purpose='nav-link-container'] {
max-width: calc(~'100% - 48px');
overflow-x: scroll;
scrollbar-width: none;
}
}
}

View file

@ -28,6 +28,7 @@
@import 'components/parallax-city.component.less';
@import 'components/logo-carousel.component.less';
@import 'components/animated-arrow-button.component.less';
@import 'components/docs-nav-and-search.component.less';
// Per-page styles
@import 'pages/homepage.less';

View file

@ -17,7 +17,7 @@
}
[purpose='page-container'] {
padding: 64px 64px 32px 64px;
padding: 48px;
}
[purpose='page-content'] {
margin-left: auto;
@ -25,117 +25,25 @@
max-width: 1072px;
}
[purpose='breadcrumbs-and-search'] {
margin-bottom: 64px;
max-width: 1072px;
[purpose='breadcrumbs'] {
font-size: 14px;
[purpose='breadcrumbs'] {
margin-right: 24px;
}
[purpose='search'] {
// Note: We're using classes here to override the default Docsearch styles;
button {
width: 100%;
cursor: text;
margin: 0;
}
.DocSearch-Button {
border-top-left-radius: 6px;
border-bottom-left-radius: 6px;
border-top-right-radius: 6px;
border-bottom-right-radius: 6px;
border: 1px solid @core-fleet-black-25;
background-color: #FFF;
padding: 6px;
height: 36px;
margin: 0;
width: 256px;
}
.DocSearch-Button:hover {
box-shadow: none;
border: 1px solid @core-fleet-black-25;
color: @core-fleet-black-50;
}
.DocSearch-Search-Icon {
margin-left: 10px;
height: 16px;
width: 16px;
color: @core-fleet-black-50;
stroke-width: 3px;
}
.DocSearch-Button-Keys {
display: none;
}
.input-group:focus-within {
border: 1px solid @core-vibrant-blue;
}
.DocSearch-Button-Placeholder {
font-size: 16px;
font-weight: 400;
padding-left: 12px;
}
[purpose='disabled-search'] {
input {
padding-top: 6px;
padding-bottom: 6px;
border: none;
} &::placeholder {
font-size: 16px;
line-height: 24px;
color: #8B8FA2;
}
.input-group {
border-top-left-radius: 6px;
border-bottom-left-radius: 6px;
border-top-right-radius: 6px;
border-bottom-right-radius: 6px;
border: 1px solid @core-fleet-black-25;
background: #FFF;
}
.input-group:focus-within {
border: 1px solid @core-vibrant-blue;
}
.form-control {
border-radius: 6px;
padding: 6px;
height: 36px;
margin: 0;
width: 212px;
}
.docsearch-input:focus-visible {
outline: none;
}
.ds-input:focus {
outline: rgba(0, 0, 0, 0);
}
.input-group-text {
color: @core-fleet-black-50;
}
.form-control {
height: 36px;
padding: 0px;
font-size: 16px;
} &:focus {
border: none;
}
}
}
margin-bottom: 48px;
}
[purpose='breadcrumbs-category'] {
color: #8B8FA2;
margin-right: 8px;
font-size: 14px;
font-weight: 400;
line-height: 150%; /* */
&:hover {
color: #192147;
text-decoration: none;
}
}
[purpose='breadcrumbs-title'] {
margin-left: 8px;
[purpose='breadcrumbs-category'] {
color: #8B8FA2;
margin-right: 8px;
font-size: 14px;
font-weight: 400;
line-height: 150%; /* */
&:hover {
color: #192147;
text-decoration: none;
}
}
[purpose='breadcrumbs-title'] {
margin-left: 8px;
}
[purpose='icon-and-name'] {
flex-direction: row;
align-items: center;
@ -373,24 +281,14 @@
width: 100%;
margin-left: 0px;
}
[purpose='breadcrumbs-and-search'] {
[purpose='breadcrumbs'] {
margin-bottom: 32px;
}
}
@media (max-width: 768px) {
[purpose='breadcrumbs-and-search'] {
max-width: 1072px;
font-size: 14px;
[purpose='breadcrumbs'] {
margin-bottom: 24px;
}
[purpose='search'] {
width: 100%;
.DocSearch-Button {
width: 100%;
}
}
[purpose='breadcrumbs'] {
margin-bottom: 24px;
}
}

View file

@ -1,10 +1,10 @@
#app-library {
[purpose='page-container'] {
padding: 64px;
padding: 48px;
}
[purpose='page-content'] {
max-width: 1072px;
max-width: 1104px;
margin-left: auto;
margin-right: auto;
}
@ -240,7 +240,7 @@
@media (max-width: 991px) {
[purpose='page-container'] {
padding: 64px 32px;
padding: 32px;
}
[purpose='app-card'] {
min-width: 40%;
@ -255,9 +255,6 @@
}
@media (max-width: 768px) {
[purpose='page-container'] {
padding: 48px 24px;
}
[purpose='app-search'] {
margin-top: 32px;
width: 100%;

View file

@ -1,5 +1,15 @@
#basic-documentation {
[purpose='page-container'] {
padding: 48px;
}
[purpose='page-content'] {
margin-left: auto;
margin-right: auto;
max-width: 1104px;
}
h1 {
font-size: 30px;
}
@ -25,23 +35,15 @@
}
h1, h2, h3, h4, h5, h6 {
line-height: 1.2;
}
a:not(.btn) {
color: @core-vibrant-blue;
line-height: 120%;
}
ul {
list-style: none;
padding-left: 8px;
li {
margin-bottom: 8px;
}
}
.markdown-heading:hover {
@ -77,6 +79,75 @@
80% {opacity: 20;}
100% {opacity: 0;}
}
[purpose='mobile-custom-select'] {
display: flex;
cursor: pointer;
height: 48px;
padding: 0px 12px;
justify-content: space-between;
align-items: center;
align-self: stretch;
border-radius: 6px;
border: 1px solid var(--border-border-primary, #E2E4EA);
background: var(--surface-surface-primary, #FFF);
width: 100%;
margin-bottom: 16px;
margin-top: 16px;
p {
color: var(--text-text-brand, #192147);
/* Body MD (FKA p) */
font-family: Inter;
font-size: 16px;
font-style: normal;
font-weight: 400;
line-height: 24px; /* 150% */
}
img {
height: 16px;
}
&:hover {
border-radius: 6px;
border: 1px solid var(--border-border-primary, #E2E4EA);
background: var(--surface-surface-primary, #FFF);
box-shadow: 0px 0px 0px 2px rgba(25, 33, 71, 0.05);
}
}
[purpose='mobile-table-of-contents'] {
display: flex;
cursor: pointer;
height: 48px;
padding: 0px 12px;
justify-content: start;
align-items: center;
align-self: stretch;
border-radius: 6px;
border: 1px solid #E2E4EA;
background: #FFF;
width: 100%;
margin-bottom: 8px;
p {
color: #192147;
/* Body MD (FKA p) */
font-family: Inter;
font-size: 16px;
font-style: normal;
font-weight: 400;
line-height: 24px; /* 150% */
}
img {
height: 14px;
margin-right: 16px;
}
&:hover {
border-radius: 6px;
border: 1px solid #E2E4EA;
background: #FFF;
box-shadow: 0px 0px 0px 2px rgba(25, 33, 71, 0.05);
}
}
[purpose='search'] {
// Note: We're using classes here to override the default Docsearch styles;
@ -161,49 +232,6 @@
border: none;
}
}
[purpose='docs-landing-page'] {
h3 {
font-size: 24px;
line-height: 32px;
}
a {
color: @core-vibrant-blue;
}
[purpose='support-link'] {
text-align: center;
margin-top: 24px;
margin-bottom: 0px;
a {
display: inline-block;
}
a:after {
background-image: url('/images/icon-arrow-upper-right-7x7@2x.png');
background-size: 7px 7px;
display: inline-block;
position: relative;
top: -4px;
left: 4px;
width: 7px;
height: 7px;
content: '';
}
br {
display: none;
}
}
[purpose='docs-tree'] {
a {
color: @core-fleet-black;
text-decoration: none;
&:hover {
color: @core-vibrant-blue;
}
}
}
}
[purpose='docs-template'] {
h3 {
@ -218,7 +246,6 @@
[purpose='edit-button'], [purpose='faq-edit-button'] {
color: @core-vibrant-blue;
font-size: 12px;
position: absolute;
right: 230px;
@ -240,42 +267,16 @@
[purpose='faq-edit-button'] {
right: 48px;
}
[purpose='search'] {
.form-control {
height: 36px;
font-size: 16px;
padding: 0;
}
.DocSearch-Button {
height: 36px;
font-size: 16px;
padding: 0;
}
}
[purpose='breadcrumbs'] {
p, a {
font-size: 14px;
}
}
[purpose='mobile-docs-nav'] {
a {
color: @core-fleet-black;
text-decoration: none;
&.active {
color: @core-vibrant-blue;
}
&:hover {
color: @core-vibrant-blue;
}
}
[purpose='mobile-docs-nav-other-links'] {
@ -303,94 +304,86 @@
[purpose='left-sidebar'] {
scrollbar-width: none;
font-size: 14px;
a {
color: @core-fleet-black;
text-decoration: none;
&:hover {
color: #6A67FE;
}
&.btn-primary {
color: #fff;
}
.btn-primary {
color: #fff;
background-color: #ff5c83;
border-color: #ff5c83;
&:hover {
background-color: darken(#ff5c83, 10%);
border-color: darken(#ff5c83, 10%);
}
}
}
.left-nav {
max-width: 200px;
[purpose='left-sidebar-links'] {
border-bottom: 1px solid @core-fleet-black-25;
margin-bottom: 16px;
}
.topic {
padding-left: 0px;
color: @core-fleet-black-75;
&.active {
color: @core-vibrant-blue;
}
[purpose='section-title'] {
margin-bottom: 8px;
color: #192147;
font-family: Inter;
font-size: 14px;
font-weight: 800;
line-height: 120%;
}
}
[purpose='left-sidebar']::-webkit-scrollbar, [purpose='right-sidebar']::-webkit-scrollbar, [purpose='subtopics']::-webkit-scrollbar {
display: none;
}
[purpose='expanded-nav'] {
li {
[purpose='subpage-link'] {
font-size: 14px;
font-style: normal;
font-weight: 400;
line-height: 21px;
color: @core-fleet-black-75;
display: block;
padding: 4px 8px;
&:hover {
text-decoration: none;
border-radius: 4px;
background: #F9FAFC;
}
&.active {
border-radius: 4px;
background: #F9FAFC;
}
}
[purpose='nav-section']:not(:last-of-type) {
border-bottom: 1px solid #E2E4EA;
margin-bottom: 16px;
}
[purpose='nav-section'] {
padding-bottom: 12px;
[purpose='nav-section-title'] {
font-size: 13px;
font-weight: 500;
line-height: 18px;
text-transform: uppercase;
margin-bottom: 12px;
padding-top: 8px;
color: @core-fleet-black;
[purpose='expanded-nav'] {
display: flex;
flex-direction: column;
padding-top: 8px;
padding-bottom: 16px;
[purpose='nav-section']:not(:last-of-type) {
border-bottom: 1px solid #E2E4EA;
margin-bottom: 16px;
}
[purpose='nav-section'] {
padding-bottom: 12px;
[purpose='nav-section-title'] {
font-size: 13px;
font-weight: 500;
line-height: 18px;
text-transform: uppercase;
margin-bottom: 12px;
padding-top: 8px;
color: @core-fleet-black;
}
}
}
}
[purpose='left-sidebar']::-webkit-scrollbar, [purpose='right-sidebar']::-webkit-scrollbar, [purpose='subtopics']::-webkit-scrollbar {
display: none;
}
[purpose='right-sidebar'] {
scrollbar-width: none;
p, a {
font-size: 14px;
}
a {
&:hover {
color: #6A67FE;
color: @core-fleet-black-75;
text-decoration: none;
border-radius: 4px;
background: #F9FAFC;
}
&.active {
color: @core-fleet-black-75;
border-radius: 4px;
background: #F9FAFC;
}
}
li {
margin-bottom: 0;
}
}
[purpose='swag-cta'] {
cursor: pointer;
@ -510,6 +503,7 @@
[purpose='content'] {
width: 100%;
padding-left: 32px;
hr {
margin: 0px;
padding: 0px;
@ -566,7 +560,9 @@
margin-bottom: 24px;
scroll-margin-top: 104px;
}
a:not(.btn) {
color: @core-vibrant-blue;
}
pre + hr + h3 {
padding-top: 0px;
}
@ -882,15 +878,126 @@
}
}
[purpose='subtopics-modal'] {
.modal.fade .modal-dialog {
transition: transform 0.2s ease-out;
-webkit-transform: translate(-25%, 0%);
transform: translate(125%, 0%);
}
.modal.show .modal-dialog {
-webkit-transform: translate(0, 0);
transform: translate(0, 0);
}
[parasails-component='modal'] {
[purpose='modal-dialog'] {
margin-right: 16px;
}
}
}
[purpose='table-of-contents-modal'] {
.modal.fade .modal-dialog {
transition: transform 0.2s ease-out;
-webkit-transform: translate(-25%, 0%);
transform: translate(-125%, 0%);
}
.modal.show .modal-dialog {
-webkit-transform: translate(0, 0);
transform: translate(0, 0);
}
[parasails-component='modal'] {
[purpose='modal-dialog'] {
margin-left: 16px;
}
}
}
[parasails-component='modal'] {
[purpose='modal-dialog'] {
// margin-left: 16px;
margin-top: 16px;
margin-bottom: 16px;
max-width: 366px;
// max-height: calc(~'100vh - 32px');
[purpose='modal-content'] {
display: flex;
height: calc(~'100vh - 32px');
margin-top: 0px;
max-width: 366px;
padding: 48px 19px 24px 24px;
flex-direction: column;
align-items: flex-start;
scrollbar-width: none;
flex-shrink: 0;
[purpose='modal-links'] {
height: 100%;
width: 100%;
scrollbar-width: none;
overflow: auto;
[purpose='section-title'] {
color: #192147;
font-family: Inter;
font-size: 14px;
font-weight: 800;
line-height: 120%;
margin-bottom: 8px;
}
[purpose='expanded-nav'] {
padding-top: 8px;
padding-bottom: 16px;
}
[purpose='modal-nav-link'] {
color: #515774;
font-family: Inter;
font-size: 14px;
line-height: 150%;
width: 100%;
display: block;
padding: 4px 8px;
&:hover {
text-decoration: none;
border-radius: 4px;
background: #F9FAFC;
}
&.active {
border-radius: 4px;
background: #F9FAFC;
}
}
[purpose='modal-subtopics'] {
a {
color: #515774;
font-family: Inter;
margin-right: 5px;
font-size: 14px;
line-height: 150%;
width: 100%;
// text-wrap: nowrap;
padding: 4px 8px;
&:hover {
text-decoration: none;
border-radius: 4px;
background: #F9FAFC;
}
&.active {
border-radius: 4px;
background: #F9FAFC;
}
}
}
}
}
}
}
// for larger screens
@media (min-width: 992px) {
[purpose='docs-template'] {
ul {
.topic {
padding-left: 8px;
}
}
[purpose='search'] {
.input-group {
@ -909,7 +1016,8 @@
}
[purpose='left-sidebar'] {
height: fit-content;
min-width: 216px;
min-width: 200px;
margin-right: 16px;
transition-property: all;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 500ms;
@ -922,28 +1030,40 @@
min-width: 190px;
position: sticky;
top: 104px;
margin-left: 24px;
height: fit-content;
overflow-y: auto;
transition-property: all;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 500ms;
[purpose='subtopics-heading'] {
color: #192147;
font-size: 14px;
font-weight: 800;
line-height: 120%;
margin-bottom: 24px;
}
[purpose='subtopics'] {
scrollbar-width: none;
overflow-y: auto;
color: @core-fleet-black;
padding-top: 4px;
padding-bottom: 4px;
border-left: 1px solid @core-vibrant-blue-25;
max-height: calc(~'100vh - 60px');
dispaly: flex;
flex-direction: column;
transition-property: max-height;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 500ms;
a {
color: @core-fleet-black;
display: block;
color: #515774;
text-decoration: none;
padding: 4px 8px;
&:hover {
color: @core-vibrant-blue;
color: #515774;
border-radius: 4px;
background: #F9FAFC;
}
}
}
@ -1001,6 +1121,9 @@
// for smaller screens
@media (max-width: 991px) {
[purpose='page-container'] {
padding: 32px;
}
[purpose='back-to-top-button-container'] {
display: none;
}
@ -1015,27 +1138,23 @@
top: -55px;
right: 0px;
}
[purpose='right-sidebar'] {
width: 100%;
// Note: we're specifying a minimum height for this element to be the height of the edit page button.
// Even if there are no subtopics on a documentation page, we can be sure that the edit page button will not overlap the pages content.
min-height: 30px;
margin-bottom: 32px;
[purpose='subtopics'] {
color: @core-fleet-black;
a {
color: @core-vibrant-blue;
}
}
}
[purpose='content'] {
width: 100%;
padding-left: 0px;
margin-left: 0px;
a {
word-wrap: break-word;
}
@ -1050,9 +1169,8 @@
@media (max-width: 768px) {
[purpose='docs-template'] {
[purpose='edit-button'] {
top: 0px;
top: 80px;
right: 0px;
}
}
@ -1060,11 +1178,60 @@
}
// for mobile
@media (max-width: 576px) {
@media (max-width: 575px) {
[purpose='docs-template'] {
padding: 0px 24px;
}
[purpose='page-container'] {
padding: 32px 24px;
}
[purpose='subtopics-modal'] {
.modal.fade .modal-dialog {
transition: transform 0.1s ease-out;
-webkit-transform: translate(-25%, 0%);
transform: translate(0, 125%);
}
.modal.show .modal-dialog {
-webkit-transform: translate(0, 0);
transform: translate(0, 0);
}
[parasails-component='modal'] {
[purpose='modal-dialog'] {
margin-right: 16px;
}
}
}
[purpose='table-of-contents-modal'] {
.modal.fade .modal-dialog {
transition: transform 0.1s ease-out;
-webkit-transform: translate(-25%, 0%);
transform: translate(0%, 125%);
}
.modal.show .modal-dialog {
-webkit-transform: translate(0, 0);
transform: translate(0, 0);
}
[parasails-component='modal'] {
[purpose='modal-dialog'] {
margin-left: 16px;
}
}
}
[parasails-component='modal'] {
[purpose='modal-dialog'] {
margin: 16px;
width: 100%;
max-width: calc(~'100% - 32px');
max-height: calc(~'100vh - 32px');
[purpose='modal-content'] {
max-width: 100%;
height: calc(~'100vh - 72px');
}
}
}
}
@media(hover) {
[purpose='docs-template'] {

View file

@ -1,4 +1,68 @@
#osquery-table-details {
[purpose='page-container'] {
padding: 48px;
}
[purpose='page-content'] {
margin-left: auto;
margin-right: auto;
max-width: 1104px;
}
[purpose='page-headline'] {
// max-width: 662px;
// margin-right: 16px;
margin-bottom: 48px;
h2 {
margin-bottom: 24px;
color: #192147;
font-size: 32px;
font-weight: 800;
line-height: 120%;
}
p {
color: #515774;
font-size: 15px;
line-height: 150%;
margin-bottom: 0px;
}
}
[purpose='platform-filters'] {
border-bottom: 1px solid #E2E4EA;
margin-bottom: 48px;
[purpose='platform-filter'] {
width: 25%;
display: flex;
padding: 16px 40px 24px 40px;
justify-content: center;
align-items: center;
cursor: pointer;
img {
height: 20px;
margin-right: 10px;
}
p {
color: #192147;
text-align: center;
margin-bottom: 0px;
font-family: Inter;
font-size: 16px;
font-weight: 400;
line-height: 24px; /* 150% */
white-space: nowrap;
}
&.selected {
border-bottom: 2px solid var(--text-text-brand, #192147);
padding: 16px 40px 22px 40px;
p {
font-weight: 700;
}
}
}
}
hr {
margin: 0;
width: 100vw;
@ -132,31 +196,31 @@
-ms-overflow-style: none;
min-width: 245px;
max-width: 250px;
padding-top: 24px;
height: 100%;
margin-right: 16px;
h4 {
line-height: 24px;
}
}
[purpose='table-of-contents'] {
[purpose='table-of-contents'], [purpose='modal-table-of-contents'] {
scrollbar-width: none;
padding-top: 16px;
padding-bottom: 120px;
margin-top: 16px;
border-top: 1px solid @core-fleet-black-25;
position: relative;
width: 100%;
a {
font-size: 14px;
line-height: 28px;
color: @text-normal;
color: @core-fleet-black-75;
text-decoration: none;
}
a:hover {
color: @core-vibrant-blue;
}
a.active {
color: @core-vibrant-blue;
&:hover {
text-decoration: none;
border-radius: 4px;
background: #F9FAFC;
}
&.active {
border-radius: 4px;
background: #F9FAFC;
}
}
min-height: calc(~'100vh - 565px');
overflow-y: scroll;
@ -179,6 +243,7 @@
[purpose='table-container'] {
height: min-content;
max-width: 860px;
width: 100%;
}
[purpose='overflow-shadow'] {
@ -191,9 +256,8 @@
z-index: 2;
}
[purpose='content'] {
padding-left: 40px;
padding-right: 40px;
max-width: 960px;
margin-top: 32px;
color: @core-fleet-black-75;
h2 {
font-weight: 800;
font-size: 24px;
@ -231,9 +295,8 @@
}
[purpose='schema-table'] {
width: 100%;
max-width: 100%;
position: relative;
padding-top: 24px;
margin-bottom: 40px;
[purpose='platform-logos'] {
height: 0px;
@ -244,6 +307,7 @@
a:not(.btn):not([purpose='evented-table-label']) {
color: @core-vibrant-blue;
padding-right: 7px;
word-break: break-word;
}
a:not(.markdown-link):not([purpose='evented-table-label']) {
&:after {
@ -413,13 +477,152 @@
margin-top: 40px;
border-top: 1px solid @core-fleet-black-25;
}
[purpose='mobile-custom-select'] {
display: flex;
cursor: pointer;
height: 48px;
padding: 0px 12px;
justify-content: space-between;
align-items: center;
align-self: stretch;
border-radius: 6px;
border: 1px solid var(--border-border-primary, #E2E4EA);
background: var(--surface-surface-primary, #FFF);
width: 100%;
margin-bottom: 16px;
margin-top: 16px;
p {
color: var(--text-text-brand, #192147);
margin-top: 0px;
/* Body MD (FKA p) */
font-family: Inter;
font-size: 16px;
font-style: normal;
font-weight: 400;
line-height: 24px; /* 150% */
}
img {
height: 16px;
}
&:hover {
border-radius: 6px;
border: 1px solid var(--border-border-primary, #E2E4EA);
background: var(--surface-surface-primary, #FFF);
box-shadow: 0px 0px 0px 2px rgba(25, 33, 71, 0.05);
}
}
[purpose='table-of-contents-modal'] {
[purpose='modal-table-of-contents'] {
padding-bottom: 0px;
}
.modal.fade .modal-dialog {
transition: transform 0.2s ease-out;
-webkit-transform: translate(-25%, 0%);
transform: translate(-125%, 0%);
}
.modal.show .modal-dialog {
-webkit-transform: translate(0, 0);
transform: translate(0, 0);
}
[parasails-component='modal'] {
[purpose='modal-dialog'] {
margin-left: 16px;
}
}
}
[parasails-component='modal'] {
[purpose='modal-dialog'] {
// margin-left: 16px;
margin-top: 16px;
margin-bottom: 16px;
max-width: 366px;
// max-height: calc(~'100vh - 32px');
[purpose='modal-content'] {
display: flex;
height: calc(~'100vh - 32px');
margin-top: 0px;
max-width: 366px;
padding: 48px 19px 24px 24px;
flex-direction: column;
align-items: flex-start;
// gap: 24px;
flex-shrink: 0;
[purpose='modal-links'] {
max-height: 100%;
width: 100%;
overflow-y: scroll;
[purpose='section-title'] {
color: #192147;
font-family: Inter;
font-size: 14px;
font-weight: 800;
line-height: 120%;
margin-bottom: 8px;
}
[purpose='expanded-nav'] {
padding-top: 8px;
padding-bottom: 16px;
}
[purpose='modal-nav-link'] {
color: #515774;
font-family: Inter;
margin-right: 5px;
font-size: 14px;
line-height: 150%;
width: 100%;
display: block;
// text-wrap: nowrap;
padding: 4px 8px;
&:hover {
text-decoration: none;
border-radius: 4px;
background: #F9FAFC;
}
&.active {
border-radius: 4px;
background: #F9FAFC;
}
}
[purpose='modal-subtopics'] {
a {
color: #515774;
font-family: Inter;
margin-right: 5px;
font-size: 14px;
line-height: 150%;
width: 100%;
// text-wrap: nowrap;
padding: 4px 8px;
// &:hover {
// text-decoration: none;
// border-radius: 4px;
// background: #F9FAFC;
// }
// &.active {
// border-radius: 4px;
// background: #F9FAFC;
// }
}
}
}
}
}
}
@media (max-width: 991px) {
[purpose='page-container'] {
padding: 32px;
}
[purpose='table-container'] {
max-width: unset;
}
[purpose='content'] {
margin-top: 0px;
}
[purpose='schema-table'] {
padding-top: 40px;
padding-top: 16px;
[purpose='platform-logos'] {
top: 53px;
}
@ -432,6 +635,9 @@
display: block;
}
}
[purpose='platform-filters'] {
margin-bottom: 32px;
}
[purpose='filter-row'] {
padding-left: 40px;
padding-right: 40px;
@ -458,9 +664,8 @@
}
@media (max-width: 576px) {
[purpose='content'] {
padding-left: 24px;
padding-right: 24px;
[purpose='page-container'] {
padding: 32px 24px;
}
[purpose='mobile-nav'] {
padding-left: 24px;
@ -511,5 +716,35 @@
}
}
}
[purpose='table-of-contents-modal'] {
.modal.fade .modal-dialog {
transition: transform 0.1s ease-out;
-webkit-transform: translate(-25%, 0%);
transform: translate(0%, 125%);
}
.modal.show .modal-dialog {
-webkit-transform: translate(0, 0);
transform: translate(0, 0);
}
[parasails-component='modal'] {
[purpose='modal-dialog'] {
margin-left: 16px;
}
}
}
[parasails-component='modal'] {
[purpose='modal-dialog'] {
margin: 16px;
width: 100%;
max-width: calc(~'100% - 32px');
max-height: calc(~'100vh - 32px');
[purpose='modal-content'] {
max-width: 100%;
height: calc(~'100vh - 72px');
}
}
}
}
}

View file

@ -1,5 +1,5 @@
#policy-details {
// background-color: #FFF;
h3 {
padding-bottom: 24px;
padding-top: 32px;
@ -19,125 +19,32 @@
[purpose='page-container'] {
padding: 64px 64px 32px 64px;
padding: 48px;
}
[purpose='page-content'] {
margin-left: auto;
margin-right: auto;
max-width: 1072px;
max-width: 1104px;
}
[purpose='breadcrumbs-and-search'] {
margin-bottom: 64px;
max-width: 1072px;
[purpose='breadcrumbs'] {
font-size: 14px;
[purpose='breadcrumbs'] {
margin-right: 24px;
}
[purpose='search'] {
// Note: We're using classes here to override the default Docsearch styles;
button {
width: 100%;
cursor: text;
margin: 0;
}
.DocSearch-Button {
border-top-left-radius: 6px;
border-bottom-left-radius: 6px;
border-top-right-radius: 6px;
border-bottom-right-radius: 6px;
border: 1px solid @core-fleet-black-25;
background-color: #FFF;
padding: 6px;
height: 36px;
margin: 0;
width: 256px;
}
.DocSearch-Button:hover {
box-shadow: none;
border: 1px solid @core-fleet-black-25;
color: @core-fleet-black-50;
}
.DocSearch-Search-Icon {
margin-left: 10px;
height: 16px;
width: 16px;
color: @core-fleet-black-50;
stroke-width: 3px;
}
.DocSearch-Button-Keys {
display: none;
}
.input-group:focus-within {
border: 1px solid @core-vibrant-blue;
}
.DocSearch-Button-Placeholder {
font-size: 16px;
font-weight: 400;
padding-left: 12px;
}
[purpose='disabled-search'] {
input {
padding-top: 6px;
padding-bottom: 6px;
border: none;
} &::placeholder {
font-size: 16px;
line-height: 24px;
color: #8B8FA2;
}
.input-group {
border-top-left-radius: 6px;
border-bottom-left-radius: 6px;
border-top-right-radius: 6px;
border-bottom-right-radius: 6px;
border: 1px solid @core-fleet-black-25;
background: #FFF;
}
.input-group:focus-within {
border: 1px solid @core-vibrant-blue;
}
.form-control {
border-radius: 6px;
padding: 6px;
height: 36px;
margin: 0;
width: 212px;
}
.docsearch-input:focus-visible {
outline: none;
}
.ds-input:focus {
outline: rgba(0, 0, 0, 0);
}
.input-group-text {
color: @core-fleet-black-50;
}
.form-control {
height: 36px;
padding: 0px;
font-size: 16px;
} &:focus {
border: none;
}
}
}
[purpose='breadcrumbs-category'] {
color: #8B8FA2;
margin-right: 8px;
font-size: 14px;
font-weight: 400;
line-height: 150%; /* */
&:hover {
color: #192147;
text-decoration: none;
}
}
[purpose='breadcrumbs-title'] {
margin-left: 8px;
margin-bottom: 48px;
}
[purpose='breadcrumbs-category'] {
color: #8B8FA2;
margin-right: 8px;
font-size: 14px;
font-weight: 400;
line-height: 150%; /* */
&:hover {
color: #192147;
text-decoration: none;
}
}
[purpose='breadcrumbs-title'] {
margin-left: 8px;
}
[purpose='policy-name'] {
color: #192147;
@ -560,7 +467,7 @@
width: 100%;
margin-left: 0px;
}
[purpose='breadcrumbs-and-search'] {
[purpose='breadcrumbs'] {
margin-bottom: 32px;
}
pre {
@ -573,18 +480,8 @@
}
@media (max-width: 768px) {
[purpose='breadcrumbs-and-search'] {
max-width: 1072px;
font-size: 14px;
[purpose='breadcrumbs'] {
margin-bottom: 24px;
}
[purpose='search'] {
width: 100%;
.DocSearch-Button {
width: 100%;
}
}
[purpose='breadcrumbs'] {
margin-bottom: 24px;
}
}

View file

@ -1,5 +1,15 @@
#policy-library {
// background-color: #FFF;
[purpose='page-container'] {
padding: 48px;
}
[purpose='page-content'] {
margin-left: auto;
margin-right: auto;
max-width: 1104px;
}
a {
color: #515774;
font-family: Inter;
@ -110,14 +120,7 @@
color: @core-fleet-black-50;
}
}
[purpose='page-container'] {
padding: 64px;
}
[purpose='page-content'] {
margin-left: auto;
margin-right: auto;
max-width: 1072px;
}
[purpose='search-and-headline'] {
margin-bottom: 64px;
}
@ -312,7 +315,7 @@
@media (max-width: 991px) {
[purpose='page-container'] {
padding: 64px 32px;
padding: 32px;
}
[purpose='policy-name-and-description'] {
max-width: unset;

View file

@ -1,5 +1,5 @@
#query-detail {
// background-color: #FFF;
h3 {
padding-bottom: 24px;
padding-top: 32px;
@ -19,125 +19,32 @@
[purpose='page-container'] {
padding: 64px 64px 32px 64px;
padding: 48px;
}
[purpose='page-content'] {
margin-left: auto;
margin-right: auto;
max-width: 1072px;
max-width: 1104px;
}
[purpose='breadcrumbs-and-search'] {
margin-bottom: 64px;
max-width: 1072px;
[purpose='breadcrumbs'] {
font-size: 14px;
[purpose='breadcrumbs'] {
margin-right: 24px;
}
[purpose='search'] {
// Note: We're using classes here to override the default Docsearch styles;
button {
width: 100%;
cursor: text;
margin: 0;
}
.DocSearch-Button {
border-top-left-radius: 6px;
border-bottom-left-radius: 6px;
border-top-right-radius: 6px;
border-bottom-right-radius: 6px;
border: 1px solid @core-fleet-black-25;
background-color: #FFF;
padding: 6px;
height: 36px;
margin: 0;
width: 256px;
}
.DocSearch-Button:hover {
box-shadow: none;
border: 1px solid @core-fleet-black-25;
color: @core-fleet-black-50;
}
.DocSearch-Search-Icon {
margin-left: 10px;
height: 16px;
width: 16px;
color: @core-fleet-black-50;
stroke-width: 3px;
}
.DocSearch-Button-Keys {
display: none;
}
.input-group:focus-within {
border: 1px solid @core-vibrant-blue;
}
.DocSearch-Button-Placeholder {
font-size: 16px;
font-weight: 400;
padding-left: 12px;
}
[purpose='disabled-search'] {
input {
padding-top: 6px;
padding-bottom: 6px;
border: none;
} &::placeholder {
font-size: 16px;
line-height: 24px;
color: #8B8FA2;
}
.input-group {
border-top-left-radius: 6px;
border-bottom-left-radius: 6px;
border-top-right-radius: 6px;
border-bottom-right-radius: 6px;
border: 1px solid @core-fleet-black-25;
background: #FFF;
}
.input-group:focus-within {
border: 1px solid @core-vibrant-blue;
}
.form-control {
border-radius: 6px;
padding: 6px;
height: 36px;
margin: 0;
width: 212px;
}
.docsearch-input:focus-visible {
outline: none;
}
.ds-input:focus {
outline: rgba(0, 0, 0, 0);
}
.input-group-text {
color: @core-fleet-black-50;
}
.form-control {
height: 36px;
padding: 0px;
font-size: 16px;
} &:focus {
border: none;
}
}
}
[purpose='breadcrumbs-category'] {
color: #8B8FA2;
margin-right: 8px;
font-size: 14px;
font-weight: 400;
line-height: 150%; /* */
&:hover {
color: #192147;
text-decoration: none;
}
}
[purpose='breadcrumbs-title'] {
margin-left: 8px;
margin-bottom: 48px;
}
[purpose='breadcrumbs-category'] {
color: #8B8FA2;
margin-right: 8px;
font-size: 14px;
font-weight: 400;
line-height: 150%;
&:hover {
color: #192147;
text-decoration: none;
}
}
[purpose='breadcrumbs-title'] {
margin-left: 8px;
}
[purpose='query-name'] {
color: #192147;
@ -505,7 +412,7 @@
width: 100%;
margin-left: 0px;
}
[purpose='breadcrumbs-and-search'] {
[purpose='breadcrumbs'] {
margin-bottom: 32px;
}
pre {
@ -518,18 +425,8 @@
}
@media (max-width: 768px) {
[purpose='breadcrumbs-and-search'] {
max-width: 1072px;
font-size: 14px;
[purpose='breadcrumbs'] {
margin-bottom: 24px;
}
[purpose='search'] {
width: 100%;
.DocSearch-Button {
width: 100%;
}
}
[purpose='breadcrumbs'] {
margin-bottom: 24px;
}
}

View file

@ -1,5 +1,15 @@
#query-library {
// background-color: #FFF;
[purpose='page-container'] {
padding: 48px;
}
[purpose='page-content'] {
margin-left: auto;
margin-right: auto;
max-width: 1104px;
}
a {
color: #515774;
font-family: Inter;
@ -110,14 +120,7 @@
color: @core-fleet-black-50;
}
}
[purpose='page-container'] {
padding: 64px;
}
[purpose='page-content'] {
margin-left: auto;
margin-right: auto;
max-width: 1072px;
}
[purpose='search-and-headline'] {
margin-bottom: 64px;
}
@ -318,7 +321,7 @@
@media (max-width: 991px) {
[purpose='page-container'] {
padding: 64px 32px;
padding: 32px;
}
[purpose='policy-name-and-description'] {
max-width: unset;

View file

@ -1,5 +1,4 @@
#vital-details {
// background-color: #FFF;
h3 {
padding-bottom: 24px;
padding-top: 32px;
@ -20,12 +19,12 @@
[purpose='page-container'] {
padding: 64px 64px 32px 64px;
padding: 48px;
}
[purpose='page-content'] {
margin-left: auto;
margin-right: auto;
max-width: 1072px;
max-width: 1104px;
}
[purpose='search-and-headline'] {
margin-bottom: 48px;
@ -247,10 +246,8 @@
}
}
}
}
[purpose='vital-details-and-sidebar'] {
padding-top: 32px;
@ -549,10 +546,10 @@
max-height: 100%;
width: 100%;
overflow-y: scroll;
scrollbar-width: none;
[purpose='vital-link'] {
color: #515774;
font-family: Inter;
margin-right: 5px;
font-size: 14px;
line-height: 150%;
width: 100%;

View file

@ -463,6 +463,7 @@
<script src="/js/components/bar-chart.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>

View file

@ -1,31 +1,14 @@
<div id="app-details" v-cloak>
<div purpose="page-container">
<div purpose="page-content" class="container p-0">
<div purpose="breadcrumbs-and-search" class="d-flex flex-md-row flex-column justify-content-between align-items-md-center align-items-start">
<div purpose="breadcrumbs" class="d-flex flex-row align-items-start">
<div>
<a purpose="breadcrumbs-category" class="text-nowrap" href="/app-library">App library</a>/
</div>
<div purpose="breadcrumbs-title">
<span><%- thisApp.name %></span>
</div>
<docs-nav-and-search current-section="software" search-filter="software" :algolia-public-key="algoliaPublicKey"></docs-nav-and-search>
<div purpose="breadcrumbs" class="d-flex flex-row align-items-start">
<div>
<a purpose="breadcrumbs-category" class="text-nowrap" href="/app-library">App library</a>/
</div>
<div purpose="breadcrumbs-title">
<span><%- thisApp.name %></span>
</div>
<!-- <div purpose="search" id="docsearch-query" class="d-flex">
<div purpose="disabled-search" class="d-flex w-100">
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text border-0 bg-transparent pl-3" >
<img style="height: 16px; width: 16px;" class="search" alt="search" src="/images/icon-search-16x16@2x.png">
</span>
</div>
<div class="form-control border-0 ">
<input class="docsearch-input pr-1"
placeholder="Search" aria-label="Search the handbook"
/>
</div>
</div>
</div>
</div> -->
</div>
<div purpose="app-details-and-sidebar" class="d-flex flex-nowrap flex-lg-row flex-column">
<div purpose="app-details" class="d-inline-flex flex-column flex-shrink w-0">

View file

@ -1,27 +1,12 @@
<div id="app-library" v-cloak>
<div purpose="page-container">
<div purpose="page-content" class="d-flex flex-column">
<docs-nav-and-search current-section="software" search-filter="software" :algolia-public-key="algoliaPublicKey"></docs-nav-and-search>
<div purpose="search-and-headline" class="d-flex flex-md-row flex-column justify-content-between align-items-md-center">
<div purpose="page-title" class="d-flex flex-column">
<h1>App library</h1>
<p>Install Fleet-maintained apps on your hosts without the need for additional configuration. Activate self-service for your end users.</p>
</div>
<!-- <div purpose="app-search" id="docsearch-query" class="d-flex">
<div purpose="disabled-search" class="d-flex w-100">
<div class="input-group d-flex flex-nowrap">
<div class="input-group-prepend">
<span class="input-group-text border-0 bg-transparent" >
<img style="height: 16px; width: 16px;" class="search" alt="search" src="/images/icon-search-16x16@2x.png">
</span>
</div>
<div class="form-control border-0 ">
<input class="docsearch-input pr-1"
placeholder="Search" aria-label="Search"
/>
</div>
</div>
</div>
</div> -->
</div>
<div purpose="count-and-cta" class="d-flex flex-sm-row flex-column align-items-sm-center align-items-start justify-content-sm-between justify-content-center mb-3">
<div><p class="mb-0"><strong>{{allApps.length}} and counting....</strong></p></div>

View file

@ -1,161 +1,36 @@
<div id="basic-documentation" v-cloak>
<div purpose="docs-landing-page" v-if="isDocsLandingPage">
<div style="max-width: 948px;" class="container-fluid p-0 px-3 px-sm-4 py-5 mb-5 mx-auto">
<div class="text-center">
<h1 class="pt-5">Fleet documentation</h1>
<p class="mb-2">Welcome to the documentation for Fleet, the lightweight management platform for laptops and servers.</p>
</div>
<div purpose="search" id="docsearch-query-landing" class="d-flex p-0 mt-5">
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text border-0 bg-transparent pl-3" >
<img style="height: 16px; width: 16px;" class="search" alt="search" src="/images/icon-search-16x16@2x.png">
</span>
</div>
<div class="form-control border-0 ">
<input class="docsearch-input pr-1"
placeholder="Search..." aria-label="Search the docs and guides"
/>
</div>
</div>
</div>
<p purpose="support-link">Can't find what you're looking for? <a href="/support">Support</a></p>
<div purpose="docs-tree">
<div class="container-fluid d-flex flex-column flex-sm-row justify-content-sm-between p-0 px-4">
<div v-for="page in findPagesByUrl()">
<div style="max-width: 300px;" class="container-fluid justify-content-start align-items-center p-0 px-2 pt-4 m-0 mt-3">
<h3 class="mb-4">{{page.title}}</h3>
<ul style="list-style: none;" class="p-0 m-0">
<li class="mb-2" v-for="subpage in findPagesByUrl(page.url)">
<a :href="subpage.url">{{subpage.title}}</a>
</li>
</ul>
</div>
</div>
</div>
</div>
<div purpose="page-container">
<div purpose="page-content">
<docs-nav-and-search search-filter="docs" current-section="docs" :algolia-public-key="algoliaPublicKey"></docs-nav-and-search>
<div purpose="mobile-table-of-contents" class="d-flex d-lg-none" @click="clickOpenMobileDocsNav()">
<img src="/images/icon-hamburger-menu-16x14@2x.png" alt="click to open the table of contents." >
<p class="mb-0"><%= thisPage.title %></p>
</div>
</div>
<div v-else>
<div purpose="docs-template" style="max-width: 1200px;" class="container-fluid px-lg-3 mb-5">
<div purpose="breadcrumbs-and-search" class="conainer-fluid d-flex flex-column flex-lg-row justify-content-lg-between p-0 pt-4 pb-lg-2 m-0 breadcrumbs-search">
<div purpose="breadcrumbs" class="d-none d-lg-flex p-0 m-0 align-items-center breadcrumbs">
<a :href="'/' + breadcrumbs[0]" class="pr-3" v-if="breadcrumbs.length > 1">
{{breadcrumbs[0] === 'docs' ? 'Documentation' : breadcrumbs[0]}}
</a>
<div class="d-flex p-0 m-0 align-items-center" v-if="breadcrumbs.length === 3">
<img style="width: 6px; height: 9px;" alt="right chevron" src="/images/chevron-right-6x9@2x.png" />
<a :href="'/' + breadcrumbs[0] + '/' + breadcrumbs[1]" class="px-3">
{{getTitleFromUrl(breadcrumbs[1])}}
</a>
</div>
<div class="d-flex p-0 m-0 align-items-center" v-if="breadcrumbs.length > 1">
<img style="width: 6px; height: 9px;" alt="right chevron" src="/images/chevron-right-6x9@2x.png"/>
<p class="px-3 m-0">
{{thisPage.title}}
</p>
</div>
</div>
<div purpose="search" id="docsearch-query" class="d-flex p-0 mb-2 mb-lg-0">
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text border-0 bg-transparent pl-3">
<img style="height: 16px; width: 16px;" class="search" alt="search" src="/images/icon-search-16x16@2x.png">
</span>
</div>
<div class="form-control border-0 ">
<input class="docsearch-input pr-1"
placeholder="Search the docs..." aria-label="Search the docs and guides"
v-model="inputTextValue"/>
</div>
</div>
</div>
<div purpose="mobile-docs-nav" class="d-flex-block d-lg-none">
<div class="d-flex flex-column d-lg-none p-0 m-0 justify-content-start align-items-center">
<button purpose="docs-nav-button" class="btn btn-block d-flex align-items-center docs-nav-button" type="button" @click="toggleDocsNav">
<span class="pr-2 m-0">Docs</span>
<img class="my-auto" style="width: 6px; height: 9px;" alt="right chevron" src="/images/chevron-right-6x9@2x.png"/>
<span class="font-weight-bold px-2 m-0">{{getTitleFromUrl(breadcrumbs[1])}}</span>
<img style="width: 6px; height: 9px;" class="ml-auto my-auto" alt="right chevron" src="/images/chevron-right-6x9@2x.png" v-if="!showDocsNav"/>
<img style="width: 9px; height: 6px;" class="ml-auto my-auto" alt="down chevron" src="/images/chevron-down-9x6@2x.png" v-else/>
</button>
</div>
<div class="border-bottom" v-if="!showDocsNav"></div>
<div class="d-flex px-0 border-bottom mobile-docs-nav" v-if="showDocsNav">
<div class="container-fluid px-0 pt-4">
<ul class="px-0 mb-0 pb-3">
<li class="px-0 mb-2" v-for="page in findPagesByUrl()" :key="page.title">
<span class="font-weight-bold">
{{page.title}}
</span>
<div purpose="expanded-nav" class="pt-3">
<ul class="p-0 pl-2 mb-3" v-if="!_.isEmpty(findPagesByUrl(page.url))">
<li v-for="subpage in findPagesByUrl(page.url)" :key="subpage.title">
<a :href="subpage.url" :class="subpage.title === thisPage.title ? 'topic active' : 'topic'">
{{subpage.title}}
</a>
</li>
</ul>
</div>
</li>
</ul>
<ul class="px-0 mb-0 pt-3" purpose="mobile-docs-nav-other-links">
<li class="px-0 mb-3"><a href="/queries">Built-in checks</a></li>
<li class="px-0 mb-3"><a href="/tables">Raw data</a></li>
<li class="px-0 mb-3"><a href="/app-library">App library</a></li>
<li class="px-0 mb-3"><a href="/releases">Release notes</a></li>
<li class="px-0 mb-3"><a href="/docs/contributing" target="_blank">Contributing</a></li>
<li class="px-0 mb-3"><a href="/support">Support</a></li>
<li class="px-0 mb-3"><a href="/contact">Take a tour</a></li>
</ul>
</div>
</div>
</div>
</div>
<div purpose="docs-template" class="container-fluid p-0">
<h1 purpose="page-title" class="d-flex d-lg-none py-4 m-0"><%= thisPage.title %></h1>
<div purpose="edit-button-container">
<a :purpose="thisPage.title !== 'FAQ' ? 'edit-button' : 'faq-edit-button'" :href="'https://github.com/fleetdm/fleet/edit/main/docs/'+thisPage.sectionRelativeRepoPath" target="_blank">
<i class="fa fa-pencil"></i>Edit page
</a>
</div>
<div class="container-fluid d-flex flex-column flex-lg-row p-0 pt-lg-4 pb-lg-4 m-0">
<div purpose="left-sidebar" class="d-none d-lg-flex flex-column text-left pl-0 pr-4 left-sidebar">
<ul class="p-0 pb-3 m-0 left-nav">
<li v-for="page in findPagesByUrl()" :key="page.title">
<span class="font-weight-bold pb-3">{{page.title}}</span>
<div purpose="expanded-nav" class="pt-3" >
<ul class="p-0 pl-2 mb-3">
<li v-for="subpage in findPagesByUrl(page.url)" :key="subpage.title">
<a :href="subpage.url" :class="subpage.title === thisPage.title ? 'topic active' : 'topic'">
{{subpage.title}}
</a>
</li>
</ul>
<div purpose="content-and-desktop-sidebars" class="d-flex flex-column flex-lg-row">
<div purpose="left-sidebar" class="d-none d-lg-flex flex-column text-left left-sidebar">
<div purpose="left-sidebar-links">
<div v-for="page in findPagesByUrl()" :key="page.title">
<p purpose="section-title">{{page.title}}</p>
<div purpose="expanded-nav">
<a :href="subpage.url" purpose="subpage-link" :class="subpage.title === thisPage.title ? 'topic active' : 'topic'" v-for="subpage in findPagesByUrl(page.url)" :key="subpage.title">
{{subpage.title}}
</a>
</div>
</li>
</ul>
<a class="pt-4 pb-3" href="/queries">Built-in checks</a>
<a class="pb-3" href="/tables">Raw data</a>
<a class="pb-3" href="/app-library">App library</a>
<a class="pb-3" target="_blank" href="/releases">Release notes</a>
<a class="pb-3" href="/docs/contributing" target="_blank">Contributing</a>
<a class="pb-3" target="_blank" href="/support">Support</a>
<a class="pb-3" href="/contact">Take a tour</a>
</div>
</div>
<a purpose="subpage-link" target="_blank" href="/releases">Release notes</a>
<a purpose="subpage-link" href="/docs/contributing" target="_blank">Contributing</a>
<a purpose="subpage-link" target="_blank" href="/support">Support</a>
<a purpose="subpage-link" href="/contact">Take a tour</a>
<div class="d-none d-lg-block" purpose="swag-cta" v-if="showSwagForm">
<a class="d-flex align-items-center justify-content-center" @click="clickSwagRequestCTA()">
<div class="d-flex flex-column align-items-center">
@ -169,27 +44,24 @@
</div>
</div>
<div purpose="right-sidebar" class="order-first order-lg-last p-0 pb-2 pb-lg-0 pr-lg-0 right-sidebar" v-if="!thisPage.title.includes('FAQ')">
<p class="font-weight-bold pb-2 m-0 mb-2" v-if="!_.isEmpty(subtopics)">On this page:</p>
<div purpose="subtopics" v-if="!_.isEmpty(subtopics)">
<ul class="p-0 m-0">
<!-- <li v-for="(subtopic, index) in subtopics" :class="pl-lg-2 pb-3 pb-1g-2 subtopic" :key="index">
<a :class="getActiveSubtopicClass(currentLocation, subtopic.url)" :href="subtopic.url">{{subtopic.title}}</a>
</li> -->
<li v-for="(subtopic, index) in subtopics" class="pl-lg-3 pb-3 pb-lg-2 subtopic" :key="index">
<a :href="subtopic.url">{{subtopic.title}}</a>
</li>
<li class="d-lg-none pl-lg-3 subtopic">
<a href="/support">Help and feedback</a>
</li>
</ul>
<div purpose="right-sidebar" class="order-first order-lg-last right-sidebar" v-if="!thisPage.title.includes('FAQ') && !_.isEmpty(subtopics)">
<div class="d-none d-lg-block">
<p purpose="subtopics-heading" class="font-weight-bold">On this page:</p>
<div purpose="subtopics" v-if="!_.isEmpty(subtopics)">
<a purpose="subtopic-link" v-for="(subtopic, index) in subtopics" :href="subtopic.url">{{subtopic.title}}</a>
</div>
</div>
<div class="d-block d-lg-none" >
<div purpose="mobile-custom-select" class="d-flex flex-row justify-content-between" @click="clickOpenMobileSubtopicsNav()">
<div><p class="mb-0">On this page</p></div>
<div><img src="/images/icon-select-arrows-16x16@2x.png" alt="click to open the table of contents"></div>
</div>
</div>
</div>
<div purpose="content" id="body-content" class="d-flex flex-column px-lg-5 content" parasails-has-no-page-script>
<div purpose="content" id="body-content" class="d-flex flex-column content" parasails-has-no-page-script>
<%- partial(
path.relative(
path.dirname(__filename),
@ -202,7 +74,6 @@
)
)
) %>
<div purpose="docs-start-cta" class="d-flex flex-column flex-sm-row justify-content-between">
<div purpose="docs-start-cta-image" class="col-sm-6 col-md-5 col-lg-6"></div>
<div purpose="docs-start-cta-content" class="d-flex flex-column justify-content-center text-center">
@ -225,19 +96,40 @@
<%}%>
</div>
</div>
</div>
</div>
</div>
<div purpose="back-to-top-button-container">
<div purpose="back-to-top-button" nohightlight @click="clickScrollToTop">
<p class="mb-0"><img alt="An arrow pointing up" class="d-inline" src="/images/icon-arrow-up-12x13@2x.png">Back to top</p>
</div>
</div>
</div>
<div purpose="back-to-top-button-container">
<div purpose="back-to-top-button" nohightlight @click="clickScrollToTop">
<p class="mb-0"><img alt="An arrow pointing up" class="d-inline" src="/images/icon-arrow-up-12x13@2x.png">Back to top</p>
</div>
</div>
<div purpose="table-of-contents-modal">
<modal v-if="modal === 'table-of-contents'" @close="closeModal()">
<div purpose="modal-links">
<div v-for="page in findPagesByUrl()" :key="page.title">
<p purpose="section-title">{{page.title}}</p>
<div purpose="expanded-nav">
<a purpose="modal-nav-link" :href="subpage.url" :class="subpage.title === thisPage.title ? 'active' : ''" v-for="subpage in findPagesByUrl(page.url)" :key="subpage.title">
{{subpage.title}}
</a>
</div>
</div>
</div>
</modal>
</div>
<div purpose="subtopics-modal">
<modal v-if="modal === 'subtopics'" @close="closeModal()">
<p class="font-weight-bold pb-2 m-0 mb-2" v-if="!_.isEmpty(subtopics)">On this page:</p>
<div purpose="modal-links">
<a v-for="subtopic in subtopics" purpose="modal-nav-link" class="d-block" :href="subtopic.url" @click="closeModal()">{{subtopic.title}}</a>
</div>
</modal>
</div>
</div>
<%- /* Expose server-rendered data as window.SAILS_LOCALS :: */ exposeLocalsToBrowser() %>

View file

@ -1,93 +1,74 @@
<div id="osquery-table-details" v-cloak>
<div class="d-flex flex-column justify-content-center">
<div purpose="search-and-filters" class="d-flex flex-column justify-content-center">
<div purpose="filter-row" style="max-width: 1200px;" class="mx-auto py-4 w-100 d-flex flex-sm-row flex-column justify-content-between">
<div class="d-flex">
<div purpose="platform-selector" class="d-flex flex-row justify-content-between align-items-center"
id="dropdownMenuSelectPurpose" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
{{userFriendlyPlatformNames[selectedPlatform]}} <img class="d-flex align-self-end" style="width: 16px; height: 16px;" src="/images/chevron-down-16x16@2x.png" alt="a small shevron pointing downwards">
</div>
<div purpose="platform-selector-dropwdown" class="dropdown-menu" aria-labelledby="dropdownMenuSelectPurpose">
<div class="dropdown-item d-block"
@click="clickFilterByPlatform('all')">All platforms</div>
<div class="dropdown-item d-block"
@click="clickFilterByPlatform('windows')">Windows</div>
<div class="dropdown-item d-block"
@click="clickFilterByPlatform('linux')">Linux</div>
<div class="dropdown-item d-block"
@click="clickFilterByPlatform('darwin')">macOS</div>
<div class="dropdown-item d-block"
@click="clickFilterByPlatform('chrome')">ChromeOS</div>
</div>
<div purpose="page-container">
<div purpose="page-content">
<docs-nav-and-search search-filter="tables" current-section="tables" :algolia-public-key="algoliaPublicKey"></docs-nav-and-search>
<div purpose="page-headline" class="d-flex flex-column">
<h2>Tables</h2>
<p>Fleet uses osquery tables to query operating system, hardware, and software data. Each table provides specific data for analysis and filtering.</p>
</div>
<div class="d-flex">
<div purpose="search" id="docsearch-query" class="d-flex align-items-center">
<div purpose="disabled-search" class="d-flex align-items-center">
<img style="height: 16px; width: 16px;" class="d-inline mr-2" alt="search" src="/images/icon-search-16x16@2x.png">
<input placeholder="Search tables" class="pl-1" >
</div>
<div purpose="platform-filters" class="d-flex flex-row justify-content-center">
<div purpose="platform-filter" :class="[selectedPlatform === 'apple' ? 'selected' : '']" class="d-flex flex-row justify-content-center align-items-center" @click="clickSelectPlatform('apple')">
<p class="d-flex align-items-center">
<img src="/images/os-macos-dark-24x24@2x.png" alt="macOS" class="d-inline">
<span class="d-none d-md-inline">Apple</span>
</p>
</div>
</div>
</div>
<hr>
<div purpose="mobile-nav" class="d-flex d-lg-none flex-column">
<div class="d-flex flex-row justify-content-between align-items-center" @click="clickToggleTableNav()">
<div purpose="table-of-contents-header" class="d-flex flex-row">
<h4 style="font-size: 16px; line-height: 24px; font-weight: 700; margin-bottom: 0px;">
<img class="d-inline" style="vertical-align: middle;margin-right: 12px; height: 14px; width: 16px;" src="/images/icon-hamburger-menu-16x14@2x.png" alt="A menu icon">
Tables
<span class="ml-2" purpose="number-of-tables">{{numberOfTablesDisplayed}}</span>
</h4>
<div purpose="platform-filter" :class="[selectedPlatform === 'linux' ? 'selected' : '']" class="d-flex flex-row justify-content-center align-items-center" @click="clickSelectPlatform('linux')">
<p class="d-flex align-items-center">
<img src="/images/os-linux-dark-24x24@2x.png" alt="Linux" class="d-inline">
<span class="d-none d-md-inline">Linux</span>
</p>
</div>
<img style="width: 6px; height: 9px;" class="d-flex d-lg-none justify-self-end" alt="right chevron" src="/images/chevron-right-6x9@2x.png" v-if="!showTableNav"/>
<img style="width: 9px; height: 6px;" class="d-flex d-lg-none justify-self-end" alt="down chevron" src="/images/chevron-down-9x6@2x.png" v-else/>
</div>
<div class="d-flex d-lg-none pt-3" v-if="showTableNav">
<div purpose="mobile-table-of-contents">
<a class="d-block" :class="[tableToDisplay.title === table.title ? 'active' : '']" :href="table.url+[selectedPlatform !== 'all' ? '?platformFilter='+encodeURIComponent(selectedPlatform) : '' ]" v-for="table in filteredTables">{{table.title}} <span purpose="evented-table-icon" v-if="table.evented"><img alt="evented table" src="/images/icon-evented-12x12@2x.png" ></span></a>
<div purpose="platform-filter" :class="[selectedPlatform === 'windows' ? 'selected' : '']" class="d-flex flex-row justify-content-center align-items-center" @click="clickSelectPlatform('windows')">
<p class="d-flex align-items-center">
<img src="/images/os-windows-dark-24x24@2x.png" alt="Windows" class="d-inline">
<span class="d-none d-md-inline">Windows</span>
</p>
</div>
</div>
</div>
<hr class="d-lg-none d-flex">
</div>
<div purpose="content" class="container" style="max-width: 1200px;">
<div class="d-flex flex-lg-row flex-column justify-content-between">
<div purpose="left-sidebar" class="d-none d-lg-flex flex-column">
<div class="d-flex flex-row justify-content-between">
<div purpose="table-of-contents-header" class="d-flex flex-row">
<h4 style="font-size: 16px; line-height: 24px; font-weight: 700;">
Tables<span class="ml-2" purpose="number-of-tables">{{numberOfTablesDisplayed}}</span>
</h4>
</div>
</div>
<div style="position: relative;">
<div purpose="table-of-contents">
<a class="d-block" purpose="table-of-contents-link" :class="[tableToDisplay.title === table.title ? 'active' : '']" :href="table.url+[selectedPlatform !== 'all' ? '?platformFilter='+encodeURIComponent(selectedPlatform) : '' ]" v-for="table in filteredTables">{{table.title}} <span purpose="evented-table-icon" v-if="table.evented"><img alt="evented table" src="/images/icon-evented-12x12@2x.png" ></span></a>
</div>
<div purpose="overflow-shadow" class="d-none d-lg-block"></div>
<div purpose="platform-filter" :class="[selectedPlatform === 'chrome' ? 'selected' : '']" class="d-flex flex-row justify-content-center align-items-center" @click="clickSelectPlatform('chrome')">
<p class="d-flex align-items-center">
<img src="/images/os-chromeos-dark-24x24@2x.png" alt="Chrome" class="d-inline">
<span class="d-none d-md-inline">ChromeOS</span>
</p>
</div>
</div>
<div purpose="table-container" class="d-flex flex-column pl-xl-5 pl-lg-3 w-100">
<div purpose="schema-table">
<div purpose="platform-logos" class="d-flex flex-row align-items-center">
<img class="mx-2" style="height: 25px" src="/images/os-macos-dark-24x24@2x.png" alt="macOS logo" v-if="_.includes(tableToDisplay.platforms, 'darwin')">
<img class="mx-2" style="height: 24px" src="/images/os-windows-dark-24x24@2x.png" alt="Windows logo" v-if="_.includes(tableToDisplay.platforms, 'windows')">
<img class="mx-2" style="height: 24px" src="/images/os-linux-dark-24x24@2x.png" alt="Linux logo" v-if="_.includes(tableToDisplay.platforms, 'linux')">
<img class="mx-2" style="height: 25px" src="/images/os-chromeos-dark-24x24@2x.png" alt="macOS logo" v-if="_.includes(tableToDisplay.platforms, 'chrome')">
</div>
<%- partial(path.relative(path.dirname(__filename), path.resolve( sails.config.appPath, path.join(sails.config.builtStaticContent.compiledPagePartialsAppPath, tableToDisplay.htmlId)))) %>
</div>
<div class="justify-self-end">
<a :href="tableToDisplay.githubUrl" purpose="edit-button" target="_blank">Edit page<i class="fa fa-pencil"></i></a>
<div class="d-block justify-self-end" purpose="slack-cta">
<h3 class="pt-0" style="font-size: 24px; line-height: 28px;">Need more help?</h3>
<div class="d-sm-flex">
<a href="/slack" target="_blank" class="d-flex btn btn-md btn-outline-secondary justify-content-center align-items-center mt-3 mt-sm-0" purpose="next-steps-button">
<img style="height: 24px;" class="pr-3" alt="Slack logo" src="/images/logo-slack-24x24@2x.png"/>
Ask the community on Slack
</a>
<div class="d-flex flex-column justify-content-center">
<div purpose="content" class="container p-0" style="max-width: 1200px;">
<div class="d-flex flex-lg-row flex-column justify-content-start">
<div purpose="left-sidebar" class="d-none d-lg-flex flex-column">
<div style="position: relative;">
<div purpose="table-of-contents">
<a class="d-block" purpose="table-of-contents-link" :class="[tableToDisplay.title === table.title ? 'active' : '']" :href="table.url+'#'+selectedPlatform" v-for="table in filteredTables">{{table.title}} <span purpose="evented-table-icon" v-if="table.evented"><img alt="evented table" src="/images/icon-evented-12x12@2x.png" ></span></a>
</div>
<div purpose="overflow-shadow" class="d-none d-lg-block"></div>
</div>
</div>
<div purpose="mobile-custom-select" class="d-flex d-lg-none flex-row justify-content-between" @click="clickOpenTablesNav()">
<div><p class="mb-0"><%= tableToDisplay.title %></p></div>
<div><img src="/images/icon-select-arrows-16x16@2x.png" alt="click to open the table of contents"></div>
</div>
<div purpose="table-container" class="d-flex flex-column">
<div purpose="schema-table">
<%- partial(path.relative(path.dirname(__filename), path.resolve( sails.config.appPath, path.join(sails.config.builtStaticContent.compiledPagePartialsAppPath, tableToDisplay.htmlId)))) %>
</div>
<div class="justify-self-end">
<a :href="tableToDisplay.githubUrl" purpose="edit-button" target="_blank">Edit page<i class="fa fa-pencil"></i></a>
<div class="d-block justify-self-end" purpose="slack-cta">
<h3 class="pt-0" style="font-size: 24px; line-height: 28px;">Need more help?</h3>
<div class="d-sm-flex">
<a href="/slack" target="_blank" class="d-flex btn btn-md btn-outline-secondary justify-content-center align-items-center mt-3 mt-sm-0" purpose="next-steps-button">
<img style="height: 24px;" class="pr-3" alt="Slack logo" src="/images/logo-slack-24x24@2x.png"/>
Ask the community on Slack
</a>
</div>
</div>
</div>
</div>
</div>
@ -95,5 +76,12 @@
</div>
</div>
</div>
<div purpose="table-of-contents-modal" >
<modal v-if="modal === 'table-of-contents'" @close="closeModal()">
<div purpose="modal-table-of-contents">
<a class="d-block" purpose="modal-table-of-contents-link" :class="[tableToDisplay.title === table.title ? 'active' : '']" :href="table.url+'#'+selectedPlatform" v-for="table in filteredTables">{{table.title}} <span purpose="evented-table-icon" v-if="table.evented"><img alt="evented table" src="/images/icon-evented-12x12@2x.png" ></span></a>
</div>
</modal>
</div>
</div>
<%- /* Expose server-rendered data as window.SAILS_LOCALS :: */ exposeLocalsToBrowser() %>

View file

@ -1,30 +1,13 @@
<div id="policy-details" v-cloak>
<div purpose="page-container">
<div purpose="page-content">
<div purpose="breadcrumbs-and-search" class="d-flex flex-md-row flex-column justify-content-between align-items-md-center align-items-start">
<div purpose="breadcrumbs" class="d-flex flex-row align-items-start">
<div>
<a purpose="breadcrumbs-category" class="text-nowrap" href="/policies">Policies</a>/
</div>
<div purpose="breadcrumbs-title">
<span><%- policy.name %></span>
</div>
<docs-nav-and-search search-filter="policies" current-section="policies" :algolia-public-key="algoliaPublicKey"></docs-nav-and-search>
<div purpose="breadcrumbs" class="d-flex flex-row align-items-start">
<div>
<a purpose="breadcrumbs-category" class="text-nowrap" href="/policies">Policies</a>/
</div>
<div purpose="search" id="docsearch-query" class="d-flex">
<div purpose="disabled-search" class="d-flex w-100">
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text border-0 bg-transparent pl-3" >
<img style="height: 16px; width: 16px;" class="search" alt="search" src="/images/icon-search-16x16@2x.png">
</span>
</div>
<div class="form-control border-0 ">
<input class="docsearch-input pr-1"
placeholder="Search" aria-label="Search the handbook"
/>
</div>
</div>
</div>
<div purpose="breadcrumbs-title">
<span><%- policy.name %></span>
</div>
</div>
<div purpose="policy-details-and-sidebar" class="d-flex flex-lg-row flex-column">

View file

@ -2,28 +2,13 @@
<div purpose="page-container">
<div purpose="page-content">
<docs-nav-and-search search-filter="policies" current-section="policies" :algolia-public-key="algoliaPublicKey"></docs-nav-and-search>
<div purpose="search-and-headline" class="d-flex flex-md-row flex-column justify-content-between align-items-md-center align-items-start">
<div purpose="page-headline" class="d-flex flex-column">
<h2>Policies</h2>
<p>A collection of policies, OS settings, and scripts for macOS, Windows, and Linux.</p>
<p>Contributions welcome <a target="_blank" href="https://github.com/fleetdm/fleet/blob/main/docs/01-Using-Fleet/standard-query-library/standard-query-library.yml">over on GitHub.</a></p>
</div>
<div purpose="policy-search" id="docsearch-query" class="d-flex">
<div purpose="disabled-search" class="d-flex">
<div class="input-group d-flex flex-nowrap">
<div class="input-group-prepend">
<span class="input-group-text border-0 bg-transparent" >
<img style="height: 16px; width: 16px;" class="search" alt="search" src="/images/icon-search-16x16@2x.png">
</span>
</div>
<div class="form-control border-0 ">
<input class="docsearch-input pr-1"
placeholder="Search" aria-label="Search"
/>
</div>
</div>
</div>
</div>
</div>
<div purpose="platform-filters" class="d-flex flex-row justify-content-center">
<div purpose="platform-filter" :class="[selectedPlatform === 'macos' ? 'selected' : '']" class="d-flex flex-row justify-content-center align-items-center" @click="clickSelectPlatform('macos')">

View file

@ -1,30 +1,13 @@
<div id="query-detail" v-cloak>
<div purpose="page-container">
<div purpose="page-content">
<div purpose="breadcrumbs-and-search" class="d-flex flex-md-row flex-column justify-content-between align-items-md-center align-items-start">
<div purpose="breadcrumbs" class="d-flex flex-row align-items-start">
<div>
<a purpose="breadcrumbs-category" class="text-nowrap" href="/queries">Queries</a>/
</div>
<div purpose="breadcrumbs-title">
<span><%- query.name %></span>
</div>
<docs-nav-and-search search-filter="queries" current-section="queries" :algolia-public-key="algoliaPublicKey"></docs-nav-and-search>
<div purpose="breadcrumbs" class="d-flex flex-row align-items-start">
<div>
<a purpose="breadcrumbs-category" class="text-nowrap" href="/queries">Queries</a>/
</div>
<div purpose="search" id="docsearch-query" class="d-flex">
<div purpose="disabled-search" class="d-flex w-100">
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text border-0 bg-transparent pl-3" >
<img style="height: 16px; width: 16px;" class="search" alt="search" src="/images/icon-search-16x16@2x.png">
</span>
</div>
<div class="form-control border-0 ">
<input class="docsearch-input pr-1"
placeholder="Search" aria-label="Search the handbook"
/>
</div>
</div>
</div>
<div purpose="breadcrumbs-title">
<span><%- query.name %></span>
</div>
</div>
<div purpose="query-details-and-sidebar" class="d-flex flex-lg-row flex-column">

View file

@ -2,27 +2,12 @@
<div purpose="page-container">
<div purpose="page-content">
<docs-nav-and-search search-filter="queries" current-section="queries" :algolia-public-key="algoliaPublicKey"></docs-nav-and-search>
<div purpose="search-and-headline" class="d-flex flex-md-row flex-column justify-content-between align-items-md-center align-items-start">
<div purpose="page-headline" class="d-flex flex-column">
<h2>Queries</h2>
<p>A collection of optional queries you can run anytime. Contributions welcome <a target="_blank" href="https://github.com/fleetdm/fleet/edit/main/docs/queries.yml">over on GitHub.</a></p>
</div>
<div purpose="policy-search" id="docsearch-query" class="d-flex">
<div purpose="disabled-search" class="d-flex">
<div class="input-group d-flex flex-nowrap">
<div class="input-group-prepend">
<span class="input-group-text border-0 bg-transparent" >
<img style="height: 16px; width: 16px;" class="search" alt="search" src="/images/icon-search-16x16@2x.png">
</span>
</div>
<div class="form-control border-0 ">
<input class="docsearch-input pr-1"
placeholder="Search" aria-label="Search"
/>
</div>
</div>
</div>
</div>
</div>
<div purpose="platform-filters" class="d-flex flex-row justify-content-center">
<div purpose="platform-filter" :class="[selectedPlatform === 'macos' ? 'selected' : '']" class="d-flex flex-row justify-content-center align-items-center" @click="clickSelectPlatform('macos')">

View file

@ -1,27 +1,12 @@
<div id="vital-details" v-cloak>
<div purpose="page-container">
<div purpose="page-content">
<docs-nav-and-search search-filter="vitals" current-section="vitals" :algolia-public-key="algoliaPublicKey"></docs-nav-and-search>
<div purpose="search-and-headline" class="d-flex flex-md-row flex-column justify-content-between align-items-md-center align-items-start">
<div purpose="page-headline" class="d-flex flex-column">
<h2>Vitals</h2>
<p>Fleets built-in queries for collecting and storing important device information.</p>
</div>
<div purpose="vitals-search" id="docsearch-query" class="d-flex">
<div purpose="disabled-search" class="d-flex">
<div class="input-group d-flex flex-nowrap">
<div class="input-group-prepend">
<span class="input-group-text border-0 bg-transparent" >
<img style="height: 16px; width: 16px;" class="search" alt="search" src="/images/icon-search-16x16@2x.png">
</span>
</div>
<div class="form-control border-0 ">
<input class="docsearch-input pr-1"
placeholder="Search" aria-label="Search"
/>
</div>
</div>
</div>
</div>
</div>
<div purpose="platform-filters" class="d-flex flex-row justify-content-center">
<div purpose="platform-filter" :class="[selectedPlatform === 'apple' ? 'selected' : '']" class="d-flex flex-row justify-content-center align-items-center" @click="clickSelectPlatform('apple')">