diff --git a/config.yaml b/config.yaml index 24d7c97a..8b949e70 100644 --- a/config.yaml +++ b/config.yaml @@ -2,13 +2,20 @@ baseURL: "/" enableRobotsTXT: True languageCode: "en-us" title: "Crossplane" + +# directory name in /themes theme: "geekboot" + +# enable Lastmod parameter for each page. Placed in an HTML meta tag. enableGitInfo: true -uglyurls: false + +# Crossplane docs don't use the Hugo taxonomy or term page kinds. +# Disabling provides a small build speedup disableKinds: - taxonomy - term +# Enable RSS feeds for sections outputs: home: - html @@ -18,28 +25,43 @@ outputs: taxonomy: term: - +# Don't publish the README.md file in the /public folder ignoreFiles: - README.md +# build.writeStats is used to optimize CSS. +# the netlify_build.sh script uncomments this. +# The default comment means users don't need Hugo extended for authoring. build: # writeStats: true + markup: goldmark: renderer: + # Allow mixing markdown and HTML. Required for Vale and some in-line + # styling. + # Okay to run `unsafe: true` since we review .md file inputs + # More info: https://gohugo.io/getting-started/configuration-markup/#rendererunsafe unsafe: true tableOfContents: + # Which heading levels to include in the right-side table of contents startLevel: 1 endLevel: 9 highlight: + # Enable syntax styling for code fence (```) blocks codeFences: true + # Use classes instead of inline HTML styles for syntax decoration noClasses: false + # Include line numbers to the left of a code fence box linenos: true + # Make the line numbers anchor links anchorLineNos: true + # Don't put the line numbers in tables and only use SPAN elements. For CSS styling. lineNumbersInTable: false module: + # Mounts give Hugo access to images and YAML for compile-time processing. mounts: - source: content target: content @@ -57,30 +79,21 @@ module: includeFiles: - "**/api/**.yaml" +# Give Hugo access to environmental variables matching a given regex. +# These give Hugo access to Netlify data to generate proper URLs security: funcs: getenv: - ^CONTEXT - ^REVIEW_ID +# Global parameters accessible by any Page params: + # The current "latest" version. Used in the version dropdown latest: "1.15" - upboundLink: "https://www.upbound.io/" - slackLink: "https://slack.crossplane.io/" - githubLink: "https://github.com/crossplane/crossplane" - twitterLink: "https://twitter.com/crossplane_io" - forumLink: "https://groups.google.com/forum/#!forum/crossplane-dev" - youtubeLink: "https://www.youtube.com/channel/UC19FgzMBMqBro361HbE46Fw" - podcastLink: "https://www.youtube.com/playlist?list=PL510POnNVaaYFuK-B_SIUrpIonCtLVOzT" - blogLink: "https://blog.crossplane.io/" - communityMeetingLink: "https://github.com/crossplane/crossplane/#get-involved" - cncfLink: "https://www.cncf.io/" - prodFormLink: "https://docs.google.com/forms/d/e/1FAIpQLSev-5clADSdkwi_wiFqBCAECeIoAQDE91chBbeWbvyTjRCeYg/viewform" - infoMailToLink: "mailto:info@crossplane.io" - upboundGithubLink: "https://github.com/upbound" - docs: true - repoLink: "https://github.com/crossplane/crossplane" anchors: + # Generate heading anchors for any heading between min and max min: 2 max: 5 + # description for search engines. description: "Crossplane lets you build a control plane with Kubernetes-style declarative and API-driven configuration and management for anything." diff --git a/content/contribute/code-style-guide.md b/content/contribute/code-style-guide.md index 00ad2150..1cfd22ea 100644 --- a/content/contribute/code-style-guide.md +++ b/content/contribute/code-style-guide.md @@ -9,9 +9,9 @@ for source code used in documentation. ## Use fenced code blocks -Use Markdown [fenced code -blocks](https://www.markdownguide.org/extended-syntax/#fenced-code-blocks) with -three backticks (` ``` `) for +Use Markdown +[fenced code blocks](https://www.markdownguide.org/extended-syntax/#fenced-code-blocks) +with three backticks (` ``` `) for all command examples and outputs. ````markdown @@ -24,6 +24,10 @@ Only use a single backtick (`` ` ``) for commands used in a sentence. For example, the command `kubectl apply` is inside a sentence. +{{< hint "warning" >}} +Vale doesn't validate terms inside single backtick or fenced code blocks. +{{< /hint >}} + ## Use language hints for proper highlighting Hugo attempts to determine the language and apply proper styling, but it's not always optimized for readability. diff --git a/content/contribute/contribute.md b/content/contribute/contribute.md index f2cb854a..052e5e0d 100644 --- a/content/contribute/contribute.md +++ b/content/contribute/contribute.md @@ -134,6 +134,23 @@ betaVersion: "1.11" --- ``` +#### Descriptions + +Hugo uses the `description` field to populate webpage metadata for search +engines. + +```yaml +--- +title: Compositions +weight: 30 +aliases: + - composition +description: "Compositions are a template for creating Crossplane resources" +--- +``` + +The description text isn't displayed anywhere in the docs. + ### Headings Use standard markdown for headings (`#`). The top level heading, a single hash (`#`) is for the page title. All content headings should be two hashes (`##`) or diff --git a/content/contribute/infrastructure.md b/content/contribute/infrastructure.md index 143079f1..0fd1cd85 100644 --- a/content/contribute/infrastructure.md +++ b/content/contribute/infrastructure.md @@ -4,11 +4,82 @@ weight: 600 description: "Learn how the docs and our tools are built" --- -The Crossplane document website is in a unique [website GitHub -repository](https://github.com/crossplane/docs). +The Crossplane document website is in a standalone +[GitHub repository](https://github.com/crossplane/docs) separate from Crossplane +core. -Crossplane uses [Hugo](https://gohugo.io/), a static site generator. Hugo -influences the directory structure of the website repository. +The Crossplane docs tools consist of: +* [Netlify](https://netlify.com/) - web hosting and DNS provided by the CNCF. +* [Hugo](https://gohugo.io/) - to compile markdown to static HTML. +* [Bootstrap](https://getbootstrap.com/docs/5.2/) - for pre-built CSS options. +* [PostCSS](https://postcss.org/) - for CSS optimization. +* [Webpack](https://webpack.js.org/) - for Javascript optimization. + + +## Netlify + +Builds for production deploys and PR previews are automatically done by Netlify. + +{{< hint "note" >}} +The CNCF controls Netlify access. +{{< /hint >}} + +Settings for Netlify are inside +[`netlify.toml`](https://github.com/crossplane/docs/blob/master/netlify.toml). + +Settings inside the `netlify.toml` file override any settings in the Netlify web +interface. + +The +[`build`](https://github.com/crossplane/docs/blob/3e9e10671c32e368f5381d83e406e16bc38c93bc/netlify.toml#L1) +directive defines what Netlify does to build the site. + +The +[`HUGO_VERSION`](https://github.com/crossplane/docs/blob/3e9e10671c32e368f5381d83e406e16bc38c93bc/netlify.toml#L7) +settings defines which version of Hugo Netlify uses. + +The +[`redirects`](https://github.com/crossplane/docs/blob/3e9e10671c32e368f5381d83e406e16bc38c93bc/netlify.toml#L9) +are server side HTTP redirects for moved pages. + +The [Netlify documentation](https://docs.netlify.com/configure-builds/file-based-configuration/) +has more information about configuring `netlify.toml`. + +Netlify automatically detects the +[`package.json`](https://github.com/crossplane/docs/blob/master/package.json) +file and loads the listed NodeJS dependencies. + + +### netlify_build.sh + + +During a build Netlify runs the Bash script +[`netlify_build.sh`](https://github.com/crossplane/docs/blob/master/netlify_build.sh). + +The script creates a new docs section called `latest` and copies the defined +`LATEST_VER` to `/latest`. + +Next the script enables `writeStats` in the Hugo configuration file. + +Then, using the Netlify `$CONTEXT` +[environmental variable](https://docs.netlify.com/configure-builds/environment-variables/#build-metadata) +Hugo runs, defining the [`BaseURL`](https://gohugo.io/methods/site/baseurl/) to +use for generating internal links. + +## Hugo +Crossplane uses [Hugo](https://gohugo.io/), a static site generator. + +Hugo combines HTML templates, markdown content and generates static HTML +content. + +{{}} +The Hugo web server is only used for local development. Crossplane documentation +uses Netlify for hosting. + +Hugo only acts as an HTML compiler. +{{< /hint >}} + +Hugo influences the directory structure of the repository. The `/content` directory is the root directory for all documentation content. @@ -17,23 +88,33 @@ files, like HTML templates, shortcodes and global media files. The `/utils/` directory is for JavaScript source code and files unrelated to Hugo used in the website. - -The `/themes/geekboot/assets` folder contains all (S)CSS and compiled JavaScript -for the website. - + + ## CSS -Crossplane documentation uses [Bootstrap -5.2](https://getbootstrap.com/docs/5.2/getting-started/introduction/). -Unmodified Bootstrap SCSS files are in -`/themes/geekboot/assets/scss/bootstrap/`. Any docs-specific overrides are in -per-element SCSS files located one directory higher in -`/themes/geekboot/assets/scss/`. + + +Crossplane documentation uses [Bootstrap 5.2](https://getbootstrap.com/docs/5.2/getting-started/introduction/). + +Bootstrap provides multiple prebuilt styles and features making CSS easier. + +The docs import _all_ Bootstrap SCSS files and rely on Hugo and PostCSS to +optimize the compiled CSS file. + +The unmodified Bootstrap SCSS files are in +`/themes/geekboot/assets/scss/bootstrap/`. + +Any docs-specific overrides are in per-element SCSS files located one directory +higher in `/themes/geekboot/assets/scss/`. {{}} Don't edit the original Bootstrap stylesheets. It makes the ability to upgrade to future Bootstrap versions difficult or impossible. {{< /hint >}} +The file `/themes/geekboot/assets/scss/docs.scss` defines all the stylesheets +Hugo loads and compiles. Add any new styles to the `docs.scss` file to include +them. + ### Color themes Crossplane docs support a light and dark color theme that's applied via CSS variables. @@ -46,108 +127,326 @@ Universal and default variables are defined in Provide theme specific color overrides in `/themes/geekboot/assets/scss/light-mode.scss` or -`/themes/geekboot/assets/scss/light-mode.scss`. +`/themes/geekboot/assets/scss/dark-mode.scss`. {{}} -When creating new styles rely on variables for any color function, even if both +When creating new styles, use variables for any colors, even if both themes share the color. {{< /hint >}} + ### SCSS compilation + + Hugo compiles the SCSS to CSS. Local development doesn't require SCSS installed. For local development (when using `hugo server`) Hugo compiles SCSS without any optimizations. -For production (publishing on Netlify or using `hugo server ---environment production`) Hugo compiles SCSS and optimizes the CSS with -[PostCSS](https://postcss.org/). The PostCSS configuration is in -`/postcss.config.js`. The optimizations includes: +In production, when publishing on Netlify or using +`hugo server --environment production`, Hugo compiles SCSS and optimizes the +CSS with [PostCSS](https://postcss.org/). + + +The PostCSS configuration is in `/postcss.config.js`. + +The optimizations includes: * [postcss-lightningcss](https://github.com/onigoetz/postcss-lightningcss) - for building, minimizing and generating a source map. * [PurgeCSS](https://purgecss.com/plugins/postcss.html) - removes unused styles to reduce the CSS file size. * [postcss-sort-media-queries](https://github.com/yunusga/postcss-sort-media-queries)- -to organize and reduce CSS media queries to remove duplicate and unused - CSS. +to organize the output CSS for another small performance boost. + +#### How optimization works + +Crossplane runs a +[different Hugo CSS command](https://github.com/crossplane/docs/blob/3e9e10671c32e368f5381d83e406e16bc38c93bc/themes/geekboot/layouts/partials/stylesheet-dynamic.html#L4) +if it's in local development or production. + +Hugo is in "production" when using `hugo` to only build HTML or with +`hugo server --environment production`. + +{{}} +Running Hugo in `production` mode requires the Hugo _extended_ version to +support PostCSS. + +Standard Hugo fails to build the documentation. +{{< /hint >}} + + + +PurgeCSS relies on a JSON file of every HTML tag and CSS class used across the +website and only preserves the matching CSS styles. The resulting file is around +20x smaller than unoptimized CSS. + + +Hugo generates the JSON file with the `buildStats` (or `writeStats`) +[configuration setting](https://gohugo.io/getting-started/configuration/#configure-build) +enabled. + +{{}} +Some tags or classes are dynamically created or not always enabled, like light +or dark mode. + +Exclude these style sheets from CSS optimization with the +`purgecss start ignore` comment. + +For example, the Crossplane documentation ignores the `color-modes` style sheet. + +```css +/* purgecss start ignore */ +@import "color-modes"; +/* purgecss end ignore */ +``` +{{< /hint >}} + +The Crossplane documentation only enables this flag during Netlify builds. +Manually update the `config.yaml` file to enable local optimization. Optimizing CSS locally with PostCSS requires installing extra packages. * [Sass](https://sass-lang.com/install) * [NPM](https://www.npmjs.com/) * NPM packages defined in `/package.json` with `npm install`. - ## JavaScript -A goal of the documentation website is to use as little JavaScript as possible. Unless -the script provides a significant improvement in performance, capability or user -experience. +A goal of the documentation website is to use as little JavaScript as possible. +Unless the script provides a significant improvement in performance, capability +or user experience. -To make local development there are no run-time dependencies for -JavaScript. - -Runtime JavaScript is in `/themes/geekboot/assets/js/`. [Webpack](https://webpack.js.org/) -has bundled, minified and compressed the JavaScript. +Local development has no run-time JavaScript dependencies. To prevent +dependencies, making JavaScript changes requires compiling and committing to git. The source JavaScript is in `/utils/webpack/src/js` and requires [Webpack](https://webpack.js.org/) to bundle and optimize the code. -* `colorMode.js` provides the ability to change the light and dark mode color theme. -* `tabDeepAnchor.js` rewrites anchor links inside tabs to open a tab and present - the anchor. +Webpack places the compiled JavaScript in `/themes/geekboot/assets/js/` and +updates `/themes/geekboot/data/assets.json` to tell Hugo the new compiled +JavaScript filename. + +{{< hint "important" >}} +The JavaScript source in `/utils/webpack/src`, newly compiled JavaScript in +`/themes/geekboot/assets/js` and updated `/themes/geekboot/data/assets.json` +must be in git for production and preview deploys to use the changed JavaScript. +{{< /hint >}} + +### JavaScript files +* `bootstrap/` is the entire Bootstrap JavaScript library. +* `colorMode.js` provides the ability to change the light and dark mode color + theme. +* `customClipboard.js` supports the `copy-lines` code box function. * `globalScripts.js` is the point of entry for Webpack to determine all dependencies. This bundles [instant.page](https://instant.page/) and [Bootstrap's JavaScript](https://getbootstrap.com/docs/5.2/getting-started/javascript/). +* `hoverHighlight.js` provides dynamic "hover to highlight" function. +* `slackNotify.js` creates the "Join Crossplane Slack" bubble on the home page. +* `tabDeepAnchor.js` rewrites anchor links inside tabs to open a tab and present + the anchor. -### Bootstrap JavaScript builder -The entire [Bootstrap JavaScript -source](https://github.com/twbs/bootstrap/tree/main/js/src) is in -`/utils/webpack/src/js/bootstrap`. +The `globalScripts.js` file is the entry point for Webpack. Any JavaScript +modules or scripts must be in `globalScripts.js` to get compiled. + +#### Building JavaScript + +Requirements: +* [NodeJS](https://nodejs.org/en/download) v20.1.2 or later. +* [NPM CLI](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) + +From the `/utils/webpack` director use `npm` to install the NodeJS dependencies. + +```shell +cd utils/webpack +npm install +``` + +Building JavaScript has two options: +1. `npm run dev` +2. `npm run prod` + +Using the `dev` argument doesn't optimize the JavaScript, simplifying +debugging. + +Using the `prod` argument optimizes the JavaScript but makes debugging more +difficult. + +{{}} +Always use `npm run prod` to build the compiled JavaScript to use on the +Crossplane documentation site. +{{< /hint >}} + +```shell +npm run prod + +> prod +> webpack --mode=production + +assets by status 80.9 KiB [cached] 1 asset +asset ../../data/assets.json 158 bytes [compared for emit] +orphan modules 180 KiB [orphan] 81 modules +runtime modules 670 bytes 3 modules +cacheable modules 223 KiB + modules by path ./src/js/*.js 186 KiB + ./src/js/globalScripts.js + 81 modules 181 KiB [built] [code generated] + ./src/js/colorMode.js 2.69 KiB [built] [code generated] + ./src/js/tabDeepAnchor.js 2.31 KiB [built] [code generated] + modules by path ./node_modules/ 37.6 KiB + ./node_modules/instant.page/instantpage.js 11.4 KiB [built] [code generated] + ./node_modules/clipboard/dist/clipboard.js 26.2 KiB [built] [code generated] +webpack 5.89.0 compiled successfully in 1248 ms +``` + +## Search + +[Algolia](https://www.algolia.com/) provides search functionality through their +[DocSearch](https://docsearch.algolia.com/) program. + +{{< hint note >}} +Crossplane docs don't use the Netlify Algolia plugin and relies on the +[Algolia Crawler](https://www.algolia.com/doc/tools/crawler/getting-started/overview/) to +discover new content and changes. +{{< /hint >}} + +## Sitemap and robots + +Hugo generates the `robots.txt` +[automatically](https://gohugo.io/templates/robots/). + +For search engine discovery Crossplane uses a `sitemap.xml` file generated from +the [`sitemap.xml` template](https://github.com/crossplane/docs/blob/master/themes/geekboot/layouts/_default/sitemap.xml). + +## Link checking + +Crossplane checks links with Hugo and +[`htmltest`](https://github.com/wjdp/htmltest). + +Hugo builds fail for any broken links in a Hugo `ref` shortcode. + +To catch markdown links `htmltest` crawls rendered HTML and validates all +internal links. + +On Monday a +[GitHub Action](https://github.com/crossplane/docs/blob/master/.github/workflows/weekly-link-checker.yml) +runs to validate external links with `htmltest`. + +The configuration for `htmltest` is in +[`/utils/htmlstest`](https://github.com/crossplane/docs/blob/master/utils/htmltest/.htmltest.yml). -Adding a new Bootstrap feature requires importing it in `globalScripts.js`. -By importing only the necessary Bootstrap JavaScript features, reduces the -bundle size. ## Annotated website tree Expand the tab below to see an annotated `tree` output of the website repository. {{}} -```shell -tree . -├── content # Root for all page content +```shell +├── config.yaml # Hugo configuration file +├── content # Root for all page content │   ├── contribute -│   ├── knowledge-base │   ├── master -│   ├── v1.12 -│   ├── v1.11 -│   └── v1.10 -├── themes # Entry point for theme-specific designs -│   └── geekboot -│   ├── assets # JS and stylesheets -│   │   ├── js # Bundled and optmized Javascript -│   │   └── scss # Bootstrap SCSS overrides -│   │   └── bootstrap # Bootstrap original SCSS files -│   ├── data -│   ├── layouts # HTML layouts and shortcodes -│   │   ├── _default # HTML layouts for page types -│   │   │   └── _markup # Hugo render hooks -│   │   ├── partials # HTML Template elements -│   │   │   ├── icons -│   │   │   └── utils -│   │   └── shortcodes # Shortcode features -│   └── static # Static files across the theme. -│   ├── fonts # Font files -│   └── img # Global images -└── utils # Files unrelated to Hugo - └── vale # Files related to our Vale validation rules - └── webpack # Files managed or related to webpack - └── src - └── js - └── bootstrap/ # Original Bootstrap JavaScript - └── colorMode.js # Color theme switcher - └── customClipboard.js # Defines where to put a clipboard icon and what to copy - └── globalScripts.js # The collection of things to load on all pages - └── hoverHighlight.js # Enables hover to highlight - └── slackNotify.js # Tooltip to prompt user to join the community Slack - └── tabDeepAnchor.js # Enable anchors inside tabs +│   ├── media # Images used in docs pages +│   ├── v1.13 +│   ├── v1.14 +│   └── v1.15 +├── hugo_stats.json # Generated by Hugo writeStats for PurgeCSS +├── netlify.toml # Netlify configuration +├── netlify_build.sh # Custom build script for Netlify +├── package-lock.json # NodeJS dependency version lock +├── package.json # NodeJS dependencies +├── postcss.config.js # PostCSS configuration +├── static # Legacy docs site images +├── themes +│   └── geekboot # The Hugo theme used by Crossplane +│   ├── LICENSE-bootstrap +│   ├── LICENSE-geekdoc +│   ├── assets +│   │   ├── js # Compiled JavaScript +│   │   └── scss # Sytlesheets +│   │   └── bootstrap # Unmodified Bootstrap 5.2 SCSS +│   ├── data # Hugo mapping for JavaScript files. Autogenerated. +│   ├── layouts # HTML template pages +│   │   ├── 404.html # 404 page template +│   │   ├── _default +│   │   │   ├── _markup/ # Templates for rendering specific style components +│   │   │   ├── baseof.html # Entrypoint template for all pages +│   │   │   ├── list.html # List type pages, see partials/single-list.html +│   │   │   ├── redirect.html # Provides HTML redirect functions +│   │   │   ├── section.rss.xml # RSS feed template +│   │   │   ├── single.html # Single type pages, see partials/single-list.html +│   │   │   └── sitemap.xml # Sitemap template +│   │   ├── partials # Template includes +│   │   │   ├── analytics.html # Analytics and trackers +│   │   │   ├── crds.html # Entrypoint for API documentation +│   │   │   ├── docs-navbar.html # Top header links +│   │   │   ├── docs-sidebar.html # left-side navigation menu +│   │   │   ├── favicons.html # Favicons +│   │   │   ├── feature-state-alert.html # Alert box for alpha/beta features +│   │   │   ├── footer.html # Footer copyright and links +│   │   │   ├── ga-tag.html # Google Analytics +│   │   │   ├── google-analytics.html # Notice for GA release version +│   │   │   ├── header.html # content +│   │   │   ├── icons # Icons from fontawesome and Crossplane specific +│   │   │   ├── icons.html # SVG includes common enough to be on every page +│   │   │   ├── left-nav.html # Left-hand navigation +│   │   │   ├── master-version-alert.html # Alert box for the master version +│   │   │   ├── mermaid.html # Styling and JavaScript for mermaid diagrams +│   │   │   ├── meta-common.html # tags used on all pages +│   │   │   ├── ms-clarity.html # Microsoft Clarity tags +│   │   │   ├── old-version-alert.html # Alert box for versions that aren't the latest +│   │   │   ├── redirect.html # HTML meta redirect +│   │   │   ├── release-notes.html # Release note summary page generator +│   │   │   ├── rollworks.html # Rollworks analytics tags +│   │   │   ├── scripts.html # Global JavaScript includes +│   │   │   ├── search-button.html # Algolia search button +│   │   │   ├── sidebar # Static links in the left-side nav +│   │   │   ├── single-list.html # Template used by all single and list type pages +│   │   │   ├── skippy.html # Shift the page when the target is an anchor link +│   │   │   ├── social.html # Social media data includes +│   │   │   ├── stylesheet-cached.html # Static CSS that never changes +│   │   │   ├── stylesheet-dynamic.html # Dynamic CSS that may change between pages +│   │   │   ├── toc.html # Table of contents modifications +│   │   │   ├── utils # Utils imported from Geekdoc theme +│   │   │   └── version-dropdown-menu.html # Version dropdown menu +│   │   └── shortcodes +│   │   ├── check.html # Produce and style a Checkmark +│   │   ├── editCode.html # Code box with editable field +│   │   ├── expand.html # Expand button +│   │   ├── getCRDs.html # Generate API pages +│   │   ├── hint.html # Hint boxes +│   │   ├── hover.html # Hover to highlight +│   │   ├── img.html # Image optimizer +│   │   ├── include.html # Include an external file +│   │   ├── markdown.html # Run content through the markdown engine again +│   │   ├── param.html # Import from Bootstrap theme +│   │   ├── partial.html # Import from Bootstrap theme +│   │   ├── placeholder.html # Import from Bootstrap theme +│   │   ├── propertylist.html # Import from Bootstrap theme +│   │   ├── tab.html # Individual Tab. Related to tabs.html +│   │   ├── table.html # Apply bootstrap styles to markdown tables +│   │   ├── tabs.html # Tab builder, related to tab.html +│   │   ├── url.html # Create a download link to a file. Used by the APIs +│   │   └── year.html # Print the current year +│   └── static # Static global image files +└── utils # Scripts and tools related to the docs + ├── htmltest # htmltest link checker + ├── vale # Vale linter + │   └── styles + │   ├── Crossplane # Crossplane spelling exceptions + │   ├── Google # Google's Vale rules + │   ├── Microsoft # Microsoft's Vale rules + │   ├── alex # Write inclusive language + │   ├── gitlab # Gitlab's Vale rules + │   ├── proselint # Write better + │   └── write-good # Write better + └── webpack # JavaScript tools + ├── package-lock.json # NodeJS dependency version lock + ├── package.json # NodeJS dependencies + ├── src + │   └── js + │   ├── bootstrap/ # Unmodified Bootstrap JavaScript + │   ├── colorMode.js # Color mode switcher + │   ├── customClipboard.js # Custom copy-to-clipboard tool + │   ├── globalScripts.js # Point of entry for all scripts compiled by Webpack + │   ├── hoverHighlight.js # Hover to highlight + │   ├── slackNotify.js # "Join Crossplane Slack" bubble + │   └── tabDeepAnchor.js # Link inside a tab + └── webpack.config.js ``` {{}} \ No newline at end of file diff --git a/content/contribute/vale.md b/content/contribute/vale.md index 53f70287..06c884b0 100644 --- a/content/contribute/vale.md +++ b/content/contribute/vale.md @@ -52,8 +52,7 @@ Crossplane uses the following Vale styles: * [Google](https://github.com/errata-ai/google) - for the [Google developer documentation style guide](https://developers.google.com/style). * [Microsoft](https://github.com/errata-ai/Microsoft) - for the [Microsoft style guide](https://learn.microsoft.com/en-us/style-guide/welcome/). * [proselint](https://github.com/errata-ai/proselint) - for higher quality writing. -* [Upbound](https://github.com/upbound/vale/tree/main/styles/Upbound) - for - customized terms and preventing corporate jargon. +* [Crossplane](https://github.com/crossplane/docs/tree/master/utils/vale/styles/Crossplane) - spelling exceptions for Kubernetes and Crossplane related words. * [write-good](https://github.com/errata-ai/write-good) - for higher quality writing. {{}} @@ -120,7 +119,7 @@ Vale back on. For example, -```text +```plaintext The following example will use passive voice and lowercase crossplane. Do not do this. @@ -138,7 +137,7 @@ Do not turn off rules without good reasons. For example, -```text +```plaintext Do not turn off rules without good reasons. @@ -149,3 +148,20 @@ Do not turn off rules without good reasons. Vale requires capitalization for `YES` and `NO` and a space around `=`. {{}} +## Vale settings + +The Vale configuration for the repository is in +[utils/vale/vale.ini](https://github.com/crossplane/docs/blob/master/utils/vale/.vale.ini). + +{{< hint "note" >}} +The `vale.ini` file is a Vale configuration file. Read the Vale documentation +for more information about the `vale.ini` file. +{{< /hint >}} + +Some imported Vale styles don't apply or duplicate other rules. Disable +individual rules inside the `vale.ini` file. + +For example Google and Microsoft rules both cover the use of first person words +like `I`. The docs `vale.ini` disables the +[Microsoft rule](https://github.com/crossplane/docs/blob/3e9e10671c32e368f5381d83e406e16bc38c93bc/utils/vale/.vale.ini#L42) +to prevent duplicate errors. \ No newline at end of file diff --git a/netlify.toml b/netlify.toml index 061a87c1..1ad64417 100644 --- a/netlify.toml +++ b/netlify.toml @@ -1,11 +1,27 @@ +# Read the Netlify docs for details: +# https://docs.netlify.com/configure-builds/file-based-configuration/ +# +# +# Build commands. Logic for previews vs prod are handled inside netlify_build.sh +[context.deploy-preview] + command = "bash netlify_build.sh" + +[context.production] + command = "bash netlify_build.sh" + [build] base = "/" publish = "public/" command = "bash netlify_build.sh" +# The version of Hugo to use for the Netlify build. [build.environment] HUGO_VERSION = "0.119.0" +# +# The following are Netlify redirects for moved docs pages +# https://docs.netlify.com/configure-builds/file-based-configuration/#redirects +# [[redirects]] from = "/docs/*" to = "/:splat" @@ -17,7 +33,6 @@ from = "/v1.12/*" to = "/latest/:splat" status = 302 -# Redirects for EOL versions [[redirects]] from = "/v1.11/*" to = "/latest/:splat" @@ -55,12 +70,6 @@ from = "/knowledge-base/install/**" to = "/latest/software/" status = 302 -[context.deploy-preview] - command = "bash netlify_build.sh" - -[context.production] - command = "bash netlify_build.sh" - # Use [dev] to set configuration overrides for local # development environments run using Netlify Dev - except # for environment variables. Environment variables for Netlify diff --git a/netlify_build.sh b/netlify_build.sh index bd9dd9e6..fe23a14f 100644 --- a/netlify_build.sh +++ b/netlify_build.sh @@ -1,16 +1,30 @@ #!/usr/bin/env bash +# Which which version is the "Latest"? LATEST_VER="1.15" +# Make a copy of /content/$LATEST_VER to the directory /latest +# Search indexing only points to /latest, this prevents broken or out of date +# search results cp -R content/v$LATEST_VER content/latest +# Set the `version` front matter to prevent redirect issues with the version +# drop-down menu. sed -i "s/^\s*version: \"$LATEST_VER\"//g" content/latest/_index.md +# Enable Hugo writeStats to enable PurgeCSS optimizations. +# docs: https://gohugo.io/getting-started/configuration/#configure-build sed -i 's/# writeStats: true/writeStats: true/g' config.yaml cat config.yaml +# $CONTEXT is a Netlify environmental variable. +# https://docs.netlify.com/configure-builds/environment-variables/#build-metadata + +# For production set the baseURL to be the docs URL if [ "$CONTEXT" = "production" ]; then hugo --minify --baseURL https://docs.crossplane.io/ + +# For any other context use the Netlify deploy URL. elif [ "$CONTEXT" = "branch-deploy" ]; then echo "Building branch deploy with URL $DEPLOY_PRIME_URL" hugo --minify --baseURL $DEPLOY_PRIME_URL diff --git a/postcss.config.js b/postcss.config.js index 1c8c6725..2a32d5d8 100644 --- a/postcss.config.js +++ b/postcss.config.js @@ -1,9 +1,17 @@ +// LightningCSS settings +// https://lightningcss.dev/ +// +// Support browsers with at least 0.25% usage from broswerlist: https://browserslist.dev/?q=bGFzdCAyIHZlcnNpb25z const postcssLightningcss = require("postcss-lightningcss")({ browsers: ">= .25%", lightningcssOptions: { } }); +// PurgeCSS settings +// https://purgecss.com/ +// +// Load hugo_stats.json to know what elements are in use const purgecss = require('@fullhuman/postcss-purgecss')({ content: ['./hugo_stats.json'], variables: true, @@ -18,6 +26,10 @@ const purgecss = require('@fullhuman/postcss-purgecss')({ safelist: [] }); +// PostCSS Media sort +// https://github.com/yunusga/postcss-sort-media-queries +// +// Sort CSS to prioritize desktop users const mediasort = require('postcss-sort-media-queries')({ sort: 'desktop-first' }); diff --git a/utils/vale/styles/Crossplane/brands.txt b/utils/vale/styles/Crossplane/brands.txt index f0719eb8..15d38dc6 100644 --- a/utils/vale/styles/Crossplane/brands.txt +++ b/utils/vale/styles/Crossplane/brands.txt @@ -1,8 +1,10 @@ +Algolia Bootstrap CC-BY CNCF Commonmark DockerHub +DocSearch Geekdocs Goldmark Grammarly @@ -11,6 +13,7 @@ HashiCorp instant.page Kustomize Netlify +NodeJS NPM OpenAPI OpenAPIv3 diff --git a/utils/webpack/src/js/colorMode.js b/utils/webpack/src/js/colorMode.js index 74993451..045ee108 100644 --- a/utils/webpack/src/js/colorMode.js +++ b/utils/webpack/src/js/colorMode.js @@ -4,6 +4,12 @@ * Licensed under MIT (https://github.com/coliff/dark-mode-switch/blob/main/LICENSE) */ +/* +* +* Controls the dark mode/light mode switcher and saves a cookie to remember the +* user preference. +*/ + (() => { var darkSwitch = document.getElementById("darkSwitch"); diff --git a/utils/webpack/src/js/customClipboard.js b/utils/webpack/src/js/customClipboard.js index 1b4f82ad..3b10d323 100644 --- a/utils/webpack/src/js/customClipboard.js +++ b/utils/webpack/src/js/customClipboard.js @@ -1,6 +1,11 @@ // Customize clipboard.js import * as ClipboardJS from 'clipboard'; +/* +* Extends clipboard.js to support passing line numbers to copy instead of a +* whole code box. +*/ + // copy API links to the clipboard const crdURLCopier = new ClipboardJS('.kind-link'); diff --git a/utils/webpack/src/js/globalScripts.js b/utils/webpack/src/js/globalScripts.js index 765ce603..9d8a0dda 100644 --- a/utils/webpack/src/js/globalScripts.js +++ b/utils/webpack/src/js/globalScripts.js @@ -1,8 +1,14 @@ // The collection of things to load on all pages + +// Color mode switcher import ColorMode from './colorMode'; + +// Link pre-fetcher +// https://instant.page/ import 'instant.page'; - +// Bootstrap JS libraries in use. +// IF a new Bootstrap feature requires JS, add it here. import './bootstrap/src/base-component'; import './bootstrap/src/button'; import './bootstrap/src/collapse'; @@ -12,7 +18,14 @@ import './bootstrap/src/scrollspy'; import './bootstrap/src/tab'; import './bootstrap/src/offcanvas'; +// If a link is to an anchor inside a tab, open the tab and go to the anchor import './tabDeepAnchor.js'; + +// Customize the clipboard to support the `copy-lines` function import './customClipboard.js'; + +// Hover to highlight function import './hoverHighlight.js'; + +// "Join Slack" notification bubble import './slackNotify.js'; \ No newline at end of file diff --git a/utils/webpack/src/js/hoverHighlight.js b/utils/webpack/src/js/hoverHighlight.js index 4c48581b..9e8ac8a3 100644 --- a/utils/webpack/src/js/hoverHighlight.js +++ b/utils/webpack/src/js/hoverHighlight.js @@ -1,3 +1,10 @@ +/* +* Create the hover to highlight function. +* +* Finds the code box matching the label and updates the code box to add a +* highlight function. +*/ + export function getKeywords(){ var keywordList = document.getElementsByTagName("highlight-term") diff --git a/utils/webpack/src/js/slackNotify.js b/utils/webpack/src/js/slackNotify.js index 337ad7a7..27a1a8fe 100644 --- a/utils/webpack/src/js/slackNotify.js +++ b/utils/webpack/src/js/slackNotify.js @@ -1,3 +1,7 @@ +/* +* Create a PopperJS popover for the Join Slack notifications. +*/ + import { createPopper } from '@popperjs/core'; const slackIcon = document.querySelector('#slack');