Compare commits

..

10 Commits

Author SHA1 Message Date
XhmikosR ff0bd51d99 More 2024-03-12 07:28:26 +02:00
XhmikosR fb93bf0f7c Revert "Add OpenSearch images" 2024-03-12 07:28:26 +02:00
XhmikosR 4a90884035 Add OpenSearch images 2024-03-12 07:28:25 +02:00
XhmikosR 2b89ee2c79 Add InputEncoding 2024-03-12 07:28:25 +02:00
XhmikosR 612584a140 Update search.js 2024-03-12 07:28:25 +02:00
XhmikosR ed8c28a835 Make OpenSearch an output format.
Not sure if there's another way to do this...
2024-03-11 21:05:45 +02:00
Martijn Cuppens ecfddb4e38 docs: enable OpenSearch 2024-03-11 21:05:44 +02:00
Julien Déramond 6ce0c62e21 Docs: drop data-bs-scroll="true" from navbar (#39766) 2024-03-11 09:26:03 +02:00
XhmikosR 930740afbc Switch to using hugo.IsProduction (#39763) 2024-03-08 12:41:17 +02:00
Louis-Maxime Piton f545964f8f Docs: fix position of search modal to avoid interface blocking at small breakpoints (#39739)
Co-authored-by: Julien Déramond <juderamond@gmail.com>
2024-03-08 09:04:12 +01:00
18 changed files with 539 additions and 2051 deletions
+1 -1
View File
@@ -18,7 +18,7 @@ jobs:
browserstack:
runs-on: ubuntu-latest
if: github.repository == 'twbs/bootstrap'
timeout-minutes: 15
timeout-minutes: 30
steps:
- name: Clone repository
-47
View File
@@ -1,47 +0,0 @@
name: LambdaTest
on:
push:
branches:
- "**"
- "!dependabot/**"
workflow_dispatch:
env:
FORCE_COLOR: 2
NODE: 20
permissions:
contents: read
jobs:
lambdatest:
runs-on: ubuntu-latest
if: github.repository == 'twbs/bootstrap'
timeout-minutes: 15
steps:
- name: Clone repository
uses: actions/checkout@v4
with:
persist-credentials: false
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: "${{ env.NODE }}"
cache: npm
- name: Install npm dependencies
run: npm ci
- name: Run dist
run: npm run dist
- name: Run LambdaTest tests
run: npm run js-test-lt-cloud
env:
LT_USERNAME: "${{ secrets.LT_USERNAME }}"
LT_ACCESS_KEY: "${{ secrets.LT_ACCESS_KEY }}"
LT_TUNNEL_NAME: "tunnel-${{ github.sha }}"
GITHUB_SHA: "${{ github.sha }}"
-1
View File
@@ -41,4 +41,3 @@ Thumbs.db
/dist-sass/
/js/coverage/
/node_modules/
/.lambdatest/
+15
View File
@@ -28,6 +28,21 @@ enableRobotsTXT: true
metaDataFormat: "yaml"
disableKinds: ["404", "taxonomy", "term", "RSS"]
outputFormats:
OpenSearch:
baseName: opensearch
isPlainText: true
mediaType: application/xml
notAlternative: true
outputs:
home:
- HTML
- OpenSearch
page:
- HTML
- OpenSearch
publishDir: "_site"
module:
+68 -142
View File
@@ -3,149 +3,75 @@
'use strict'
const browsers = {
browserStack: {
safariMac: {
base: 'BrowserStack',
os: 'OS X',
os_version: 'Catalina',
browser: 'Safari',
browser_version: 'latest'
},
chromeMac: {
base: 'BrowserStack',
os: 'OS X',
os_version: 'Catalina',
browser: 'Chrome',
browser_version: 'latest'
},
firefoxMac: {
base: 'BrowserStack',
os: 'OS X',
os_version: 'Catalina',
browser: 'Firefox',
browser_version: 'latest'
},
chromeWin10: {
base: 'BrowserStack',
os: 'Windows',
os_version: '10',
browser: 'Chrome',
browser_version: '60'
},
firefoxWin10: {
base: 'BrowserStack',
os: 'Windows',
os_version: '10',
browser: 'Firefox',
browser_version: '60'
},
chromeWin10Latest: {
base: 'BrowserStack',
os: 'Windows',
os_version: '10',
browser: 'Chrome',
browser_version: 'latest'
},
firefoxWin10Latest: {
base: 'BrowserStack',
os: 'Windows',
os_version: '10',
browser: 'Firefox',
browser_version: 'latest'
},
iphone7: {
base: 'BrowserStack',
os: 'ios',
os_version: '12.0',
device: 'iPhone 7',
real_mobile: true
},
iphone12: {
base: 'BrowserStack',
os: 'ios',
os_version: '14.0',
device: 'iPhone 12',
real_mobile: true
},
pixel3: {
base: 'BrowserStack',
os: 'android',
os_version: '9.0',
device: 'Google Pixel 3',
real_mobile: true
}
safariMac: {
base: 'BrowserStack',
os: 'OS X',
os_version: 'Catalina',
browser: 'Safari',
browser_version: 'latest'
},
lambdaTest: {
safariMac: {
browserName: 'Safari',
browserVersion: 'latest',
'LT:Options': {
platformName: 'MacOS Monterey'
}
},
chromeMac: {
browserName: 'Chrome',
browserVersion: 'latest',
'LT:Options': {
platformName: 'MacOS Monterey'
}
},
firefoxMac: {
browserName: 'Firefox',
browserVersion: 'latest',
'LT:Options': {
platformName: 'MacOS Monterey'
}
},
chromeWin10: {
browserName: 'Chrome',
browserVersion: '60',
'LT:Options': {
platformName: 'Windows 10'
}
},
firefoxWin10: {
browserName: 'Firefox',
browserVersion: '60',
'LT:Options': {
platformName: 'Windows 10'
}
},
chromeWin10Latest: {
browserName: 'Chrome',
browserVersion: 'latest',
'LT:Options': {
platformName: 'Windows 10'
}
},
firefoxWin10Latest: {
browserName: 'Firefox',
browserVersion: 'latest',
'LT:Options': {
platformName: 'Windows 10'
}
},
ios15: {
platformName: 'ios',
platformVersion: '15',
browserName: 'Safari',
deviceName: 'iPhone.*',
isRealMobile: true
},
ios16: {
platformName: 'ios',
platformVersion: '16',
browserName: 'Safari',
deviceName: 'iPhone.*',
isRealMobile: true
},
android12: {
platformName: 'android',
platformVersion: '12',
browserName: 'Chrome',
deviceName: 'Pixel.*',
isRealMobile: true
}
chromeMac: {
base: 'BrowserStack',
os: 'OS X',
os_version: 'Catalina',
browser: 'Chrome',
browser_version: 'latest'
},
firefoxMac: {
base: 'BrowserStack',
os: 'OS X',
os_version: 'Catalina',
browser: 'Firefox',
browser_version: 'latest'
},
chromeWin10: {
base: 'BrowserStack',
os: 'Windows',
os_version: '10',
browser: 'Chrome',
browser_version: '60'
},
firefoxWin10: {
base: 'BrowserStack',
os: 'Windows',
os_version: '10',
browser: 'Firefox',
browser_version: '60'
},
chromeWin10Latest: {
base: 'BrowserStack',
os: 'Windows',
os_version: '10',
browser: 'Chrome',
browser_version: 'latest'
},
firefoxWin10Latest: {
base: 'BrowserStack',
os: 'Windows',
os_version: '10',
browser: 'Firefox',
browser_version: 'latest'
},
iphone7: {
base: 'BrowserStack',
os: 'ios',
os_version: '12.0',
device: 'iPhone 7',
real_mobile: true
},
iphone12: {
base: 'BrowserStack',
os: 'ios',
os_version: '14.0',
device: 'iPhone 12',
real_mobile: true
},
pixel2: {
base: 'BrowserStack',
os: 'android',
os_version: '8.0',
device: 'Google Pixel 2',
real_mobile: true
}
}
+9 -62
View File
@@ -9,21 +9,9 @@ const replace = require('@rollup/plugin-replace')
const { browsers } = require('./browsers.js')
const ENV = process.env
const BROWSERSTACK = Boolean(ENV.BROWSERSTACK)
const DEBUG = Boolean(ENV.DEBUG)
const JQUERY_TEST = Boolean(ENV.JQUERY)
const BROWSERSTACK = Boolean(ENV.BROWSERSTACK)
const LAMBDATEST = Boolean(ENV.LAMBDATEST)
const webDriverConfig = {
desktop: {
hostname: 'hub.lambdatest.com',
port: 80
},
mobile: {
hostname: 'mobile-hub.lambdatest.com',
port: 80
}
}
const frameworks = [
'jasmine'
@@ -66,23 +54,15 @@ const config = {
colors: true,
autoWatch: false,
singleRun: true,
captureTimeout: 180_000,
browserDisconnectTolerance: 3,
browserDisconnectTimeout: 180_000,
browserNoActivityTimeout: 400_000,
retryLimit: 2,
concurrency: 5,
concurrency: Number.POSITIVE_INFINITY,
client: {
clearContext: false,
jasmine: {
timeoutInterval: 120_000
}
clearContext: false
},
files: [
'node_modules/hammer-simulator/index.js',
{
pattern: 'js/tests/unit/**/!(jquery).spec.js',
watched: !BROWSERSTACK && !LAMBDATEST
watched: !BROWSERSTACK
}
],
preprocessors: {
@@ -118,51 +98,18 @@ const config = {
}
}
if (LAMBDATEST) {
config.hostname = 'localhost.lambdatest.com'
config.captureTimeout = 600_000
for (const key of Object.keys(browsers.lambdaTest)) {
browsers.lambdaTest[key].base = 'WebDriver'
browsers.lambdaTest[key].build = `bootstrap-${ENV.GITHUB_SHA ? `${ENV.GITHUB_SHA.slice(0, 7)}-` : ''}${new Date().toISOString()}`
browsers.lambdaTest[key].project = 'Bootstrap'
if (browsers.lambdaTest[key].isRealMobile) {
browsers.lambdaTest[key].config = webDriverConfig.mobile
browsers.lambdaTest[key].user = ENV.LT_USERNAME
browsers.lambdaTest[key].accessKey = ENV.LT_ACCESS_KEY
browsers.lambdaTest[key].tunnel = true
browsers.lambdaTest[key].console = true
browsers.lambdaTest[key].network = true
browsers.lambdaTest[key].tunnelName = ENV.LT_TUNNEL_NAME || 'jasmine'
browsers.lambdaTest[key].pseudoActivityInterval = 5000 // 5000 ms heartbeat
} else {
browsers.lambdaTest[key].config = webDriverConfig.desktop
browsers.lambdaTest[key]['LT:Options'].username = ENV.LT_USERNAME
browsers.lambdaTest[key]['LT:Options'].accessKey = ENV.LT_ACCESS_KEY
browsers.lambdaTest[key]['LT:Options'].tunnel = true
browsers.lambdaTest[key]['LT:Options'].console = true
browsers.lambdaTest[key]['LT:Options'].network = true
browsers.lambdaTest[key]['LT:Options'].tunnelName = ENV.LT_TUNNEL_NAME || 'jasmine'
browsers.lambdaTest[key]['LT:Options'].pseudoActivityInterval = 5000 // 5000 ms heartbeat
}
}
plugins.push('karma-webdriver-launcher', 'karma-jasmine-html-reporter')
config.customLaunchers = browsers.lambdaTest
config.browsers = Object.keys(browsers.lambdaTest)
reporters.push('kjhtml')
} else if (BROWSERSTACK) {
if (BROWSERSTACK) {
config.hostname = ip.address()
config.browserStack = {
username: ENV.BROWSER_STACK_USERNAME,
accessKey: ENV.BROWSER_STACK_ACCESS_KEY,
build: `bootstrap-${ENV.GITHUB_SHA ? `${ENV.GITHUB_SHA.slice(0, 7)}-` : ''}${new Date().toISOString()}`,
project: 'Bootstrap'
project: 'Bootstrap',
retryLimit: 2
}
plugins.push('karma-browserstack-launcher', 'karma-jasmine-html-reporter')
config.customLaunchers = browsers.browserStack
config.browsers = Object.keys(browsers.browserStack)
config.customLaunchers = browsers
config.browsers = Object.keys(browsers)
reporters.push('BrowserStack', 'kjhtml')
} else if (JQUERY_TEST) {
frameworks.push('detectBrowsers')
-28
View File
@@ -1,28 +0,0 @@
/* eslint-env node */
/* eslint-disable no-console */
'use strict'
const process = require('node:process')
const lambdaTunnel = require('@lambdatest/node-tunnel')
if (process.env.LAMBDATEST !== 'true') {
console.log('Skipping lt-local script!')
return
}
const tunnelInstance = new lambdaTunnel() // eslint-disable-line new-cap
const tunnelArguments = {
user: process.env.LT_USERNAME,
key: process.env.LT_ACCESS_KEY,
tunnelName: process.env.LT_TUNNEL_NAME || 'jasmine',
logFile: 'local.log'
};
// eslint-disable-next-line unicorn/prefer-top-level-await
(async () => {
await tunnelInstance.start(tunnelArguments)
await new Promise(res => {
setTimeout(res, 5000)
})
})()
+408 -1752
View File
File diff suppressed because it is too large Load Diff
+3 -9
View File
@@ -72,9 +72,6 @@
"js-test-integration-bundle": "rollup --config js/tests/integration/rollup.bundle.js",
"js-test-integration-modularity": "rollup --config js/tests/integration/rollup.bundle-modularity.js",
"js-test-cloud": "cross-env BROWSERSTACK=true npm run js-test-karma",
"js-test-lt-cloud": "cross-env LAMBDATEST=true npm-run-all --parallel --race js-test-lt-local js-test-karma",
"js-test-lt-local": "npm-run-all js-test-lt-tunnel sleep",
"js-test-lt-tunnel": "node js/tests/lt-local",
"js-test-jquery": "cross-env JQUERY=true npm run js-test-karma",
"lint": "npm-run-all --aggregate-output --continue-on-error --parallel js-lint css-lint lockfile-lint",
"docs": "npm-run-all docs-build docs-lint",
@@ -85,7 +82,7 @@
"docs-serve": "hugo server --port 9001 --disableFastRender --noHTTPCache --renderToMemory --printPathWarnings --printUnusedTemplates",
"docs-serve-only": "npx sirv-cli _site --port 9001",
"lockfile-lint": "lockfile-lint --allowed-hosts npm --allowed-schemes https: --empty-hostname false --type npm --path package-lock.json",
"update-deps": "ncu -u -x globby,jasmine,karma-rollup-preprocessor && echo Manually update site/assets/js/vendor",
"update-deps": "ncu -u -x globby,jasmine,karma-browserstack-launcher,karma-rollup-preprocessor && echo Manually update site/assets/js/vendor",
"release": "npm-run-all dist release-sri docs-build release-zip*",
"release-sri": "node build/generate-sri.mjs",
"release-version": "node build/change-version.mjs",
@@ -100,8 +97,7 @@
"watch-css-docs": "nodemon --watch site/assets/scss/ --ext scss --exec \"npm run css-lint\"",
"watch-css-test": "nodemon --watch scss/ --ext scss,js --exec \"npm run css-test\"",
"watch-js-main": "nodemon --watch js/src/ --ext js --exec \"npm-run-all js-lint js-compile\"",
"watch-js-docs": "nodemon --watch site/assets/js/ --ext js --exec \"npm run js-lint\"",
"sleep": "sleep 5"
"watch-js-docs": "nodemon --watch site/assets/js/ --ext js --exec \"npm run js-lint\""
},
"peerDependencies": {
"@popperjs/core": "^2.11.8"
@@ -110,7 +106,6 @@
"@babel/cli": "^7.23.9",
"@babel/core": "^7.24.0",
"@babel/preset-env": "^7.24.0",
"@lambdatest/node-tunnel": "^4.0.7",
"@popperjs/core": "^2.11.8",
"@rollup/plugin-babel": "^6.0.4",
"@rollup/plugin-commonjs": "^25.0.7",
@@ -134,7 +129,7 @@
"jasmine": "^5.1.0",
"jquery": "^3.7.1",
"karma": "^6.4.3",
"karma-browserstack-launcher": "^1.6.0",
"karma-browserstack-launcher": "1.4.0",
"karma-chrome-launcher": "^3.2.0",
"karma-coverage-istanbul-reporter": "^3.0.3",
"karma-detect-browsers": "^2.3.3",
@@ -142,7 +137,6 @@
"karma-jasmine": "^5.1.0",
"karma-jasmine-html-reporter": "^2.1.0",
"karma-rollup-preprocessor": "7.0.7",
"karma-webdriver-launcher": "^1.0.8",
"lockfile-lint": "^4.13.2",
"nodemon": "^3.1.0",
"npm-run-all2": "^6.1.2",
+15 -1
View File
@@ -13,7 +13,7 @@
const siteDocsVersion = searchElement.getAttribute('data-bd-docs-version')
window.docsearch({
const search = window.docsearch({
apiKey: '3151f502c7b9e9dafd5e6372b691a24e',
indexName: 'bootstrap',
appId: 'AK7KMZKZHQ',
@@ -42,4 +42,18 @@
})
}
})
function hashSearch() {
const SEARCH_WORD = '#search='
if (window.location.hash && window.location.hash.startsWith(SEARCH_WORD)) {
search.input.autocomplete.setVal(window.location.hash.slice(SEARCH_WORD.length))
search.input.autocomplete.open()
}
}
hashSearch()
// For the nerds: search by changing the url hash
window.addEventListener('hashchange', hashSearch, false)
})()
+1
View File
@@ -47,6 +47,7 @@
--docsearch-muted-color: var(--bs-secondary-color);
--docsearch-hit-shadow: none;
position: fixed;
z-index: 2000; // Make sure to be over all components showcased in the documentation
cursor: auto; // Needed because of [role="button"] in Algolia search modal. Remove once https://github.com/algolia/docsearch/issues/1370 is tackled.
+1 -1
View File
@@ -158,7 +158,7 @@
{{ .Content }}
{{- if eq hugo.Environment "production" -}}
{{- if hugo.IsProduction -}}
<script src="/docs/{{ .Site.Params.docs_version }}/dist/js/bootstrap.bundle.min.js" {{ printf "integrity=%q" .Site.Params.cdn.js_bundle_hash | safeHTMLAttr }}></script>
{{- else -}}
<script src="/docs/{{ .Site.Params.docs_version }}/dist/js/bootstrap.bundle.js"></script>
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/" xmlns:moz="http://www.mozilla.org/2006/browser/search/">
<ShortName>{{ .Site.Title }}</ShortName>
<Description>Search {{ .Site.Title }} Documentation</Description>
<InputEncoding>UTF-8</InputEncoding>
<Image type="image/x-icon" width="16" height="16">{{ (urls.JoinPath "/docs" .Site.Params.docs_version "assets/img/favicons/favicon.ico") | absURL }}</Image>
<Url type="text/html" method="get" template="{{ "/" | absURL }}#search={searchTerms}"/>
</OpenSearchDescription>
+1 -1
View File
@@ -23,7 +23,7 @@
</button>
</div>
<div class="offcanvas-lg offcanvas-end flex-grow-1" tabindex="-1" id="bdNavbar" aria-labelledby="bdNavbarOffcanvasLabel" data-bs-scroll="true">
<div class="offcanvas-lg offcanvas-end flex-grow-1" tabindex="-1" id="bdNavbar" aria-labelledby="bdNavbarOffcanvasLabel">
<div class="offcanvas-header px-4 pb-0">
<h5 class="offcanvas-title text-white" id="bdNavbarOffcanvasLabel">Bootstrap</h5>
<button type="button" class="btn-close btn-close-white" data-bs-dismiss="offcanvas" aria-label="Close" data-bs-target="#bdNavbar"></button>
+4
View File
@@ -11,6 +11,10 @@
<link rel="canonical" href="{{ .Permalink }}">
{{ with .OutputFormats.Get "opensearch" -}}
<link rel="search" href="{{ .Permalink }}" title="{{ $.Site.Title }}" type="application/opensearchdescription+xml">
{{ end -}}
<link rel="preconnect" href="https://AK7KMZKZHQ-dsn.algolia.net" crossorigin>
{{ with .Params.robots -}}
+2 -2
View File
@@ -1,4 +1,4 @@
{{ if eq hugo.Environment "production" -}}
{{ if hugo.IsProduction -}}
<script src="/docs/{{ .Site.Params.docs_version }}/dist/js/bootstrap.bundle.min.js" {{ printf "integrity=%q" .Site.Params.cdn.js_bundle_hash | safeHTMLAttr }}></script>
{{ else -}}
<script src="/docs/{{ .Site.Params.docs_version }}/dist/js/bootstrap.bundle.js"></script>
@@ -15,7 +15,7 @@
{{- $targetDocsJSPath := path.Join "/docs" .Site.Params.docs_version "assets/js/docs.js" -}}
{{- $docsJs := append $js $vendor | resources.Concat $targetDocsJSPath -}}
{{- if eq hugo.Environment "production" -}}
{{- if hugo.IsProduction -}}
{{- $docsJs = $docsJs | resources.Minify -}}
{{- end }}
+2 -2
View File
@@ -1,6 +1,6 @@
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@docsearch/css@3">
{{ if eq hugo.Environment "production" -}}
{{ if hugo.IsProduction -}}
{{ if eq .Page.Params.direction "rtl" -}}
<link href="/docs/{{ .Site.Params.docs_version }}/dist/css/bootstrap.rtl.min.css" rel="stylesheet" {{ printf "integrity=%q" .Site.Params.cdn.css_rtl_hash | safeHTMLAttr }}>
{{- else -}}
@@ -15,7 +15,7 @@
{{- $sassOptions := dict "targetPath" $targetDocsCssPath "outputStyle" "expanded" "precision" 6 -}}
{{- $postcssOptions := dict "use" "autoprefixer" "noMap" true -}}
{{ if eq hugo.Environment "production" -}}
{{ if hugo.IsProduction -}}
{{- $sassOptions = merge $sassOptions (dict "outputStyle" "compressed") -}}
{{- end -}}
+1 -2
View File
@@ -1,8 +1,7 @@
# www.robotstxt.org
{{- $isProduction := eq hugo.Environment "production" -}}
{{- $isNetlify := eq (getenv "NETLIFY") "true" -}}
{{- $allowCrawling := and (not $isNetlify) $isProduction -}}
{{- $allowCrawling := and (not $isNetlify) hugo.IsProduction -}}
{{ if $allowCrawling }}
# Allow crawling of all content