1
0
mirror of synced 2025-12-21 10:57:10 -05:00
Files
docs/lib/frontmatter.js
Edward Thomson 0fee9aedcd Landing page: groups of features (#22313)
* homepage: reduce padding below search area

Bring as much useful content up "above the fold".

* homepage: add groups for the front page sections

Group the homepage links into sections that map to the GitHub features
page (`/features`) plus two groups that are bespoke to the docs ("Get
started" and "Developers").

* homepage: update group design

Group the feature list area using the design exploration work by
@arisacoba.  Remove the description.

* homepage: remove ungrouped items from main area

Remove ungrouped items (like the external links) from the main feature
area.  Users can still navigate to ungrouped items in the sidebar.

* fix tsc error, use Link component

* homepage: support empty icon in group

Don't assume that we have icons everywhere on the landing page groups.

* homepage: drop octocat/invertocat

Looks weird with the modern icons, looks bad in dark mode.  Drop them
for now.

* homepage: document the childGroups frontmatter property

* homepage: don't test that sidebar == main content

We're reducing the links on the homepage in the main content area, but
the sidebar should be the complete list of products.  Remove the tests
that ensure that the main content area has all the sidebar content.  But
keep the tests that ensure that the sidebar content has all the links in
the main content area.

* homepage: remove "GitHub" doc set

The "GitHub" doc set "will be removed soon as we keep moving more content
out of it, so let's not include it here to keep the page more
evergreen."

* homepage: don't test that `/github` is linked on the main page

We're removing the `/github` doc set, and it's now not in the main page
grouped links.  Remove the test that `/github` exists, now look for
`/get-started`.

* homepage: use octicons instead of images

The images from https://github.com/features will be updated 🔜 - in
the meantime, let's use octicons which are consistent and give visual
interest.

* homepage: use octicons from @primer/octicons-react

Using the react components adds `<svg>` elements instead of `<img>`
elements, which lets the element use the current fill color, supporting
both light and dark themes.

Co-authored-by: Mike Surowiec <mikesurowiec@users.noreply.github.com>
Co-authored-by: Emily Gould <4822039+emilyistoofunky@users.noreply.github.com>
2021-10-22 17:58:16 +00:00

261 lines
6.2 KiB
JavaScript

import fs from 'fs'
import path from 'path'
import parse from './read-frontmatter.js'
import semver from 'semver'
import { allVersions } from './all-versions.js'
const layoutNames = [
'default',
'dev-toc',
'graphql-explorer',
'product-landing',
'product-sublanding',
'release-notes',
false,
]
const semverValidRange = semver.validRange
const semverRange = {
type: 'string',
conform: semverValidRange,
message: 'Must be a valid SemVer range',
}
const versionObjs = Object.values(allVersions)
const guideTypes = ['overview', 'quick_start', 'tutorial', 'how_to', 'reference']
const featureVersions = fs
.readdirSync(path.posix.join(process.cwd(), 'data/features'))
.map((file) => path.basename(file, '.yml'))
export const schema = {
properties: {
title: {
type: 'string',
required: true,
translatable: true,
},
shortTitle: {
type: 'string',
translatable: true,
},
intro: {
type: 'string',
translatable: true,
},
product: {
type: 'string',
translatable: true,
},
permissions: {
type: 'string',
},
// true by default on articles, false on all other content
showMiniToc: {
type: 'boolean',
},
miniTocMaxHeadingLevel: {
type: 'number',
default: 2,
minimum: 2,
maximum: 4,
},
mapTopic: {
type: 'boolean',
},
// allow hidden articles under `early-access`
hidden: {
type: 'boolean',
},
layout: {
type: ['string', 'boolean'],
enum: layoutNames,
message: 'must be the filename of an existing layout file, or `false` for no layout',
},
redirect_from: {
type: ['array', 'string'],
},
allowTitleToDifferFromFilename: {
type: 'boolean',
},
introLinks: {
type: 'object',
properties: {
quickstart: { type: 'string' },
reference: { type: 'string' },
overview: { type: 'string' },
},
},
authors: {
type: 'array',
items: {
type: 'string',
},
},
examples_source: {
type: 'string',
},
effectiveDate: {
type: 'string',
},
featuredLinks: {
type: 'object',
properties: {
gettingStarted: {
type: 'array',
items: { type: 'string' },
},
guides: {
type: 'array',
items: { type: 'string' },
},
guideCards: {
type: 'array',
items: { type: 'string' },
},
popular: {
type: 'array',
items: { type: 'string' },
},
// allows you to use an alternate heading for the popular column
popularHeading: {
type: 'string',
},
},
},
// Shown in `product-landing.html` "What's new" section
changelog: {
type: 'object',
properties: {
label: { type: 'string' },
prefix: { type: 'string' },
},
},
type: {
type: 'string',
enum: guideTypes,
},
topics: {
type: 'array',
},
includeGuides: {
type: 'array',
},
learningTracks: {
type: 'array',
},
// Used in `product-landing.html`
beta_product: {
type: 'boolean',
},
// Show in `product-landing.html`
product_video: {
type: 'string',
},
interactive: {
type: 'boolean',
},
communityRedirect: {
type: 'object',
properties: {
name: 'string',
href: 'string',
},
},
// Platform-specific content preference
defaultPlatform: {
type: 'string',
enum: ['mac', 'windows', 'linux'],
},
// Tool-specific content preference
defaultTool: {
type: 'string',
enum: ['webui', 'cli', 'desktop', 'curl', 'codespaces', 'vscode'],
},
// Documentation contributed by a third party, such as a GitHub Partner
contributor: {
type: 'object',
properties: {
name: { type: 'string' },
URL: { type: 'string' },
},
},
// Child groups specified on top-level TOC
childGroups: {
type: 'array',
},
// Child links specified on any TOC page
children: {
type: 'array',
},
// External products specified on the homepage
externalProducts: {
type: 'object',
properties: {
atom: {
type: 'object',
required: true,
properties: {
id: { type: 'string', required: true },
name: { type: 'string', required: true },
href: { type: 'string', format: 'url', required: true },
external: { type: 'boolean', required: true },
},
},
electron: {
type: 'object',
required: true,
properties: {
id: { type: 'string', required: true },
name: { type: 'string', required: true },
href: { type: 'string', format: 'url', required: true },
external: { type: 'boolean', required: true },
},
},
},
},
// whether or not the page is mirrored by an experimental page
hasExperimentalAlternative: {
type: 'boolean',
},
},
}
const featureVersionsProp = {
feature: {
type: ['string', 'array'],
enum: featureVersions,
items: {
type: 'string',
},
message:
'must be the name (or names) of a feature that matches "filename" in data/features/_filename_.yml',
},
}
schema.properties.versions = {
type: ['object', 'string'], // allow a '*' string to indicate all versions
required: true,
properties: versionObjs.reduce((acc, versionObj) => {
acc[versionObj.plan] = semverRange
acc[versionObj.shortName] = semverRange
return acc
}, featureVersionsProp),
}
// Support 'github-ae': next
schema.properties.versions.properties['github-ae'] = 'next'
schema.properties.versions.properties.ghae = 'next'
function frontmatter(markdown, opts = {}) {
const defaults = {
schema,
validateKeyNames: true,
validateKeyOrder: false, // TODO: enable this once we've sorted all the keys. See issue 9658
}
return parse(markdown, Object.assign({}, defaults, opts))
}
// attach the schema object so it can be `require`d elsewhere.
frontmatter.schema = schema
export default frontmatter