From: Mark Otto Date: Thu, 11 Dec 2025 22:10:51 +0000 (-0800) Subject: Docs design updates (#41918) X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a98aacc9b6ba67c6bc555dd79f45b78564eb441f;p=thirdparty%2Fbootstrap.git Docs design updates (#41918) * Refactor docs site styling and Shiki integration Code Highlighting: - Enhance Code.astro with Shiki transformers and Bootstrap theme - Add tab support for multi-language code examples - Add toolbar with language labels and copy button - Support diff highlighting via @shikijs/transformers Components: - Update Example.astro styling and structure - Refine DocsSidebar.astro layout - Update Navigation, Versions, and GetStarted components - Update ThemeToggler.astro - Minor updates to ReferenceTable, Swatch components Site SCSS: - Restyle code snippets and examples (_component-examples.scss) - Update syntax highlighting styles (_syntax.scss) - Refine sidebar styling (_sidebar.scss) - Update search component styles (_search.scss) - Update navbar styles (_navbar.scss) - Refresh callouts, clipboard, content styles Config & Assets: - Update astro.config.ts for Shiki - Add sticky.js partial - Update application.js - Update guide screenshots (parcel, vite, webpack) * fixes * update images * update permissions * Optimised images with calibre/image-actions --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- diff --git a/.github/workflows/calibreapp-image-actions.yml b/.github/workflows/calibreapp-image-actions.yml index 09d038e761..cf21837170 100644 --- a/.github/workflows/calibreapp-image-actions.yml +++ b/.github/workflows/calibreapp-image-actions.yml @@ -18,7 +18,8 @@ jobs: name: calibreapp/image-actions runs-on: ubuntu-latest permissions: - # allow calibreapp/image-actions to update PRs + # allow calibreapp/image-actions to update PRs and commit compressed images + contents: write pull-requests: write steps: - name: Clone repository diff --git a/package-lock.json b/package-lock.json index b84bb31623..bbcc8d32ae 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33,6 +33,7 @@ "@rollup/plugin-commonjs": "^29.0.0", "@rollup/plugin-node-resolve": "^16.0.3", "@rollup/plugin-replace": "^6.0.3", + "@shikijs/transformers": "^3.7.0", "@stackblitz/sdk": "^1.11.0", "@types/js-yaml": "^4.0.9", "@types/mime": "^4.0.0", @@ -40,6 +41,7 @@ "astro": "^5.15.6", "astro-auto-import": "^0.4.5", "autoprefixer": "^10.4.22", + "bootstrap-vscode-theme": "^0.0.9", "bundlewatch": "^0.4.1", "clean-css-cli": "^5.6.3", "clipboard": "^2.0.11", @@ -4686,6 +4688,41 @@ "@shikijs/types": "3.15.0" } }, + "node_modules/@shikijs/transformers": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-3.19.0.tgz", + "integrity": "sha512-e6vwrsyw+wx4OkcrDbL+FVCxwx8jgKiCoXzakVur++mIWVcgpzIi8vxf4/b4dVTYrV/nUx5RjinMf4tq8YV8Fw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/core": "3.19.0", + "@shikijs/types": "3.19.0" + } + }, + "node_modules/@shikijs/transformers/node_modules/@shikijs/core": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-3.19.0.tgz", + "integrity": "sha512-L7SrRibU7ZoYi1/TrZsJOFAnnHyLTE1SwHG1yNWjZIVCqjOEmCSuK2ZO9thnRbJG6TOkPp+Z963JmpCNw5nzvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.19.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.5" + } + }, + "node_modules/@shikijs/transformers/node_modules/@shikijs/types": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.19.0.tgz", + "integrity": "sha512-Z2hdeEQlzuntf/BZpFG8a+Fsw9UVXdML7w0o3TgSXV3yNESGon+bs9ITkQb3Ki7zxoXOOu5oJWqZ2uto06V9iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, "node_modules/@shikijs/types": { "version": "3.15.0", "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.15.0.tgz", @@ -5949,6 +5986,16 @@ "dev": true, "license": "MIT" }, + "node_modules/bootstrap-vscode-theme": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/bootstrap-vscode-theme/-/bootstrap-vscode-theme-0.0.9.tgz", + "integrity": "sha512-++aMildSGVaDS7qD59FEh4Fh6bJol4Gpo7u3rbEPqcuReRY7zOvLn77sBoK9zhVe+YT7bkPiDut47jErweChdw==", + "dev": true, + "license": "MIT", + "engines": { + "vscode": "^1.0.0" + } + }, "node_modules/boxen": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/boxen/-/boxen-8.0.1.tgz", diff --git a/package.json b/package.json index 019aa97c41..a9c11aabaa 100644 --- a/package.json +++ b/package.json @@ -119,6 +119,7 @@ "@rollup/plugin-commonjs": "^29.0.0", "@rollup/plugin-node-resolve": "^16.0.3", "@rollup/plugin-replace": "^6.0.3", + "@shikijs/transformers": "^3.7.0", "@stackblitz/sdk": "^1.11.0", "@types/js-yaml": "^4.0.9", "@types/mime": "^4.0.0", @@ -126,6 +127,7 @@ "astro": "^5.15.6", "astro-auto-import": "^0.4.5", "autoprefixer": "^10.4.22", + "bootstrap-vscode-theme": "^0.0.9", "bundlewatch": "^0.4.1", "clean-css-cli": "^5.6.3", "clipboard": "^2.0.11", diff --git a/site/astro.config.ts b/site/astro.config.ts index de9a1433bb..d5f3cbdc91 100644 --- a/site/astro.config.ts +++ b/site/astro.config.ts @@ -1,4 +1,7 @@ import { defineConfig } from 'astro/config' +import bootstrapLight from 'bootstrap-vscode-theme/themes/bootstrap-light.json' +import bootstrapDark from 'bootstrap-vscode-theme/themes/bootstrap-dark.json' +import { transformerNotationDiff } from '@shikijs/transformers' import { bootstrap } from './src/libs/astro' import { getConfig } from './src/libs/config' @@ -27,9 +30,22 @@ export default defineConfig({ syntaxHighlight: 'shiki', shikiConfig: { themes: { - light: 'github-light', - dark: 'github-dark' - } + light: bootstrapLight, + dark: bootstrapDark + }, + transformers: [ + transformerNotationDiff(), + { + name: 'add-language-attribute', + pre(node) { + // Add data-language attribute to pre tag so Code component can access it + const lang = this.options.lang + if (lang) { + node.properties['dataLanguage'] = lang + } + } + } + ] } }, site, diff --git a/site/src/assets/application.js b/site/src/assets/application.js index 62f5f88b34..c9fce7fad6 100644 --- a/site/src/assets/application.js +++ b/site/src/assets/application.js @@ -11,6 +11,8 @@ import sidebarScroll from './partials/sidebar.js' import snippets from './partials/snippets.js' +import stickyNav from './partials/sticky.js' sidebarScroll() snippets() +stickyNav() diff --git a/site/src/assets/partials/sticky.js b/site/src/assets/partials/sticky.js new file mode 100644 index 0000000000..8d803fb806 --- /dev/null +++ b/site/src/assets/partials/sticky.js @@ -0,0 +1,28 @@ +// NOTICE!! DO NOT USE ANY OF THIS JAVASCRIPT +// IT'S ALL JUST JUNK FOR OUR DOCS! +// ++++++++++++++++++++++++++++++++++++++++++ + +/* + * JavaScript for Bootstrap's docs (https://getbootstrap.com/) + * Copyright 2011-2025 The Bootstrap Authors + * Licensed under the Creative Commons Attribution 3.0 Unported License. + * For details, see https://creativecommons.org/licenses/by/3.0/. + */ + +export default () => { + const navbar = document.querySelector('.bd-sticky-navbar') + + if (!navbar) { + return + } + + const handleScroll = () => { + navbar.classList.toggle('is-stuck', window.scrollY > 0) + } + + // Check initial state + handleScroll() + + // Update on scroll + window.addEventListener('scroll', handleScroll, { passive: true }) +} diff --git a/site/src/components/DocsSidebar.astro b/site/src/components/DocsSidebar.astro index 2bc4d3f411..cfb6c336ff 100644 --- a/site/src/components/DocsSidebar.astro +++ b/site/src/components/DocsSidebar.astro @@ -91,7 +91,7 @@ const sidebar = getData('sidebar')
  • {item.title} @@ -111,7 +111,7 @@ const sidebar = getData('sidebar')