From 668ccbfe43a917b26ec50f53436b1c3fb4b4df12 Mon Sep 17 00:00:00 2001 From: khoodehui <67047571+khoodehui@users.noreply.github.com> Date: Tue, 2 May 2023 18:35:50 +0800 Subject: [PATCH] Implement new scan report (#116) * Implement new scan report * Bump version number --- combine.js | 2 +- constants/itemTypeDescription.js | 9 + crawlers/commonCrawlerFunc.js | 135 +- crawlers/crawlDomain.js | 31 +- mergeAxeResults.js | 395 +- package-lock.json | 131 +- package.json | 4 +- playwrightAxeGenerator.js | 2 +- .../partials/components/categorySelector.ejs | 45 + .../ejs/partials/components/ruleOffcanvas.ejs | 32 + static/ejs/partials/components/scanAbout.ejs | 149 + static/ejs/partials/components/topFive.ejs | 14 + .../partials/components/wcagCompliance.ejs | 124 + static/ejs/partials/footer.ejs | 14 + static/ejs/partials/header.ejs | 37 + static/ejs/partials/main.ejs | 22 + static/ejs/partials/scripts/bootstrap.ejs | 8 + .../ejs/partials/scripts/categorySummary.ejs | 53 + static/ejs/partials/scripts/highlightjs.ejs | 335 + static/ejs/partials/scripts/popper.ejs | 7 + static/ejs/partials/scripts/ruleOffcanvas.ejs | 412 + static/ejs/partials/scripts/utils.ejs | 22 + static/ejs/partials/styles/bootstrap.ejs | 12375 ++++++++++++++++ static/ejs/partials/styles/highlightjs.ejs | 54 + static/ejs/partials/styles/styles.ejs | 677 + static/ejs/report.ejs | 47 + static/mustache/.prettierrc | 4 + .../{ => mustache}/Attention Deficit.mustache | 0 static/{ => mustache}/Blind.mustache | 0 static/{ => mustache}/Cognitive.mustache | 0 static/{ => mustache}/Colorblindness.mustache | 0 static/{ => mustache}/Deaf.mustache | 0 static/{ => mustache}/Deafblind.mustache | 0 static/{ => mustache}/Dyslexia.mustache | 0 static/{ => mustache}/Low Vision.mustache | 0 static/{ => mustache}/Mobility.mustache | 0 .../Sighted Keyboard Users.mustache | 0 static/{ => mustache}/report.mustache | 0 38 files changed, 14866 insertions(+), 274 deletions(-) create mode 100644 constants/itemTypeDescription.js create mode 100644 static/ejs/partials/components/categorySelector.ejs create mode 100644 static/ejs/partials/components/ruleOffcanvas.ejs create mode 100644 static/ejs/partials/components/scanAbout.ejs create mode 100644 static/ejs/partials/components/topFive.ejs create mode 100644 static/ejs/partials/components/wcagCompliance.ejs create mode 100644 static/ejs/partials/footer.ejs create mode 100644 static/ejs/partials/header.ejs create mode 100644 static/ejs/partials/main.ejs create mode 100644 static/ejs/partials/scripts/bootstrap.ejs create mode 100644 static/ejs/partials/scripts/categorySummary.ejs create mode 100644 static/ejs/partials/scripts/highlightjs.ejs create mode 100644 static/ejs/partials/scripts/popper.ejs create mode 100644 static/ejs/partials/scripts/ruleOffcanvas.ejs create mode 100644 static/ejs/partials/scripts/utils.ejs create mode 100644 static/ejs/partials/styles/bootstrap.ejs create mode 100644 static/ejs/partials/styles/highlightjs.ejs create mode 100644 static/ejs/partials/styles/styles.ejs create mode 100644 static/ejs/report.ejs create mode 100644 static/mustache/.prettierrc rename static/{ => mustache}/Attention Deficit.mustache (100%) rename static/{ => mustache}/Blind.mustache (100%) rename static/{ => mustache}/Cognitive.mustache (100%) rename static/{ => mustache}/Colorblindness.mustache (100%) rename static/{ => mustache}/Deaf.mustache (100%) rename static/{ => mustache}/Deafblind.mustache (100%) rename static/{ => mustache}/Dyslexia.mustache (100%) rename static/{ => mustache}/Low Vision.mustache (100%) rename static/{ => mustache}/Mobility.mustache (100%) rename static/{ => mustache}/Sighted Keyboard Users.mustache (100%) rename static/{ => mustache}/report.mustache (100%) diff --git a/combine.js b/combine.js index 55200c1d..192e044a 100644 --- a/combine.js +++ b/combine.js @@ -75,7 +75,7 @@ const combineRun = async (details, deviceToScan) => { if (scanDetails.urlsCrawled.scanned.length > 0) { await createAndUpdateResultsFolders(randomToken); - await generateArtifacts(randomToken, deviceToScan); + await generateArtifacts(randomToken, url, deviceToScan); } else { printMessage([`No pages were scanned.`], constants.alertMessageOoptions); } diff --git a/constants/itemTypeDescription.js b/constants/itemTypeDescription.js new file mode 100644 index 00000000..e3f67b63 --- /dev/null +++ b/constants/itemTypeDescription.js @@ -0,0 +1,9 @@ +const itemTypeDescription = { + mustFix: + 'Issues that need to be addressed promptly, as they create significant barriers for persons with disabilities and can prevent them from accessing essential content or features.', + goodToFix: + 'Issues that could pose certain challenges for persons with disabilities (PWDs), but are unlikely to completely hinder their access to essential content or features.', + passed: 'Occurrences that passed the automated checks.', +}; + +export default itemTypeDescription; diff --git a/crawlers/commonCrawlerFunc.js b/crawlers/commonCrawlerFunc.js index b44f7b59..6a4e3b4b 100644 --- a/crawlers/commonCrawlerFunc.js +++ b/crawlers/commonCrawlerFunc.js @@ -4,44 +4,135 @@ import crawlee from 'crawlee'; import axe from 'axe-core'; import { axeScript } from '../constants/constants.js'; -const filterAxeResults = (results, host) => { - const { violations, url } = results; - const page = host === '' || url.split(host).length !== 2 ? url : url.split(host)[1]; - - const errors = violations.map(violation => { - const { id, nodes, help, impact, helpUrl } = violation; - const fixes = nodes.map(node => ({ - htmlElement: node.html, - })); - return { - id, - description: help, - impact, - helpUrl, - fixes, +// const filterAxeResults = (results, host) => { +// const { violations, url } = results; +// const page = host === '' || url.split(host).length !== 2 ? url : url.split(host)[1]; + +// const errors = violations.map(violation => { +// const { id, nodes, help, impact, helpUrl } = violation; +// const fixes = nodes.map(node => ({ +// htmlElement: node.html, +// })); +// return { +// id, +// description: help, +// impact, +// helpUrl, +// fixes, +// }; +// }); +// return { +// url, +// page, +// errors, +// }; +// }; + +const filterAxeResults = (results, pageTitle) => { + const { violations, incomplete, passes, url } = results; + + let totalItems = 0; + const mustFix = { totalItems: 0, rules: {} }; + const goodToFix = { totalItems: 0, rules: {} }; + const passed = { totalItems: 0, rules: {} }; + + const process = (item, needsReview = false) => { + const { id: rule, help: description, helpUrl, tags, nodes } = item; + + if (rule === 'frame-tested') return; + + const conformance = tags.filter(tag => tag.startsWith('wcag') || tag === 'best-practice'); + + const addTo = (category, node) => { + const { html, failureSummary } = node; + if (!(rule in category.rules)) { + category.rules[rule] = { description, helpUrl, conformance, totalItems: 0, items: [] }; + } + const message = needsReview + ? failureSummary.slice(failureSummary.indexOf('\n') + 1).trim() + : failureSummary; + category.rules[rule].items.push( + needsReview ? { html, message, needsReview } : { html, message }, + ); + category.rules[rule].totalItems += 1; + category.totalItems += 1; + totalItems += 1; }; + + nodes.forEach(node => { + const { impact } = node; + if (impact === 'critical' || impact === 'serious') { + addTo(mustFix, node); + } else { + addTo(goodToFix, node); + } + }); + }; + + violations.forEach(item => process(item)); + incomplete.forEach(item => process(item, true)); + + passes.forEach(item => { + const { id: rule, help: description, helpUrl, tags, nodes } = item; + + if (rule === 'frame-tested') return; + + const conformance = tags.filter(tag => tag.startsWith('wcag') || tag === 'best-practice'); + + nodes.forEach(node => { + const { html } = node; + if (!(rule in passed.rules)) { + passed.rules[rule] = { description, helpUrl, conformance, totalItems: 0, items: [] }; + } + passed.rules[rule].items.push({ html }); + passed.totalItems += 1; + passed.rules[rule].totalItems += 1; + totalItems += 1; + }); }); + return { url, - page, - errors, + pageTitle, + totalItems, + mustFix, + goodToFix, + passed, }; }; -export const runAxeScript = async (page, host) => { +// export const runAxeScript = async (page, host) => { +// await crawlee.puppeteerUtils.injectFile(page, axeScript); +// const results = await page.evaluate(() => { +// axe.configure({ +// branding: { +// application: 'purple-hats', +// }, +// reporter: 'no-passes', +// }); +// return axe.run({ +// resultTypes: ['violations'], +// }); +// }); +// return filterAxeResults(results, host); +// }; + +export const runAxeScript = async (page) => { await crawlee.puppeteerUtils.injectFile(page, axeScript); const results = await page.evaluate(() => { axe.configure({ branding: { application: 'purple-hats', }, - reporter: 'no-passes', }); return axe.run({ - resultTypes: ['violations'], + resultTypes: ['violations', 'passes', 'incomplete'], }); }); - return filterAxeResults(results, host); + const pageTitle = await page.evaluate(() => { + return document.title; + }); + return filterAxeResults(results, pageTitle); }; export const createCrawleeSubFolders = async randomToken => { @@ -52,7 +143,7 @@ export const createCrawleeSubFolders = async randomToken => { export const preNavigationHooks = [ async (_crawlingContext, gotoOptions) => { - gotoOptions = { waitUntil: "domcontentloaded", timeout: 30000 }; + gotoOptions = { waitUntil: 'domcontentloaded', timeout: 30000 }; }, ]; diff --git a/crawlers/crawlDomain.js b/crawlers/crawlDomain.js index 65536bae..65d58490 100644 --- a/crawlers/crawlDomain.js +++ b/crawlers/crawlDomain.js @@ -9,7 +9,6 @@ import { } from './commonCrawlerFunc.js'; import constants from '../constants/constants.js'; - const crawlDomain = async (url, randomToken, host, viewportSettings, maxRequestsPerCrawl) => { const urlsCrawled = { ...constants.urlsCrawledObj }; const { maxConcurrency } = constants; @@ -26,7 +25,7 @@ const crawlDomain = async (url, randomToken, host, viewportSettings, maxRequests } else if (customDevice === 'Samsung Galaxy S9+') { device = devices['Galaxy S9+']; } else if (viewportWidth) { - device = { viewport: { width: Number(viewportWidth), height: 720 }}; + device = { viewport: { width: Number(viewportWidth), height: 720 } }; } else if (customDevice) { device = devices[customDevice.replace('_', / /g)]; } else { @@ -41,21 +40,20 @@ const crawlDomain = async (url, randomToken, host, viewportSettings, maxRequests }, browserPoolOptions: { useFingerprints: false, - preLaunchHooks: [async (pageId, launchContext) => { - - launchContext.launchOptions = { - ...launchContext.launchOptions, - bypassCSP: true, - ignoreHTTPSErrors: true, - ...device, - }; - - }], + preLaunchHooks: [ + async (pageId, launchContext) => { + launchContext.launchOptions = { + ...launchContext.launchOptions, + bypassCSP: true, + ignoreHTTPSErrors: true, + ...device, + }; + }, + ], }, requestQueue, preNavigationHooks, requestHandler: async ({ page, request, enqueueLinks, enqueueLinksByClickingElements }) => { - const currentUrl = request.url; const location = await page.evaluate('location'); @@ -66,12 +64,12 @@ const crawlDomain = async (url, randomToken, host, viewportSettings, maxRequests await enqueueLinks({ // set selector matches anchor elements with href but not contains # or starting with mailto: - selector:'a:not(a[href*="#"],a[href^="mailto:"])', + selector: 'a:not(a[href*="#"],a[href^="mailto:"])', strategy: 'same-domain', requestQueue, transformRequestFunction(req) { // ignore all links ending with `.pdf` - req.url = req.url.replace(/(?<=&|\?)utm_.*?(&|$)/igm, ""); + req.url = req.url.replace(/(?<=&|\?)utm_.*?(&|$)/gim, ''); return req; }, }); @@ -84,11 +82,10 @@ const crawlDomain = async (url, randomToken, host, viewportSettings, maxRequests selector: ':not(a):is(*[role="link"], button[onclick])', transformRequestFunction(req) { // ignore all links ending with `.pdf` - req.url = req.url.replace(/(?<=&|\?)utm_.*?(&|$)/igm, ""); + req.url = req.url.replace(/(?<=&|\?)utm_.*?(&|$)/gim, ''); return req; }, }); - } else { urlsCrawled.outOfDomain.push(currentUrl); } diff --git a/mergeAxeResults.js b/mergeAxeResults.js index fb01f3b0..d8a02843 100644 --- a/mergeAxeResults.js +++ b/mergeAxeResults.js @@ -4,17 +4,15 @@ import fs from 'fs-extra'; import printMessage from 'print-message'; import path from 'path'; import { fileURLToPath } from 'url'; -import Mustache from 'mustache'; -import constants, { intermediateScreenshotsPath, destinationPath } from './constants/constants.js'; +import ejs from 'ejs'; +import constants from './constants/constants.js'; import { getCurrentTime, getStoragePath } from './utils.js'; import { consoleLogger, silentLogger } from './logs.js'; +import itemTypeDescription from './constants/itemTypeDescription.js'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); -const axeIssuesList = JSON.parse(fs.readFileSync('./constants/axeTypes.json')); -const wcagList = JSON.parse(fs.readFileSync('./constants/wcagLinks.json')); - const extractFileNames = async directory => fs .readdir(directory) @@ -33,29 +31,8 @@ const parseContentToJson = async rPath => silentLogger.error(`(parseContentToJson) - ${parseError}`); }); -const fetchIcons = async (disabilities, impact) => - Promise.all( - disabilities.map(async disability => { - const template = await fs - .readFile(path.join(__dirname, `/static/${disability}.mustache`), 'utf8') - .catch(templateError => { - consoleLogger.info('An error has occurred when reading the template, please try again.'); - silentLogger.error(`(fetchIcons, mapping disabilities) - ${templateError}`); - }); - - return Mustache.render(template, { impact }); - }), - ).catch(iconError => { - consoleLogger.info('An error has occurred when fetching icons, please try again.'); - silentLogger.error(`(fetchIcons) - ${iconError}`); - }); - const writeResults = async (allissues, storagePath, jsonFilename = 'compiledResults') => { - const finalResultsInJson = JSON.stringify( - { startTime: getCurrentTime(), count: allissues.length, allissues }, - null, - 4, - ); + const finalResultsInJson = JSON.stringify(allissues, null, 4); try { await fs.writeFile(`${storagePath}/reports/${jsonFilename}.json`, finalResultsInJson); @@ -67,215 +44,219 @@ const writeResults = async (allissues, storagePath, jsonFilename = 'compiledResu } }; -const writeHTML = async (allissues, storagePath, deviceToScan, htmlFilename = 'report') => { - const issueCounts = issueCountMap(allissues); - const domainScanned = storagePath.split('_')[1]; - var deviceUsed = storagePath.split('_')[4]; - - const totalIssues = issueCounts.get('total'); - const totalCritical = issueCounts.get('critical'); - const totalSerious = issueCounts.get('serious'); - const totalModerate = issueCounts.get('moderate'); - const totalMinor = issueCounts.get('minor'); - const totalUnique = new Set(allissues.map(issue => issue.description)).size; - - const issueImpact = { - totalIssues, - totalCritical, - totalSerious, - totalModerate, - totalMinor, - totalUnique, - }; - - let deviceIconHtml; - switch (deviceUsed) { - case 'Desktop': - deviceIconHtml = `<svg viewBox="0 0 100 100" aria-hidden="true"> - <path d="M80.24 19.76H19.76C16.9736 19.76 14.72 22.0208 14.72 24.8072V65.1776C14.72 67.964 16.9736 70.2248 19.76 70.2248H42.44V75.1928H37.4C36.0104 75.1928 34.88 76.3232 34.88 77.7128C34.88 79.1096 36.0104 80.2328 37.4 80.2328H62.6C63.9896 80.2328 65.12 79.1024 65.12 77.7128C65.12 76.316 63.9896 75.1928 62.6 75.1928H57.56V70.2248H80.24C83.0264 70.2248 85.28 67.964 85.28 65.1776V24.8072C85.28 22.0208 83.0264 19.76 80.24 19.76ZM80.24 63.68C80.24 64.5512 79.5344 65.2568 78.6632 65.2568H21.3368C20.4656 65.2568 19.76 64.5512 19.76 63.68V26.4632C19.76 25.592 20.4656 24.8864 21.3368 24.8864H78.6704C79.5416 24.8864 80.2472 25.592 80.2472 26.4632L80.24 63.68Z"> - </svg>`; - break; - case 'Mobile': - deviceIconHtml = `<svg viewBox="0 0 100 100" aria-hidden="true"> - <path fill-rule="evenodd" clip-rule="evenodd" d="M36.6667 17C33.353 17 30.6667 19.6456 30.6667 22.9091V76.0909C30.6667 79.3544 33.353 82 36.6667 82H61.6667C64.9805 82 67.6667 79.3544 67.6667 76.0909V22.9091C67.6667 19.6456 64.9805 17 61.6667 17H36.6667ZM63.6667 24.8788H34.6667V72.1515H63.6667V24.8788ZM43.6667 20.447C43.6667 20.175 43.8906 19.9545 44.1667 19.9545H55.1667C55.4429 19.9545 55.6667 20.175 55.6667 20.447C55.6667 20.7189 55.4429 20.9394 55.1667 20.9394H44.1667C43.8906 20.9394 43.6667 20.7189 43.6667 20.447ZM49.6667 80.0303C51.3236 80.0303 52.6667 78.7075 52.6667 77.0758C52.6667 75.444 51.3236 74.1212 49.6667 74.1212C48.0099 74.1212 46.6667 75.444 46.6667 77.0758C46.6667 78.7075 48.0099 80.0303 49.6667 80.0303Z"> - </svg>`; - break; - case 'CustomWidth': - deviceUsed = storagePath.split('_')[5] + ' width viewport'; - deviceIconHtml = `<svg viewBox="0 0 100 100" aria-hidden="true"> - <path fill-rule="evenodd" clip-rule="evenodd" d="M25 35C25 29.4772 29.4772 25 35 25H65C70.5228 25 75 29.4772 75 35V65C75 70.5228 70.5228 75 65 75H35C29.4772 75 25 70.5228 25 65V35ZM34.2466 52.3973C32.9226 52.3973 31.8493 53.4705 31.8493 54.7945V65.7534C31.8493 67.0774 32.9226 68.1507 34.2466 68.1507C34.3627 68.1507 34.4769 68.1424 34.5887 68.1265C34.7007 68.1425 34.8151 68.1508 34.9315 68.1508H45.8904C47.2144 68.1508 48.2877 67.0775 48.2877 65.7535C48.2877 64.4296 47.2144 63.3563 45.8904 63.3563H36.6438V54.7945C36.6438 53.4706 35.5705 52.3973 34.2466 52.3973ZM68.8356 45.2055C68.8356 46.5295 67.7623 47.6027 66.4384 47.6027C65.1144 47.6027 64.0411 46.5295 64.0411 45.2055V36.6437L54.7945 36.6437C53.4706 36.6437 52.3973 35.5704 52.3973 34.2465C52.3973 32.9225 53.4706 31.8492 54.7945 31.8492L65.7534 31.8492C65.8698 31.8492 65.9843 31.8575 66.0963 31.8735C66.208 31.8576 66.3222 31.8493 66.4384 31.8493C67.7623 31.8493 68.8356 32.9226 68.8356 34.2466V45.2055Z"> - </svg>`; - break; - default: - deviceUsed = deviceToScan.replaceAll('_', ' '); - deviceIconHtml = `<svg viewBox="0 0 100 100" aria-hidden="true"> - <path fill-rule="evenodd" clip-rule="evenodd" d="M36.6667 17C33.353 17 30.6667 19.6456 30.6667 22.9091V76.0909C30.6667 79.3544 33.353 82 36.6667 82H61.6667C64.9805 82 67.6667 79.3544 67.6667 76.0909V22.9091C67.6667 19.6456 64.9805 17 61.6667 17H36.6667ZM63.6667 24.8788H34.6667V72.1515H63.6667V24.8788ZM43.6667 20.447C43.6667 20.175 43.8906 19.9545 44.1667 19.9545H55.1667C55.4429 19.9545 55.6667 20.175 55.6667 20.447C55.6667 20.7189 55.4429 20.9394 55.1667 20.9394H44.1667C43.8906 20.9394 43.6667 20.7189 43.6667 20.447ZM49.6667 80.0303C51.3236 80.0303 52.6667 78.7075 52.6667 77.0758C52.6667 75.444 51.3236 74.1212 49.6667 74.1212C48.0099 74.1212 46.6667 75.444 46.6667 77.0758C46.6667 78.7075 48.0099 80.0303 49.6667 80.0303Z"> - </svg>`; - } - - const finalResultsInJson = JSON.stringify( - { - startTime: getCurrentTime(), - count: allissues.length, - allissues, - issueImpact, - domainScanned, - deviceUsed, - deviceIconHtml, - }, - null, - 4, - ); - - try { - const musTemp = await fs.readFile(path.join(__dirname, '/static/report.mustache')); - const output = Mustache.render(musTemp.toString(), JSON.parse(finalResultsInJson)); - await fs.writeFile(`${storagePath}/reports/${htmlFilename}.html`, output); - } catch (templateError) { - consoleLogger.info('An error has ocurred when generating the report, please try again.'); - silentLogger.error(`(writeHTML) - ${templateError}`); - } +const writeHTML = async (allIssues, storagePath, htmlFilename = 'report') => { + const ejsString = fs.readFileSync('./static/ejs/report.ejs', 'utf-8'); + const template = ejs.compile(ejsString, { filename: './static/ejs/report.ejs' }); + const html = template(allIssues); + fs.writeFileSync(`${storagePath}/reports/${htmlFilename}.html`, html); }; -const flattenAxeResults = async rPath => { +// const granularReporting = async (randomToken, allIssues) => { +// if (allIssues.length > 0) { +// const storagePath = getStoragePath(randomToken); +// const impactLevels = ['critical', 'serious', 'moderate', 'minor']; + +// let currentImpactLevelIssues; +// impactLevels.forEach(async impactLevel => { +// currentImpactLevelIssues = allIssues.filter(issue => issue.impact === impactLevel); + +// if (currentImpactLevelIssues.length > 0) { +// const writeSeverityResult = writeResults( +// currentImpactLevelIssues, +// storagePath, +// `compiledResults-${impactLevel}`, +// ); +// const writeHTMLSeverityReport = writeHTML( +// currentImpactLevelIssues, +// storagePath, +// `report-${impactLevel}`, +// ); +// await Promise.all([writeSeverityResult, writeHTMLSeverityReport]); +// } +// }); + +// return true; +// } + +// return false; +// }; + +// const issueCountMap = allIssues => { +// const criticalImpact = allIssues.filter(issue => issue.impact === 'critical'); +// const seriousImpact = allIssues.filter(issue => issue.impact === 'serious'); +// const moderateImpact = allIssues.filter(issue => issue.impact === 'moderate'); +// const minorImpact = allIssues.filter(issue => issue.impact === 'minor'); + +// const issueCount = new Map(); +// issueCount.set('critical', criticalImpact.length); +// issueCount.set('serious', seriousImpact.length); +// issueCount.set('moderate', moderateImpact.length); +// issueCount.set('minor', minorImpact.length); +// issueCount.set('total', allIssues.length); + +// return issueCount; +// }; + +// const thresholdLimitCheck = async (warnLevel, allIssues, totalUniqueIssues) => { +// const issueCounts = issueCountMap(allIssues); + +// const messages = [ +// [`Total Issues: ${issueCounts.get('total')}`, `Total Unique Issues: ${totalUniqueIssues}`], +// [ +// `Issue Breakdown`, +// `Critical: ${issueCounts.get('critical')}`, +// `Serious: ${issueCounts.get('serious')}`, +// `Moderate: ${issueCounts.get('moderate')}`, +// `Minor: ${issueCounts.get('minor')}`, +// ], +// ]; + +// const uniqueIssues = [`Unique: ${totalUniqueIssues}`]; + +// if (warnLevel !== 'none' && issueCounts.get(warnLevel) > 0) { +// messages.push([ +// `Issues with impact level - ${warnLevel} found in your project. Please review the accessibility issues.`, +// ]); +// process.exitCode = 1; +// } + +// messages.forEach((message, index, array) => { +// if (array.length !== 1 && index === array.length - 1) { +// printMessage(message, constants.alertMessageOptions); +// } else { +// printMessage(message); +// } +// }); +// }; + +// export const generateArtifacts = async (randomToken, deviceToScan) => { +// const storagePath = getStoragePath(randomToken); +// const directory = `${storagePath}/${constants.allIssueFileName}`; +// let allIssues = []; +// const allFiles = await extractFileNames(directory); + +// await Promise.all( +// allFiles.map(async file => { +// const rPath = `${directory}/${file}`; +// const flattenedIssues = await flattenAxeResults(rPath); +// allIssues = allIssues.concat(flattenedIssues); +// }), +// ).catch(flattenIssuesError => { +// consoleLogger.info('An error has occurred when flattening the issues, please try again.'); +// silentLogger.error(flattenIssuesError); +// }); + +// const totalUniqueIssues = new Set(allIssues.map(issue => issue.description)).size; +// if (process.env.REPORT_BREAKDOWN === '1') { +// await granularReporting(randomToken, allIssues); +// } + +// await thresholdLimitCheck(process.env.WARN_LEVEL, allIssues, totalUniqueIssues); + +// await writeResults(allIssues, storagePath); +// await writeHTML(allIssues, storagePath, deviceToScan); +// }; + +const pushResults = async (rPath, allIssues) => { const parsedContent = await parseContentToJson(rPath); + const { url, pageTitle } = parsedContent; - const flattenedIssues = []; - const { url, page, errors } = parsedContent; - errors.forEach(error => { - error.fixes.forEach(item => { - const { id: errorId, impact, description, helpUrl } = error; - const { disabilities, wcag } = axeIssuesList.find(obj => obj.id === errorId) || {}; - - const wcagLinks = wcag - ? wcag.map(element => wcagList.find(obj => obj.wcag === element) || { wcag: element }) - : null; - - flattenedIssues.push({ - url, - page, - description, - impact, - helpUrl, - htmlElement: item.htmlElement, - order: constants.impactOrder[impact], - wcagLinks, - disabilities, - }); - }); - }); + allIssues.totalPagesScanned += 1; + allIssues.topFiveMustFix.push({ url, pageTitle, totalMustFix: parsedContent.mustFix.totalItems }); - return Promise.all( - flattenedIssues.map(async issue => { - const { disabilities, impact, ...rest } = issue; - const icons = disabilities ? await fetchIcons(disabilities, impact) : null; - return { ...rest, impact, disabilities: icons }; - }), - ); -}; + ['mustFix', 'goodToFix', 'passed'].forEach(category => { + const { totalItems, rules } = parsedContent[category]; + const currCategoryFromAllIssues = allIssues.items[category]; + + currCategoryFromAllIssues.totalItems += totalItems; -const granularReporting = async (randomToken, allIssues) => { - if (allIssues.length > 0) { - const storagePath = getStoragePath(randomToken); - const impactLevels = ['critical', 'serious', 'moderate', 'minor']; - - let currentImpactLevelIssues; - impactLevels.forEach(async impactLevel => { - currentImpactLevelIssues = allIssues.filter(issue => issue.impact === impactLevel); - - if (currentImpactLevelIssues.length > 0) { - const writeSeverityResult = writeResults( - currentImpactLevelIssues, - storagePath, - `compiledResults-${impactLevel}`, - ); - const writeHTMLSeverityReport = writeHTML( - currentImpactLevelIssues, - storagePath, - `report-${impactLevel}`, - ); - await Promise.all([writeSeverityResult, writeHTMLSeverityReport]); + Object.keys(rules).forEach(rule => { + const { description, helpUrl, conformance, totalItems: count, items } = rules[rule]; + + if (!(rule in currCategoryFromAllIssues.rules)) { + currCategoryFromAllIssues.rules[rule] = { + description, + helpUrl, + conformance, + totalItems: 0, + pagesAffected: {}, + }; } - }); - return true; - } + if (category !== 'passed') { + conformance + .filter(c => /wcag[0-9]{3,4}/.test(c)) + .forEach(c => allIssues.wcagViolations.add(c)); + } - return false; -}; + const currRuleFromAllIssues = currCategoryFromAllIssues.rules[rule]; -const issueCountMap = allIssues => { - const criticalImpact = allIssues.filter(issue => issue.impact === 'critical'); - const seriousImpact = allIssues.filter(issue => issue.impact === 'serious'); - const moderateImpact = allIssues.filter(issue => issue.impact === 'moderate'); - const minorImpact = allIssues.filter(issue => issue.impact === 'minor'); + currRuleFromAllIssues.totalItems += count; - const issueCount = new Map(); - issueCount.set('critical', criticalImpact.length); - issueCount.set('serious', seriousImpact.length); - issueCount.set('moderate', moderateImpact.length); - issueCount.set('minor', minorImpact.length); - issueCount.set('total', allIssues.length); + if (!(url in currRuleFromAllIssues.pagesAffected)) { + currRuleFromAllIssues.pagesAffected[url] = { pageTitle, items: [] }; + } - return issueCount; + currRuleFromAllIssues.pagesAffected[url].items.push(...items); + }); + }); }; -const thresholdLimitCheck = async (warnLevel, allIssues, totalUniqueIssues) => { - const issueCounts = issueCountMap(allIssues); - - const messages = [ - [`Total Issues: ${issueCounts.get('total')}`, `Total Unique Issues: ${totalUniqueIssues}`], - [ - `Issue Breakdown`, - `Critical: ${issueCounts.get('critical')}`, - `Serious: ${issueCounts.get('serious')}`, - `Moderate: ${issueCounts.get('moderate')}`, - `Minor: ${issueCounts.get('minor')}`, - ], - ]; - - const uniqueIssues = [`Unique: ${totalUniqueIssues}`]; - - if (warnLevel !== 'none' && issueCounts.get(warnLevel) > 0) { - messages.push([ - `Issues with impact level - ${warnLevel} found in your project. Please review the accessibility issues.`, - ]); - process.exitCode = 1; - } - - messages.forEach((message, index, array) => { - if (array.length !== 1 && index === array.length - 1) { - printMessage(message, constants.alertMessageOptions); - } else { - printMessage(message); - } +const flattenAndSortResults = allIssues => { + ['mustFix', 'goodToFix', 'passed'].forEach(category => { + allIssues.totalItems += allIssues.items[category].totalItems; + allIssues.items[category].rules = Object.entries(allIssues.items[category].rules) + .map(ruleEntry => { + const [rule, ruleInfo] = ruleEntry; + ruleInfo.pagesAffected = Object.entries(ruleInfo.pagesAffected) + .map(pageEntry => { + const [url, pageInfo] = pageEntry; + return { url, ...pageInfo }; + }) + .sort((page1, page2) => page2.items.length - page1.items.length); + return { rule, ...ruleInfo }; + }) + .sort((rule1, rule2) => rule2.totalItems - rule1.totalItems); }); + allIssues.topFiveMustFix.sort((page1, page2) => page2.totalMustFix - page1.totalMustFix); + allIssues.topFiveMustFix = allIssues.topFiveMustFix.slice(0, 5); + // convert the set to an array + allIssues.wcagViolations = Array.from(allIssues.wcagViolations); }; -export const generateArtifacts = async (randomToken, deviceToScan) => { +export const generateArtifacts = async (randomToken, urlScanned, viewport) => { const storagePath = getStoragePath(randomToken); + const directory = `${storagePath}/${constants.allIssueFileName}`; - let allIssues = []; + const allIssues = { + startTime: getCurrentTime(), + urlScanned, + viewport, + totalPagesScanned: 0, + totalItems: 0, + topFiveMustFix: [], + wcagViolations: new Set(), + items: { + mustFix: { description: itemTypeDescription.mustFix, totalItems: 0, rules: {} }, + goodToFix: { description: itemTypeDescription.goodToFix, totalItems: 0, rules: {} }, + passed: { description: itemTypeDescription.passed, totalItems: 0, rules: {} }, + }, + }; + const allFiles = await extractFileNames(directory); await Promise.all( allFiles.map(async file => { const rPath = `${directory}/${file}`; - const flattenedIssues = await flattenAxeResults(rPath); - allIssues = allIssues.concat(flattenedIssues); + await pushResults(rPath, allIssues); }), ).catch(flattenIssuesError => { consoleLogger.info('An error has occurred when flattening the issues, please try again.'); - silentLogger.error(flattenIssuesError); + silentLogger.error(flattenIssuesError.stack); }); - const totalUniqueIssues = new Set(allIssues.map(issue => issue.description)).size; - if (process.env.REPORT_BREAKDOWN === '1') { - await granularReporting(randomToken, allIssues); - } - - await thresholdLimitCheck(process.env.WARN_LEVEL, allIssues, totalUniqueIssues); + flattenAndSortResults(allIssues); await writeResults(allIssues, storagePath); - await writeHTML(allIssues, storagePath, deviceToScan); + await writeHTML(allIssues, storagePath); }; diff --git a/package-lock.json b/package-lock.json index 90142a8a..1613894f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,23 +1,23 @@ { "name": "purple-hats", - "version": "0.0.9", + "version": "0.0.12", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "purple-hats", - "version": "0.0.9", + "version": "0.0.12", "license": "ISC", "dependencies": { "axe-core": "^4.6.2", "axios": "^1.2.2", "cheerio": "^1.0.0-rc.12", "crawlee": "^3.3.0", + "ejs": "^3.1.9", "fs-extra": "^11.1.0", "glob": "^9.1.2", "inquirer": "^9.1.4", "jsdom": "^21.0.0", - "mustache": "^4.2.0", "playwright": "1.32.1", "print-message": "^3.0.1", "safe-regex": "^2.1.1", @@ -2498,7 +2498,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -2940,7 +2939,6 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, "license": "MIT" }, "node_modules/confusing-browser-globals": { @@ -3342,6 +3340,20 @@ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "license": "MIT" }, + "node_modules/ejs": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", + "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/electron-to-chromium": { "version": "1.4.344", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.344.tgz", @@ -4139,6 +4151,33 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -5507,6 +5546,23 @@ "node": ">=8" } }, + "node_modules/jake": { + "version": "10.8.5", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", + "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/jest": { "version": "29.5.0", "resolved": "https://registry.npmjs.org/jest/-/jest-29.5.0.tgz", @@ -6573,7 +6629,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -6607,15 +6662,6 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, - "node_modules/mustache": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", - "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", - "license": "MIT", - "bin": { - "mustache": "bin/mustache" - } - }, "node_modules/mute-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", @@ -10589,7 +10635,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -10871,8 +10916,7 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "confusing-browser-globals": { "version": "1.0.11", @@ -11130,6 +11174,14 @@ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" }, + "ejs": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", + "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "requires": { + "jake": "^10.8.5" + } + }, "electron-to-chromium": { "version": "1.4.344", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.344.tgz", @@ -11694,6 +11746,32 @@ "flat-cache": "^3.0.4" } }, + "filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "requires": { + "minimatch": "^5.0.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -12557,6 +12635,17 @@ "istanbul-lib-report": "^3.0.0" } }, + "jake": { + "version": "10.8.5", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", + "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", + "requires": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + } + }, "jest": { "version": "29.5.0", "resolved": "https://registry.npmjs.org/jest/-/jest-29.5.0.tgz", @@ -13323,7 +13412,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -13344,11 +13432,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, - "mustache": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", - "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==" - }, "mute-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", diff --git a/package.json b/package.json index f75eed27..cb52fd95 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "purple-hats", "main": "index.js", - "version": "0.0.11", + "version": "0.0.12", "type": "module", "imports": { "#root/*.js": "./*.js" @@ -11,11 +11,11 @@ "axios": "^1.2.2", "cheerio": "^1.0.0-rc.12", "crawlee": "^3.3.0", + "ejs": "^3.1.9", "fs-extra": "^11.1.0", "glob": "^9.1.2", "inquirer": "^9.1.4", "jsdom": "^21.0.0", - "mustache": "^4.2.0", "playwright": "1.32.1", "print-message": "^3.0.1", "safe-regex": "^2.1.1", diff --git a/playwrightAxeGenerator.js b/playwrightAxeGenerator.js index 11dd1f72..14d8c863 100644 --- a/playwrightAxeGenerator.js +++ b/playwrightAxeGenerator.js @@ -247,7 +247,7 @@ const processPage = async page => { await createDetailsAndLogs(scanDetails, '${randomToken}'); await createAndUpdateResultsFolders('${randomToken}'); createScreenshotsFolder('${randomToken}'); - await generateArtifacts('${randomToken}', 'Automated Scan'); + await generateArtifacts('${randomToken}', '${domain}','Automated Scan'); });`; let tmpDir; diff --git a/static/ejs/partials/components/categorySelector.ejs b/static/ejs/partials/components/categorySelector.ejs new file mode 100644 index 00000000..65ec8070 --- /dev/null +++ b/static/ejs/partials/components/categorySelector.ejs @@ -0,0 +1,45 @@ +<% const formattedCategoryTitles = { + mustFix: "Must Fix", + goodToFix: "Good to Fix", + passed: "Passed" +} %> + +<button + id="<%= category %>Selector" + class="h-100 category-selector <%= category %>" + onclick="changeSelectedCategory(event, '<%= category %>')" +> + <div class="d-flex align-items-center mb-3"> + <h2 class="d-flex align-items-center category-name fw-bold d-inline mb-0"> + <%= formattedCategoryTitles[category] %> + </h2> + <svg + tabindex="0" + class="ms-2" + data-bs-toggle="tooltip" + data-bs-placement="top" + title="<%= items[category].description %>" + width="14" + height="14" + viewBox="0 0 14 14" + fill="none" + xmlns="http://www.w3.org/2000/svg" + > + <g clip-path="url(.clip0_1630_1670)"> + <path + d="M11.9528 2.05329C9.22079 -0.68205 4.78867 -0.68477 2.0533 2.04718C-0.682042 4.7792 -0.684795 9.21135 2.04722 11.9467C4.77917 14.6821 9.21135 14.6848 11.9467 11.9528C14.682 9.22085 14.6848 4.78863 11.9528 2.05329ZM7.00216 11.2406C6.6319 11.2406 6.33174 10.9405 6.33174 10.5702C6.33174 10.1999 6.63187 9.89976 7.00216 9.89976C7.37243 9.89976 7.67259 10.1999 7.67259 10.5702C7.67255 10.9405 7.37243 11.2406 7.00216 11.2406ZM8.09214 7.20401C7.70918 7.42788 7.67645 7.7033 7.6748 8.49691C7.6747 8.54938 7.67453 8.60233 7.67423 8.65558C7.67185 9.03068 7.36712 9.33312 6.99253 9.33312C6.99105 9.33312 6.98957 9.33312 6.98813 9.33312C6.61159 9.33074 6.3083 9.02356 6.31066 8.64699C6.31099 8.59568 6.31109 8.54468 6.31119 8.49415C6.31287 7.67852 6.31492 6.66352 7.40395 6.02694C8.27777 5.51613 8.3879 5.18059 8.28543 4.74029C8.16503 4.2231 7.69273 4.08907 7.32418 4.1312C7.20042 4.14541 6.58322 4.24724 6.58322 4.85783C6.58322 5.23431 6.27795 5.5396 5.90141 5.5396C5.52487 5.5396 5.21964 5.23431 5.21964 4.85783C5.21964 3.76416 6.02107 2.90831 7.16859 2.77656C8.35043 2.64099 9.35515 3.32135 9.61338 4.4312C9.99939 6.08915 8.61379 6.89911 8.09214 7.20401Z" + fill="#B5C5CA" + /> + </g> + <defs> + <clipPath class="clip0_1630_1670"> + <rect width="14" height="14" fill="white" /> + </clipPath> + </defs> + </svg> + </div> + <span> + <% if (category !== 'passed') { %> <%= items[category].rules.length %> issues / <% } %> <%= + items[category].totalItems %> occurrences + </span> +</button> diff --git a/static/ejs/partials/components/ruleOffcanvas.ejs b/static/ejs/partials/components/ruleOffcanvas.ejs new file mode 100644 index 00000000..ce66d08b --- /dev/null +++ b/static/ejs/partials/components/ruleOffcanvas.ejs @@ -0,0 +1,32 @@ +<%# this is a template; content will be populated using js %> +<div + class="offcanvas offcanvas-end" + tabindex="-1" + id="expandedRule" + aria-labelledby="expandedRuleName" +> + <div class="p-4"> + <div class="offcanvas-header p-0"> + <h3 class="offcanvas-title" id="expandedRuleName">Offcanvas</h3> + <button + type="button" + class="btn-close text-reset" + data-bs-dismiss="offcanvas" + aria-label="Close" + ></button> + </div> + <p id="expandedRuleDescription"> + Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut + labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco + laboris nisi ut aliquip ex ea commodo consequat. + </p> + <a id="expandedRuleHelpUrl" href="#" target="_blank">Learn more about this issue</a> + <h4>Conformance:</h4> + <div id="expandedRuleConformance"></div> + </div> + <div class="offcanvas-body"> + <div id="expandedRuleInfoText"></div> + <div id="expandedRuleCategorySelectors"></div> + <div id="expandedRuleCategoryContent" class="mt-4"></div> + </div> +</div> diff --git a/static/ejs/partials/components/scanAbout.ejs b/static/ejs/partials/components/scanAbout.ejs new file mode 100644 index 00000000..569bb569 --- /dev/null +++ b/static/ejs/partials/components/scanAbout.ejs @@ -0,0 +1,149 @@ +<div id="scan-about" class="z-1 card flex-shrink-0"> + <h2>About this scan</h2> + <div> + <svg + aria-label="Start time" + width="18" + height="19" + viewBox="0 0 18 19" + fill="none" + xmlns="http://www.w3.org/2000/svg" + > + <path + fill-rule="evenodd" + clip-rule="evenodd" + d="M3.69863 0.927936C3.69863 0.41626 4.11262 0.00146484 4.62329 0.00146484C5.13396 0.00146484 5.54795 0.41626 5.54795 0.927936V1.85441H9.24658V0.927936C9.24658 0.41626 9.66056 0.00146484 10.1712 0.00146484C10.6819 0.00146484 11.0959 0.41626 11.0959 0.927936V1.85441H12.0205C13.5526 1.85441 14.7945 3.09879 14.7945 4.63382V8.51434C14.6723 8.5058 14.549 8.50146 14.4247 8.50146C14.0768 8.50146 13.7367 8.53544 13.4075 8.60029V7.41323H1.38699V12.9721C1.38699 13.7396 2.00795 14.3618 2.77397 14.3618H9.1446C9.18737 14.8464 9.29359 15.3125 9.45476 15.7515H2.77397C1.24195 15.7515 0 14.5071 0 12.9721V4.63382C0 3.09879 1.24195 1.85441 2.77397 1.85441H3.69863V0.927936ZM9.24658 3.24411V3.70735C9.24658 4.21902 9.66056 4.63382 10.1712 4.63382C10.6819 4.63382 11.0959 4.21902 11.0959 3.70735V3.24411H12.0205C12.7866 3.24411 13.4075 3.8663 13.4075 4.63382V6.48676H1.38699V4.63382C1.38699 3.8663 2.00795 3.24411 2.77397 3.24411H3.69863V3.70735C3.69863 4.21902 4.11262 4.63382 4.62329 4.63382C5.13396 4.63382 5.54795 4.21902 5.54795 3.70735V3.24411H9.24658ZM17.0959 14.0015C17.0959 15.7043 15.7343 17.0848 14.0548 17.0848C12.3752 17.0848 11.0137 15.7043 11.0137 14.0015C11.0137 12.2986 12.3752 10.9181 14.0548 10.9181C15.7343 10.9181 17.0959 12.2986 17.0959 14.0015ZM18 14.0015C18 16.2106 16.2337 18.0015 14.0548 18.0015C11.8759 18.0015 10.1096 16.2106 10.1096 14.0015C10.1096 11.7923 11.8759 10.0015 14.0548 10.0015C16.2337 10.0015 18 11.7923 18 14.0015ZM14.0548 11.5015C13.8732 11.5015 13.726 11.6507 13.726 11.8348V13.9181C13.726 14.0241 13.7748 14.1185 13.8507 14.1795C13.8597 14.191 13.8696 14.2021 13.8803 14.2125L14.8486 15.161C14.9791 15.2889 15.1873 15.2853 15.3134 15.1529C15.4396 15.0205 15.436 14.8095 15.3054 14.6816L14.3836 13.7785V11.8348C14.3836 11.6507 14.2364 11.5015 14.0548 11.5015Z" + fill="#CED4DA" + /> + </svg> + <span><%= startTime %></span> + </div> + <div> + <svg + aria-label="URL scanned" + width="18" + height="15" + viewBox="0 0 18 15" + fill="none" + xmlns="http://www.w3.org/2000/svg" + > + <path + fill-rule="evenodd" + clip-rule="evenodd" + d="M16.5789 2.80146H1.42105V12.6015H16.5789V2.80146ZM18 0.934798V2.80146V13.0681C18 13.5836 17.5758 14.0015 17.0526 14.0015H0.947369C0.42415 14.0015 0 13.5836 0 13.0681V2.80146V0.934798C0 0.419332 0.42415 0.00146484 0.947369 0.00146484H17.0526C17.5758 0.00146484 18 0.419332 18 0.934798ZM3.07895 2.3348C2.68653 2.3348 2.36842 2.0214 2.36842 1.6348C2.36842 1.2482 2.68653 0.934798 3.07895 0.934798C3.47136 0.934798 3.78947 1.2482 3.78947 1.6348C3.78947 2.0214 3.47136 2.3348 3.07895 2.3348ZM4.26316 1.6348C4.26316 2.0214 4.58127 2.3348 4.97368 2.3348C5.3661 2.3348 5.68421 2.0214 5.68421 1.6348C5.68421 1.2482 5.3661 0.934798 4.97368 0.934798C4.58127 0.934798 4.26316 1.2482 4.26316 1.6348ZM6.86842 2.3348C6.47601 2.3348 6.15789 2.0214 6.15789 1.6348C6.15789 1.2482 6.47601 0.934798 6.86842 0.934798C7.26083 0.934798 7.57895 1.2482 7.57895 1.6348C7.57895 2.0214 7.26083 2.3348 6.86842 2.3348Z" + fill="#CED4DA" + /> + </svg> + <a href="<%= urlScanned %>" target="_blank"><%= urlScanned %></a> + </div> + <div> + <% if (viewport.startsWith('Desktop')) { %> + <svg + aria-label="Viewport" + width="18" + height="15.5" + viewBox="0 0 18 15.5" + fill="none" + xmlns="http://www.w3.org/2000/svg" + > + <path + d="M16.56 0.19H1.44A1.26 1.26 0 0 0 0.18 1.452v10.092a1.26 1.26 0 0 0 1.26 1.262h5.67v1.242H5.85c-0.347 0 -0.63 0.282 -0.63 0.63 0 0.349 0.282 0.63 0.63 0.63h6.3c0.347 0 0.63 -0.282 0.63 -0.63 0 -0.349 -0.282 -0.63 -0.63 -0.63h-1.26v-1.242h5.67c0.697 0 1.26 -0.565 1.26 -1.262V1.452A1.26 1.26 0 0 0 16.56 0.19Zm0 10.98c0 0.218 -0.176 0.394 -0.394 0.394H1.834A0.394 0.394 0 0 1 1.44 11.17V1.866c0 -0.218 0.176 -0.394 0.394 -0.394H16.168c0.218 0 0.394 0.176 0.394 0.394L16.56 11.17Z" + fill="#CED4DA" + /> + </svg> + <% } else if (viewport.startsWith('CustomWidth')) { %> + <svg + aria-label="Viewport" + width="18" + height="18" + viewBox="0 0 18 18" + fill="none" + xmlns="http://www.w3.org/2000/svg" + > + <path + fill-rule="evenodd" + clip-rule="evenodd" + d="M0 3.6a3.6 3.6 0 0 1 3.6 -3.6h10.8a3.6 3.6 0 0 1 3.6 3.6v10.8a3.6 3.6 0 0 1 -3.6 3.6H3.6a3.6 3.6 0 0 1 -3.6 -3.6V3.6Zm3.329 6.263a0.863 0.863 0 0 0 -0.863 0.863v3.945a0.863 0.863 0 0 0 0.986 0.854c0.041 0.006 0.081 0.009 0.123 0.009h3.945a0.863 0.863 0 1 0 0 -1.726H4.192v-3.083a0.863 0.863 0 0 0 -0.863 -0.863Zm12.452 -2.588a0.863 0.863 0 1 1 -1.726 0V4.192h-3.328a0.863 0.863 0 0 1 0 -1.726h3.945c0.042 0 0.083 0.004 0.123 0.009a0.863 0.863 0 0 1 0.986 0.854v3.946Z" + fill="#CED4DA" + /> + </svg> + <% } else { %> + <svg + aria-label="Viewport" + width="12" + height="22" + viewBox="0 0 12 22" + fill="none" + xmlns="http://www.w3.org/2000/svg" + > + <path + fill-rule="evenodd" + clip-rule="evenodd" + d="M1.94595 0.00146484C0.87123 0.00146484 0 0.856193 0 1.91056V19.0924C0 20.1467 0.87123 21.0015 1.94595 21.0015H10.0541C11.1288 21.0015 12 20.1467 12 19.0924V1.91056C12 0.856194 11.1288 0.00146484 10.0541 0.00146484H1.94595ZM10.7027 2.54692H1.2973V17.8196H10.7027V2.54692ZM4.21622 1.1151C4.21622 1.02724 4.28882 0.95601 4.37838 0.95601H7.94595C8.03551 0.95601 8.10811 1.02724 8.10811 1.1151C8.10811 1.20296 8.03551 1.27419 7.94595 1.27419H4.37838C4.28882 1.27419 4.21622 1.20296 4.21622 1.1151ZM6.16216 20.3651C6.69952 20.3651 7.13514 19.9377 7.13514 19.4106C7.13514 18.8834 6.69952 18.456 6.16216 18.456C5.6248 18.456 5.18919 18.8834 5.18919 19.4106C5.18919 19.9377 5.6248 20.3651 6.16216 20.3651Z" + fill="#CED4DA" + /> + </svg> + <% } %> + <span + ><%= viewport.startsWith("CustomWidth") ? `${viewport.split("_")[1]} width` : viewport %> + <%= viewport === 'Automated Scan' ? '' : 'viewport' %></span +> + </div> + <div> + <svg + aria-label="Pages scanned" + width="17" + height="18" + viewBox="0 0 17 18" + fill="none" + xmlns="http://www.w3.org/2000/svg" + > + <g clip-path="url(#clip0_1630_1547)"> + <path + d="M14.0299 1.09229H2.97102C2.59546 1.09229 2.29102 1.39673 2.29102 1.77228V16.231C2.29102 16.6065 2.59546 16.911 2.97102 16.911H14.0299C14.4054 16.911 14.7099 16.6065 14.7099 16.231V1.77228C14.7099 1.39673 14.4054 1.09229 14.0299 1.09229Z" + stroke="#CED4DA" + stroke-width="1.7369" + /> + <path + d="M5.03369 4.92139H11.9663" + stroke="#CED4DA" + stroke-width="1.189" + stroke-linecap="round" + /> + <path + d="M5.03369 7.64136H11.9663" + stroke="#CED4DA" + stroke-width="1.189" + stroke-linecap="round" + /> + <path + d="M5.03369 10.3613H11.9663" + stroke="#CED4DA" + stroke-width="1.189" + stroke-linecap="round" + /> + <path + d="M5.03369 13.0813H11.9663" + stroke="#CED4DA" + stroke-width="1.189" + stroke-linecap="round" + /> + </g> + <defs> + <clipPath id="clip0_1630_1547"> + <rect width="17" height="17" fill="white" transform="translate(0 0.501465)" /> + </clipPath> + </defs> + </svg> + <span><%= totalPagesScanned %> pages</span> + </div> + <hr class="mt-3 mb-4" /> + <iframe + id="a11yBanner" + title="GovTech Accessibility Enabling Team information banner" + class="h-auto w-100" + src="https://govtechsg.github.io/purple-banner-embeds/" + onerror="$(this).replaceWith('<p>You need to be online to view this content.</p>');" + scrolling="no" + ></iframe> +</div> diff --git a/static/ejs/partials/components/topFive.ejs b/static/ejs/partials/components/topFive.ejs new file mode 100644 index 00000000..0a8ee10f --- /dev/null +++ b/static/ejs/partials/components/topFive.ejs @@ -0,0 +1,14 @@ +<div id="top-five-card" class="card h-100"> + <div class="card-body"> + <h2>Top 5 affected pages with the most must fix elements</h2> + <% topFiveMustFix.forEach((page, index) => { %> + <div class="d-flex justify-content-between"> + <a href="<%= page.url %>" target="_blank"><%= page.pageTitle %></a> + <span aria-label="<%= page.totalMustFix %> must fix items" class="fw-bold ms-2"><%= page.totalMustFix %></span> + </div> + <% if (index < topFiveMustFix.length - 1) { %> + <hr class="my-2"/> + <% } %> + <% }) %> + </div> +</div> diff --git a/static/ejs/partials/components/wcagCompliance.ejs b/static/ejs/partials/components/wcagCompliance.ejs new file mode 100644 index 00000000..d4e6ba01 --- /dev/null +++ b/static/ejs/partials/components/wcagCompliance.ejs @@ -0,0 +1,124 @@ +<% wcagLinks = { 'WCAG 1.1.1': 'https://www.w3.org/TR/WCAG21/#non-text-content', 'WCAG 1.2.2': +'https://www.w3.org/TR/WCAG21/#captions-prerecorded', 'WCAG 1.3.1': +'https://www.w3.org/TR/WCAG21/#info-and-relationships', 'WCAG 1.3.5': +'https://www.w3.org/TR/WCAG21/#use-of-color', 'WCAG 1.4.2': +'https://www.w3.org/TR/WCAG21/#audio-control', 'WCAG 1.4.3': +'https://www.w3.org/TR/WCAG21/#contrast-minimum', 'WCAG 1.4.4': +'https://www.w3.org/TR/WCAG21/#resize-text', 'WCAG 1.4.12': +'https://www.w3.org/TR/WCAG21/#text-spacing', 'WCAG 2.1.1': +'https://www.w3.org/TR/WCAG21/#pause-stop-hide', 'WCAG 2.4.1': +'https://www.w3.org/TR/WCAG21/#bypass-blocks', 'WCAG 2.4.2': +'https://www.w3.org/TR/WCAG21/#page-titled', 'WCAG 2.4.4': +'https://www.w3.org/TR/WCAG21/#link-purpose-in-context', 'WCAG 3.1.1': +'https://www.w3.org/TR/WCAG21/#language-of-page', 'WCAG 3.1.2': +'https://www.w3.org/TR/WCAG21/#labels-or-instructions', 'WCAG 4.1.1': +'https://www.w3.org/TR/WCAG21/#parsing', 'WCAG 4.1.2': +'https://www.w3.org/TR/WCAG21/#name-role-value', }; wcagPassPercentage = +parseFloat((Object.keys(wcagLinks).length - wcagViolations.length) / Object.keys(wcagLinks).length * +100).toFixed(2); %> + +<div id="wcag-compliance-card" class="card h-100 p-3"> + <h2 class="mb-0">WCAG Compliance</h2> + <div class="wcag-compliance-passes-panel"> + <div class="d-flex justify-content-between align-items-center"> + <div class="d-flex align-items-center"> + <span class="fw-bold">Automated: WCAG (A & AA) Passes</span> + <button + aria-label="More on automated testing WCAG coverage" + id="wcagModalToggle" + class="ms-2" + data-bs-toggle="modal" + data-bs-target="#wcagModal" + > + <svg + width="14" + height="14" + viewBox="0 0 14 14" + fill="none" + xmlns="http://www.w3.org/2000/svg" + > + <path + d="M11.9528 2.05329C9.22079 -0.68205 4.78867 -0.68477 2.0533 2.04718C-0.682042 4.7792 -0.684795 9.21135 2.04722 11.9467C4.77917 14.6821 9.21135 14.6848 11.9467 11.9528C14.682 9.22085 14.6848 4.78863 11.9528 2.05329ZM7.00216 11.2406C6.6319 11.2406 6.33174 10.9405 6.33174 10.5702C6.33174 10.1999 6.63187 9.89976 7.00216 9.89976C7.37243 9.89976 7.67259 10.1999 7.67259 10.5702C7.67255 10.9405 7.37243 11.2406 7.00216 11.2406ZM8.09214 7.20401C7.70918 7.42788 7.67645 7.7033 7.6748 8.49691C7.6747 8.54938 7.67453 8.60233 7.67423 8.65558C7.67185 9.03068 7.36712 9.33312 6.99253 9.33312C6.99105 9.33312 6.98957 9.33312 6.98813 9.33312C6.61159 9.33074 6.3083 9.02356 6.31066 8.64699C6.31099 8.59568 6.31109 8.54468 6.31119 8.49415C6.31287 7.67852 6.31492 6.66352 7.40395 6.02694C8.27777 5.51613 8.3879 5.18059 8.28543 4.74029C8.16503 4.2231 7.69273 4.08907 7.32418 4.1312C7.20042 4.14541 6.58322 4.24724 6.58322 4.85783C6.58322 5.23431 6.27795 5.5396 5.90141 5.5396C5.52487 5.5396 5.21964 5.23431 5.21964 4.85783C5.21964 3.76416 6.02107 2.90831 7.16859 2.77656C8.35043 2.64099 9.35515 3.32135 9.61338 4.4312C9.99939 6.08915 8.61379 6.89911 8.09214 7.20401Z" + fill="#B5C5CA" + /> + </svg> + </button> + </div> + <span class="ms-2"><%= wcagPassPercentage %>%</span> + </div> + <div class="wcag-compliance-passes-bar"> + <div + class="wcag-compliance-passes-bar-progress" + style="width: <%= wcagPassPercentage %>%" + ></div> + </div> + </div> + <p> + Only a subset of + <a + href="https://www.w3.org/WAI/WCAG21/quickref/?currentsidebar=%23col_customize&versions=2.1&levels=aaa" + target="_blank" + >WCAG 2.1</a + > + (Conformance Level A & AA) Success Criteria can be automatically checked so + <a href="#" target="_blank">manual testing</a> + is still required. + </p> +</div> +<div + id="wcagModal" + class="modal fade" + tabindex="-1" + aria-labelledby="wcagModalLabel" + aria-hidden="true" +> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <h3 class="modal-title fw-bold" id="wcagModalLabel">Automated Testing WCAG Coverage</h3> + <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> + </div> + <div class="modal-body"> + <div> + Only 16 WCAG 2.1 Success Criteria can be checked reasonably through automated testing: + </div> + <div class="accordion my-3" id="wcagLinksAccordion"> + <div class="accordion-item"> + <div class="accordion-header" id="wcagLinksAccordionTitle"> + <button + class="accordion-button collapsed" + type="button" + data-bs-toggle="collapse" + data-bs-target="#wcagLinksAccordionContent" + aria-expanded="false" + aria-controls="wcagLinksAccordionContent" + > + 16 WCAG Success Criteria (A & AA) + </button> + </div> + <div + id="wcagLinksAccordionContent" + class="accordion-collapse collapse" + aria-labelledby="wcagLinksAccordionTitle" + data-bs-parent="#accordionExample" + > + <div class="accordion-body"> + <ul id="wcagLinksList"> + <% Object.entries(wcagLinks).forEach(link => { %> + <li> + <a href="<%= link[1] %>" target="_blank"><%= link[0] %></a> + </li> + <% }) %> + </ul> + </div> + </div> + </div> + </div> + <div> + <strong>Manual testing is still recommended</strong> as they involve subjective judgements + and human interpretation, which cannot be fully automated. + </div> + </div> + </div> + </div> +</div> diff --git a/static/ejs/partials/footer.ejs b/static/ejs/partials/footer.ejs new file mode 100644 index 00000000..491aebb3 --- /dev/null +++ b/static/ejs/partials/footer.ejs @@ -0,0 +1,14 @@ +<div id="footer" class="card"> + <div class="row mx-0"> + <div class="col-sm-6 text-sm-start"> + <a href="mailto:enquiries_HATS@tech.gov.sg">Help us improve</a> + <hr class="d-sm-none" /> + </div> + <div class="col-sm-6 text-sm-end"> + Created by + <a href="https://go.gov.sg/accessibility" target="_blank" + >GovTech Accessibility Enabling Team</a + > + </div> + </div> +</div> diff --git a/static/ejs/partials/header.ejs b/static/ejs/partials/header.ejs new file mode 100644 index 00000000..3e02a212 --- /dev/null +++ b/static/ejs/partials/header.ejs @@ -0,0 +1,37 @@ +<div id="header"> + <div class="z-2 card flex-row justify-content-between px-3 py-4"> + <div class="d-flex align-items-center"> + <svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg"> + <circle cx="24" cy="24" r="24" fill="#785EF0"/> + <path d="M16.2528 24.9725V23.832C16.2528 21.5526 14.4057 19.7056 12.1264 19.7056C9.84708 19.7056 8 21.5526 8 23.832V27.0721C8 29.2906 9.74991 31.0986 11.9448 31.1939V29.2806C11.9448 26.905 13.8772 24.9725 16.2528 24.9725Z" fill="white"/> + <path d="M12.308 29.28V31.1979H16.2528V25.3352C14.0779 25.3352 12.308 27.1051 12.308 29.28Z" fill="white"/> + <path d="M22.8201 25.3289H18.6937V31.1997H22.8201V25.3289Z" fill="white"/> + <path d="M22.8201 17.6016C20.5408 17.6016 18.6937 19.4486 18.6937 21.728V24.9672H22.8201V17.6016Z" fill="white"/> + <path d="M29.3876 17.6016C27.1082 17.6016 25.2612 19.4486 25.2612 21.728V24.9672H29.3876V17.6016Z" fill="white"/> + <path d="M29.3876 25.3289H25.2612V31.1997H29.3876V25.3289Z" fill="white"/> + <path d="M36.3182 31.199C38.5976 31.199 40.4446 29.3519 40.4446 27.0726V25.3281H36.3182V31.199Z" fill="white"/> + <path d="M40.4446 19.7056C38.1653 19.7056 36.3182 21.5526 36.3182 23.832V24.9644H40.4446V19.7056Z" fill="white"/> + <path d="M35.955 23.832C35.955 21.5526 34.1079 19.7056 31.8286 19.7056V22.844C31.8286 23.6195 32.0429 24.3441 32.4143 24.9644H35.955V23.832Z" fill="white"/> + <path d="M35.955 26.9709V25.3281H32.6595C33.4123 26.3261 34.6083 26.9709 35.955 26.9709Z" fill="white"/> + </svg> + + <h1 class="d-inline mb-0 ms-3">Accessibility Site Report</h1> + </div> + <%# <div class="toggleWrapper"> + <input tabindex="0" type="checkbox" class="dm" id="dm" /> + <label for="dm" class="toggle"> + <span class="toggle__handler"> + <span class="crater crater--1"></span> + <span class="crater crater--2"></span> + <span class="crater crater--3"></span> + </span> + <span class="star star--1"></span> + <span class="star star--2"></span> + <span class="star star--3"></span> + <span class="star star--4"></span> + <span class="star star--5"></span> + <span class="star star--6"></span> + </label> + </div> %> + </div> +</div> diff --git a/static/ejs/partials/main.ejs b/static/ejs/partials/main.ejs new file mode 100644 index 00000000..dba4f180 --- /dev/null +++ b/static/ejs/partials/main.ejs @@ -0,0 +1,22 @@ +<div class="d-flex flex-grow-1 align-items-stretch"> + <%- include("components/scanAbout") %> + <div class="d-flex flex-column flex-grow-1"> + <div class="row m-0 py-4 px-3"> + <div class="col-md-6 pe-md-2"><%- include("components/wcagCompliance") %></div> + <div class="col-md-6 ps-md-2 mt-3 mt-md-0"><%- include("components/topFive") %></div> + </div> + <hr class="my-2 mx-3" /> + <div class="row m-0 pt-4 px-2"> + <% Object.keys(items).forEach((category) => { %> + <div class="col-md-4 px-2"> + <%- include("components/categorySelector", { category: category }) %> + </div> + <% }) %> + </div> + <div id="categorySummary" class="px-3 py-4 mb-3 flex-grow-1"> + <%# dynamically generated section from scripts/categorySummary %> + </div> + <%- include("components/ruleOffcanvas") %> + <%- include("footer") %> + </div> +</div> diff --git a/static/ejs/partials/scripts/bootstrap.ejs b/static/ejs/partials/scripts/bootstrap.ejs new file mode 100644 index 00000000..39b7f6d0 --- /dev/null +++ b/static/ejs/partials/scripts/bootstrap.ejs @@ -0,0 +1,8 @@ +<script> + /*! + * Bootstrap v5.3.0-alpha3 (https://getbootstrap.com/) + * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap=e()}(this,(function(){"use strict";const t=new Map,e={set(e,i,n){t.has(e)||t.set(e,new Map);const s=t.get(e);s.has(i)||0===s.size?s.set(i,n):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(s.keys())[0]}.`)},get:(e,i)=>t.has(e)&&t.get(e).get(i)||null,remove(e,i){if(!t.has(e))return;const n=t.get(e);n.delete(i),0===n.size&&t.delete(e)}},i="transitionend",n=t=>(t&&window.CSS&&window.CSS.escape&&(t=t.replace(/#([^\s"#']+)/g,((t,e)=>`#${CSS.escape(e)}`))),t),s=t=>{t.dispatchEvent(new Event(i))},o=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),r=t=>o(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(n(t)):null,a=t=>{if(!o(t)||0===t.getClientRects().length)return!1;const e="visible"===getComputedStyle(t).getPropertyValue("visibility"),i=t.closest("details:not([open])");if(!i)return e;if(i!==t){const e=t.closest("summary");if(e&&e.parentNode!==i)return!1;if(null===e)return!1}return e},l=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),c=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?c(t.parentNode):null},h=()=>{},d=t=>{t.offsetHeight},u=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,f=[],p=()=>"rtl"===document.documentElement.dir,m=t=>{var e;e=()=>{const e=u();if(e){const i=t.NAME,n=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=n,t.jQueryInterface)}},"loading"===document.readyState?(f.length||document.addEventListener("DOMContentLoaded",(()=>{for(const t of f)t()})),f.push(e)):e()},g=(t,e=[],i=t)=>"function"==typeof t?t(...e):i,_=(t,e,n=!0)=>{if(!n)return void g(t);const o=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const n=Number.parseFloat(e),s=Number.parseFloat(i);return n||s?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(e)+5;let r=!1;const a=({target:n})=>{n===e&&(r=!0,e.removeEventListener(i,a),g(t))};e.addEventListener(i,a),setTimeout((()=>{r||s(e)}),o)},b=(t,e,i,n)=>{const s=t.length;let o=t.indexOf(e);return-1===o?!i&&n?t[s-1]:t[0]:(o+=i?1:-1,n&&(o=(o+s)%s),t[Math.max(0,Math.min(o,s-1))])},v=/[^.]*(?=\..*)\.|.*/,y=/\..*/,w=/::\d+$/,A={};let E=1;const T={mouseenter:"mouseover",mouseleave:"mouseout"},C=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function O(t,e){return e&&`${e}::${E++}`||t.uidEvent||E++}function x(t){const e=O(t);return t.uidEvent=e,A[e]=A[e]||{},A[e]}function k(t,e,i=null){return Object.values(t).find((t=>t.callable===e&&t.delegationSelector===i))}function L(t,e,i){const n="string"==typeof e,s=n?i:e||i;let o=N(t);return C.has(o)||(o=t),[n,s,o]}function S(t,e,i,n,s){if("string"!=typeof e||!t)return;let[o,r,a]=L(e,i,n);if(e in T){const t=t=>function(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};r=t(r)}const l=x(t),c=l[a]||(l[a]={}),h=k(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&s);const d=O(r,e.replace(v,"")),u=o?function(t,e,i){return function n(s){const o=t.querySelectorAll(e);for(let{target:r}=s;r&&r!==this;r=r.parentNode)for(const a of o)if(a===r)return j(s,{delegateTarget:r}),n.oneOff&&P.off(t,s.type,e,i),i.apply(r,[s])}}(t,i,r):function(t,e){return function i(n){return j(n,{delegateTarget:t}),i.oneOff&&P.off(t,n.type,e),e.apply(t,[n])}}(t,r);u.delegationSelector=o?i:null,u.callable=r,u.oneOff=s,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function D(t,e,i,n,s){const o=k(e[i],n,s);o&&(t.removeEventListener(i,o,Boolean(s)),delete e[i][o.uidEvent])}function I(t,e,i,n){const s=e[i]||{};for(const[o,r]of Object.entries(s))o.includes(n)&&D(t,e,i,r.callable,r.delegationSelector)}function N(t){return t=t.replace(y,""),T[t]||t}const P={on(t,e,i,n){S(t,e,i,n,!1)},one(t,e,i,n){S(t,e,i,n,!0)},off(t,e,i,n){if("string"!=typeof e||!t)return;const[s,o,r]=L(e,i,n),a=r!==e,l=x(t),c=l[r]||{},h=e.startsWith(".");if(void 0===o){if(h)for(const i of Object.keys(l))I(t,l,i,e.slice(1));for(const[i,n]of Object.entries(c)){const s=i.replace(w,"");a&&!e.includes(s)||D(t,l,r,n.callable,n.delegationSelector)}}else{if(!Object.keys(c).length)return;D(t,l,r,o,s?i:null)}},trigger(t,e,i){if("string"!=typeof e||!t)return null;const n=u();let s=null,o=!0,r=!0,a=!1;e!==N(e)&&n&&(s=n.Event(e,i),n(t).trigger(s),o=!s.isPropagationStopped(),r=!s.isImmediatePropagationStopped(),a=s.isDefaultPrevented());const l=j(new Event(e,{bubbles:o,cancelable:!0}),i);return a&&l.preventDefault(),r&&t.dispatchEvent(l),l.defaultPrevented&&s&&s.preventDefault(),l}};function j(t,e={}){for(const[i,n]of Object.entries(e))try{t[i]=n}catch(e){Object.defineProperty(t,i,{configurable:!0,get:()=>n})}return t}function M(t){if("true"===t)return!0;if("false"===t)return!1;if(t===Number(t).toString())return Number(t);if(""===t||"null"===t)return null;if("string"!=typeof t)return t;try{return JSON.parse(decodeURIComponent(t))}catch(e){return t}}function F(t){return t.replace(/[A-Z]/g,(t=>`-${t.toLowerCase()}`))}const H={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${F(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${F(e)}`)},getDataAttributes(t){if(!t)return{};const e={},i=Object.keys(t.dataset).filter((t=>t.startsWith("bs")&&!t.startsWith("bsConfig")));for(const n of i){let i=n.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1,i.length),e[i]=M(t.dataset[n])}return e},getDataAttribute:(t,e)=>M(t.getAttribute(`data-bs-${F(e)}`))};class ${static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(t){return t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t}_mergeConfigObj(t,e){const i=o(e)?H.getDataAttribute(e,"config"):{};return{...this.constructor.Default,..."object"==typeof i?i:{},...o(e)?H.getDataAttributes(e):{},..."object"==typeof t?t:{}}}_typeCheckConfig(t,e=this.constructor.DefaultType){for(const[n,s]of Object.entries(e)){const e=t[n],r=o(e)?"element":null==(i=e)?`${i}`:Object.prototype.toString.call(i).match(/\s([a-z]+)/i)[1].toLowerCase();if(!new RegExp(s).test(r))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${n}" provided type "${r}" but expected type "${s}".`)}var i}}class W extends ${constructor(t,i){super(),(t=r(t))&&(this._element=t,this._config=this._getConfig(i),e.set(this._element,this.constructor.DATA_KEY,this))}dispose(){e.remove(this._element,this.constructor.DATA_KEY),P.off(this._element,this.constructor.EVENT_KEY);for(const t of Object.getOwnPropertyNames(this))this[t]=null}_queueCallback(t,e,i=!0){_(t,e,i)}_getConfig(t){return t=this._mergeConfigObj(t,this._element),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}static getInstance(t){return e.get(r(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.3.0-alpha2"}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(t){return`${t}${this.EVENT_KEY}`}}const B=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`),e=i&&"#"!==i?i.trim():null}return n(e)},z={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter((t=>t.matches(e))),parents(t,e){const i=[];let n=t.parentNode.closest(e);for(;n;)i.push(n),n=n.parentNode.closest(e);return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map((t=>`${t}:not([tabindex^="-"])`)).join(",");return this.find(e,t).filter((t=>!l(t)&&a(t)))},getSelectorFromElement(t){const e=B(t);return e&&z.findOne(e)?e:null},getElementFromSelector(t){const e=B(t);return e?z.findOne(e):null},getMultipleElementsFromSelector(t){const e=B(t);return e?z.find(e):[]}},R=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,n=t.NAME;P.on(document,i,`[data-bs-dismiss="${n}"]`,(function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),l(this))return;const s=z.getElementFromSelector(this)||this.closest(`.${n}`);t.getOrCreateInstance(s)[e]()}))};class q extends W{static get NAME(){return"alert"}close(){if(P.trigger(this._element,"close.bs.alert").defaultPrevented)return;this._element.classList.remove("show");const t=this._element.classList.contains("fade");this._queueCallback((()=>this._destroyElement()),this._element,t)}_destroyElement(){this._element.remove(),P.trigger(this._element,"closed.bs.alert"),this.dispose()}static jQueryInterface(t){return this.each((function(){const e=q.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}R(q,"close"),m(q);const V='[data-bs-toggle="button"]';class K extends W{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){const e=K.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}P.on(document,"click.bs.button.data-api",V,(t=>{t.preventDefault();const e=t.target.closest(V);K.getOrCreateInstance(e).toggle()})),m(K);const Q={endCallback:null,leftCallback:null,rightCallback:null},X={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class Y extends ${constructor(t,e){super(),this._element=t,t&&Y.isSupported()&&(this._config=this._getConfig(e),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents())}static get Default(){return Q}static get DefaultType(){return X}static get NAME(){return"swipe"}dispose(){P.off(this._element,".bs.swipe")}_start(t){this._supportPointerEvents?this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX):this._deltaX=t.touches[0].clientX}_end(t){this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX-this._deltaX),this._handleSwipe(),g(this._config.endCallback)}_move(t){this._deltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this._deltaX}_handleSwipe(){const t=Math.abs(this._deltaX);if(t<=40)return;const e=t/this._deltaX;this._deltaX=0,e&&g(e>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(P.on(this._element,"pointerdown.bs.swipe",(t=>this._start(t))),P.on(this._element,"pointerup.bs.swipe",(t=>this._end(t))),this._element.classList.add("pointer-event")):(P.on(this._element,"touchstart.bs.swipe",(t=>this._start(t))),P.on(this._element,"touchmove.bs.swipe",(t=>this._move(t))),P.on(this._element,"touchend.bs.swipe",(t=>this._end(t))))}_eventIsPointerPenTouch(t){return this._supportPointerEvents&&("pen"===t.pointerType||"touch"===t.pointerType)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}const U="next",G="prev",J="left",Z="right",tt="slid.bs.carousel",et="carousel",it="active",nt={ArrowLeft:Z,ArrowRight:J},st={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},ot={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class rt extends W{constructor(t,e){super(t,e),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=z.findOne(".carousel-indicators",this._element),this._addEventListeners(),this._config.ride===et&&this.cycle()}static get Default(){return st}static get DefaultType(){return ot}static get NAME(){return"carousel"}next(){this._slide(U)}nextWhenVisible(){!document.hidden&&a(this._element)&&this.next()}prev(){this._slide(G)}pause(){this._isSliding&&s(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval((()=>this.nextWhenVisible()),this._config.interval)}_maybeEnableCycle(){this._config.ride&&(this._isSliding?P.one(this._element,tt,(()=>this.cycle())):this.cycle())}to(t){const e=this._getItems();if(t>e.length-1||t<0)return;if(this._isSliding)return void P.one(this._element,tt,(()=>this.to(t)));const i=this._getItemIndex(this._getActive());if(i===t)return;const n=t>i?U:G;this._slide(n,e[t])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(t){return t.defaultInterval=t.interval,t}_addEventListeners(){this._config.keyboard&&P.on(this._element,"keydown.bs.carousel",(t=>this._keydown(t))),"hover"===this._config.pause&&(P.on(this._element,"mouseenter.bs.carousel",(()=>this.pause())),P.on(this._element,"mouseleave.bs.carousel",(()=>this._maybeEnableCycle()))),this._config.touch&&Y.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const t of z.find(".carousel-item img",this._element))P.on(t,"dragstart.bs.carousel",(t=>t.preventDefault()));const t={leftCallback:()=>this._slide(this._directionToOrder(J)),rightCallback:()=>this._slide(this._directionToOrder(Z)),endCallback:()=>{"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout((()=>this._maybeEnableCycle()),500+this._config.interval))}};this._swipeHelper=new Y(this._element,t)}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=nt[t.key];e&&(t.preventDefault(),this._slide(this._directionToOrder(e)))}_getItemIndex(t){return this._getItems().indexOf(t)}_setActiveIndicatorElement(t){if(!this._indicatorsElement)return;const e=z.findOne(".active",this._indicatorsElement);e.classList.remove(it),e.removeAttribute("aria-current");const i=z.findOne(`[data-bs-slide-to="${t}"]`,this._indicatorsElement);i&&(i.classList.add(it),i.setAttribute("aria-current","true"))}_updateInterval(){const t=this._activeElement||this._getActive();if(!t)return;const e=Number.parseInt(t.getAttribute("data-bs-interval"),10);this._config.interval=e||this._config.defaultInterval}_slide(t,e=null){if(this._isSliding)return;const i=this._getActive(),n=t===U,s=e||b(this._getItems(),i,n,this._config.wrap);if(s===i)return;const o=this._getItemIndex(s),r=e=>P.trigger(this._element,e,{relatedTarget:s,direction:this._orderToDirection(t),from:this._getItemIndex(i),to:o});if(r("slide.bs.carousel").defaultPrevented)return;if(!i||!s)return;const a=Boolean(this._interval);this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(o),this._activeElement=s;const l=n?"carousel-item-start":"carousel-item-end",c=n?"carousel-item-next":"carousel-item-prev";s.classList.add(c),d(s),i.classList.add(l),s.classList.add(l),this._queueCallback((()=>{s.classList.remove(l,c),s.classList.add(it),i.classList.remove(it,c,l),this._isSliding=!1,r(tt)}),i,this._isAnimated()),a&&this.cycle()}_isAnimated(){return this._element.classList.contains("slide")}_getActive(){return z.findOne(".active.carousel-item",this._element)}_getItems(){return z.find(".carousel-item",this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(t){return p()?t===J?G:U:t===J?U:G}_orderToDirection(t){return p()?t===G?J:Z:t===G?Z:J}static jQueryInterface(t){return this.each((function(){const e=rt.getOrCreateInstance(this,t);if("number"!=typeof t){if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}else e.to(t)}))}}P.on(document,"click.bs.carousel.data-api","[data-bs-slide], [data-bs-slide-to]",(function(t){const e=z.getElementFromSelector(this);if(!e||!e.classList.contains(et))return;t.preventDefault();const i=rt.getOrCreateInstance(e),n=this.getAttribute("data-bs-slide-to");return n?(i.to(n),void i._maybeEnableCycle()):"next"===H.getDataAttribute(this,"slide")?(i.next(),void i._maybeEnableCycle()):(i.prev(),void i._maybeEnableCycle())})),P.on(window,"load.bs.carousel.data-api",(()=>{const t=z.find('[data-bs-ride="carousel"]');for(const e of t)rt.getOrCreateInstance(e)})),m(rt);const at="show",lt="collapse",ct="collapsing",ht='[data-bs-toggle="collapse"]',dt={parent:null,toggle:!0},ut={parent:"(null|element)",toggle:"boolean"};class ft extends W{constructor(t,e){super(t,e),this._isTransitioning=!1,this._triggerArray=[];const i=z.find(ht);for(const t of i){const e=z.getSelectorFromElement(t),i=z.find(e).filter((t=>t===this._element));null!==e&&i.length&&this._triggerArray.push(t)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return dt}static get DefaultType(){return ut}static get NAME(){return"collapse"}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t=[];if(this._config.parent&&(t=this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter((t=>t!==this._element)).map((t=>ft.getOrCreateInstance(t,{toggle:!1})))),t.length&&t[0]._isTransitioning)return;if(P.trigger(this._element,"show.bs.collapse").defaultPrevented)return;for(const e of t)e.hide();const e=this._getDimension();this._element.classList.remove(lt),this._element.classList.add(ct),this._element.style[e]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const i=`scroll${e[0].toUpperCase()+e.slice(1)}`;this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(ct),this._element.classList.add(lt,at),this._element.style[e]="",P.trigger(this._element,"shown.bs.collapse")}),this._element,!0),this._element.style[e]=`${this._element[i]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(P.trigger(this._element,"hide.bs.collapse").defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,d(this._element),this._element.classList.add(ct),this._element.classList.remove(lt,at);for(const t of this._triggerArray){const e=z.getElementFromSelector(t);e&&!this._isShown(e)&&this._addAriaAndCollapsedClass([t],!1)}this._isTransitioning=!0,this._element.style[t]="",this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(ct),this._element.classList.add(lt),P.trigger(this._element,"hidden.bs.collapse")}),this._element,!0)}_isShown(t=this._element){return t.classList.contains(at)}_configAfterMerge(t){return t.toggle=Boolean(t.toggle),t.parent=r(t.parent),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=this._getFirstLevelChildren(ht);for(const e of t){const t=z.getElementFromSelector(e);t&&this._addAriaAndCollapsedClass([e],this._isShown(t))}}_getFirstLevelChildren(t){const e=z.find(":scope .collapse .collapse",this._config.parent);return z.find(t,this._config.parent).filter((t=>!e.includes(t)))}_addAriaAndCollapsedClass(t,e){if(t.length)for(const i of t)i.classList.toggle("collapsed",!e),i.setAttribute("aria-expanded",e)}static jQueryInterface(t){const e={};return"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1),this.each((function(){const i=ft.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}}))}}P.on(document,"click.bs.collapse.data-api",ht,(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();for(const t of z.getMultipleElementsFromSelector(this))ft.getOrCreateInstance(t,{toggle:!1}).toggle()})),m(ft);var pt="top",mt="bottom",gt="right",_t="left",bt="auto",vt=[pt,mt,gt,_t],yt="start",wt="end",At="clippingParents",Et="viewport",Tt="popper",Ct="reference",Ot=vt.reduce((function(t,e){return t.concat([e+"-"+yt,e+"-"+wt])}),[]),xt=[].concat(vt,[bt]).reduce((function(t,e){return t.concat([e,e+"-"+yt,e+"-"+wt])}),[]),kt="beforeRead",Lt="read",St="afterRead",Dt="beforeMain",It="main",Nt="afterMain",Pt="beforeWrite",jt="write",Mt="afterWrite",Ft=[kt,Lt,St,Dt,It,Nt,Pt,jt,Mt];function Ht(t){return t?(t.nodeName||"").toLowerCase():null}function $t(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function Wt(t){return t instanceof $t(t).Element||t instanceof Element}function Bt(t){return t instanceof $t(t).HTMLElement||t instanceof HTMLElement}function zt(t){return"undefined"!=typeof ShadowRoot&&(t instanceof $t(t).ShadowRoot||t instanceof ShadowRoot)}const Rt={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach((function(t){var i=e.styles[t]||{},n=e.attributes[t]||{},s=e.elements[t];Bt(s)&&Ht(s)&&(Object.assign(s.style,i),Object.keys(n).forEach((function(t){var e=n[t];!1===e?s.removeAttribute(t):s.setAttribute(t,!0===e?"":e)})))}))},effect:function(t){var e=t.state,i={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,i.popper),e.styles=i,e.elements.arrow&&Object.assign(e.elements.arrow.style,i.arrow),function(){Object.keys(e.elements).forEach((function(t){var n=e.elements[t],s=e.attributes[t]||{},o=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:i[t]).reduce((function(t,e){return t[e]="",t}),{});Bt(n)&&Ht(n)&&(Object.assign(n.style,o),Object.keys(s).forEach((function(t){n.removeAttribute(t)})))}))}},requires:["computeStyles"]};function qt(t){return t.split("-")[0]}var Vt=Math.max,Kt=Math.min,Qt=Math.round;function Xt(){var t=navigator.userAgentData;return null!=t&&t.brands&&Array.isArray(t.brands)?t.brands.map((function(t){return t.brand+"/"+t.version})).join(" "):navigator.userAgent}function Yt(){return!/^((?!chrome|android).)*safari/i.test(Xt())}function Ut(t,e,i){void 0===e&&(e=!1),void 0===i&&(i=!1);var n=t.getBoundingClientRect(),s=1,o=1;e&&Bt(t)&&(s=t.offsetWidth>0&&Qt(n.width)/t.offsetWidth||1,o=t.offsetHeight>0&&Qt(n.height)/t.offsetHeight||1);var r=(Wt(t)?$t(t):window).visualViewport,a=!Yt()&&i,l=(n.left+(a&&r?r.offsetLeft:0))/s,c=(n.top+(a&&r?r.offsetTop:0))/o,h=n.width/s,d=n.height/o;return{width:h,height:d,top:c,right:l+h,bottom:c+d,left:l,x:l,y:c}}function Gt(t){var e=Ut(t),i=t.offsetWidth,n=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-n)<=1&&(n=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:n}}function Jt(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&zt(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function Zt(t){return $t(t).getComputedStyle(t)}function te(t){return["table","td","th"].indexOf(Ht(t))>=0}function ee(t){return((Wt(t)?t.ownerDocument:t.document)||window.document).documentElement}function ie(t){return"html"===Ht(t)?t:t.assignedSlot||t.parentNode||(zt(t)?t.host:null)||ee(t)}function ne(t){return Bt(t)&&"fixed"!==Zt(t).position?t.offsetParent:null}function se(t){for(var e=$t(t),i=ne(t);i&&te(i)&&"static"===Zt(i).position;)i=ne(i);return i&&("html"===Ht(i)||"body"===Ht(i)&&"static"===Zt(i).position)?e:i||function(t){var e=/firefox/i.test(Xt());if(/Trident/i.test(Xt())&&Bt(t)&&"fixed"===Zt(t).position)return null;var i=ie(t);for(zt(i)&&(i=i.host);Bt(i)&&["html","body"].indexOf(Ht(i))<0;){var n=Zt(i);if("none"!==n.transform||"none"!==n.perspective||"paint"===n.contain||-1!==["transform","perspective"].indexOf(n.willChange)||e&&"filter"===n.willChange||e&&n.filter&&"none"!==n.filter)return i;i=i.parentNode}return null}(t)||e}function oe(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function re(t,e,i){return Vt(t,Kt(e,i))}function ae(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function le(t,e){return e.reduce((function(e,i){return e[i]=t,e}),{})}const ce={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,i=t.state,n=t.name,s=t.options,o=i.elements.arrow,r=i.modifiersData.popperOffsets,a=qt(i.placement),l=oe(a),c=[_t,gt].indexOf(a)>=0?"height":"width";if(o&&r){var h=function(t,e){return ae("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:le(t,vt))}(s.padding,i),d=Gt(o),u="y"===l?pt:_t,f="y"===l?mt:gt,p=i.rects.reference[c]+i.rects.reference[l]-r[l]-i.rects.popper[c],m=r[l]-i.rects.reference[l],g=se(o),_=g?"y"===l?g.clientHeight||0:g.clientWidth||0:0,b=p/2-m/2,v=h[u],y=_-d[c]-h[f],w=_/2-d[c]/2+b,A=re(v,w,y),E=l;i.modifiersData[n]=((e={})[E]=A,e.centerOffset=A-w,e)}},effect:function(t){var e=t.state,i=t.options.element,n=void 0===i?"[data-popper-arrow]":i;null!=n&&("string"!=typeof n||(n=e.elements.popper.querySelector(n)))&&Jt(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function he(t){return t.split("-")[1]}var de={top:"auto",right:"auto",bottom:"auto",left:"auto"};function ue(t){var e,i=t.popper,n=t.popperRect,s=t.placement,o=t.variation,r=t.offsets,a=t.position,l=t.gpuAcceleration,c=t.adaptive,h=t.roundOffsets,d=t.isFixed,u=r.x,f=void 0===u?0:u,p=r.y,m=void 0===p?0:p,g="function"==typeof h?h({x:f,y:m}):{x:f,y:m};f=g.x,m=g.y;var _=r.hasOwnProperty("x"),b=r.hasOwnProperty("y"),v=_t,y=pt,w=window;if(c){var A=se(i),E="clientHeight",T="clientWidth";A===$t(i)&&"static"!==Zt(A=ee(i)).position&&"absolute"===a&&(E="scrollHeight",T="scrollWidth"),(s===pt||(s===_t||s===gt)&&o===wt)&&(y=mt,m-=(d&&A===w&&w.visualViewport?w.visualViewport.height:A[E])-n.height,m*=l?1:-1),s!==_t&&(s!==pt&&s!==mt||o!==wt)||(v=gt,f-=(d&&A===w&&w.visualViewport?w.visualViewport.width:A[T])-n.width,f*=l?1:-1)}var C,O=Object.assign({position:a},c&&de),x=!0===h?function(t,e){var i=t.x,n=t.y,s=e.devicePixelRatio||1;return{x:Qt(i*s)/s||0,y:Qt(n*s)/s||0}}({x:f,y:m},$t(i)):{x:f,y:m};return f=x.x,m=x.y,l?Object.assign({},O,((C={})[y]=b?"0":"",C[v]=_?"0":"",C.transform=(w.devicePixelRatio||1)<=1?"translate("+f+"px, "+m+"px)":"translate3d("+f+"px, "+m+"px, 0)",C)):Object.assign({},O,((e={})[y]=b?m+"px":"",e[v]=_?f+"px":"",e.transform="",e))}const fe={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,i=t.options,n=i.gpuAcceleration,s=void 0===n||n,o=i.adaptive,r=void 0===o||o,a=i.roundOffsets,l=void 0===a||a,c={placement:qt(e.placement),variation:he(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:s,isFixed:"fixed"===e.options.strategy};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,ue(Object.assign({},c,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:r,roundOffsets:l})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,ue(Object.assign({},c,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}};var pe={passive:!0};const me={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,i=t.instance,n=t.options,s=n.scroll,o=void 0===s||s,r=n.resize,a=void 0===r||r,l=$t(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach((function(t){t.addEventListener("scroll",i.update,pe)})),a&&l.addEventListener("resize",i.update,pe),function(){o&&c.forEach((function(t){t.removeEventListener("scroll",i.update,pe)})),a&&l.removeEventListener("resize",i.update,pe)}},data:{}};var ge={left:"right",right:"left",bottom:"top",top:"bottom"};function _e(t){return t.replace(/left|right|bottom|top/g,(function(t){return ge[t]}))}var be={start:"end",end:"start"};function ve(t){return t.replace(/start|end/g,(function(t){return be[t]}))}function ye(t){var e=$t(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function we(t){return Ut(ee(t)).left+ye(t).scrollLeft}function Ae(t){var e=Zt(t),i=e.overflow,n=e.overflowX,s=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+s+n)}function Ee(t){return["html","body","#document"].indexOf(Ht(t))>=0?t.ownerDocument.body:Bt(t)&&Ae(t)?t:Ee(ie(t))}function Te(t,e){var i;void 0===e&&(e=[]);var n=Ee(t),s=n===(null==(i=t.ownerDocument)?void 0:i.body),o=$t(n),r=s?[o].concat(o.visualViewport||[],Ae(n)?n:[]):n,a=e.concat(r);return s?a:a.concat(Te(ie(r)))}function Ce(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function Oe(t,e,i){return e===Et?Ce(function(t,e){var i=$t(t),n=ee(t),s=i.visualViewport,o=n.clientWidth,r=n.clientHeight,a=0,l=0;if(s){o=s.width,r=s.height;var c=Yt();(c||!c&&"fixed"===e)&&(a=s.offsetLeft,l=s.offsetTop)}return{width:o,height:r,x:a+we(t),y:l}}(t,i)):Wt(e)?function(t,e){var i=Ut(t,!1,"fixed"===e);return i.top=i.top+t.clientTop,i.left=i.left+t.clientLeft,i.bottom=i.top+t.clientHeight,i.right=i.left+t.clientWidth,i.width=t.clientWidth,i.height=t.clientHeight,i.x=i.left,i.y=i.top,i}(e,i):Ce(function(t){var e,i=ee(t),n=ye(t),s=null==(e=t.ownerDocument)?void 0:e.body,o=Vt(i.scrollWidth,i.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),r=Vt(i.scrollHeight,i.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),a=-n.scrollLeft+we(t),l=-n.scrollTop;return"rtl"===Zt(s||i).direction&&(a+=Vt(i.clientWidth,s?s.clientWidth:0)-o),{width:o,height:r,x:a,y:l}}(ee(t)))}function xe(t){var e,i=t.reference,n=t.element,s=t.placement,o=s?qt(s):null,r=s?he(s):null,a=i.x+i.width/2-n.width/2,l=i.y+i.height/2-n.height/2;switch(o){case pt:e={x:a,y:i.y-n.height};break;case mt:e={x:a,y:i.y+i.height};break;case gt:e={x:i.x+i.width,y:l};break;case _t:e={x:i.x-n.width,y:l};break;default:e={x:i.x,y:i.y}}var c=o?oe(o):null;if(null!=c){var h="y"===c?"height":"width";switch(r){case yt:e[c]=e[c]-(i[h]/2-n[h]/2);break;case wt:e[c]=e[c]+(i[h]/2-n[h]/2)}}return e}function ke(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=void 0===n?t.placement:n,o=i.strategy,r=void 0===o?t.strategy:o,a=i.boundary,l=void 0===a?At:a,c=i.rootBoundary,h=void 0===c?Et:c,d=i.elementContext,u=void 0===d?Tt:d,f=i.altBoundary,p=void 0!==f&&f,m=i.padding,g=void 0===m?0:m,_=ae("number"!=typeof g?g:le(g,vt)),b=u===Tt?Ct:Tt,v=t.rects.popper,y=t.elements[p?b:u],w=function(t,e,i,n){var s="clippingParents"===e?function(t){var e=Te(ie(t)),i=["absolute","fixed"].indexOf(Zt(t).position)>=0&&Bt(t)?se(t):t;return Wt(i)?e.filter((function(t){return Wt(t)&&Jt(t,i)&&"body"!==Ht(t)})):[]}(t):[].concat(e),o=[].concat(s,[i]),r=o[0],a=o.reduce((function(e,i){var s=Oe(t,i,n);return e.top=Vt(s.top,e.top),e.right=Kt(s.right,e.right),e.bottom=Kt(s.bottom,e.bottom),e.left=Vt(s.left,e.left),e}),Oe(t,r,n));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}(Wt(y)?y:y.contextElement||ee(t.elements.popper),l,h,r),A=Ut(t.elements.reference),E=xe({reference:A,element:v,strategy:"absolute",placement:s}),T=Ce(Object.assign({},v,E)),C=u===Tt?T:A,O={top:w.top-C.top+_.top,bottom:C.bottom-w.bottom+_.bottom,left:w.left-C.left+_.left,right:C.right-w.right+_.right},x=t.modifiersData.offset;if(u===Tt&&x){var k=x[s];Object.keys(O).forEach((function(t){var e=[gt,mt].indexOf(t)>=0?1:-1,i=[pt,mt].indexOf(t)>=0?"y":"x";O[t]+=k[i]*e}))}return O}function Le(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=i.boundary,o=i.rootBoundary,r=i.padding,a=i.flipVariations,l=i.allowedAutoPlacements,c=void 0===l?xt:l,h=he(n),d=h?a?Ot:Ot.filter((function(t){return he(t)===h})):vt,u=d.filter((function(t){return c.indexOf(t)>=0}));0===u.length&&(u=d);var f=u.reduce((function(e,i){return e[i]=ke(t,{placement:i,boundary:s,rootBoundary:o,padding:r})[qt(i)],e}),{});return Object.keys(f).sort((function(t,e){return f[t]-f[e]}))}const Se={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name;if(!e.modifiersData[n]._skip){for(var s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0===r||r,l=i.fallbackPlacements,c=i.padding,h=i.boundary,d=i.rootBoundary,u=i.altBoundary,f=i.flipVariations,p=void 0===f||f,m=i.allowedAutoPlacements,g=e.options.placement,_=qt(g),b=l||(_!==g&&p?function(t){if(qt(t)===bt)return[];var e=_e(t);return[ve(t),e,ve(e)]}(g):[_e(g)]),v=[g].concat(b).reduce((function(t,i){return t.concat(qt(i)===bt?Le(e,{placement:i,boundary:h,rootBoundary:d,padding:c,flipVariations:p,allowedAutoPlacements:m}):i)}),[]),y=e.rects.reference,w=e.rects.popper,A=new Map,E=!0,T=v[0],C=0;C<v.length;C++){var O=v[C],x=qt(O),k=he(O)===yt,L=[pt,mt].indexOf(x)>=0,S=L?"width":"height",D=ke(e,{placement:O,boundary:h,rootBoundary:d,altBoundary:u,padding:c}),I=L?k?gt:_t:k?mt:pt;y[S]>w[S]&&(I=_e(I));var N=_e(I),P=[];if(o&&P.push(D[x]<=0),a&&P.push(D[I]<=0,D[N]<=0),P.every((function(t){return t}))){T=O,E=!1;break}A.set(O,P)}if(E)for(var j=function(t){var e=v.find((function(e){var i=A.get(e);if(i)return i.slice(0,t).every((function(t){return t}))}));if(e)return T=e,"break"},M=p?3:1;M>0&&"break"!==j(M);M--);e.placement!==T&&(e.modifiersData[n]._skip=!0,e.placement=T,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function De(t,e,i){return void 0===i&&(i={x:0,y:0}),{top:t.top-e.height-i.y,right:t.right-e.width+i.x,bottom:t.bottom-e.height+i.y,left:t.left-e.width-i.x}}function Ie(t){return[pt,gt,mt,_t].some((function(e){return t[e]>=0}))}const Ne={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,i=t.name,n=e.rects.reference,s=e.rects.popper,o=e.modifiersData.preventOverflow,r=ke(e,{elementContext:"reference"}),a=ke(e,{altBoundary:!0}),l=De(r,n),c=De(a,s,o),h=Ie(l),d=Ie(c);e.modifiersData[i]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:h,hasPopperEscaped:d},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":h,"data-popper-escaped":d})}},Pe={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.offset,o=void 0===s?[0,0]:s,r=xt.reduce((function(t,i){return t[i]=function(t,e,i){var n=qt(t),s=[_t,pt].indexOf(n)>=0?-1:1,o="function"==typeof i?i(Object.assign({},e,{placement:t})):i,r=o[0],a=o[1];return r=r||0,a=(a||0)*s,[_t,gt].indexOf(n)>=0?{x:a,y:r}:{x:r,y:a}}(i,e.rects,o),t}),{}),a=r[e.placement],l=a.x,c=a.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=l,e.modifiersData.popperOffsets.y+=c),e.modifiersData[n]=r}},je={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=xe({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}},Me={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0!==r&&r,l=i.boundary,c=i.rootBoundary,h=i.altBoundary,d=i.padding,u=i.tether,f=void 0===u||u,p=i.tetherOffset,m=void 0===p?0:p,g=ke(e,{boundary:l,rootBoundary:c,padding:d,altBoundary:h}),_=qt(e.placement),b=he(e.placement),v=!b,y=oe(_),w="x"===y?"y":"x",A=e.modifiersData.popperOffsets,E=e.rects.reference,T=e.rects.popper,C="function"==typeof m?m(Object.assign({},e.rects,{placement:e.placement})):m,O="number"==typeof C?{mainAxis:C,altAxis:C}:Object.assign({mainAxis:0,altAxis:0},C),x=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,k={x:0,y:0};if(A){if(o){var L,S="y"===y?pt:_t,D="y"===y?mt:gt,I="y"===y?"height":"width",N=A[y],P=N+g[S],j=N-g[D],M=f?-T[I]/2:0,F=b===yt?E[I]:T[I],H=b===yt?-T[I]:-E[I],$=e.elements.arrow,W=f&&$?Gt($):{width:0,height:0},B=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},z=B[S],R=B[D],q=re(0,E[I],W[I]),V=v?E[I]/2-M-q-z-O.mainAxis:F-q-z-O.mainAxis,K=v?-E[I]/2+M+q+R+O.mainAxis:H+q+R+O.mainAxis,Q=e.elements.arrow&&se(e.elements.arrow),X=Q?"y"===y?Q.clientTop||0:Q.clientLeft||0:0,Y=null!=(L=null==x?void 0:x[y])?L:0,U=N+K-Y,G=re(f?Kt(P,N+V-Y-X):P,N,f?Vt(j,U):j);A[y]=G,k[y]=G-N}if(a){var J,Z="x"===y?pt:_t,tt="x"===y?mt:gt,et=A[w],it="y"===w?"height":"width",nt=et+g[Z],st=et-g[tt],ot=-1!==[pt,_t].indexOf(_),rt=null!=(J=null==x?void 0:x[w])?J:0,at=ot?nt:et-E[it]-T[it]-rt+O.altAxis,lt=ot?et+E[it]+T[it]-rt-O.altAxis:st,ct=f&&ot?function(t,e,i){var n=re(t,e,i);return n>i?i:n}(at,et,lt):re(f?at:nt,et,f?lt:st);A[w]=ct,k[w]=ct-et}e.modifiersData[n]=k}},requiresIfExists:["offset"]};function Fe(t,e,i){void 0===i&&(i=!1);var n,s,o=Bt(e),r=Bt(e)&&function(t){var e=t.getBoundingClientRect(),i=Qt(e.width)/t.offsetWidth||1,n=Qt(e.height)/t.offsetHeight||1;return 1!==i||1!==n}(e),a=ee(e),l=Ut(t,r,i),c={scrollLeft:0,scrollTop:0},h={x:0,y:0};return(o||!o&&!i)&&(("body"!==Ht(e)||Ae(a))&&(c=(n=e)!==$t(n)&&Bt(n)?{scrollLeft:(s=n).scrollLeft,scrollTop:s.scrollTop}:ye(n)),Bt(e)?((h=Ut(e,!0)).x+=e.clientLeft,h.y+=e.clientTop):a&&(h.x=we(a))),{x:l.left+c.scrollLeft-h.x,y:l.top+c.scrollTop-h.y,width:l.width,height:l.height}}function He(t){var e=new Map,i=new Set,n=[];function s(t){i.add(t.name),[].concat(t.requires||[],t.requiresIfExists||[]).forEach((function(t){if(!i.has(t)){var n=e.get(t);n&&s(n)}})),n.push(t)}return t.forEach((function(t){e.set(t.name,t)})),t.forEach((function(t){i.has(t.name)||s(t)})),n}var $e={placement:"bottom",modifiers:[],strategy:"absolute"};function We(){for(var t=arguments.length,e=new Array(t),i=0;i<t;i++)e[i]=arguments[i];return!e.some((function(t){return!(t&&"function"==typeof t.getBoundingClientRect)}))}function Be(t){void 0===t&&(t={});var e=t,i=e.defaultModifiers,n=void 0===i?[]:i,s=e.defaultOptions,o=void 0===s?$e:s;return function(t,e,i){void 0===i&&(i=o);var s,r,a={placement:"bottom",orderedModifiers:[],options:Object.assign({},$e,o),modifiersData:{},elements:{reference:t,popper:e},attributes:{},styles:{}},l=[],c=!1,h={state:a,setOptions:function(i){var s="function"==typeof i?i(a.options):i;d(),a.options=Object.assign({},o,a.options,s),a.scrollParents={reference:Wt(t)?Te(t):t.contextElement?Te(t.contextElement):[],popper:Te(e)};var r,c,u=function(t){var e=He(t);return Ft.reduce((function(t,i){return t.concat(e.filter((function(t){return t.phase===i})))}),[])}((r=[].concat(n,a.options.modifiers),c=r.reduce((function(t,e){var i=t[e.name];return t[e.name]=i?Object.assign({},i,e,{options:Object.assign({},i.options,e.options),data:Object.assign({},i.data,e.data)}):e,t}),{}),Object.keys(c).map((function(t){return c[t]}))));return a.orderedModifiers=u.filter((function(t){return t.enabled})),a.orderedModifiers.forEach((function(t){var e=t.name,i=t.options,n=void 0===i?{}:i,s=t.effect;if("function"==typeof s){var o=s({state:a,name:e,instance:h,options:n});l.push(o||function(){})}})),h.update()},forceUpdate:function(){if(!c){var t=a.elements,e=t.reference,i=t.popper;if(We(e,i)){a.rects={reference:Fe(e,se(i),"fixed"===a.options.strategy),popper:Gt(i)},a.reset=!1,a.placement=a.options.placement,a.orderedModifiers.forEach((function(t){return a.modifiersData[t.name]=Object.assign({},t.data)}));for(var n=0;n<a.orderedModifiers.length;n++)if(!0!==a.reset){var s=a.orderedModifiers[n],o=s.fn,r=s.options,l=void 0===r?{}:r,d=s.name;"function"==typeof o&&(a=o({state:a,options:l,name:d,instance:h})||a)}else a.reset=!1,n=-1}}},update:(s=function(){return new Promise((function(t){h.forceUpdate(),t(a)}))},function(){return r||(r=new Promise((function(t){Promise.resolve().then((function(){r=void 0,t(s())}))}))),r}),destroy:function(){d(),c=!0}};if(!We(t,e))return h;function d(){l.forEach((function(t){return t()})),l=[]}return h.setOptions(i).then((function(t){!c&&i.onFirstUpdate&&i.onFirstUpdate(t)})),h}}var ze=Be(),Re=Be({defaultModifiers:[me,je,fe,Rt]}),qe=Be({defaultModifiers:[me,je,fe,Rt,Pe,Se,Me,ce,Ne]});const Ve=Object.freeze(Object.defineProperty({__proto__:null,afterMain:Nt,afterRead:St,afterWrite:Mt,applyStyles:Rt,arrow:ce,auto:bt,basePlacements:vt,beforeMain:Dt,beforeRead:kt,beforeWrite:Pt,bottom:mt,clippingParents:At,computeStyles:fe,createPopper:qe,createPopperBase:ze,createPopperLite:Re,detectOverflow:ke,end:wt,eventListeners:me,flip:Se,hide:Ne,left:_t,main:It,modifierPhases:Ft,offset:Pe,placements:xt,popper:Tt,popperGenerator:Be,popperOffsets:je,preventOverflow:Me,read:Lt,reference:Ct,right:gt,start:yt,top:pt,variationPlacements:Ot,viewport:Et,write:jt},Symbol.toStringTag,{value:"Module"})),Ke="dropdown",Qe="ArrowUp",Xe="ArrowDown",Ye="click.bs.dropdown.data-api",Ue="keydown.bs.dropdown.data-api",Ge="show",Je='[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)',Ze=`${Je}.show`,ti=".dropdown-menu",ei=p()?"top-end":"top-start",ii=p()?"top-start":"top-end",ni=p()?"bottom-end":"bottom-start",si=p()?"bottom-start":"bottom-end",oi=p()?"left-start":"right-start",ri=p()?"right-start":"left-start",ai={autoClose:!0,boundary:"clippingParents",display:"dynamic",offset:[0,2],popperConfig:null,reference:"toggle"},li={autoClose:"(boolean|string)",boundary:"(string|element)",display:"string",offset:"(array|string|function)",popperConfig:"(null|object|function)",reference:"(string|element|object)"};class ci extends W{constructor(t,e){super(t,e),this._popper=null,this._parent=this._element.parentNode,this._menu=z.next(this._element,ti)[0]||z.prev(this._element,ti)[0]||z.findOne(ti,this._parent),this._inNavbar=this._detectNavbar()}static get Default(){return ai}static get DefaultType(){return li}static get NAME(){return Ke}toggle(){return this._isShown()?this.hide():this.show()}show(){if(l(this._element)||this._isShown())return;const t={relatedTarget:this._element};if(!P.trigger(this._element,"show.bs.dropdown",t).defaultPrevented){if(this._createPopper(),"ontouchstart"in document.documentElement&&!this._parent.closest(".navbar-nav"))for(const t of[].concat(...document.body.children))P.on(t,"mouseover",h);this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.add(Ge),this._element.classList.add(Ge),P.trigger(this._element,"shown.bs.dropdown",t)}}hide(){if(l(this._element)||!this._isShown())return;const t={relatedTarget:this._element};this._completeHide(t)}dispose(){this._popper&&this._popper.destroy(),super.dispose()}update(){this._inNavbar=this._detectNavbar(),this._popper&&this._popper.update()}_completeHide(t){if(!P.trigger(this._element,"hide.bs.dropdown",t).defaultPrevented){if("ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))P.off(t,"mouseover",h);this._popper&&this._popper.destroy(),this._menu.classList.remove(Ge),this._element.classList.remove(Ge),this._element.setAttribute("aria-expanded","false"),H.removeDataAttribute(this._menu,"popper"),P.trigger(this._element,"hidden.bs.dropdown",t)}}_getConfig(t){if("object"==typeof(t=super._getConfig(t)).reference&&!o(t.reference)&&"function"!=typeof t.reference.getBoundingClientRect)throw new TypeError(`${Ke.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);return t}_createPopper(){if(void 0===Ve)throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");let t=this._element;"parent"===this._config.reference?t=this._parent:o(this._config.reference)?t=r(this._config.reference):"object"==typeof this._config.reference&&(t=this._config.reference);const e=this._getPopperConfig();this._popper=qe(t,this._menu,e)}_isShown(){return this._menu.classList.contains(Ge)}_getPlacement(){const t=this._parent;if(t.classList.contains("dropend"))return oi;if(t.classList.contains("dropstart"))return ri;if(t.classList.contains("dropup-center"))return"top";if(t.classList.contains("dropdown-center"))return"bottom";const e="end"===getComputedStyle(this._menu).getPropertyValue("--bs-position").trim();return t.classList.contains("dropup")?e?ii:ei:e?si:ni}_detectNavbar(){return null!==this._element.closest(".navbar")}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||"static"===this._config.display)&&(H.setDataAttribute(this._menu,"popper","static"),t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,...g(this._config.popperConfig,[t])}}_selectMenuItem({key:t,target:e}){const i=z.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter((t=>a(t)));i.length&&b(i,e,t===Xe,!i.includes(e)).focus()}static jQueryInterface(t){return this.each((function(){const e=ci.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}static clearMenus(t){if(2===t.button||"keyup"===t.type&&"Tab"!==t.key)return;const e=z.find(Ze);for(const i of e){const e=ci.getInstance(i);if(!e||!1===e._config.autoClose)continue;const n=t.composedPath(),s=n.includes(e._menu);if(n.includes(e._element)||"inside"===e._config.autoClose&&!s||"outside"===e._config.autoClose&&s)continue;if(e._menu.contains(t.target)&&("keyup"===t.type&&"Tab"===t.key||/input|select|option|textarea|form/i.test(t.target.tagName)))continue;const o={relatedTarget:e._element};"click"===t.type&&(o.clickEvent=t),e._completeHide(o)}}static dataApiKeydownHandler(t){const e=/input|textarea/i.test(t.target.tagName),i="Escape"===t.key,n=[Qe,Xe].includes(t.key);if(!n&&!i)return;if(e&&!i)return;t.preventDefault();const s=this.matches(Je)?this:z.prev(this,Je)[0]||z.next(this,Je)[0]||z.findOne(Je,t.delegateTarget.parentNode),o=ci.getOrCreateInstance(s);if(n)return t.stopPropagation(),o.show(),void o._selectMenuItem(t);o._isShown()&&(t.stopPropagation(),o.hide(),s.focus())}}P.on(document,Ue,Je,ci.dataApiKeydownHandler),P.on(document,Ue,ti,ci.dataApiKeydownHandler),P.on(document,Ye,ci.clearMenus),P.on(document,"keyup.bs.dropdown.data-api",ci.clearMenus),P.on(document,Ye,Je,(function(t){t.preventDefault(),ci.getOrCreateInstance(this).toggle()})),m(ci);const hi="show",di="mousedown.bs.backdrop",ui={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},fi={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class pi extends ${constructor(t){super(),this._config=this._getConfig(t),this._isAppended=!1,this._element=null}static get Default(){return ui}static get DefaultType(){return fi}static get NAME(){return"backdrop"}show(t){if(!this._config.isVisible)return void g(t);this._append();const e=this._getElement();this._config.isAnimated&&d(e),e.classList.add(hi),this._emulateAnimation((()=>{g(t)}))}hide(t){this._config.isVisible?(this._getElement().classList.remove(hi),this._emulateAnimation((()=>{this.dispose(),g(t)}))):g(t)}dispose(){this._isAppended&&(P.off(this._element,di),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_configAfterMerge(t){return t.rootElement=r(t.rootElement),t}_append(){if(this._isAppended)return;const t=this._getElement();this._config.rootElement.append(t),P.on(t,di,(()=>{g(this._config.clickCallback)})),this._isAppended=!0}_emulateAnimation(t){_(t,this._getElement(),this._config.isAnimated)}}const mi=".bs.focustrap",gi="backward",_i={autofocus:!0,trapElement:null},bi={autofocus:"boolean",trapElement:"element"};class vi extends ${constructor(t){super(),this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return _i}static get DefaultType(){return bi}static get NAME(){return"focustrap"}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),P.off(document,mi),P.on(document,"focusin.bs.focustrap",(t=>this._handleFocusin(t))),P.on(document,"keydown.tab.bs.focustrap",(t=>this._handleKeydown(t))),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,P.off(document,mi))}_handleFocusin(t){const{trapElement:e}=this._config;if(t.target===document||t.target===e||e.contains(t.target))return;const i=z.focusableChildren(e);0===i.length?e.focus():this._lastTabNavDirection===gi?i[i.length-1].focus():i[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?gi:"forward")}}const yi=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",wi=".sticky-top",Ai="padding-right",Ei="margin-right";class Ti{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,Ai,(e=>e+t)),this._setElementAttributes(yi,Ai,(e=>e+t)),this._setElementAttributes(wi,Ei,(e=>e-t))}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,Ai),this._resetElementAttributes(yi,Ai),this._resetElementAttributes(wi,Ei)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const n=this.getWidth();this._applyManipulationCallback(t,(t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+n)return;this._saveInitialAttribute(t,e);const s=window.getComputedStyle(t).getPropertyValue(e);t.style.setProperty(e,`${i(Number.parseFloat(s))}px`)}))}_saveInitialAttribute(t,e){const i=t.style.getPropertyValue(e);i&&H.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,(t=>{const i=H.getDataAttribute(t,e);null!==i?(H.removeDataAttribute(t,e),t.style.setProperty(e,i)):t.style.removeProperty(e)}))}_applyManipulationCallback(t,e){if(o(t))e(t);else for(const i of z.find(t,this._element))e(i)}}const Ci=".bs.modal",Oi="hidden.bs.modal",xi="show.bs.modal",ki="modal-open",Li="show",Si="modal-static",Di={backdrop:!0,focus:!0,keyboard:!0},Ii={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class Ni extends W{constructor(t,e){super(t,e),this._dialog=z.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new Ti,this._addEventListeners()}static get Default(){return Di}static get DefaultType(){return Ii}static get NAME(){return"modal"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||P.trigger(this._element,xi,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(ki),this._adjustDialog(),this._backdrop.show((()=>this._showElement(t))))}hide(){this._isShown&&!this._isTransitioning&&(P.trigger(this._element,"hide.bs.modal").defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(Li),this._queueCallback((()=>this._hideModal()),this._element,this._isAnimated())))}dispose(){P.off(window,Ci),P.off(this._dialog,Ci),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new pi({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new vi({trapElement:this._element})}_showElement(t){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0;const e=z.findOne(".modal-body",this._dialog);e&&(e.scrollTop=0),d(this._element),this._element.classList.add(Li),this._queueCallback((()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,P.trigger(this._element,"shown.bs.modal",{relatedTarget:t})}),this._dialog,this._isAnimated())}_addEventListeners(){P.on(this._element,"keydown.dismiss.bs.modal",(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():this._triggerBackdropTransition())})),P.on(window,"resize.bs.modal",(()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()})),P.on(this._element,"mousedown.dismiss.bs.modal",(t=>{P.one(this._element,"click.dismiss.bs.modal",(e=>{this._element===t.target&&this._element===e.target&&("static"!==this._config.backdrop?this._config.backdrop&&this.hide():this._triggerBackdropTransition())}))}))}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide((()=>{document.body.classList.remove(ki),this._resetAdjustments(),this._scrollBar.reset(),P.trigger(this._element,Oi)}))}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(P.trigger(this._element,"hidePrevented.bs.modal").defaultPrevented)return;const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._element.style.overflowY;"hidden"===e||this._element.classList.contains(Si)||(t||(this._element.style.overflowY="hidden"),this._element.classList.add(Si),this._queueCallback((()=>{this._element.classList.remove(Si),this._queueCallback((()=>{this._element.style.overflowY=e}),this._dialog)}),this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),i=e>0;if(i&&!t){const t=p()?"paddingLeft":"paddingRight";this._element.style[t]=`${e}px`}if(!i&&t){const t=p()?"paddingRight":"paddingLeft";this._element.style[t]=`${e}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each((function(){const i=Ni.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}}))}}P.on(document,"click.bs.modal.data-api",'[data-bs-toggle="modal"]',(function(t){const e=z.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),P.one(e,xi,(t=>{t.defaultPrevented||P.one(e,Oi,(()=>{a(this)&&this.focus()}))}));const i=z.findOne(".modal.show");i&&Ni.getInstance(i).hide(),Ni.getOrCreateInstance(e).toggle(this)})),R(Ni),m(Ni);const Pi="show",ji="showing",Mi="hiding",Fi=".offcanvas.show",Hi="hidePrevented.bs.offcanvas",$i="hidden.bs.offcanvas",Wi={backdrop:!0,keyboard:!0,scroll:!1},Bi={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class zi extends W{constructor(t,e){super(t,e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return Wi}static get DefaultType(){return Bi}static get NAME(){return"offcanvas"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||P.trigger(this._element,"show.bs.offcanvas",{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._backdrop.show(),this._config.scroll||(new Ti).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(ji),this._queueCallback((()=>{this._config.scroll&&!this._config.backdrop||this._focustrap.activate(),this._element.classList.add(Pi),this._element.classList.remove(ji),P.trigger(this._element,"shown.bs.offcanvas",{relatedTarget:t})}),this._element,!0))}hide(){this._isShown&&(P.trigger(this._element,"hide.bs.offcanvas").defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add(Mi),this._backdrop.hide(),this._queueCallback((()=>{this._element.classList.remove(Pi,Mi),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new Ti).reset(),P.trigger(this._element,$i)}),this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const t=Boolean(this._config.backdrop);return new pi({className:"offcanvas-backdrop",isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?()=>{"static"!==this._config.backdrop?this.hide():P.trigger(this._element,Hi)}:null})}_initializeFocusTrap(){return new vi({trapElement:this._element})}_addEventListeners(){P.on(this._element,"keydown.dismiss.bs.offcanvas",(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():P.trigger(this._element,Hi))}))}static jQueryInterface(t){return this.each((function(){const e=zi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}P.on(document,"click.bs.offcanvas.data-api",'[data-bs-toggle="offcanvas"]',(function(t){const e=z.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this))return;P.one(e,$i,(()=>{a(this)&&this.focus()}));const i=z.findOne(Fi);i&&i!==e&&zi.getInstance(i).hide(),zi.getOrCreateInstance(e).toggle(this)})),P.on(window,"load.bs.offcanvas.data-api",(()=>{for(const t of z.find(Fi))zi.getOrCreateInstance(t).show()})),P.on(window,"resize.bs.offcanvas",(()=>{for(const t of z.find("[aria-modal][class*=show][class*=offcanvas-]"))"fixed"!==getComputedStyle(t).position&&zi.getOrCreateInstance(t).hide()})),R(zi),m(zi);const Ri=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),qi=/^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i,Vi=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i,Ki=(t,e)=>{const i=t.nodeName.toLowerCase();return e.includes(i)?!Ri.has(i)||Boolean(qi.test(t.nodeValue)||Vi.test(t.nodeValue)):e.filter((t=>t instanceof RegExp)).some((t=>t.test(i)))},Qi={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},Xi={allowList:Qi,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"<div></div>"},Yi={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},Ui={entry:"(string|element|function|null)",selector:"(string|element)"};class Gi extends ${constructor(t){super(),this._config=this._getConfig(t)}static get Default(){return Xi}static get DefaultType(){return Yi}static get NAME(){return"TemplateFactory"}getContent(){return Object.values(this._config.content).map((t=>this._resolvePossibleFunction(t))).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(t){return this._checkContent(t),this._config.content={...this._config.content,...t},this}toHtml(){const t=document.createElement("div");t.innerHTML=this._maybeSanitize(this._config.template);for(const[e,i]of Object.entries(this._config.content))this._setContent(t,i,e);const e=t.children[0],i=this._resolvePossibleFunction(this._config.extraClass);return i&&e.classList.add(...i.split(" ")),e}_typeCheckConfig(t){super._typeCheckConfig(t),this._checkContent(t.content)}_checkContent(t){for(const[e,i]of Object.entries(t))super._typeCheckConfig({selector:e,entry:i},Ui)}_setContent(t,e,i){const n=z.findOne(i,t);n&&((e=this._resolvePossibleFunction(e))?o(e)?this._putElementInTemplate(r(e),n):this._config.html?n.innerHTML=this._maybeSanitize(e):n.textContent=e:n.remove())}_maybeSanitize(t){return this._config.sanitize?function(t,e,i){if(!t.length)return t;if(i&&"function"==typeof i)return i(t);const n=(new window.DOMParser).parseFromString(t,"text/html"),s=[].concat(...n.body.querySelectorAll("*"));for(const t of s){const i=t.nodeName.toLowerCase();if(!Object.keys(e).includes(i)){t.remove();continue}const n=[].concat(...t.attributes),s=[].concat(e["*"]||[],e[i]||[]);for(const e of n)Ki(e,s)||t.removeAttribute(e.nodeName)}return n.body.innerHTML}(t,this._config.allowList,this._config.sanitizeFn):t}_resolvePossibleFunction(t){return g(t,[this])}_putElementInTemplate(t,e){if(this._config.html)return e.innerHTML="",void e.append(t);e.textContent=t.textContent}}const Ji=new Set(["sanitize","allowList","sanitizeFn"]),Zi="fade",tn="show",en=".modal",nn="hide.bs.modal",sn="hover",on="focus",rn={AUTO:"auto",TOP:"top",RIGHT:p()?"left":"right",BOTTOM:"bottom",LEFT:p()?"right":"left"},an={allowList:Qi,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,6],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',title:"",trigger:"hover focus"},ln={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"};class cn extends W{constructor(t,e){if(void 0===Ve)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t,e),this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners(),this._config.selector||this._fixTitle()}static get Default(){return an}static get DefaultType(){return ln}static get NAME(){return"tooltip"}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){this._isEnabled&&(this._activeTrigger.click=!this._activeTrigger.click,this._isShown()?this._leave():this._enter())}dispose(){clearTimeout(this._timeout),P.off(this._element.closest(en),nn,this._hideModalHandler),this._element.getAttribute("data-bs-original-title")&&this._element.setAttribute("title",this._element.getAttribute("data-bs-original-title")),this._disposePopper(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this._isWithContent()||!this._isEnabled)return;const t=P.trigger(this._element,this.constructor.eventName("show")),e=(c(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(t.defaultPrevented||!e)return;this._disposePopper();const i=this._getTipElement();this._element.setAttribute("aria-describedby",i.getAttribute("id"));const{container:n}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(n.append(i),P.trigger(this._element,this.constructor.eventName("inserted"))),this._popper=this._createPopper(i),i.classList.add(tn),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))P.on(t,"mouseover",h);this._queueCallback((()=>{P.trigger(this._element,this.constructor.eventName("shown")),!1===this._isHovered&&this._leave(),this._isHovered=!1}),this.tip,this._isAnimated())}hide(){if(this._isShown()&&!P.trigger(this._element,this.constructor.eventName("hide")).defaultPrevented){if(this._getTipElement().classList.remove(tn),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))P.off(t,"mouseover",h);this._activeTrigger.click=!1,this._activeTrigger.focus=!1,this._activeTrigger.hover=!1,this._isHovered=null,this._queueCallback((()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),P.trigger(this._element,this.constructor.eventName("hidden")))}),this.tip,this._isAnimated())}}update(){this._popper&&this._popper.update()}_isWithContent(){return Boolean(this._getTitle())}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(t){const e=this._getTemplateFactory(t).toHtml();if(!e)return null;e.classList.remove(Zi,tn),e.classList.add(`bs-${this.constructor.NAME}-auto`);const i=(t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t})(this.constructor.NAME).toString();return e.setAttribute("id",i),this._isAnimated()&&e.classList.add(Zi),e}setContent(t){this._newContent=t,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(t){return this._templateFactory?this._templateFactory.changeContent(t):this._templateFactory=new Gi({...this._config,content:t,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{".tooltip-inner":this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(t){return this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(Zi)}_isShown(){return this.tip&&this.tip.classList.contains(tn)}_createPopper(t){const e=g(this._config.placement,[this,t,this._element]),i=rn[e.toUpperCase()];return qe(this._element,t,this._getPopperConfig(i))}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_resolvePossibleFunction(t){return g(t,[this._element])}_getPopperConfig(t){const e={placement:t,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:t=>{this._getTipElement().setAttribute("data-popper-placement",t.state.placement)}}]};return{...e,...g(this._config.popperConfig,[e])}}_setListeners(){const t=this._config.trigger.split(" ");for(const e of t)if("click"===e)P.on(this._element,this.constructor.eventName("click"),this._config.selector,(t=>{this._initializeOnDelegatedTarget(t).toggle()}));else if("manual"!==e){const t=e===sn?this.constructor.eventName("mouseenter"):this.constructor.eventName("focusin"),i=e===sn?this.constructor.eventName("mouseleave"):this.constructor.eventName("focusout");P.on(this._element,t,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusin"===t.type?on:sn]=!0,e._enter()})),P.on(this._element,i,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusout"===t.type?on:sn]=e._element.contains(t.relatedTarget),e._leave()}))}this._hideModalHandler=()=>{this._element&&this.hide()},P.on(this._element.closest(en),nn,this._hideModalHandler)}_fixTitle(){const t=this._element.getAttribute("title");t&&(this._element.getAttribute("aria-label")||this._element.textContent.trim()||this._element.setAttribute("aria-label",t),this._element.setAttribute("data-bs-original-title",t),this._element.removeAttribute("title"))}_enter(){this._isShown()||this._isHovered?this._isHovered=!0:(this._isHovered=!0,this._setTimeout((()=>{this._isHovered&&this.show()}),this._config.delay.show))}_leave(){this._isWithActiveTrigger()||(this._isHovered=!1,this._setTimeout((()=>{this._isHovered||this.hide()}),this._config.delay.hide))}_setTimeout(t,e){clearTimeout(this._timeout),this._timeout=setTimeout(t,e)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(t){const e=H.getDataAttributes(this._element);for(const t of Object.keys(e))Ji.has(t)&&delete e[t];return t={...e,..."object"==typeof t&&t?t:{}},t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t.container=!1===t.container?document.body:r(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),t}_getDelegateConfig(){const t={};for(const[e,i]of Object.entries(this._config))this.constructor.Default[e]!==i&&(t[e]=i);return t.selector=!1,t.trigger="manual",t}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(t){return this.each((function(){const e=cn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}m(cn);const hn={...cn.Default,content:"",offset:[0,8],placement:"right",template:'<div class="popover" role="tooltip"><div class="popover-arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>',trigger:"click"},dn={...cn.DefaultType,content:"(null|string|element|function)"};class un extends cn{static get Default(){return hn}static get DefaultType(){return dn}static get NAME(){return"popover"}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{".popover-header":this._getTitle(),".popover-body":this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(t){return this.each((function(){const e=un.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}m(un);const fn="click.bs.scrollspy",pn="active",mn="[href]",gn={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},_n={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class bn extends W{constructor(t,e){super(t,e),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement="visible"===getComputedStyle(this._element).overflowY?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return gn}static get DefaultType(){return _n}static get NAME(){return"scrollspy"}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(const t of this._observableSections.values())this._observer.observe(t)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(t){return t.target=r(t.target)||document.body,t.rootMargin=t.offset?`${t.offset}px 0px -30%`:t.rootMargin,"string"==typeof t.threshold&&(t.threshold=t.threshold.split(",").map((t=>Number.parseFloat(t)))),t}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(P.off(this._config.target,fn),P.on(this._config.target,fn,mn,(t=>{const e=this._observableSections.get(t.target.hash);if(e){t.preventDefault();const i=this._rootElement||window,n=e.offsetTop-this._element.offsetTop;if(i.scrollTo)return void i.scrollTo({top:n,behavior:"smooth"});i.scrollTop=n}})))}_getNewObserver(){const t={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver((t=>this._observerCallback(t)),t)}_observerCallback(t){const e=t=>this._targetLinks.get(`#${t.target.id}`),i=t=>{this._previousScrollData.visibleEntryTop=t.target.offsetTop,this._process(e(t))},n=(this._rootElement||document.documentElement).scrollTop,s=n>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=n;for(const o of t){if(!o.isIntersecting){this._activeTarget=null,this._clearActiveClass(e(o));continue}const t=o.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(s&&t){if(i(o),!n)return}else s||t||i(o)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const t=z.find(mn,this._config.target);for(const e of t){if(!e.hash||l(e))continue;const t=z.findOne(e.hash,this._element);a(t)&&(this._targetLinks.set(e.hash,e),this._observableSections.set(e.hash,t))}}_process(t){this._activeTarget!==t&&(this._clearActiveClass(this._config.target),this._activeTarget=t,t.classList.add(pn),this._activateParents(t),P.trigger(this._element,"activate.bs.scrollspy",{relatedTarget:t}))}_activateParents(t){if(t.classList.contains("dropdown-item"))z.findOne(".dropdown-toggle",t.closest(".dropdown")).classList.add(pn);else for(const e of z.parents(t,".nav, .list-group"))for(const t of z.prev(e,".nav-link, .nav-item > .nav-link, .list-group-item"))t.classList.add(pn)}_clearActiveClass(t){t.classList.remove(pn);const e=z.find("[href].active",t);for(const t of e)t.classList.remove(pn)}static jQueryInterface(t){return this.each((function(){const e=bn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}P.on(window,"load.bs.scrollspy.data-api",(()=>{for(const t of z.find('[data-bs-spy="scroll"]'))bn.getOrCreateInstance(t)})),m(bn);const vn="ArrowLeft",yn="ArrowRight",wn="ArrowUp",An="ArrowDown",En="active",Tn="fade",Cn="show",On='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',xn=`.nav-link:not(.dropdown-toggle), .list-group-item:not(.dropdown-toggle), [role="tab"]:not(.dropdown-toggle), ${On}`;class kn extends W{constructor(t){super(t),this._parent=this._element.closest('.list-group, .nav, [role="tablist"]'),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),P.on(this._element,"keydown.bs.tab",(t=>this._keydown(t))))}static get NAME(){return"tab"}show(){const t=this._element;if(this._elemIsActive(t))return;const e=this._getActiveElem(),i=e?P.trigger(e,"hide.bs.tab",{relatedTarget:t}):null;P.trigger(t,"show.bs.tab",{relatedTarget:e}).defaultPrevented||i&&i.defaultPrevented||(this._deactivate(e,t),this._activate(t,e))}_activate(t,e){t&&(t.classList.add(En),this._activate(z.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.removeAttribute("tabindex"),t.setAttribute("aria-selected",!0),this._toggleDropDown(t,!0),P.trigger(t,"shown.bs.tab",{relatedTarget:e})):t.classList.add(Cn)}),t,t.classList.contains(Tn)))}_deactivate(t,e){t&&(t.classList.remove(En),t.blur(),this._deactivate(z.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.setAttribute("aria-selected",!1),t.setAttribute("tabindex","-1"),this._toggleDropDown(t,!1),P.trigger(t,"hidden.bs.tab",{relatedTarget:e})):t.classList.remove(Cn)}),t,t.classList.contains(Tn)))}_keydown(t){if(![vn,yn,wn,An].includes(t.key))return;t.stopPropagation(),t.preventDefault();const e=[yn,An].includes(t.key),i=b(this._getChildren().filter((t=>!l(t))),t.target,e,!0);i&&(i.focus({preventScroll:!0}),kn.getOrCreateInstance(i).show())}_getChildren(){return z.find(xn,this._parent)}_getActiveElem(){return this._getChildren().find((t=>this._elemIsActive(t)))||null}_setInitialAttributes(t,e){this._setAttributeIfNotExists(t,"role","tablist");for(const t of e)this._setInitialAttributesOnChild(t)}_setInitialAttributesOnChild(t){t=this._getInnerElement(t);const e=this._elemIsActive(t),i=this._getOuterElement(t);t.setAttribute("aria-selected",e),i!==t&&this._setAttributeIfNotExists(i,"role","presentation"),e||t.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(t,"role","tab"),this._setInitialAttributesOnTargetPanel(t)}_setInitialAttributesOnTargetPanel(t){const e=z.getElementFromSelector(t);e&&(this._setAttributeIfNotExists(e,"role","tabpanel"),t.id&&this._setAttributeIfNotExists(e,"aria-labelledby",`${t.id}`))}_toggleDropDown(t,e){const i=this._getOuterElement(t);if(!i.classList.contains("dropdown"))return;const n=(t,n)=>{const s=z.findOne(t,i);s&&s.classList.toggle(n,e)};n(".dropdown-toggle",En),n(".dropdown-menu",Cn),i.setAttribute("aria-expanded",e)}_setAttributeIfNotExists(t,e,i){t.hasAttribute(e)||t.setAttribute(e,i)}_elemIsActive(t){return t.classList.contains(En)}_getInnerElement(t){return t.matches(xn)?t:z.findOne(xn,t)}_getOuterElement(t){return t.closest(".nav-item, .list-group-item")||t}static jQueryInterface(t){return this.each((function(){const e=kn.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}P.on(document,"click.bs.tab",On,(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this)||kn.getOrCreateInstance(this).show()})),P.on(window,"load.bs.tab",(()=>{for(const t of z.find('.active[data-bs-toggle="tab"], .active[data-bs-toggle="pill"], .active[data-bs-toggle="list"]'))kn.getOrCreateInstance(t)})),m(kn);const Ln="hide",Sn="show",Dn="showing",In={animation:"boolean",autohide:"boolean",delay:"number"},Nn={animation:!0,autohide:!0,delay:5e3};class Pn extends W{constructor(t,e){super(t,e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return Nn}static get DefaultType(){return In}static get NAME(){return"toast"}show(){P.trigger(this._element,"show.bs.toast").defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(Ln),d(this._element),this._element.classList.add(Sn,Dn),this._queueCallback((()=>{this._element.classList.remove(Dn),P.trigger(this._element,"shown.bs.toast"),this._maybeScheduleHide()}),this._element,this._config.animation))}hide(){this.isShown()&&(P.trigger(this._element,"hide.bs.toast").defaultPrevented||(this._element.classList.add(Dn),this._queueCallback((()=>{this._element.classList.add(Ln),this._element.classList.remove(Dn,Sn),P.trigger(this._element,"hidden.bs.toast")}),this._element,this._config.animation)))}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(Sn),super.dispose()}isShown(){return this._element.classList.contains(Sn)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout((()=>{this.hide()}),this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const i=t.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){P.on(this._element,"mouseover.bs.toast",(t=>this._onInteraction(t,!0))),P.on(this._element,"mouseout.bs.toast",(t=>this._onInteraction(t,!1))),P.on(this._element,"focusin.bs.toast",(t=>this._onInteraction(t,!0))),P.on(this._element,"focusout.bs.toast",(t=>this._onInteraction(t,!1)))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=Pn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}return R(Pn),m(Pn),{Alert:q,Button:K,Carousel:rt,Collapse:ft,Dropdown:ci,Modal:Ni,Offcanvas:zi,Popover:un,ScrollSpy:bn,Tab:kn,Toast:Pn,Tooltip:cn}})); +</script> \ No newline at end of file diff --git a/static/ejs/partials/scripts/categorySummary.ejs b/static/ejs/partials/scripts/categorySummary.ejs new file mode 100644 index 00000000..d4d6aaf4 --- /dev/null +++ b/static/ejs/partials/scripts/categorySummary.ejs @@ -0,0 +1,53 @@ +<%# functions used to show the list of rules at the bottom of the report %> +<script> + window.addEventListener('DOMContentLoaded', () => { + document.getElementById('mustFixSelector').click(); + }); + + const changeSelectedCategory = (() => { + let selected = null; + + return (event, category) => { + if (selected) { + selected.classList.remove('selected'); + } + event.currentTarget.classList.add('selected'); + selected = event.currentTarget; + loadRulesSummary(category); + }; + })(); + + function loadRulesSummary(category) { + const newItems = []; + + const formatItemsCount = count => { + if (count < 1000) return `${count}`; + if (count >= 9000) return '>9k'; + return `${Math.floor(count / 1000)}k`; + }; + + scanItems[category].rules.forEach(rule => { + const ruleItem = createElementFromString(` + <button class="rule-item" data-bs-toggle="offcanvas" data-bs-target="#expandedRule" aria-controls="expandedRule"> + <div> + <div class="rule-items-count ${category}"> + ${formatItemsCount(rule.totalItems)} + </div> + ${htmlEscapeString(rule.description)} + </div> + <div> + <svg width="9" height="16" viewBox="0 0 9 16" fill="none" xmlns="http://www.w3.org/2000/svg"> + <path d="M1.03847 16C0.833084 16 0.632306 15.9388 0.461529 15.8241C0.290753 15.7095 0.157649 15.5465 0.0790493 15.3558C0.000449621 15.1651 -0.0201154 14.9553 0.0199549 14.7529C0.0600251 14.5505 0.158931 14.3645 0.304165 14.2186L6.49293 7.99975L0.304165 1.78088C0.109639 1.58514 0.000422347 1.31979 0.000518839 1.04315C0.000615331 0.766523 0.110018 0.501248 0.30468 0.30564C0.499341 0.110032 0.763331 9.70251e-05 1.03862 6.41929e-08C1.31392 -9.68968e-05 1.57798 0.109652 1.77278 0.305123L8.69586 7.26187C8.8906 7.45757 9 7.72299 9 7.99975C9 8.2765 8.8906 8.54192 8.69586 8.73763L1.77278 15.6944C1.67646 15.7914 1.562 15.8684 1.43598 15.9208C1.30996 15.9733 1.17487 16.0002 1.03847 16Z" fill="#333333"/> + </svg> + </div> + </button> + `); + + ruleItem.addEventListener('click', () => expandRule(category, rule)); + newItems.push(ruleItem); + }); + + document.getElementById('categorySummary').replaceChildren(...newItems); + } +</script> + \ No newline at end of file diff --git a/static/ejs/partials/scripts/highlightjs.ejs b/static/ejs/partials/scripts/highlightjs.ejs new file mode 100644 index 00000000..099888f3 --- /dev/null +++ b/static/ejs/partials/scripts/highlightjs.ejs @@ -0,0 +1,335 @@ +<script> + /*! + Highlight.js v11.7.0 (git: 82688fad18) + (c) 2006-2022 undefined and other contributors + License: BSD-3-Clause + */ + var hljs=function(){"use strict";var e={exports:{}};function t(e){ + return e instanceof Map?e.clear=e.delete=e.set=()=>{ + throw Error("map is read-only")}:e instanceof Set&&(e.add=e.clear=e.delete=()=>{ + throw Error("set is read-only") + }),Object.freeze(e),Object.getOwnPropertyNames(e).forEach((n=>{var i=e[n] + ;"object"!=typeof i||Object.isFrozen(i)||t(i)})),e} + e.exports=t,e.exports.default=t;class n{constructor(e){ + void 0===e.data&&(e.data={}),this.data=e.data,this.isMatchIgnored=!1} + ignoreMatch(){this.isMatchIgnored=!0}}function i(e){ + return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'") + }function r(e,...t){const n=Object.create(null);for(const t in e)n[t]=e[t] + ;return t.forEach((e=>{for(const t in e)n[t]=e[t]})),n} + const s=e=>!!e.scope||e.sublanguage&&e.language;class o{constructor(e,t){ + this.buffer="",this.classPrefix=t.classPrefix,e.walk(this)}addText(e){ + this.buffer+=i(e)}openNode(e){if(!s(e))return;let t="" + ;t=e.sublanguage?"language-"+e.language:((e,{prefix:t})=>{if(e.includes(".")){ + const n=e.split(".") + ;return[`${t}${n.shift()}`,...n.map(((e,t)=>`${e}${"_".repeat(t+1)}`))].join(" ") + }return`${t}${e}`})(e.scope,{prefix:this.classPrefix}),this.span(t)} + closeNode(e){s(e)&&(this.buffer+="</span>")}value(){return this.buffer}span(e){ + this.buffer+=`<span class="${e}">`}}const a=(e={})=>{const t={children:[]} + ;return Object.assign(t,e),t};class c{constructor(){ + this.rootNode=a(),this.stack=[this.rootNode]}get top(){ + return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){ + this.top.children.push(e)}openNode(e){const t=a({scope:e}) + ;this.add(t),this.stack.push(t)}closeNode(){ + if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){ + for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)} + walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,t){ + return"string"==typeof t?e.addText(t):t.children&&(e.openNode(t), + t.children.forEach((t=>this._walk(e,t))),e.closeNode(t)),e}static _collapse(e){ + "string"!=typeof e&&e.children&&(e.children.every((e=>"string"==typeof e))?e.children=[e.children.join("")]:e.children.forEach((e=>{ + c._collapse(e)})))}}class l extends c{constructor(e){super(),this.options=e} + addKeyword(e,t){""!==e&&(this.openNode(t),this.addText(e),this.closeNode())} + addText(e){""!==e&&this.add(e)}addSublanguage(e,t){const n=e.root + ;n.sublanguage=!0,n.language=t,this.add(n)}toHTML(){ + return new o(this,this.options).value()}finalize(){return!0}}function g(e){ + return e?"string"==typeof e?e:e.source:null}function d(e){return p("(?=",e,")")} + function u(e){return p("(?:",e,")*")}function h(e){return p("(?:",e,")?")} + function p(...e){return e.map((e=>g(e))).join("")}function f(...e){const t=(e=>{ + const t=e[e.length-1] + ;return"object"==typeof t&&t.constructor===Object?(e.splice(e.length-1,1),t):{} + })(e);return"("+(t.capture?"":"?:")+e.map((e=>g(e))).join("|")+")"} + function b(e){return RegExp(e.toString()+"|").exec("").length-1} + const m=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./ + ;function E(e,{joinWith:t}){let n=0;return e.map((e=>{n+=1;const t=n + ;let i=g(e),r="";for(;i.length>0;){const e=m.exec(i);if(!e){r+=i;break} + r+=i.substring(0,e.index), + i=i.substring(e.index+e[0].length),"\\"===e[0][0]&&e[1]?r+="\\"+(Number(e[1])+t):(r+=e[0], + "("===e[0]&&n++)}return r})).map((e=>`(${e})`)).join(t)} + const x="[a-zA-Z]\\w*",w="[a-zA-Z_]\\w*",y="\\b\\d+(\\.\\d+)?",_="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",O="\\b(0b[01]+)",v={ + begin:"\\\\[\\s\\S]",relevance:0},N={scope:"string",begin:"'",end:"'", + illegal:"\\n",contains:[v]},k={scope:"string",begin:'"',end:'"',illegal:"\\n", + contains:[v]},M=(e,t,n={})=>{const i=r({scope:"comment",begin:e,end:t, + contains:[]},n);i.contains.push({scope:"doctag", + begin:"[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)", + end:/(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,excludeBegin:!0,relevance:0}) + ;const s=f("I","a","is","so","us","to","at","if","in","it","on",/[A-Za-z]+['](d|ve|re|ll|t|s|n)/,/[A-Za-z]+[-][a-z]+/,/[A-Za-z][a-z]{2,}/) + ;return i.contains.push({begin:p(/[ ]+/,"(",s,/[.]?[:]?([.][ ]|[ ])/,"){3}")}),i + },S=M("//","$"),R=M("/\\*","\\*/"),j=M("#","$");var A=Object.freeze({ + __proto__:null,MATCH_NOTHING_RE:/\b\B/,IDENT_RE:x,UNDERSCORE_IDENT_RE:w, + NUMBER_RE:y,C_NUMBER_RE:_,BINARY_NUMBER_RE:O, + RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~", + SHEBANG:(e={})=>{const t=/^#![ ]*\// + ;return e.binary&&(e.begin=p(t,/.*\b/,e.binary,/\b.*/)),r({scope:"meta",begin:t, + end:/$/,relevance:0,"on:begin":(e,t)=>{0!==e.index&&t.ignoreMatch()}},e)}, + BACKSLASH_ESCAPE:v,APOS_STRING_MODE:N,QUOTE_STRING_MODE:k,PHRASAL_WORDS_MODE:{ + begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/ + },COMMENT:M,C_LINE_COMMENT_MODE:S,C_BLOCK_COMMENT_MODE:R,HASH_COMMENT_MODE:j, + NUMBER_MODE:{scope:"number",begin:y,relevance:0},C_NUMBER_MODE:{scope:"number", + begin:_,relevance:0},BINARY_NUMBER_MODE:{scope:"number",begin:O,relevance:0}, + REGEXP_MODE:{begin:/(?=\/[^/\n]*\/)/,contains:[{scope:"regexp",begin:/\//, + end:/\/[gimuy]*/,illegal:/\n/,contains:[v,{begin:/\[/,end:/\]/,relevance:0, + contains:[v]}]}]},TITLE_MODE:{scope:"title",begin:x,relevance:0}, + UNDERSCORE_TITLE_MODE:{scope:"title",begin:w,relevance:0},METHOD_GUARD:{ + begin:"\\.\\s*[a-zA-Z_]\\w*",relevance:0},END_SAME_AS_BEGIN:e=>Object.assign(e,{ + "on:begin":(e,t)=>{t.data._beginMatch=e[1]},"on:end":(e,t)=>{ + t.data._beginMatch!==e[1]&&t.ignoreMatch()}})});function I(e,t){ + "."===e.input[e.index-1]&&t.ignoreMatch()}function T(e,t){ + void 0!==e.className&&(e.scope=e.className,delete e.className)}function L(e,t){ + t&&e.beginKeywords&&(e.begin="\\b("+e.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)", + e.__beforeBegin=I,e.keywords=e.keywords||e.beginKeywords,delete e.beginKeywords, + void 0===e.relevance&&(e.relevance=0))}function B(e,t){ + Array.isArray(e.illegal)&&(e.illegal=f(...e.illegal))}function D(e,t){ + if(e.match){ + if(e.begin||e.end)throw Error("begin & end are not supported with match") + ;e.begin=e.match,delete e.match}}function H(e,t){ + void 0===e.relevance&&(e.relevance=1)}const P=(e,t)=>{if(!e.beforeMatch)return + ;if(e.starts)throw Error("beforeMatch cannot be used with starts") + ;const n=Object.assign({},e);Object.keys(e).forEach((t=>{delete e[t] + })),e.keywords=n.keywords,e.begin=p(n.beforeMatch,d(n.begin)),e.starts={ + relevance:0,contains:[Object.assign(n,{endsParent:!0})] + },e.relevance=0,delete n.beforeMatch + },C=["of","and","for","in","not","or","if","then","parent","list","value"] + ;function $(e,t,n="keyword"){const i=Object.create(null) + ;return"string"==typeof e?r(n,e.split(" ")):Array.isArray(e)?r(n,e):Object.keys(e).forEach((n=>{ + Object.assign(i,$(e[n],t,n))})),i;function r(e,n){ + t&&(n=n.map((e=>e.toLowerCase()))),n.forEach((t=>{const n=t.split("|") + ;i[n[0]]=[e,U(n[0],n[1])]}))}}function U(e,t){ + return t?Number(t):(e=>C.includes(e.toLowerCase()))(e)?0:1}const z={},K=e=>{ + console.error(e)},W=(e,...t)=>{console.log("WARN: "+e,...t)},X=(e,t)=>{ + z[`${e}/${t}`]||(console.log(`Deprecated as of ${e}. ${t}`),z[`${e}/${t}`]=!0) + },G=Error();function Z(e,t,{key:n}){let i=0;const r=e[n],s={},o={} + ;for(let e=1;e<=t.length;e++)o[e+i]=r[e],s[e+i]=!0,i+=b(t[e-1]) + ;e[n]=o,e[n]._emit=s,e[n]._multi=!0}function F(e){(e=>{ + e.scope&&"object"==typeof e.scope&&null!==e.scope&&(e.beginScope=e.scope, + delete e.scope)})(e),"string"==typeof e.beginScope&&(e.beginScope={ + _wrap:e.beginScope}),"string"==typeof e.endScope&&(e.endScope={_wrap:e.endScope + }),(e=>{if(Array.isArray(e.begin)){ + if(e.skip||e.excludeBegin||e.returnBegin)throw K("skip, excludeBegin, returnBegin not compatible with beginScope: {}"), + G + ;if("object"!=typeof e.beginScope||null===e.beginScope)throw K("beginScope must be object"), + G;Z(e,e.begin,{key:"beginScope"}),e.begin=E(e.begin,{joinWith:""})}})(e),(e=>{ + if(Array.isArray(e.end)){ + if(e.skip||e.excludeEnd||e.returnEnd)throw K("skip, excludeEnd, returnEnd not compatible with endScope: {}"), + G + ;if("object"!=typeof e.endScope||null===e.endScope)throw K("endScope must be object"), + G;Z(e,e.end,{key:"endScope"}),e.end=E(e.end,{joinWith:""})}})(e)}function V(e){ + function t(t,n){ + return RegExp(g(t),"m"+(e.case_insensitive?"i":"")+(e.unicodeRegex?"u":"")+(n?"g":"")) + }class n{constructor(){ + this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0} + addRule(e,t){ + t.position=this.position++,this.matchIndexes[this.matchAt]=t,this.regexes.push([t,e]), + this.matchAt+=b(e)+1}compile(){0===this.regexes.length&&(this.exec=()=>null) + ;const e=this.regexes.map((e=>e[1]));this.matcherRe=t(E(e,{joinWith:"|" + }),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex + ;const t=this.matcherRe.exec(e);if(!t)return null + ;const n=t.findIndex(((e,t)=>t>0&&void 0!==e)),i=this.matchIndexes[n] + ;return t.splice(0,n),Object.assign(t,i)}}class i{constructor(){ + this.rules=[],this.multiRegexes=[], + this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){ + if(this.multiRegexes[e])return this.multiRegexes[e];const t=new n + ;return this.rules.slice(e).forEach((([e,n])=>t.addRule(e,n))), + t.compile(),this.multiRegexes[e]=t,t}resumingScanAtSamePosition(){ + return 0!==this.regexIndex}considerAll(){this.regexIndex=0}addRule(e,t){ + this.rules.push([e,t]),"begin"===t.type&&this.count++}exec(e){ + const t=this.getMatcher(this.regexIndex);t.lastIndex=this.lastIndex + ;let n=t.exec(e) + ;if(this.resumingScanAtSamePosition())if(n&&n.index===this.lastIndex);else{ + const t=this.getMatcher(0);t.lastIndex=this.lastIndex+1,n=t.exec(e)} + return n&&(this.regexIndex+=n.position+1, + this.regexIndex===this.count&&this.considerAll()),n}} + if(e.compilerExtensions||(e.compilerExtensions=[]), + e.contains&&e.contains.includes("self"))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.") + ;return e.classNameAliases=r(e.classNameAliases||{}),function n(s,o){const a=s + ;if(s.isCompiled)return a + ;[T,D,F,P].forEach((e=>e(s,o))),e.compilerExtensions.forEach((e=>e(s,o))), + s.__beforeBegin=null,[L,B,H].forEach((e=>e(s,o))),s.isCompiled=!0;let c=null + ;return"object"==typeof s.keywords&&s.keywords.$pattern&&(s.keywords=Object.assign({},s.keywords), + c=s.keywords.$pattern, + delete s.keywords.$pattern),c=c||/\w+/,s.keywords&&(s.keywords=$(s.keywords,e.case_insensitive)), + a.keywordPatternRe=t(c,!0), + o&&(s.begin||(s.begin=/\B|\b/),a.beginRe=t(a.begin),s.end||s.endsWithParent||(s.end=/\B|\b/), + s.end&&(a.endRe=t(a.end)), + a.terminatorEnd=g(a.end)||"",s.endsWithParent&&o.terminatorEnd&&(a.terminatorEnd+=(s.end?"|":"")+o.terminatorEnd)), + s.illegal&&(a.illegalRe=t(s.illegal)), + s.contains||(s.contains=[]),s.contains=[].concat(...s.contains.map((e=>(e=>(e.variants&&!e.cachedVariants&&(e.cachedVariants=e.variants.map((t=>r(e,{ + variants:null},t)))),e.cachedVariants?e.cachedVariants:q(e)?r(e,{ + starts:e.starts?r(e.starts):null + }):Object.isFrozen(e)?r(e):e))("self"===e?s:e)))),s.contains.forEach((e=>{n(e,a) + })),s.starts&&n(s.starts,o),a.matcher=(e=>{const t=new i + ;return e.contains.forEach((e=>t.addRule(e.begin,{rule:e,type:"begin" + }))),e.terminatorEnd&&t.addRule(e.terminatorEnd,{type:"end" + }),e.illegal&&t.addRule(e.illegal,{type:"illegal"}),t})(a),a}(e)}function q(e){ + return!!e&&(e.endsWithParent||q(e.starts))}class J extends Error{ + constructor(e,t){super(e),this.name="HTMLInjectionError",this.html=t}} + const Y=i,Q=r,ee=Symbol("nomatch");var te=(t=>{ + const i=Object.create(null),r=Object.create(null),s=[];let o=!0 + ;const a="Could not find the language '{}', did you forget to load/include a language module?",c={ + disableAutodetect:!0,name:"Plain text",contains:[]};let g={ + ignoreUnescapedHTML:!1,throwUnescapedHTML:!1,noHighlightRe:/^(no-?highlight)$/i, + languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-", + cssSelector:"pre code",languages:null,__emitter:l};function b(e){ + return g.noHighlightRe.test(e)}function m(e,t,n){let i="",r="" + ;"object"==typeof t?(i=e, + n=t.ignoreIllegals,r=t.language):(X("10.7.0","highlight(lang, code, ...args) has been deprecated."), + X("10.7.0","Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"), + r=e,i=t),void 0===n&&(n=!0);const s={code:i,language:r};k("before:highlight",s) + ;const o=s.result?s.result:E(s.language,s.code,n) + ;return o.code=s.code,k("after:highlight",o),o}function E(e,t,r,s){ + const c=Object.create(null);function l(){if(!N.keywords)return void M.addText(S) + ;let e=0;N.keywordPatternRe.lastIndex=0;let t=N.keywordPatternRe.exec(S),n="" + ;for(;t;){n+=S.substring(e,t.index) + ;const r=y.case_insensitive?t[0].toLowerCase():t[0],s=(i=r,N.keywords[i]);if(s){ + const[e,i]=s + ;if(M.addText(n),n="",c[r]=(c[r]||0)+1,c[r]<=7&&(R+=i),e.startsWith("_"))n+=t[0];else{ + const n=y.classNameAliases[e]||e;M.addKeyword(t[0],n)}}else n+=t[0] + ;e=N.keywordPatternRe.lastIndex,t=N.keywordPatternRe.exec(S)}var i + ;n+=S.substring(e),M.addText(n)}function d(){null!=N.subLanguage?(()=>{ + if(""===S)return;let e=null;if("string"==typeof N.subLanguage){ + if(!i[N.subLanguage])return void M.addText(S) + ;e=E(N.subLanguage,S,!0,k[N.subLanguage]),k[N.subLanguage]=e._top + }else e=x(S,N.subLanguage.length?N.subLanguage:null) + ;N.relevance>0&&(R+=e.relevance),M.addSublanguage(e._emitter,e.language) + })():l(),S=""}function u(e,t){let n=1;const i=t.length-1;for(;n<=i;){ + if(!e._emit[n]){n++;continue}const i=y.classNameAliases[e[n]]||e[n],r=t[n] + ;i?M.addKeyword(r,i):(S=r,l(),S=""),n++}}function h(e,t){ + return e.scope&&"string"==typeof e.scope&&M.openNode(y.classNameAliases[e.scope]||e.scope), + e.beginScope&&(e.beginScope._wrap?(M.addKeyword(S,y.classNameAliases[e.beginScope._wrap]||e.beginScope._wrap), + S=""):e.beginScope._multi&&(u(e.beginScope,t),S="")),N=Object.create(e,{parent:{ + value:N}}),N}function p(e,t,i){let r=((e,t)=>{const n=e&&e.exec(t) + ;return n&&0===n.index})(e.endRe,i);if(r){if(e["on:end"]){const i=new n(e) + ;e["on:end"](t,i),i.isMatchIgnored&&(r=!1)}if(r){ + for(;e.endsParent&&e.parent;)e=e.parent;return e}} + if(e.endsWithParent)return p(e.parent,t,i)}function f(e){ + return 0===N.matcher.regexIndex?(S+=e[0],1):(I=!0,0)}function b(e){ + const n=e[0],i=t.substring(e.index),r=p(N,e,i);if(!r)return ee;const s=N + ;N.endScope&&N.endScope._wrap?(d(), + M.addKeyword(n,N.endScope._wrap)):N.endScope&&N.endScope._multi?(d(), + u(N.endScope,e)):s.skip?S+=n:(s.returnEnd||s.excludeEnd||(S+=n), + d(),s.excludeEnd&&(S=n));do{ + N.scope&&M.closeNode(),N.skip||N.subLanguage||(R+=N.relevance),N=N.parent + }while(N!==r.parent);return r.starts&&h(r.starts,e),s.returnEnd?0:n.length} + let m={};function w(i,s){const a=s&&s[0];if(S+=i,null==a)return d(),0 + ;if("begin"===m.type&&"end"===s.type&&m.index===s.index&&""===a){ + if(S+=t.slice(s.index,s.index+1),!o){const t=Error(`0 width match regex (${e})`) + ;throw t.languageName=e,t.badRule=m.rule,t}return 1} + if(m=s,"begin"===s.type)return(e=>{ + const t=e[0],i=e.rule,r=new n(i),s=[i.__beforeBegin,i["on:begin"]] + ;for(const n of s)if(n&&(n(e,r),r.isMatchIgnored))return f(t) + ;return i.skip?S+=t:(i.excludeBegin&&(S+=t), + d(),i.returnBegin||i.excludeBegin||(S=t)),h(i,e),i.returnBegin?0:t.length})(s) + ;if("illegal"===s.type&&!r){ + const e=Error('Illegal lexeme "'+a+'" for mode "'+(N.scope||"<unnamed>")+'"') + ;throw e.mode=N,e}if("end"===s.type){const e=b(s);if(e!==ee)return e} + if("illegal"===s.type&&""===a)return 1 + ;if(A>1e5&&A>3*s.index)throw Error("potential infinite loop, way more iterations than matches") + ;return S+=a,a.length}const y=O(e) + ;if(!y)throw K(a.replace("{}",e)),Error('Unknown language: "'+e+'"') + ;const _=V(y);let v="",N=s||_;const k={},M=new g.__emitter(g);(()=>{const e=[] + ;for(let t=N;t!==y;t=t.parent)t.scope&&e.unshift(t.scope) + ;e.forEach((e=>M.openNode(e)))})();let S="",R=0,j=0,A=0,I=!1;try{ + for(N.matcher.considerAll();;){ + A++,I?I=!1:N.matcher.considerAll(),N.matcher.lastIndex=j + ;const e=N.matcher.exec(t);if(!e)break;const n=w(t.substring(j,e.index),e) + ;j=e.index+n} + return w(t.substring(j)),M.closeAllNodes(),M.finalize(),v=M.toHTML(),{ + language:e,value:v,relevance:R,illegal:!1,_emitter:M,_top:N}}catch(n){ + if(n.message&&n.message.includes("Illegal"))return{language:e,value:Y(t), + illegal:!0,relevance:0,_illegalBy:{message:n.message,index:j, + context:t.slice(j-100,j+100),mode:n.mode,resultSoFar:v},_emitter:M};if(o)return{ + language:e,value:Y(t),illegal:!1,relevance:0,errorRaised:n,_emitter:M,_top:N} + ;throw n}}function x(e,t){t=t||g.languages||Object.keys(i);const n=(e=>{ + const t={value:Y(e),illegal:!1,relevance:0,_top:c,_emitter:new g.__emitter(g)} + ;return t._emitter.addText(e),t})(e),r=t.filter(O).filter(N).map((t=>E(t,e,!1))) + ;r.unshift(n);const s=r.sort(((e,t)=>{ + if(e.relevance!==t.relevance)return t.relevance-e.relevance + ;if(e.language&&t.language){if(O(e.language).supersetOf===t.language)return 1 + ;if(O(t.language).supersetOf===e.language)return-1}return 0})),[o,a]=s,l=o + ;return l.secondBest=a,l}function w(e){let t=null;const n=(e=>{ + let t=e.className+" ";t+=e.parentNode?e.parentNode.className:"" + ;const n=g.languageDetectRe.exec(t);if(n){const t=O(n[1]) + ;return t||(W(a.replace("{}",n[1])), + W("Falling back to no-highlight mode for this block.",e)),t?n[1]:"no-highlight"} + return t.split(/\s+/).find((e=>b(e)||O(e)))})(e);if(b(n))return + ;if(k("before:highlightElement",{el:e,language:n + }),e.children.length>0&&(g.ignoreUnescapedHTML||(console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."), + console.warn("https://github.com/highlightjs/highlight.js/wiki/security"), + console.warn("The element with unescaped HTML:"), + console.warn(e)),g.throwUnescapedHTML))throw new J("One of your code blocks includes unescaped HTML.",e.innerHTML) + ;t=e;const i=t.textContent,s=n?m(i,{language:n,ignoreIllegals:!0}):x(i) + ;e.innerHTML=s.value,((e,t,n)=>{const i=t&&r[t]||n + ;e.classList.add("hljs"),e.classList.add("language-"+i) + })(e,n,s.language),e.result={language:s.language,re:s.relevance, + relevance:s.relevance},s.secondBest&&(e.secondBest={ + language:s.secondBest.language,relevance:s.secondBest.relevance + }),k("after:highlightElement",{el:e,result:s,text:i})}let y=!1;function _(){ + "loading"!==document.readyState?document.querySelectorAll(g.cssSelector).forEach(w):y=!0 + }function O(e){return e=(e||"").toLowerCase(),i[e]||i[r[e]]} + function v(e,{languageName:t}){"string"==typeof e&&(e=[e]),e.forEach((e=>{ + r[e.toLowerCase()]=t}))}function N(e){const t=O(e) + ;return t&&!t.disableAutodetect}function k(e,t){const n=e;s.forEach((e=>{ + e[n]&&e[n](t)}))} + "undefined"!=typeof window&&window.addEventListener&&window.addEventListener("DOMContentLoaded",(()=>{ + y&&_()}),!1),Object.assign(t,{highlight:m,highlightAuto:x,highlightAll:_, + highlightElement:w, + highlightBlock:e=>(X("10.7.0","highlightBlock will be removed entirely in v12.0"), + X("10.7.0","Please use highlightElement now."),w(e)),configure:e=>{g=Q(g,e)}, + initHighlighting:()=>{ + _(),X("10.6.0","initHighlighting() deprecated. Use highlightAll() now.")}, + initHighlightingOnLoad:()=>{ + _(),X("10.6.0","initHighlightingOnLoad() deprecated. Use highlightAll() now.") + },registerLanguage:(e,n)=>{let r=null;try{r=n(t)}catch(t){ + if(K("Language definition for '{}' could not be registered.".replace("{}",e)), + !o)throw t;K(t),r=c} + r.name||(r.name=e),i[e]=r,r.rawDefinition=n.bind(null,t),r.aliases&&v(r.aliases,{ + languageName:e})},unregisterLanguage:e=>{delete i[e] + ;for(const t of Object.keys(r))r[t]===e&&delete r[t]}, + listLanguages:()=>Object.keys(i),getLanguage:O,registerAliases:v, + autoDetection:N,inherit:Q,addPlugin:e=>{(e=>{ + e["before:highlightBlock"]&&!e["before:highlightElement"]&&(e["before:highlightElement"]=t=>{ + e["before:highlightBlock"](Object.assign({block:t.el},t)) + }),e["after:highlightBlock"]&&!e["after:highlightElement"]&&(e["after:highlightElement"]=t=>{ + e["after:highlightBlock"](Object.assign({block:t.el},t))})})(e),s.push(e)} + }),t.debugMode=()=>{o=!1},t.safeMode=()=>{o=!0 + },t.versionString="11.7.0",t.regex={concat:p,lookahead:d,either:f,optional:h, + anyNumberOfTimes:u};for(const t in A)"object"==typeof A[t]&&e.exports(A[t]) + ;return Object.assign(t,A),t})({});return te}() + ;"object"==typeof exports&&"undefined"!=typeof module&&(module.exports=hljs);/*! `xml` grammar compiled for Highlight.js 11.7.0 */ + (()=>{var e=(()=>{"use strict";return e=>{ + const a=e.regex,n=a.concat(/[\p{L}_]/u,a.optional(/[\p{L}0-9_.-]*:/u),/[\p{L}0-9_.-]*/u),s={ + className:"symbol",begin:/&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/},t={begin:/\s/, + contains:[{className:"keyword",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}] + },i=e.inherit(t,{begin:/\(/,end:/\)/}),c=e.inherit(e.APOS_STRING_MODE,{ + className:"string"}),l=e.inherit(e.QUOTE_STRING_MODE,{className:"string"}),r={ + endsWithParent:!0,illegal:/</,relevance:0,contains:[{className:"attr", + begin:/[\p{L}0-9._:-]+/u,relevance:0},{begin:/=\s*/,relevance:0,contains:[{ + className:"string",endsParent:!0,variants:[{begin:/"/,end:/"/,contains:[s]},{ + begin:/'/,end:/'/,contains:[s]},{begin:/[^\s"'=<>`]+/}]}]}]};return{ + name:"HTML, XML", + aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"], + case_insensitive:!0,unicodeRegex:!0,contains:[{className:"meta",begin:/<![a-z]/, + end:/>/,relevance:10,contains:[t,l,c,i,{begin:/\[/,end:/\]/,contains:[{ + className:"meta",begin:/<![a-z]/,end:/>/,contains:[t,i,l,c]}]}] + },e.COMMENT(/<!--/,/-->/,{relevance:10}),{begin:/<!\[CDATA\[/,end:/\]\]>/, + relevance:10},s,{className:"meta",end:/\?>/,variants:[{begin:/<\?xml/, + relevance:10,contains:[l]},{begin:/<\?[a-z][a-z0-9]+/}]},{className:"tag", + begin:/<style(?=\s|>)/,end:/>/,keywords:{name:"style"},contains:[r],starts:{ + end:/<\/style>/,returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag", + begin:/<script(?=\s|>)/,end:/>/,keywords:{name:"script"},contains:[r],starts:{ + end:/<\/script>/,returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{ + className:"tag",begin:/<>|<\/>/},{className:"tag", + begin:a.concat(/</,a.lookahead(a.concat(n,a.either(/\/>/,/>/,/\s/)))), + end:/\/?>/,contains:[{className:"name",begin:n,relevance:0,starts:r}]},{ + className:"tag",begin:a.concat(/<\//,a.lookahead(a.concat(n,/>/))),contains:[{ + className:"name",begin:n,relevance:0},{begin:/>/,relevance:0,endsParent:!0}]}]}} + })();hljs.registerLanguage("xml",e)})(); +</script> \ No newline at end of file diff --git a/static/ejs/partials/scripts/popper.ejs b/static/ejs/partials/scripts/popper.ejs new file mode 100644 index 00000000..cf49068d --- /dev/null +++ b/static/ejs/partials/scripts/popper.ejs @@ -0,0 +1,7 @@ +<script> + /** + * @popperjs/core v2.9.2 - MIT License + */ + +"use strict";!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).Popper={})}(this,(function(e){function t(e){return{width:(e=e.getBoundingClientRect()).width,height:e.height,top:e.top,right:e.right,bottom:e.bottom,left:e.left,x:e.left,y:e.top}}function n(e){return null==e?window:"[object Window]"!==e.toString()?(e=e.ownerDocument)&&e.defaultView||window:e}function o(e){return{scrollLeft:(e=n(e)).pageXOffset,scrollTop:e.pageYOffset}}function r(e){return e instanceof n(e).Element||e instanceof Element}function i(e){return e instanceof n(e).HTMLElement||e instanceof HTMLElement}function a(e){return"undefined"!=typeof ShadowRoot&&(e instanceof n(e).ShadowRoot||e instanceof ShadowRoot)}function s(e){return e?(e.nodeName||"").toLowerCase():null}function f(e){return((r(e)?e.ownerDocument:e.document)||window.document).documentElement}function p(e){return t(f(e)).left+o(e).scrollLeft}function c(e){return n(e).getComputedStyle(e)}function l(e){return e=c(e),/auto|scroll|overlay|hidden/.test(e.overflow+e.overflowY+e.overflowX)}function u(e,r,a){void 0===a&&(a=!1);var c=f(r);e=t(e);var u=i(r),d={scrollLeft:0,scrollTop:0},m={x:0,y:0};return(u||!u&&!a)&&(("body"!==s(r)||l(c))&&(d=r!==n(r)&&i(r)?{scrollLeft:r.scrollLeft,scrollTop:r.scrollTop}:o(r)),i(r)?((m=t(r)).x+=r.clientLeft,m.y+=r.clientTop):c&&(m.x=p(c))),{x:e.left+d.scrollLeft-m.x,y:e.top+d.scrollTop-m.y,width:e.width,height:e.height}}function d(e){var n=t(e),o=e.offsetWidth,r=e.offsetHeight;return 1>=Math.abs(n.width-o)&&(o=n.width),1>=Math.abs(n.height-r)&&(r=n.height),{x:e.offsetLeft,y:e.offsetTop,width:o,height:r}}function m(e){return"html"===s(e)?e:e.assignedSlot||e.parentNode||(a(e)?e.host:null)||f(e)}function h(e){return 0<=["html","body","#document"].indexOf(s(e))?e.ownerDocument.body:i(e)&&l(e)?e:h(m(e))}function v(e,t){var o;void 0===t&&(t=[]);var r=h(e);return e=r===(null==(o=e.ownerDocument)?void 0:o.body),o=n(r),r=e?[o].concat(o.visualViewport||[],l(r)?r:[]):r,t=t.concat(r),e?t:t.concat(v(m(r)))}function g(e){return i(e)&&"fixed"!==c(e).position?e.offsetParent:null}function y(e){for(var t=n(e),o=g(e);o&&0<=["table","td","th"].indexOf(s(o))&&"static"===c(o).position;)o=g(o);if(o&&("html"===s(o)||"body"===s(o)&&"static"===c(o).position))return t;if(!o)e:{if(o=-1!==navigator.userAgent.toLowerCase().indexOf("firefox"),-1===navigator.userAgent.indexOf("Trident")||!i(e)||"fixed"!==c(e).position)for(e=m(e);i(e)&&0>["html","body"].indexOf(s(e));){var r=c(e);if("none"!==r.transform||"none"!==r.perspective||"paint"===r.contain||-1!==["transform","perspective"].indexOf(r.willChange)||o&&"filter"===r.willChange||o&&r.filter&&"none"!==r.filter){o=e;break e}e=e.parentNode}o=null}return o||t}function b(e){function t(e){o.add(e.name),[].concat(e.requires||[],e.requiresIfExists||[]).forEach((function(e){o.has(e)||(e=n.get(e))&&t(e)})),r.push(e)}var n=new Map,o=new Set,r=[];return e.forEach((function(e){n.set(e.name,e)})),e.forEach((function(e){o.has(e.name)||t(e)})),r}function w(e){var t;return function(){return t||(t=new Promise((function(n){Promise.resolve().then((function(){t=void 0,n(e())}))}))),t}}function x(e){return e.split("-")[0]}function O(e,t){var n=t.getRootNode&&t.getRootNode();if(e.contains(t))return!0;if(n&&a(n))do{if(t&&e.isSameNode(t))return!0;t=t.parentNode||t.host}while(t);return!1}function j(e){return Object.assign({},e,{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}function E(e,r){if("viewport"===r){r=n(e);var a=f(e);r=r.visualViewport;var s=a.clientWidth;a=a.clientHeight;var l=0,u=0;r&&(s=r.width,a=r.height,/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||(l=r.offsetLeft,u=r.offsetTop)),e=j(e={width:s,height:a,x:l+p(e),y:u})}else i(r)?((e=t(r)).top+=r.clientTop,e.left+=r.clientLeft,e.bottom=e.top+r.clientHeight,e.right=e.left+r.clientWidth,e.width=r.clientWidth,e.height=r.clientHeight,e.x=e.left,e.y=e.top):(u=f(e),e=f(u),s=o(u),r=null==(a=u.ownerDocument)?void 0:a.body,a=_(e.scrollWidth,e.clientWidth,r?r.scrollWidth:0,r?r.clientWidth:0),l=_(e.scrollHeight,e.clientHeight,r?r.scrollHeight:0,r?r.clientHeight:0),u=-s.scrollLeft+p(u),s=-s.scrollTop,"rtl"===c(r||e).direction&&(u+=_(e.clientWidth,r?r.clientWidth:0)-a),e=j({width:a,height:l,x:u,y:s}));return e}function D(e,t,n){return t="clippingParents"===t?function(e){var t=v(m(e)),n=0<=["absolute","fixed"].indexOf(c(e).position)&&i(e)?y(e):e;return r(n)?t.filter((function(e){return r(e)&&O(e,n)&&"body"!==s(e)})):[]}(e):[].concat(t),(n=(n=[].concat(t,[n])).reduce((function(t,n){return n=E(e,n),t.top=_(n.top,t.top),t.right=U(n.right,t.right),t.bottom=U(n.bottom,t.bottom),t.left=_(n.left,t.left),t}),E(e,n[0]))).width=n.right-n.left,n.height=n.bottom-n.top,n.x=n.left,n.y=n.top,n}function L(e){return 0<=["top","bottom"].indexOf(e)?"x":"y"}function P(e){var t=e.reference,n=e.element,o=(e=e.placement)?x(e):null;e=e?e.split("-")[1]:null;var r=t.x+t.width/2-n.width/2,i=t.y+t.height/2-n.height/2;switch(o){case"top":r={x:r,y:t.y-n.height};break;case"bottom":r={x:r,y:t.y+t.height};break;case"right":r={x:t.x+t.width,y:i};break;case"left":r={x:t.x-n.width,y:i};break;default:r={x:t.x,y:t.y}}if(null!=(o=o?L(o):null))switch(i="y"===o?"height":"width",e){case"start":r[o]-=t[i]/2-n[i]/2;break;case"end":r[o]+=t[i]/2-n[i]/2}return r}function M(e){return Object.assign({},{top:0,right:0,bottom:0,left:0},e)}function k(e,t){return t.reduce((function(t,n){return t[n]=e,t}),{})}function A(e,n){void 0===n&&(n={});var o=n;n=void 0===(n=o.placement)?e.placement:n;var i=o.boundary,a=void 0===i?"clippingParents":i,s=void 0===(i=o.rootBoundary)?"viewport":i;i=void 0===(i=o.elementContext)?"popper":i;var p=o.altBoundary,c=void 0!==p&&p;o=M("number"!=typeof(o=void 0===(o=o.padding)?0:o)?o:k(o,C));var l=e.elements.reference;p=e.rects.popper,a=D(r(c=e.elements[c?"popper"===i?"reference":"popper":i])?c:c.contextElement||f(e.elements.popper),a,s),c=P({reference:s=t(l),element:p,strategy:"absolute",placement:n}),p=j(Object.assign({},p,c)),s="popper"===i?p:s;var u={top:a.top-s.top+o.top,bottom:s.bottom-a.bottom+o.bottom,left:a.left-s.left+o.left,right:s.right-a.right+o.right};if(e=e.modifiersData.offset,"popper"===i&&e){var d=e[n];Object.keys(u).forEach((function(e){var t=0<=["right","bottom"].indexOf(e)?1:-1,n=0<=["top","bottom"].indexOf(e)?"y":"x";u[e]+=d[n]*t}))}return u}function W(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];return!t.some((function(e){return!(e&&"function"==typeof e.getBoundingClientRect)}))}function B(e){void 0===e&&(e={});var t=e.defaultModifiers,n=void 0===t?[]:t,o=void 0===(e=e.defaultOptions)?F:e;return function(e,t,i){function a(){f.forEach((function(e){return e()})),f=[]}void 0===i&&(i=o);var s={placement:"bottom",orderedModifiers:[],options:Object.assign({},F,o),modifiersData:{},elements:{reference:e,popper:t},attributes:{},styles:{}},f=[],p=!1,c={state:s,setOptions:function(i){return a(),s.options=Object.assign({},o,s.options,i),s.scrollParents={reference:r(e)?v(e):e.contextElement?v(e.contextElement):[],popper:v(t)},i=function(e){var t=b(e);return I.reduce((function(e,n){return e.concat(t.filter((function(e){return e.phase===n})))}),[])}(function(e){var t=e.reduce((function(e,t){var n=e[t.name];return e[t.name]=n?Object.assign({},n,t,{options:Object.assign({},n.options,t.options),data:Object.assign({},n.data,t.data)}):t,e}),{});return Object.keys(t).map((function(e){return t[e]}))}([].concat(n,s.options.modifiers))),s.orderedModifiers=i.filter((function(e){return e.enabled})),s.orderedModifiers.forEach((function(e){var t=e.name,n=e.options;n=void 0===n?{}:n,"function"==typeof(e=e.effect)&&(t=e({state:s,name:t,instance:c,options:n}),f.push(t||function(){}))})),c.update()},forceUpdate:function(){if(!p){var e=s.elements,t=e.reference;if(W(t,e=e.popper))for(s.rects={reference:u(t,y(e),"fixed"===s.options.strategy),popper:d(e)},s.reset=!1,s.placement=s.options.placement,s.orderedModifiers.forEach((function(e){return s.modifiersData[e.name]=Object.assign({},e.data)})),t=0;t<s.orderedModifiers.length;t++)if(!0===s.reset)s.reset=!1,t=-1;else{var n=s.orderedModifiers[t];e=n.fn;var o=n.options;o=void 0===o?{}:o,n=n.name,"function"==typeof e&&(s=e({state:s,options:o,name:n,instance:c})||s)}}},update:w((function(){return new Promise((function(e){c.forceUpdate(),e(s)}))})),destroy:function(){a(),p=!0}};return W(e,t)?(c.setOptions(i).then((function(e){!p&&i.onFirstUpdate&&i.onFirstUpdate(e)})),c):c}}function T(e){var t,o=e.popper,r=e.popperRect,i=e.placement,a=e.offsets,s=e.position,p=e.gpuAcceleration,l=e.adaptive;if(!0===(e=e.roundOffsets)){e=a.y;var u=window.devicePixelRatio||1;e={x:z(z(a.x*u)/u)||0,y:z(z(e*u)/u)||0}}else e="function"==typeof e?e(a):a;e=void 0===(e=(u=e).x)?0:e,u=void 0===(u=u.y)?0:u;var d=a.hasOwnProperty("x");a=a.hasOwnProperty("y");var m,h="left",v="top",g=window;if(l){var b=y(o),w="clientHeight",x="clientWidth";b===n(o)&&("static"!==c(b=f(o)).position&&(w="scrollHeight",x="scrollWidth")),"top"===i&&(v="bottom",u-=b[w]-r.height,u*=p?1:-1),"left"===i&&(h="right",e-=b[x]-r.width,e*=p?1:-1)}return o=Object.assign({position:s},l&&J),p?Object.assign({},o,((m={})[v]=a?"0":"",m[h]=d?"0":"",m.transform=2>(g.devicePixelRatio||1)?"translate("+e+"px, "+u+"px)":"translate3d("+e+"px, "+u+"px, 0)",m)):Object.assign({},o,((t={})[v]=a?u+"px":"",t[h]=d?e+"px":"",t.transform="",t))}function H(e){return e.replace(/left|right|bottom|top/g,(function(e){return $[e]}))}function R(e){return e.replace(/start|end/g,(function(e){return ee[e]}))}function S(e,t,n){return void 0===n&&(n={x:0,y:0}),{top:e.top-t.height-n.y,right:e.right-t.width+n.x,bottom:e.bottom-t.height+n.y,left:e.left-t.width-n.x}}function q(e){return["top","right","bottom","left"].some((function(t){return 0<=e[t]}))}var C=["top","bottom","right","left"],N=C.reduce((function(e,t){return e.concat([t+"-start",t+"-end"])}),[]),V=[].concat(C,["auto"]).reduce((function(e,t){return e.concat([t,t+"-start",t+"-end"])}),[]),I="beforeRead read afterRead beforeMain main afterMain beforeWrite write afterWrite".split(" "),_=Math.max,U=Math.min,z=Math.round,F={placement:"bottom",modifiers:[],strategy:"absolute"},X={passive:!0},Y={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(e){var t=e.state,o=e.instance,r=(e=e.options).scroll,i=void 0===r||r,a=void 0===(e=e.resize)||e,s=n(t.elements.popper),f=[].concat(t.scrollParents.reference,t.scrollParents.popper);return i&&f.forEach((function(e){e.addEventListener("scroll",o.update,X)})),a&&s.addEventListener("resize",o.update,X),function(){i&&f.forEach((function(e){e.removeEventListener("scroll",o.update,X)})),a&&s.removeEventListener("resize",o.update,X)}},data:{}},G={name:"popperOffsets",enabled:!0,phase:"read",fn:function(e){var t=e.state;t.modifiersData[e.name]=P({reference:t.rects.reference,element:t.rects.popper,strategy:"absolute",placement:t.placement})},data:{}},J={top:"auto",right:"auto",bottom:"auto",left:"auto"},K={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(e){var t=e.state,n=e.options;e=void 0===(e=n.gpuAcceleration)||e;var o=n.adaptive;o=void 0===o||o,n=void 0===(n=n.roundOffsets)||n,e={placement:x(t.placement),popper:t.elements.popper,popperRect:t.rects.popper,gpuAcceleration:e},null!=t.modifiersData.popperOffsets&&(t.styles.popper=Object.assign({},t.styles.popper,T(Object.assign({},e,{offsets:t.modifiersData.popperOffsets,position:t.options.strategy,adaptive:o,roundOffsets:n})))),null!=t.modifiersData.arrow&&(t.styles.arrow=Object.assign({},t.styles.arrow,T(Object.assign({},e,{offsets:t.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:n})))),t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-placement":t.placement})},data:{}},Q={name:"applyStyles",enabled:!0,phase:"write",fn:function(e){var t=e.state;Object.keys(t.elements).forEach((function(e){var n=t.styles[e]||{},o=t.attributes[e]||{},r=t.elements[e];i(r)&&s(r)&&(Object.assign(r.style,n),Object.keys(o).forEach((function(e){var t=o[e];!1===t?r.removeAttribute(e):r.setAttribute(e,!0===t?"":t)})))}))},effect:function(e){var t=e.state,n={popper:{position:t.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(t.elements.popper.style,n.popper),t.styles=n,t.elements.arrow&&Object.assign(t.elements.arrow.style,n.arrow),function(){Object.keys(t.elements).forEach((function(e){var o=t.elements[e],r=t.attributes[e]||{};e=Object.keys(t.styles.hasOwnProperty(e)?t.styles[e]:n[e]).reduce((function(e,t){return e[t]="",e}),{}),i(o)&&s(o)&&(Object.assign(o.style,e),Object.keys(r).forEach((function(e){o.removeAttribute(e)})))}))}},requires:["computeStyles"]},Z={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(e){var t=e.state,n=e.name,o=void 0===(e=e.options.offset)?[0,0]:e,r=(e=V.reduce((function(e,n){var r=t.rects,i=x(n),a=0<=["left","top"].indexOf(i)?-1:1,s="function"==typeof o?o(Object.assign({},r,{placement:n})):o;return r=(r=s[0])||0,s=((s=s[1])||0)*a,i=0<=["left","right"].indexOf(i)?{x:s,y:r}:{x:r,y:s},e[n]=i,e}),{}))[t.placement],i=r.x;r=r.y,null!=t.modifiersData.popperOffsets&&(t.modifiersData.popperOffsets.x+=i,t.modifiersData.popperOffsets.y+=r),t.modifiersData[n]=e}},$={left:"right",right:"left",bottom:"top",top:"bottom"},ee={start:"end",end:"start"},te={name:"flip",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options;if(e=e.name,!t.modifiersData[e]._skip){var o=n.mainAxis;o=void 0===o||o;var r=n.altAxis;r=void 0===r||r;var i=n.fallbackPlacements,a=n.padding,s=n.boundary,f=n.rootBoundary,p=n.altBoundary,c=n.flipVariations,l=void 0===c||c,u=n.allowedAutoPlacements;c=x(n=t.options.placement),i=i||(c!==n&&l?function(e){if("auto"===x(e))return[];var t=H(e);return[R(e),t,R(t)]}(n):[H(n)]);var d=[n].concat(i).reduce((function(e,n){return e.concat("auto"===x(n)?function(e,t){void 0===t&&(t={});var n=t.boundary,o=t.rootBoundary,r=t.padding,i=t.flipVariations,a=t.allowedAutoPlacements,s=void 0===a?V:a,f=t.placement.split("-")[1];0===(i=(t=f?i?N:N.filter((function(e){return e.split("-")[1]===f})):C).filter((function(e){return 0<=s.indexOf(e)}))).length&&(i=t);var p=i.reduce((function(t,i){return t[i]=A(e,{placement:i,boundary:n,rootBoundary:o,padding:r})[x(i)],t}),{});return Object.keys(p).sort((function(e,t){return p[e]-p[t]}))}(t,{placement:n,boundary:s,rootBoundary:f,padding:a,flipVariations:l,allowedAutoPlacements:u}):n)}),[]);n=t.rects.reference,i=t.rects.popper;var m=new Map;c=!0;for(var h=d[0],v=0;v<d.length;v++){var g=d[v],y=x(g),b="start"===g.split("-")[1],w=0<=["top","bottom"].indexOf(y),O=w?"width":"height",j=A(t,{placement:g,boundary:s,rootBoundary:f,altBoundary:p,padding:a});if(b=w?b?"right":"left":b?"bottom":"top",n[O]>i[O]&&(b=H(b)),O=H(b),w=[],o&&w.push(0>=j[y]),r&&w.push(0>=j[b],0>=j[O]),w.every((function(e){return e}))){h=g,c=!1;break}m.set(g,w)}if(c)for(o=function(e){var t=d.find((function(t){if(t=m.get(t))return t.slice(0,e).every((function(e){return e}))}));if(t)return h=t,"break"},r=l?3:1;0<r&&"break"!==o(r);r--);t.placement!==h&&(t.modifiersData[e]._skip=!0,t.placement=h,t.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}},ne={name:"preventOverflow",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options;e=e.name;var o=n.mainAxis,r=void 0===o||o,i=void 0!==(o=n.altAxis)&&o;o=void 0===(o=n.tether)||o;var a=n.tetherOffset,s=void 0===a?0:a,f=A(t,{boundary:n.boundary,rootBoundary:n.rootBoundary,padding:n.padding,altBoundary:n.altBoundary});n=x(t.placement);var p=t.placement.split("-")[1],c=!p,l=L(n);n="x"===l?"y":"x",a=t.modifiersData.popperOffsets;var u=t.rects.reference,m=t.rects.popper,h="function"==typeof s?s(Object.assign({},t.rects,{placement:t.placement})):s;if(s={x:0,y:0},a){if(r||i){var v="y"===l?"top":"left",g="y"===l?"bottom":"right",b="y"===l?"height":"width",w=a[l],O=a[l]+f[v],j=a[l]-f[g],E=o?-m[b]/2:0,D="start"===p?u[b]:m[b];p="start"===p?-m[b]:-u[b],m=t.elements.arrow,m=o&&m?d(m):{width:0,height:0};var P=t.modifiersData["arrow#persistent"]?t.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0};v=P[v],g=P[g],m=_(0,U(u[b],m[b])),D=c?u[b]/2-E-m-v-h:D-m-v-h,u=c?-u[b]/2+E+m+g+h:p+m+g+h,c=t.elements.arrow&&y(t.elements.arrow),h=t.modifiersData.offset?t.modifiersData.offset[t.placement][l]:0,c=a[l]+D-h-(c?"y"===l?c.clientTop||0:c.clientLeft||0:0),u=a[l]+u-h,r&&(r=o?U(O,c):O,j=o?_(j,u):j,r=_(r,U(w,j)),a[l]=r,s[l]=r-w),i&&(r=(i=a[n])+f["x"===l?"top":"left"],f=i-f["x"===l?"bottom":"right"],r=o?U(r,c):r,o=o?_(f,u):f,o=_(r,U(i,o)),a[n]=o,s[n]=o-i)}t.modifiersData[e]=s}},requiresIfExists:["offset"]},oe={name:"arrow",enabled:!0,phase:"main",fn:function(e){var t,n=e.state,o=e.name,r=e.options,i=n.elements.arrow,a=n.modifiersData.popperOffsets,s=x(n.placement);if(e=L(s),s=0<=["left","right"].indexOf(s)?"height":"width",i&&a){r=M("number"!=typeof(r="function"==typeof(r=r.padding)?r(Object.assign({},n.rects,{placement:n.placement})):r)?r:k(r,C));var f=d(i),p="y"===e?"top":"left",c="y"===e?"bottom":"right",l=n.rects.reference[s]+n.rects.reference[e]-a[e]-n.rects.popper[s];a=a[e]-n.rects.reference[e],a=(i=(i=y(i))?"y"===e?i.clientHeight||0:i.clientWidth||0:0)/2-f[s]/2+(l/2-a/2),s=_(r[p],U(a,i-f[s]-r[c])),n.modifiersData[o]=((t={})[e]=s,t.centerOffset=s-a,t)}},effect:function(e){var t=e.state;if(null!=(e=void 0===(e=e.options.element)?"[data-popper-arrow]":e)){if("string"==typeof e&&!(e=t.elements.popper.querySelector(e)))return;O(t.elements.popper,e)&&(t.elements.arrow=e)}},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]},re={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(e){var t=e.state;e=e.name;var n=t.rects.reference,o=t.rects.popper,r=t.modifiersData.preventOverflow,i=A(t,{elementContext:"reference"}),a=A(t,{altBoundary:!0});n=S(i,n),o=S(a,o,r),r=q(n),a=q(o),t.modifiersData[e]={referenceClippingOffsets:n,popperEscapeOffsets:o,isReferenceHidden:r,hasPopperEscaped:a},t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-reference-hidden":r,"data-popper-escaped":a})}},ie=B({defaultModifiers:[Y,G,K,Q]}),ae=[Y,G,K,Q,Z,te,ne,oe,re],se=B({defaultModifiers:ae});e.applyStyles=Q,e.arrow=oe,e.computeStyles=K,e.createPopper=se,e.createPopperLite=ie,e.defaultModifiers=ae,e.detectOverflow=A,e.eventListeners=Y,e.flip=te,e.hide=re,e.offset=Z,e.popperGenerator=B,e.popperOffsets=G,e.preventOverflow=ne,Object.defineProperty(e,"__esModule",{value:!0})})); +</script> \ No newline at end of file diff --git a/static/ejs/partials/scripts/ruleOffcanvas.ejs b/static/ejs/partials/scripts/ruleOffcanvas.ejs new file mode 100644 index 00000000..dd2a38b7 --- /dev/null +++ b/static/ejs/partials/scripts/ruleOffcanvas.ejs @@ -0,0 +1,412 @@ +<%# functions used to populate content in the rule offcanvas that appears when an item in the +category summary is clicked %> + +<script> + function generateWcagConformanceLinks(conformanceList) { + const wcagConformanceUrls = { + wcag111: 'https://www.w3.org/TR/WCAG21/#non-text-content', + wcag122: 'https://www.w3.org/TR/WCAG21/#captions-prerecorded', + wcag131: 'https://www.w3.org/TR/WCAG21/#info-and-relationships', + wcag135: 'https://www.w3.org/TR/WCAG21/#identify-input-purpose', + wcag141: 'https://www.w3.org/TR/WCAG21/#use-of-color', + wcag142: 'https://www.w3.org/TR/WCAG21/#audio-control', + wcag143: 'https://www.w3.org/TR/WCAG21/#contrast-minimum', + wcag144: 'https://www.w3.org/TR/WCAG21/#resize-text', + wcag1412: 'https://www.w3.org/TR/WCAG21/#text-spacing', + wcag211: 'https://www.w3.org/TR/WCAG21/#keyboard', + wcag221: 'https://www.w3.org/TR/WCAG21/#timing-adjustable', + wcag222: 'https://www.w3.org/TR/WCAG21/#pause-stop-hide', + wcag241: 'https://www.w3.org/TR/WCAG21/#bypass-blocks', + wcag242: 'https://www.w3.org/TR/WCAG21/#page-titled', + wcag244: 'https://www.w3.org/TR/WCAG21/#link-purpose-in-context', + wcag311: 'https://www.w3.org/TR/WCAG21/#language-of-page', + wcag312: 'https://www.w3.org/TR/WCAG21/#language-of-parts', + wcag332: 'https://www.w3.org/TR/WCAG21/#labels-or-instructions', + wcag411: 'https://www.w3.org/TR/WCAG21/#parsing', + wcag412: 'https://www.w3.org/TR/WCAG21/#name-role-value', + }; + + const links = []; + for (let i = 1; i < conformanceList.length; i++) { + const [wcagSection, subSection, ...sectionItem] = conformanceList[i].slice(4); // slice to get rid of 'wcag'; + const formattedConformanceNumber = `${wcagSection}.${subSection}.${sectionItem.join('')}`; + links.push( + `<a href="${ + wcagConformanceUrls[conformanceList[i]] + }" target="_blank">WCAG ${formattedConformanceNumber}</a>`, + ); + } + return links.join('  ,   '); + } + + function expandRule(selectedCategory, selectedRule) { + const conformanceLevels = { + wcag2a: 'Level A', + wcag2aa: 'Level AA', + wcag21aa: 'Level AA', + 'best-practice': 'Best practice', + }; + + document.getElementById('expandedRuleName').innerHTML = htmlEscapeString( + selectedRule.description, + ); + document.getElementById('expandedRuleDescription').innerHTML = whyItMatters[selectedRule.rule]; + document.getElementById('expandedRuleHelpUrl').href = selectedRule.helpUrl; + document.getElementById('expandedRuleConformance').replaceChildren( + createElementFromString(` + <div class="d-flex align-items-center"> + <div aria-label="${ + conformanceLevels[selectedRule.conformance[0]] + }" class="conformance-bubble ${selectedRule.conformance[0]}"></div> + ${ + selectedRule.conformance[0] === 'best-practice' + ? `<span>Best practice</span>` + : generateWcagConformanceLinks(selectedRule.conformance) + } + </div> + `), + ); + + const availableFixCategories = []; + const categorySelectors = []; + + const selectedCategorySelectorSwitcher = (function () { + let selected; + const changeSelected = curCategorySelector => { + if (selected) { + selected.classList.remove('selected'); + } + curCategorySelector.classList.add('selected'); + selected = curCategorySelector; + }; + return changeSelected; + })(); + + Object.keys(scanItems).forEach(category => { + const ruleInCategory = scanItems[category].rules.find(r => r.rule === selectedRule.rule); + + if (ruleInCategory !== undefined) { + if (category !== 'passed') { + availableFixCategories.push(category); + } + const element = createElementFromString(` + <button class="category-selector ${category}"> + <h4 class="d-flex align-items-center category-name">${getFormattedCategoryTitle( + category, + )}</h4> + <span>${ruleInCategory.totalItems} occurrences</span> + </button> + `); + element.addEventListener('click', event => { + selectedCategorySelectorSwitcher(event.currentTarget); + const ruleInfoText = document.getElementById('expandedRuleInfoText'); + if (category === 'mustFix' && availableFixCategories.includes('goodToFix')) { + ruleInfoText.innerHTML = + '<p class="mb-4">There are also occurrences of this issue that falls under "Good to Fix”.</p>'; + } else if (category === 'goodToFix' && availableFixCategories.includes('mustFix')) { + ruleInfoText.innerHTML = + '<p class="mb-4">There are also occurrences of this issue that falls under "Must Fix”.</p>'; + } else if (category === 'passed') { + ruleInfoText.innerHTML = `<p class="mb-4">There are also occurrences of this issue that falls under ${availableFixCategories + .map(c => `"${getFormattedCategoryTitle(c)}"`) + .join(' and ')}.</p>`; + } else { + ruleInfoText.innerHTML = ''; + } + + buildExpandedRuleCategoryContent(category, ruleInCategory); + }); + if (category === selectedCategory) { + element.click(); + } + categorySelectors.push(element); + } + }); + + document.getElementById('expandedRuleCategorySelectors').replaceChildren(...categorySelectors); + } + + function buildExpandedRuleCategoryContent(category, ruleInCategory) { + const contentContainer = document.getElementById('expandedRuleCategoryContent'); + + if (category === 'passed') { + contentContainer.innerHTML = `You may find the list of passed HTML elements in <a href='#' target='_blank'>passed.html</a>.`; + return; + } + + const contentTitle = createElementFromString(` + <h5 class="mb-4"> + Pages with this issue (${ruleInCategory.pagesAffected.length}) + </h5>`); + + const accordions = ruleInCategory.pagesAffected.map((page, index) => { + const accordionId = `${ruleInCategory.rule}-${category}-page-${index}`; + const accordion = createElementFromString(` + <div class="accordion mt-2 ${category}"> + <div class="accordion-item"> + <div class="accordion-header" id="${accordionId}-title"> + <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#${accordionId}-content" aria-expanded="false" aria-controls="${accordionId}-content"> + <div class="me-3">${page.pageTitle}</div> + <div class="ms-auto counter">${page.items.length}</div> + </button> + </div> + <div id="${accordionId}-content" class="accordion-collapse collapse" aria-labelledby="${accordionId}-title"> + <div class="accordion-body p-3"> + <a href="${page.url}" target="_blank">${page.url}</a> + <div class="page-accordion-content-title"> + <span>${getFormattedCategoryTitle(category)} elements</span> + <span class="page-items-count">${page.items.length}</span> + </div> + </div> + </div> + </div> + </div> + `); + + const accordionBody = accordion.getElementsByClassName('accordion-body')[0]; + + page.items.forEach(item => { + const itemCard = createElementFromString(` + <div class="card mt-3"> + ${ + item.needsReview + ? `<div class="needsReview">This occurrence might be a false positive that needs to be verified by a human.</div>` + : `` + } + <div class="p-3"> + <div class="d-flex justify-content-between"> + <div class="fw-bold">HTML element</div> + <pre class="page-item-card-section-content"><code class="language-html">${htmlEscapeString( + item.html, + )}</code></pre> + </div> + <hr /> + <div class="d-flex justify-content-between"> + <div class="fw-bold">${item.needsReview ? 'Details' : 'How to fix'}</div> + <div class="page-item-card-section-content"> + ${generateItemMessageElement(item.needsReview, item.message)} + </div> + </div> + </div> + </div> + `); + + accordionBody.appendChild(itemCard); + }); + + return accordion; + }); + contentContainer.replaceChildren(contentTitle, ...accordions); + hljs.highlightAll(); + } + + function generateItemMessageElement(needsReview, rawMessage) { + const htmlEscapedMessageArray = rawMessage.split('\n ').map(m => htmlEscapeString(m)); + + if (needsReview) { + if (htmlEscapedMessageArray.length === 1) { + return `<p class="mb-0">${htmlEscapedMessageArray[0]}</p>`; + } else { + return `<ul>${htmlEscapedMessageArray.map(m => `<li>${m}</li>`).join('')}</ul>`; + } + } else { + let i = 0; + const elements = []; + + while (i < htmlEscapedMessageArray.length) { + if (htmlEscapedMessageArray[i].startsWith('Fix ')) { + elements.push(`<p class="mb-0">${htmlEscapedMessageArray[i]}</p>`); + i++; + } else { + const fixesList = []; + while ( + i < htmlEscapedMessageArray.length && + !htmlEscapedMessageArray[i].startsWith('Fix a') + ) { + fixesList.push(`<li>${htmlEscapedMessageArray[i]}</li>`); + i++; + } + elements.push(`<ul>${fixesList.join('')}</ul>`); + } + } + + return elements.join(''); + } + } + + const whyItMatters = { + accesskeys: + '<p>\n Specifying a <code>accesskey</code> attribute value for some part of a\n document allows users to quickly activate or move the focus to a specific\n element by pressing the specified key (usually in combination with the\n <code><kbd>alt</kbd></code> key). Duplicating <code>accesskey</code> values\n creates unexpected effects that ultimately make the page less accessible.\n</p>\n<p>\n For each defined <code>accesskey</code>, ensure the value is unique and does\n not conflict with any default browser and screen reader shortcut keys.\n</p>\n<p>\n Content is not operable by keyboard users with no or low vision who cannot use\n devices such as mice that require eye-hand coordination, users who have\n trouble tracking a pointer, or users who must use alternate keyboards or input\n devices acting as keyboard emulators.\n</p>', + 'area-alt': + '<p>\n Screen readers have no way of translating images into words. It is important\n that all images, including image maps, have <code>alt</code> text values.\n</p>\n\n<p>\n Screen readers typically announce the filename of the image if alternative\n text is missing. Filenames do not adequately describe images and are not\n helpful to screen reader users.\n</p>', + 'aria-allowed-attr': + '<p>\n Using ARIA attributes in roles where they are not allowed can interfere with\n the accessibility of the web page. Using an invalid role-attribute combination\n will, at best, result in no effect on the accessibility of the application\n and, at worst, may trigger behavior that disables accessibility for entire\n portions of an application.\n</p>\n<p>\n When ARIA attributes are used on HTML elements that are not in accordance with\n WAI-ARIA 1.1, they conflict with the semantics of the elements which can cause\n assistive technology products report nonsensical user interface (UI)\n information that does not represent the actual UI of the document.\n</p>', + 'aria-command-name': + '<p>\n Screen reader users are not able to discern the purpose of elements with\n <code>role="link"</code>, <code>role="button"</code>, or\n <code>role="menuitem"</code> that do not have an accessible name.\n</p>', + 'aria-dialog-name': + '<p>\n Screen reader users are not able to discern the purpose of elements with\n <code>role="dialog"</code> or <code>role="alertdialog"</code> that do not have\n an accessible name.\n</p>', + 'aria-hidden-focus': + '<p>\n Using the <code>aria-hidden="true"</code> attribute on an element removes the\n element and ALL of its child nodes from the accessibility API making it\n completely inaccessible to screen readers and other assistive technologies.\n Aria-hidden may be used with extreme caution to hide visibly rendered content\n from assistive technologies only if the act of hiding this content is intended\n to improve the experience for users of assistive technologies by removing\n redundant or extraneous content. If aria-hidden is used to hide visible\n content from screen readers, the identical or equivalent meaning and\n functionality must be exposed to assistive technologies.\n</p>\n\n<p>\n <strong>Note:</strong> Using <code>aria-hidden="false"</code> on content that\n is a descendent of an element that is hidden using\n <code>aria-hidden="true"</code> will NOT expose that content to the\n accessibility API and it will not be accessible to screen readers or other\n assistive technologies.\n</p>\n\n<p>\n The rule applies to any element with an\n <code>aria-hidden="true"</code> attribute.\n</p>\n\n<p>\n By adding <code>aria-hidden="true"</code> to an element, content authors\n ensure that assistive technologies will ignore the element. This can be used\n to hide decorative parts of a web page, such as icon fonts - that are not\n meant to be read by assistive technologies.\n</p>\n\n<p>\n A focusable element with <code>aria-hidden="true"</code> is ignored as part of\n the reading order, but still part of the focus order, making it’s state of\n visible or hidden unclear.\n</p>\n\n<ul>\n <li>\n <p>\n <a href="https://www.w3.org/WAI/WCAG21/Understanding/name-role-value.html">https://www.w3.org/WAI/WCAG21/Understanding/name-role-value.html</a>\n </p>\n </li>\n <li>\n <p>\n <a href="https://www.w3.org/TR/wai-aria-1.1/#aria-hidden">https://www.w3.org/TR/wai-aria-1.1/#aria-hidden</a>\n </p>\n </li>\n <li>\n <p>\n <a href="https://www.w3.org/TR/html/editing.html#can-be-focused">https://www.w3.org/TR/html/editing.html#can-be-focused</a>\n </p>\n </li>\n</ul>', + 'aria-input-field-name': + '<p>\n This new rule ensures every ARIA input field has an accessible name.\n Accessible names must exist for the following input field roles:\n</p>\n<ul>\n <li>combobox</li>\n <li>listbox</li>\n <li>searchbox</li>\n <li>slider</li>\n <li>spinbutton</li>\n <li>textbox</li>\n</ul>', + 'aria-meter-name': + '<p>\n Screen reader users are not able to discern the purpose of elements with\n <code>role="meter"</code> that do not have an accessible name.\n</p>', + 'aria-progressbar-name': + '<p>\n Screen reader users are not able to discern the purpose of elements with\n <code>role="progressbar"</code> that do not have an accessible name.\n</p>', + 'aria-required-children': + '<p>\n For each role, WAI-ARIA explicitly defines which child and parent roles are\n allowable and/or required. ARIA <code>role</code>s missing required child\n <code>role</code>s will not be able to perform the accessibility functions\n intended by the developer.\n</p>\n<p>\n Assistive technology needs to convey the context to the user. For example, in\n a <code>treeitem</code>, it is important to know the parent (container), item,\n or siblings in the folder. This can be done in two ways:\n</p>\n<ol>\n <li>\n <strong>Code order or DOM:</strong> The necessary context is often clear\n from the code order or DOM.\n </li>\n <li>\n <strong>ARIA:</strong> ARIA (such as <code>aria-owns</code>) can be used\n provide the relationships when the hierarchy is not the same as the code\n structure or DOM tree.\n </li>\n</ol>', + 'aria-required-parent': + '<p>\n For each role, WAI-ARIA explicitly defines which child and parent roles are\n allowable and/or required. Elements containing ARIA <code>role</code> values\n missing required parent element <code>role</code> values will not enable\n assistive technology to function as intended by the developer.\n</p>\n<p>\n When it is necessary to convey context to the user of assistive technology in\n the form of hierarchy (for example, the importance of a parent container, item\n or sibling in a folder tree), and the hierarchy is not the same as the code\n structure or DOM tree, there is no way to provide the relationship information\n without the use of ARIA role parent elements.\n</p>', + 'aria-roledescription': + "<p>\n Inappropriate <code>aria-roledescription</code> attribute values that conflict\n with an element's implied or explicit <code>role</code> value can interfere\n with the accessibility of the web page. A conflicting\n <code>aria-roledescription</code> attribute value may result in no effect on\n the accessibility of the application and may trigger behavior that disables\n accessibility for entire portions of an application.\n</p>\n<p>\n When <code>aria-roledescription</code>> attributes are applied to HTML\n elements not in accordance with WAI-ARIA 1.1, semantics conflict between the\n <code>aria-roledescription</code> value and the implicit or explicit element\n <code>role</code> value which may result in assistive technology products\n reporting nonsensical user interface (UI) information that does not correctly\n represent the intended UI experience.\n</p>", + 'aria-text': + '<p>\n When a text node is split by markup (e.g.\n <code><h1>Hello <span>World</span></h1></code>)\n VoiceOver will treat it as two separate phrases instead of just one. Adding\n <code>role="text"</code> around the elements solves the problem. However, it\n also overrides the role of the element and all descendants and treats them all\n as text nodes. If one of the descendant elements is also focusable it would\n create an empty tab stop. That is, you could tab to the element but VoiceOver\n would not announce its name, role, or value.\n</p>', + 'aria-toggle-field-name': + '<p>\n Ensures every element with a semantic role also has an accessible name.\n Semantic roles include:\n</p>\n<ul>\n <li>checkbox</li>\n <li>menu</li>\n <li>menuitemcheckbox</li>\n <li>menuitemradio</li>\n <li>radio</li>\n <li>radiogroup</li>\n <li>switch</li>\n</ul>', + 'aria-tooltip-name': + '<p>\n Screen reader users are not able to discern the purpose of elements with\n <code>role="tooltip"</code> that do not have an accessible name.\n</p>', + 'aria-treeitem-name': + '<p>\n Screen reader users are not able to discern the purpose of elements with\n <code>role="treeitem"</code> that do not have an accessible name.\n</p>', + 'aria-valid-attr-value': + '<p>\n ARIA attributes (i.e. starting with <code>aria-</code>) must contain valid\n values. These values must be spelled correctly and correspond to values that\n make sense for a particular attribute to perform the intended accessibility\n function.\n</p>\n\n<p>\n Many ARIA attributes accept a specific set of values. Allowed values,\n acceptable "undefined" values, and acceptable "default" values are required.\n Failure to comply with allowed values results in content that is not\n accessible to assistive technology users.\n</p>', + 'aria-valid-attr': + '<p>\n If the developer uses a non-existent or misspelled ARIA attribute, the\n attribute will not be able to perform the accessibility function intended by\n the developer.\n</p>\n<p>\n In order to allow assistive technologies to convey appropriate information to\n persons with disabilities, user interface elements intended to improve the\n accessibility and interoperability of web and application content must conform\n to properly spelled and current ARIA attributes.\n</p>\n<p>\n When developers do not use attributes defined in the WAI-ARIA 1.1 W3C\n Recommendation, they do not properly convey user interface behaviors and\n structural information to assistive technologies in document-level markup.\n</p>', + 'autocomplete-valid': + '<p>\n Failure to provide autocomplete values in form fields results in inaccessible\n content. Screen readers do not read identified autocomplete form fields if the\n appropriate autocomplete attribute values are missing. Users cannot correctly\n navigate forms when screen readers cannot provide adequate information to the\n user regarding form field interaction requirements.\n</p>', + 'avoid-inline-spacing': + '<p>\n Many people with cognitive disabilities have trouble tracking lines of text\n when a block of text is single spaced. Providing spacing between 1.5 to 2\n allows them to start a new line more easily once they have finished the\n previous one.\n</p>', + blink: + '<p>\n As the name suggests, <code>blink</code> tags cause content to flash. Though\n you may like the effect, blinking text can be difficult to read, and blinking\n objects (links, buttons, etc.) can be difficult to activate, especially for\n users with imprecise or limited dexterity.\n</p>\n<p>\n It can be very difficult for people with visual and cognitive disabilities to\n see and understand text that blinks. Blinking text be distracting, especially\n for users with cognitive disabilities. It can also be difficult for some\n individuals to comprehend. For these reasons, the <code>blink</code> element\n should never be used.\n</p>', + 'definition-list': + '<p>\n Screen readers have a specific way of announcing definition lists. When such\n lists are not properly marked up, this creates the opportunity for confusing\n or inaccurate screen reader output.\n</p>\n<p>\n A definition list is used to provide the definitions of words or phrases. The\n Definition List is marked up using the <code>dl</code> element. Within the\n list, each term is put in a separate <code>dt</code> element, and its\n definition goes in the <code>dd</code> element directly following it.\n</p>', + dlitem: + "<p>\n A definition list item must be wrapped in parent <code>dl</code> elements,\n otherwise it will be invalid.\n</p>\n<p>\n A definition list must follow a specific hierarchy. A list is defined using\n the <code>dl</code> element. What follows are alternating sets of\n <code>dt</code> and <code>dd</code> elements, starting with the\n <code>dt</code> element. <code>dt</code> elements define a term while\n <code>dd</code> elements denote a term's description. Each set of\n <code>dt</code> elements must have a corresponding set of\n <code>dd</code> elements. Only <code>dt</code> and <code>dd</code> elements\n are allowed in definition list. If this hierarchy is not followed, the list\n will be invalid.\n</p>", + 'duplicate-id-active': + '<p>\n The ID attribute uniquely identifies focusable elements on a page. It does not\n make sense to duplicate an active ID.\n</p>\n\n<p>\n Duplicate active ID values break the accessibility of focusable elements\n including labels for forms, table header cells, etc., Screen readers and\n client-side scripts will skip any duplication other than the first instance.\n Validating HTML files help prevent and eliminate possible sources of\n accessibility problems, when not breaking accessibility.\n</p>\n\n<p>\n Those experienced with client-side scripting know that when you re-use an\n active ID, typically the only one that gets acted upon by the scripting is the\n first instance of the use of that active ID. Similarly, assistive technologies\n may, when referencing an active ID, only reference the first one accurately.\n</p>', + 'empty-table-header': + '<p>\n Table header elements should have visible text that describes the purpose of\n the row or column to both sighted users and screen reader users.\n</p>', + 'frame-focusable-content': + '<p>\n When a frame has a negative tabindex, the browser is prevented from\n redirecting the focus to the content inside that frame. This causes all its\n content from getting skipped in keyboard navigation, and if the frame is\n scrollable also prevents the focus from reaching any element from which the\n frame can be scrolled with the keyboard.\n</p>', + 'frame-tested': + '<p>\n Without the axe-core script, it is not possible for the tool to perform\n violation checking on multiple levels of nested iframes.\n</p>', + 'frame-title-unique': + '<p>\n Screen reader users rely on a frame title to describe the contents of the\n <code>frame</code>. Navigating through frames and iframes can quickly become\n difficult and confusing for users of this technology if the frames are not\n marked with a <code>title</code> attribute.\n</p>\n\n<p>\n Screen reader users have the option to pull up a list of titles for all frames\n on a page. Adding descriptive, unique titles allows users to quickly find the\n frame they need. If no titles are present, navigating through frames can\n quickly become difficult and confusing. If no title is listed, screen readers\n will instead give information like “frame,” “javascript,” the filename, or the\n URL. In most cases, this information won’t be very helpful.\n</p>', + 'frame-title': + '<p>\n Screen reader users rely on a frame title to describe the contents of the\n <code>frame</code>. Navigating through <code>frame</code> and\n <code>iframe</code> elements quickly becomes difficult and confusing for users\n of this technology if the markup does not contain a\n <code>title</code> attribute.\n</p>\n\n<p>\n Screen reader users have the option to pull up a list of titles for all frames\n on a page. Adding descriptive, unique titles allows users to quickly find the\n frame they need. If no titles are present, navigating through frames can\n quickly become difficult and confusing. If no title is listed, screen readers\n will instead give information like “frame,” “JavaScript,” the filename, or the\n URL. In most cases, this information won’t be very helpful.\n</p>', + 'html-xml-lang-mismatch': + "<p>\n When configuring a screen reader, users select a default language. If the\n language of a webpage is not specified, the screen reader assumes the default\n language set by the user. Multiple languages are an issue for users who speak\n and access websites in multiple languages. It is essential to specify a\n default language and ensure that it is valid for screen readers to function\n correctly.\n</p>\n<p>\n Screen readers use different sound libraries for each language, based on the\n pronunciation and characteristics of that language. Screen readers can switch\n between language libraries easily, but only if documents specify which\n language(s) should to read. If the language is not specified, screen readers\n read documents in the user's default language, resulting in garbled language.\n It can be challenging to understand anything when screen readers are using the\n wrong language library.\n</p>", + 'image-alt': + "<p>\n Screen readers have no way of translating an image into words that gets read\n to the user, even if the image only consists of text. As a result, it's\n necessary for images to have short, descriptive <code>alt</code> text so\n screen reader users clearly understand the image's contents and purpose.\n</p>\n<p>\n If you can't see, all types of visual information, such as images, are\n completely useless unless a digital text alternative is provided so that\n screen readers can convert that text into either sound or braille. The same is\n true in varying degrees for people with low vision or color-blindness.\n</p>", + 'image-redundant-alt': + '<p>\n It is unnecessary and potentially confusing to have alternative text for a\n link or image to be repeated in text adjacent to the link or image since it\n would be read twice by a screen reader.\n</p>\n\n<p>\n Since image buttons use alt attributes for labels, the labels must not\n duplicate the text next to the button. Duplicated alternative text for an\n image or link in the text adjacent to that image or link results in screen\n readers announcing the text to the user twice.\n</p>', + 'input-button-name': + '<p>\n Screen reader users are not able to discern the purpose of an\n <code>input type="button"</code> without an accessible name.\n</p>\n<p>\n Screen reader users cannot understand the purpose of an image without a\n discernable and accessible textual name. A title for an image may provide only\n advisory information about the image itself. Unnamed actionable graphic images\n such as buttons have no clear description of the destination, purpose,\n function or action for the non-text content when it is intended to be used as\n a control.\n</p>', + 'input-image-alt': + '<p>\n An <code><input type="image"></code> button must have\n alternate text, otherwise screen reader users will not know the button\'s\n purpose. Even if the image contains only text, it still requires alternate\n text, since a screen reader cannot translate images of words into output.\n</p>\n\n<p>\n <strong>Text Alone Is Not A Label</strong>: Just typing text next to the form\n element is not sufficient to create a true label. Assistive technologies like\n screen readers require labels in code that can be determined programmatically.\n Some screen readers are programmed to guess what the label should be, based on\n the surrounding text, but this method is not fool-proof and can lead to\n confusion if the screen reader guesses wrong.\n</p>', + 'landmark-banner-is-top-level': + '<p>\n If the banner landmark is not the top-level landmark (and is contained within\n another landmark), it does not effectively designate the pre-defined header\n portion of the layout in the design and therefore prevents screen reader users\n from being able to easily find their way around the layout.\n</p>\n\n<div class="note">\n <h3>Note</h3>\n <p>\n Landmarks are used to designate sections of the overall page design and\n layout. Headings are used to designate sections within the content.\n </p>\n</div>', + 'landmark-complementary-is-top-level': + '<p>\n Complementary content is ancillary content to the main theme of a document or\n page. Screen reader users have the option to skip over complementary content\n when it appears at the top level of the accessibility API. Embedding an\n <code><aside></code> element in another landmark may disable screen\n reader functionality allowing users to navigate through complementary content.\n</p>', + 'landmark-contentinfo-is-top-level': + "<p>\n The purpose of the <code>contentinfo</code> landmark can be defeated when\n placed within another landmark, as it can prevent blind screen reader users\n from being able to quickly find and navigate to the appropriate landmark.\n</p>\n\n<p>\n When screen reader users have to sort through too much extra information to\n find what they're looking for, such as not being able to quickly figure out\n which landmark contains the content information they're looking for negates\n the purpose of an existing <code>contentinfo</code> landmark.\n</p>", + 'landmark-main-is-top-level': + '<p>\n Navigating a web page is far simpler for screen reader users if the content\n splits between some high-level sections. Content outside of these sections is\n difficult to find, and its purpose may be unclear.\n</p>\n\n<p>\n HTML has historically lacked some key semantic markers, such as the ability to\n designate sections of the page as the header, navigation, main content, and\n footer. Using both HTML5 elements and ARIA landmarks in the same element is\n considered a best practice, but the future probably favors HTML regions as\n browser support increases.\n</p>\n\n<p>\n The HTML Living Standard states "A hierarchically correct main element is one\n whose ancestor elements <em>are limited</em> to <samp><html></samp>,\n <samp><body></samp>, <samp><div></samp>,\n <samp><form</samp> without an accessible name, and autonomous custom\n elements. Each main element must be a hierarchically correct main element."\n This may reflect a "best practice" based on W3C validation.\n</p>', + 'landmark-no-duplicate-banner': + '<p>\n Landmarks allow blind users to navigate and find content quickly. Missing\n landmarks require screen reader users to sort through too much extra\n information to find anything.\n</p>\n<p>\n JAWS, NVDA, and VoiceOver support the ability to navigate to sections of a web\n page using ARIA landmarks. Landmarks provide a more elegant solution to the\n problem of providing a way for users to skip to the main content of the web\n page. There is no visible alteration to the web design, making it unobtrusive\n and invisible. Of course, the fact that this technique is invisible is fine\n for blind screen reader users, but not so fine for sighted keyboard users or\n screen enlarger users with low vision. In this sense, HTML 5 regions and ARIA\n landmarks cannot yet replace the old-fashioned "skip navigation" links.\n Browsers still do not have a built-in way to notify users that HTML 5 regions\n or ARIA landmarks are present. Screen reader users are the only ones who can\n take advantage of them. There is a\n <a href="https://github.com/davidtodd/landmarks" class="external" target="_blank">Firefox ARIA landmark extension\n <img src="/assets/images/template/courses2014/new-window.png" alt="opens in a new window" class="new_window" width="13" height="13"></a>\n available, which adds the ability to navigate by landmarks in Firefox, but\n this is not a native feature of the browser.\n</p>', + 'landmark-no-duplicate-contentinfo': + '<p>\n One of the main purposes of landmarks is to allow blind users to quickly find\n and navigate to the appropriate landmark, so you should keep the total number\n of landmarks relatively low. If you don\'t, screen reader users will have to\n sort through too much extra information to find what they\'re looking for.\n</p>\n<p>\n Despite all of the talk about using correct semantic structure for\n accessibility, HTML has historically lacked some key semantic markers, such as\n the ability to designate sections of the page as the header, navigation, main\n content, and footer. With HTML5, these designations are possible, using the\n new elements <code>header</code>, <code>nav</code>, <code>main</code>, and\n <code>footer</code>. Similar functionality is available using the ARIA\n (Accessible Rich Internet Application) attributes <code>role="banner"</code>,\n <code>role="navigation"</code>, <code>role="main"</code> and\n <code>role="contentinfo"</code>.\n</p>\n\n<p>\n JAWS, NVDA, and VoiceOver support the ability to navigate to sections of a web\n page using ARIA landmarks. Landmarks provide a more elegant solution to the\n problem of providing a way for users to skip to the main content of the web\n page. There is no visible alteration to the web design, making it unobtrusive\n and invisible. Of course, the fact that this technique is invisible is fine\n for blind screen reader users, but not so fine for sighted keyboard users or\n screen enlarger users with low vision. In this sense, HTML 5 regions and ARIA\n landmarks cannot yet replace the old-fashioned "skip navigation" links.\n Browsers still do not have a built-in way to notify users that HTML 5 regions\n or ARIA landmarks are present. Screen reader users are the only ones who can\n take advantage of them. There is a\n <a href="https://github.com/davidtodd/landmarks" class="external" target="_blank">Firefox ARIA landmark extension\n <img src="/assets/images/template/courses2014/new-window.png" alt="opens in a new window" class="new_window" width="13" height="13"></a>\n available, which adds the ability to navigate by landmarks in Firefox, but\n this is not a native feature of the browser.\n</p>', + 'landmark-no-duplicate-main': + '<p>\n Navigating a web page is far simpler for screen reader users if all of the\n content splits between one or more high-level sections. Content outside of\n these sections is difficult to find, and its purpose may be unclear.\n</p>\n\n<p>\n HTML has historically lacked some key semantic markers, such as the ability to\n designate sections of the page as the header, navigation, main content, and\n footer. Using both HTML5 elements and ARIA landmarks in the same element is\n considered a best practice, but the future will favor HTML regions as browser\n support increases.\n</p>', + 'landmark-unique': + '<p>\n <code>landmark-unique</code> is a new best practice rule ensures that\n landmarks have a unique role or accessible name (i.e. role, label, title)\n combination.\n</p>', + list: '<p>\n Screen readers have a specific way of announcing lists. This feature makes\n lists clearer to understand, but will only work if lists are properly\n structured.\n</p>\n<p>\n When content elements other than list items are contained within a set of list\n elements, screen readers cannot inform the listener that they are listening to\n items within the list.\n</p>\n<p>\n For a list to be valid, it must have both parent elements (a set of\n <code>ul</code> elements or a set of <code>ol</code> elements) and child\n elements (declared inside of these tags using the <code>li</code> element),\n and any other content elements are invalid.\n</p>\n<p>\n Although some <em>non-content</em> elements such as script, template, style,\n meta, link, map, area, and datalist are permitted within lists,\n <em>content</em> elements other than <code>li</code> are not permitted.\n</p>', + listitem: + "<p>\n For a list to be valid, it must have both parent and child elements. Parent\n elements can either be a set of <code>ul</code> tags or a set of\n <code>ol</code> tags. Child elements must be declared inside of these tags\n using the <code>li</code> tag.\n</p>\n\n<p>\n Screen readers notify users when they come to a list, and tell them how many\n items are in a list. Announcing the number of items in a list and the current\n list item helps listeners know what they are listening to, and what to expect\n as they listen to it.\n</p>\n\n<p>\n If you don't mark up a list using proper semantic markup in a hierarchy, list\n items cannot inform the listener that they are listening to a list when no\n parent is indicating the presence of a list and the type of list.\n</p>", + marquee: + '<p>\n The <code>marquee</code> element creates scrolling text that is difficult to\n read and click on. Beyond that, it can be distracting to viewers, especially\n to those with low vision, cognitive disabilities, or attention deficits.\n</p>\n<p>\n People with attention deficits or cognitive disabilities could become\n distracted by content that scrolls. If scrolling content contains links,\n people with limited fine motor abilities may not be able to click on the links\n accurately. Users with visual impairments may not be able to see the scrolling\n text with enough acuity to know what the content says.\n</p>', + 'meta-refresh': + '<p>\n Since users do not expect a page to refresh automatically, such refreshing can\n be disorienting. Refreshing also moves the programmatic focus back to the top\n of the page, away from where the user had it. Such resetting is frustrating\n for users.\n</p>\n<p>\n Redirection and page refresh through the use of the\n <code><meta></code> element is problematic for users with disabilities\n in many ways. The primary reason why redirects and refreshes are problematic\n is that the user has no control over when the redirect or refresh occurs. If\n the purpose of the <code><meta></code> element is to redirect the user\n to a new location, server-side means should be employed instead of\n client-side. Content that moves or auto-updates can be a barrier to anyone who\n has trouble reading the stationary text as quickly as well as to anyone who\n has trouble tracking moving objects. It can also cause problems for screen\n readers.\n</p>', + 'object-alt': + '<p>\n Screen readers have no way of translating non-text content into text announced\n to users. Instead, they read out alternative text. For screen reader users to\n obtain the information contained in embedded <code>object</code> elements\n which must contain short, descriptive alternative text.\n</p>\n\n<p>\n The <code>object</code> element defines an embedded object within a document.\n It is used to embed multimedia (audio, video, applets, etcetera.) or another\n web page into the document. The object element needs a text alternative so\n that users of screen readers know the contents of the object.\n</p>\n<p>\n When writing a text alternative, keep in mind that the purpose of the\n alternative text is to relay information to blind users about the image’s\n contents and purpose - blind users should be able to get as much information\n from alternative text as a sighted user gets from the image. Alternative text\n should give the intent, purpose, and meaning of the image.\n</p>\n<p>\n When writing alternative text, it’s helpful to keep the following questions in\n mind:\n</p>\n<ul>\n <li>Why is the non-text content here?</li>\n <li>What information is it presenting?</li>\n <li>What purpose does it fulfill?</li>\n <li>\n If I could not use the non-text content, what words would I use to convey\n the same information or function?\n </li>\n</ul>\n\n<p>\n Be sure that all text contained in this attribute is useful. Words like\n “chart”, “image”, “diagram”, or image file names tend not to be very useful.\n</p>', + 'presentation-role-conflict': + '<p>\n There are certain cases where the semantic role of an element with\n <code>role="none"</code> or <code>role="presentation"</code> does not resolve\n to none or presentation (respectively). When this happens, the element is not\n removed from the accessibility tree (as expected) and screen readers are able\n to interact with it.\n</p>\n<p>\n To ensure the element remains removed from the accessibility tree, you should\n not add any global ARIA attributes to the element or make if focusable.\n</p>', + 'role-img-alt': + "<p>\n Screen readers have no way of translating an image into words that gets read\n to the user, even if the image only consists of text. As a result, it's\n necessary for images to have short, descriptive and accessible alternative\n text so screen reader users clearly understand the image's contents and\n purpose.\n</p>\n<p>\n If you can't see, all types of visual information, including images, are\n completely useless unless an accessible text alternative is provided which\n screen readers can convert into either sound or braille. People with low\n vision or color-blindness disabilities also require accessible alternative\n text to varying degrees.\n</p>\n<p>\n Screen readers cannot convert visual image information to speech or braille in\n the absence of an accessible text alternative associated with the image.\n</p>", + 'scope-attr-valid': + '<p>\n The <code>scope</code> attribute makes table navigation much easier for screen\n reader users, provided that it is used correctly. Incorrectly used,\n <code>scope</code> can make table navigation much harder and less efficient.\n</p>\n\n<p>\n A screen reader operates under the assumption that a table has a header and\n that this header specifies a scope. Because of the way screen readers\n function, having an accurate header makes viewing a table far more accessible\n and more efficient for people who use the device.\n</p>', + 'scrollable-region-focusable': + '<p>\n Checks scrollable content for focusable elements enabling keyboard navigation.\n Keyboard navigation should not fail when focus moves to an element within a\n scrollable region.\n</p>', + 'select-name': + '<p>\n Effective form labels are required to make forms accessible. The purpose of\n form elements such as checkboxes, radio buttons, input fields, etcetera, is\n often apparent to sighted users, even if the form element is not\n programmatically labeled. Screen readers users require useful form labels to\n identify form fields. Adding a label to all form elements eliminates ambiguity\n and contributes to a more accessible product.\n</p>\n<p>\n When labels for form elements are absent, screen reader users do not know the\n input data expectations. Screen readers cannot programmatically determine\n information about input objects without an established label relationship (or\n redundant text serving as a label).\n</p>', + 'server-side-image-map': + '<p>\n Server-side image maps are not keyboard accessible; mouse clicks are required\n to access the links contained in the image, making the image inaccessible to\n people who only use keyboards for their navigation.\n</p>\n\n<p>\n Server side image maps pass the coordinates of the mouse click to the\n server-side script used to process the image map. Because they rely on mouse\n clicks, they are not keyboard accessible, whereas client-side image maps are\n keyboard accessible. Further, it is not possible to provide text alternatives\n to the actionable areas of a server-side image map like you can with the\n <code>area</code>s of a client-side image map.\n</p>', + 'skip-link': + '<p>\n Screen readers announce content sequentially as it appears in the HTML file.\n What this means for users of assistive technology is that the content at the\n top of the page, typically including the entire navigation, is read out to the\n user before reaching any of the main content. Since content at the top of the\n page can often be very lengthy, it can be time-consuming to listen to or tab\n through all of it when the user is only interested in the main content.\n Including a skip link in an HTML page is beneficial to blind users, users with\n low vision, and mouse-only users.\n</p>', + 'svg-img-alt': + '<p>\n The intent of\n <a href="https://www.w3.org/WAI/WCAG21/Understanding/non-text-content">Success Criterion 1.1.1</a>\n is to make information conveyed by non-text content (including SVG images)\n accessible through the use of a text alternative. Text alternatives are a\n primary way for making information accessible because they can be rendered\n through any sensory modality (for example, visual, auditory or tactile) to\n match the needs of the user. Providing text alternatives allows the\n information to be rendered in a variety of ways by a variety of user agents.\n For example, a person who cannot see a picture can have the text alternative\n read aloud using synthesized speech. A person who cannot hear an audio file\n can have the text alternative displayed so that he or she can read it. In the\n future, text alternatives will also allow information to be more easily\n translated into sign language or into a simpler form of the same language.\n</p>', + tabindex: + '<p>\n Using <code>tabindex</code> with a value greater than 0 can create as many\n problems as it solves. It creates an unexpected tab order, which makes the\n page less intuitive and can give the appearance of skipping certain elements\n entirely.\n</p>\n\n<p>\n Here are some of the problems that <code>tabindex</code> (with a value of 1 or\n greater) causes:\n</p>\n<ul>\n <li>\n <strong>Unexpected tab order:</strong> From the perspective of the user,\n <code>tabindex</code> changes the default tab order in unexpected ways,\n possibly causing disorientation.\n </li>\n <li>\n <strong>Items can appear to be skipped entirely:</strong> Items appear in\n the tab order only once. If a user tabs past the <code>tabindex</code> items\n and continues through the rest of the web page, at some point the user\n arrives at the location of the <code>tabindex</code> items, but the tabbing\n process skips over these links, because the user already tabbed through them\n at the beginning of the cycle. Incorrect tab orders are frustrating when\n users are unable access items, and may not know that (s)he needs to cycle\n through the entire set of links on the page to reaccess those links.\n </li>\n <li>\n <strong>All <code>tabindex</code> items are tabbed to before any non-<code>tabindex</code>\n items.</strong>\n If you want to change the tab order of the first items AND of a section\n later in the page, you would need to set the <code>tabindex</code> value for\n every single item through to the end of the modified section. Taken to a bit\n of an extreme, if you have 20 links on a page, and if you set the\n <code>tabindex</code> of one of those links to <code>tabindex="100"</code>,\n the user tabs to that link first, even though there are fewer than 100 links\n on the page. There is no way to modify the tab order of sections later in\n the page unless you manually set the tab order of all the links before that\n section.\n </li>\n</ul>', + 'table-duplicate-name': + '<p>\n Screen readers have a specific way of announcing tables. When tables are not\n properly marked up, this creates the opportunity for confusing or inaccurate\n screen reader output.\n</p>\n<p>\n When tables have summary and caption text that is identical, screen reader\n users can be confused and find it difficult to know the name and purpose of\n the table.\n</p>', + 'td-headers-attr': + "<p>\n Screen readers have a specific way of announcing tables. When tables are not\n properly marked up, this creates the opportunity for confusing or inaccurate\n screen reader output.\n</p>\n<p>\n Sighted users can usually tell at a glance what the table's headers are and\n what their relationship to the data is. For non-sighted users this must be\n done in the markup.\n</p>\n\n<p>\n When a data table is designed with accessibility in mind, the user enters into\n table navigation mode, which allows the user to navigate from cell to cell\n within the table while hearing the screen reader announce the corresponding\n table headers for the data cells. Hearing the table headers is especially\n helpful when navigating through large data tables, or when cells contain\n similar-sounding data that could be easily confused.\n</p>\n\n<p>\n Table navigation mode is not useful, though, if the table lacks accessibility\n features.\n</p>", + 'th-has-data-cells': + '<p>\n Screen readers have a specific way of announcing tables. When tables are not\n properly marked up, this creates the opportunity for confusing or inaccurate\n screen reader output.\n</p>\n<p>\n When tables are not marked up semantically and do not have the correct header\n structure, screen reader users cannot correctly perceive the relationships\n between the cells and their contents visually.\n</p>', + 'valid-lang': + "<p>\n When configuring a screen reader, users select a default language. If the\n language of a webpage is not specified, the screen reader assumes it is the\n default language set by the user. Language selection becomes an issue for\n users who speak multiple languages and access the website in more than one\n language. It is essential to specify a language and ensure that it is valid so\n website text is pronounced correctly.\n</p>\n<p>\n Screen readers use different sound libraries for each language, based on the\n pronunciation and characteristics of that language. Screen readers can switch\n between these language libraries easily, but only if the documents specify\n which language(s) to read. If the language is not specified, the screen reader\n reads the document in the user's default language, resulting in a confusing\n experience!\n</p>", + 'video-caption': + '<p>\n If a video has no caption, deaf users have limited or no access to the\n information contained in it. Even if a captions track is available, ensure\n that it contains all meaningful information in the video, not just dialogue.\n</p>\n<p>\n Deaf viewers can see everything in the video but are not able to hear any of\n it without captions. Without a caption track, deaf viewers do not have a way\n of knowing the dialog, narration, or the essential sounds not spoken by\n people, such as "dramatic instrumental music," applause, screams, or other\n sounds that set the scene, provide context, or give meaning to the video.\n</p>', + 'no-autoplay-audio': + '<p>\n People who are blind or have low vision and use screen reading software can\n find it hard to hear the screen reader\'s speech output if there is other audio\n playing at the same time. If automatically playing audio lasts more than three\n seconds, an easily located, accessible mechanism must be provided to pause or\n stop the audio or control the audio volume. An audio control allows screen\n reader users to hear the screen reader without other sounds playing.\n</p>\n\n<div class="note">\n <h3>Note:</h3>\n <p>\n Playing audio automatically when landing on a page may affect a screen\n reader user\'s ability to find the mechanism to stop it because they navigate\n by listening and automatically started sounds might interfere with that\n navigation. Therefore, we discourage the practice of automatically starting\n sounds (especially if they last more than three seconds), and encourage that\n the sound be started by an action initiated by the user after they reach the\n page, rather than requiring that the sound be stopped by an action of the\n user after they land on the page.\n </p>\n</div>', + 'aria-hidden-body': + '<p>\n When <code><body aria-hidden="true"</code>, content is not\n accessible to assistive technology.\n</p>\n<p>\n Applying <code>aria-hidden="true"</code> to otherwise accessible objects: A\n web page is designed to be fully accessible, and it would be accessible if\n elements do not contain the\n <code>aria-hidden="true"</code> attribute value. Screen readers do\n not read content marked with the\n <code>aria-hidden="true"</code> attribute value. Users can still tab\n to focusable elements in the hidden objects, but screen readers remain silent.\n</p>\n<p>\n Any content or interface elements intentionally hidden from users — e.g.,\n inactive dialogs, collapsed menus — must also be hidden from screen reader\n users. When items are available to sighted users — such as when they activate\n a button or expand a menu item — the same items must be available to screen\n reader users. The goal is to provide screen reader users an equivalent user\n experience to sighted users. If there is a compelling reason to hide content\n from sighted users, there is usually a compelling reason also to hide that\n content from blind users. Further, when content is made available to sighted\n users, it makes sense to make it available to blind users as well.\n</p>', + 'aria-required-attr': + "<p>\n ARIA widget roles require additional attributes that describe the state of the\n widget. The state of the widget is not communicated to screen reader users if\n a required attribute is omitted.\n</p>\n\n<p>\n Certain roles act as composite user interface widgets. As such, they typically\n act as containers that manage other, contained widgets. When an object\n inherits from multiple ancestors and one ancestor indicates support for one\n property while another ancestor indicates that the same property is required,\n the property becomes required on the inheriting object. In some cases, default\n values are sufficient to meet ARIA attribute requirements.\n</p>\n\n<p>\n When required state and property attributes for specific roles (and subclass\n roles) are not present, screen readers may not be able to convey the\n definition of what the element's role is to the users.\n</p>", + bypass: + '<p>\n Since web sites often display secondary, repeated content on multiple pages\n (such as navigation links, heading graphics, and advertising frames),\n keyboard-only users benefit from faster, more direct access to the primary\n content on a page. This reduces keystrokes and minimizes associated physical\n pain.\n</p>\n\n<p>\n For users who cannot use a mouse, navigating with a keyboard is more difficult\n and time-consuming when the interface does not include methods to make\n keyboard navigation easier. For example, to activate a link in the middle of a\n web page, a keyboard user may have to tab through a large number of links and\n buttons in the header and main navigation of the page.\n</p>\n\n<p>\n At the extreme end, users with severe motor limitations might require several\n minutes to tab through all of those elements, and can lead to fatigue and\n possible physical pain for some users. Even users with less severe constraints\n will require longer than mouse users, who can click on the desired link in a\n second or two.\n</p>', + 'color-contrast': + "<p>\n Some people with low vision experience low contrast, meaning that there aren't\n very many bright or dark areas. Everything tends to appear about the same\n brightness, which makes it hard to distinguish outlines, borders, edges, and\n details. Text that is too close in luminance (brightness) to the background\n can be hard to read.\n</p>\n<p>\n There are nearly three times more individuals with low vision than those with\n total blindness. One in twelve people cannot see the average full spectrum of\n colors - about 8% of men and 0.4% of women in the US. A person with low vision\n or color blindness is unable to distinguish text against a background without\n sufficient contrast.\n</p>\n<p>Color transparency and opacity is taken into account in the background.</p>\n<p>\n Color transparency and opacity in the foreground is more difficult to detect\n and account for due to:\n</p>\n<ul>\n <li>1:1 colors in foreground and background.</li>\n <li>CSS background gradients.</li>\n <li>Background colors in CSS pseudo-elements.</li>\n <li>Background colors created with CSS borders.</li>\n <li>\n Overlap by another element in the foreground - this sometimes comes up with\n tricky positioning.\n </li>\n <li>Elements moved outside the viewport via CSS.</li>\n</ul>", + 'document-title': + '<p>\n Screen reader users use page titles to get an overview of the contents of the\n page. Navigating through pages can quickly become difficult and confusing for\n screen reader users if the pages are not marked with a title. The page\n <code>title</code> element is the first thing screen reader users hear when\n first loading a web page.\n</p>\n\n<p>\n The <code>title</code> is the first thing that screen reader users hear when\n they arrive at a page. If there is no <code>title</code> or if the\n <code>title</code> is not descriptive and unique, screen reader users must\n read through the page to determine its contents and purpose.\n</p>', + 'duplicate-id-aria': + "<p>\n Duplicate IDs are common validation errors that may break the accessibility of\n labels, e.g., ARIA elements, form fields, table header cells.\n</p>\n<p>\n Unique ID's differentiate each element from another and prevent invalid\n markup, wherein only the first instance gets acted upon by client-side\n scripting, or where assistive technologies typically only reference the first\n one accurately.\n</p>", + 'duplicate-id': + "<p>\n The ID attribute uniquely identifies elements on a page. It does not make\n sense to duplicate an ID.\n</p>\n\n<p>\n Duplicate ID's can break the accessibility of labels for forms, table header\n cells, etc., by the second instance being skipped by screen readers, or by\n client-side scripts. They are common markup validation errors that can\n eliminate possible sources of accessibility problems, when not breaking\n accessibility.\n</p>\n\n<p>\n Those experienced with client-side scripting know that when you re-use an id,\n typically the only one that gets acted upon by the scripting is the first\n instance of the use of that ID. Similarly, assistive technologies may, when\n referencing an id, only reference the first one accurately.\n</p>", + 'empty-heading': + "<p>\n Screen readers alert users to the presence of a heading tag. If the heading is\n empty or the text cannot be accessed, this could either confuse users or even\n prevent them from accessing information on the page's structure.\n</p>\n\n<p>\n If the text inside a heading cannot be accessed by a screen reader, users of\n this technology will not be able to hear the contents of the heading. Since\n headings relay the structure of a webpage, it's crucial that users of screen\n readers are able to access the contents.\n</p>\n<p>\n Applying heading markup (<code><h1></code> through\n <code>><h6></code>) is a quick way to make text stand out, however,\n using it for anything other than headings will make navigating a web page more\n confusing for users of assistive technology.\n</p>\n<p>\n In addition to making the page more accessible, headings have other benefits,\n since search engines use headings when filtering, ordering, and displaying\n results. Improving the accessibility of your site can also have the effect of\n making your page more findable.\n</p>\n<p>\n In the same way that sighted users can glance at a page and get a sense of its\n contents, users of screen readers can do the same by navigating through\n headings. Well written and properly ordered headings can save users,\n especially those who use screen readers, a lot of time and frustration.\n</p>", + 'form-field-multiple-labels': + '<p>\n Assigning multiple labels to the same form field can cause problems for some\n combinations of screen readers and browsers, and the results are inconsistent\n from one combination to the next. Some combinations will read the first label.\n Some will read the last label. Others will read both labels.\n</p>', + 'heading-order': + '<p>\n The underlying purpose of headers is to convey the structure of the page. For\n sighted users, the same purpose is achieved using different sizes of text.\n Text size, however, is not helpful for users of screen readers, because a\n screen reader identifies a header only if it is properly marked-up. When\n heading elements are applied correctly, the page becomes much easier to\n navigate for screen reader users and sighted users alike.\n</p>\n\n<p>\n In the same way that sighted users can glance at a page and get a sense of its\n contents, users of screen readers can do the same by navigating through\n headings. Well written and properly ordered headings can save users,\n especially those who use screen readers, a lot of time and frustration.\n</p>\n\n<p>\n The purpose of headings is to describe the structure of the webpage, not just\n highlight important text. They should be brief, clear, unique, and marked with\n <code>h1</code> through <code>h6</code> elements applied in hierarchical\n order. All of these qualities make headings valuable tools for screen reader\n users. Similar to the way sighted users can glance at a page and get a sense\n of its contents, screen reader users can navigate through headings. Well\n written and properly ordered headings can save screen reader time and\n frustration.\n</p>\n\n<p>\n In addition to making the page more accessible, headings have other benefits\n since search engines use headings when filtering, ordering, and displaying\n results. Improving the accessibility of your site can also have the effect of\n making your page more findable.\n</p>', + 'html-has-lang': + "<p>\n When configuring a screen reader, users select a default language. If the\n language of a webpage is not specified, the screen reader assumes the default\n language set by the user. Language settings become an issue for users who\n speak multiple languages and access website in more than one language. It is\n essential to specify a language and ensure that it is valid so website text is\n pronounced correctly.\n</p>\n<p>\n Screen readers use different sound libraries for each language, based on the\n pronunciation and characteristics of that language. Screen readers can switch\n between these language libraries easily, but only if the documents specify\n which language(s) to read and when. If the language is not specified, the\n screen reader reads the document in the user's default language, resulting in\n a strange accent! It is impossible to understand anything when screen readers\n are using the wrong language library.\n</p>", + 'html-lang-valid': + "<p>\n When configuring a screen reader, users select a default language. If the\n language of a webpage is not specified, the screen reader assumes the default\n language set by the user. Language settings are an issue for users who speak\n multiple languages and access website in more than one language. It is\n essential to specify a language and ensure that it is valid so website text is\n pronounced correctly.\n</p>\n<p>\n Screen readers use different sound libraries for each language, based on the\n pronunciation and characteristics of that language. Screen readers can switch\n between these language libraries easily, but only if the documents correctly\n specify which language(s) to read. If the language is not specified, the\n screen reader reads the document in the user's default language, resulting in\n a confusing accent! It is impossible to understand anything when screen\n readers are using the wrong language library.\n</p>", + 'label-title-only': + '<p>\n The <code>title</code> and <code>aria-describedby</code> attributes are used\n to provide additional information such as a hint. Hints are exposed to\n accessibility APIs differently than labels and as such, this can cause\n problems with assistive technologies.\n</p>\n\n<p>\n When form inputs such as text entry fields, radio buttons, check boxes, and\n select menus contain no labels other than <code>title</code> and\n <code>aria-describedby</code> attribute values, screen readers interpret the\n content as advisory information only. Labels created by the\n <code>title</code> and <code>aria-describedby</code> values are not sufficient\n to create a true label that can be determined programmatically from the code\n to convey the purpose of the input form element.\n</p>', + 'link-in-text-block': + "<p>\n Some people with low vision experience low contrast, meaning that there aren't\n very many bright or dark areas. Everything tends to appear about the same\n brightness, which makes it hard to distinguish outlines, borders, edges, and\n details. Text that is too close in luminance (brightness) to the background\n can be hard to read.\n</p>\n<p>\n There are nearly three times more individuals with low vision than those with\n total blindness. One person in twelve has a color deficiency - about 8% of men\n and 0.4% of women in the US. A person with low vision or color blindness is\n unable to distinguish text against a background without sufficient contrast.\n</p>\n<p>\n When a sufficient color contrast ratio of 3:1 is not present to distinguish\n link text color from surrounding text color, users with low vision who\n experience low contrast cannot detect visually that the text is intended to\n function as a link.\n</p>", + 'link-name': + '<ul>\n <li>\n <p>\n Inaccessible link elements pose barriers to accessibility, as they are a\n fundamental component of a website.\n </p>\n </li>\n <li>\n <p>\n Users who rely exclusively on a keyboard (and no mouse) to navigate a\n webpage can only click on links that can receive programmatic focus. A\n link that cannot receive programmatic focus is inaccessible to these\n users.\n </p>\n </li>\n\n <li>\n <p>\n Like sighted users, screen reader users need to know where a link is\n pointing. Inner link text provides this information, though it won\'t get\n used if a screen reader can\'t access it.\n </p>\n </li>\n\n <li>\n <p>\n Keyboard users, including visually impaired screen reader users or people\n who cannot use a mouse, can activate only the links and form elements that\n can receive programmatic focus. Any events activated exclusively by other\n types of focus, for example <code>onmouseover</code> events that depend on\n the mouse hover focus, are inaccessible to keyboard users. Only links and\n form elements receive keyboard focus by default. Modify elements that are\n not links or form components to receive focus by adding\n <code>tabindex="0"</code>.\n </p>\n </li>\n</ul>', + 'meta-viewport-large': + '<p>\n The <code>user-scalable="no"</code> parameter inside the\n <code>content</code> attribute of\n <code><meta name="viewport"></code> element disables zooming on a page.\n The <code>maximum-scale</code> parameter limits the amount the user can zoom.\n This is problematic for people with low vision who rely on screen magnifiers\n to properly see the contents of a web page.\n</p>\n\n<p>\n Users with partial vision and low vision often choose to enlarge the fonts on\n their browser to make text on the web easier to read. The browser\'s viewport\n focus is everything visible in the browser window at a given moment. If the\n user maximizes the browser to full size on a high-resolution monitor, the\n viewport focus area is large and may include the entire web page.\n</p>\n<p>\n If the browser window is small, the viewport focus area includes only a small\n part of the web page. The browser\'s viewport focus does not affect the\n programmatic focus. Users can scroll up and down the web page, but the\n programmatic focus does not follow the viewport. The Web Content Accessibility\n Guidelines calls for developers to design pages so that they support resize up\n to 200%; however, it is a best practice to require 5x zoom.\n</p>', + 'meta-viewport': + '<p>\n The <code>user-scalable="no"</code> parameter inside the\n <code>content</code> attribute of\n <code><meta name="viewport"></code> element disables zooming on a page.\n The <code>maximum-scale</code> parameter limits the amount the user can zoom.\n This is problematic for people with low vision who rely on screen magnifiers\n to properly see the contents of a web page.\n</p>\n\n<p>\n Users with partial vision and low vision often choose to enlarge the fonts on\n their browser to make text on the web easier to read. The browser\'s viewport\n focus is everything visible in the browser window at a given moment.\n Maximizing the browser to full size on a high-resolution monitor creates a\n large the viewport focus area and may include the entire web page.\n</p>\n<p>\n If the browser window is small, the viewport focus area only includes a small\n part of the web page. The browser\'s viewport focus does not affect the\n programmatic focus. Users can scroll up and down the web page, but the\n programmatic focus does not follow the viewport. The Web Content Accessibility\n Guidelines calls for developers to design pages so that they support resize up\n to 200%.\n</p>\n<p>\n Ensures that the <code>user-scalable="no"</code> parameter is not present in\n the <code><meta name="viewport"></code> element and the\n <code>maximum-scale</code> parameter is not less than 2.\n</p>', + 'nested-interactive': + '<p>\n Focusable elements with an interactive control ancestor (any element that\n accepts user input such as button or anchor elements) are not announced by\n screen readers and create an empty tab stop. That is, you could tab to the\n element but the screen reader will not announce its name, role, or state.\n</p>', + 'page-has-heading-one': + "<p>\n Screen reader users can use keyboard shortcuts to navigate directly to the\n first <code>h1</code>, which, in principle, should allow them to jump directly\n to the main content of the web page. If there is no <code>h1</code>, or if the\n <code>h1</code> appears somewhere other than at the start of the main content,\n screen reader users must listen to more of the web page to understand its\n structure, wasting valuable time.\n</p>\n\n<p>\n Keep in mind that blind users can't just look at a web page and immediately\n understand its layout the way that a visual user can. Visual users can take in\n much information about the page layout without having to read all of the\n content. Blind users don't have that luxury. Screen readers read linearly,\n which means listening to the entire web page unless there is some other\n convenient way to get a \"glimpse\" of the page's layout and structure. It turns\n out that headings are a way to do that. Screen reader users can use keyboard\n shortcuts to navigate through the heading structure of a document.\n</p>", + region: + "<p>\n Navigating a web page is far simpler for screen reader users if the content\n splits between multiple high-level sections. Content outside of sections is\n difficult to find, and the content's purpose may be unclear.\n</p>\n\n<p>\n Historically, HTML lacked some key semantic markers such as the ability to\n designate sections of the page as the header, navigation, main content, and\n footer. Using both HTML5 elements and ARIA landmarks in the same element is\n considered a best practice, but the future favors using native HTML5 element\n regions as browser support increases.\n</p>", + 'button-name': + '<p>\n Screen reader users are not able to discern the purpose of elements with\n <code>role="link"</code>, <code>role="button"</code>, or\n <code>role="menuitem"</code> that do not have an accessible name.\n</p>', + 'aria-allowed-role': + '<p>\n Intended accessible technology behavior by a developer is not enabled when an\n assigned WAI-ARIA role value is invalid for the parent element.\n</p>\n<p>\n When screen readers and other assistive technologies do not know the role of\n each element on the web page, they are not able to interact with it\n intelligently, nor are they able to communicate the role to the user. When the\n value for a role is invalid, there is no way to communicate the element\'s\n features, properties, and methods to assistive technologies. For example,\n applying <code>role="table"</code> to a <code><ul></code> effectively\n hijacks the default semantics associated with the\n <code><ul></code> element in a way that screenreaders do not expect\n resulting in unexpected behavior.\n</p>', + 'aria-roles': + "<p>\n Elements assigned invalid ARIA role values are not interpreted by assistive\n technology as intended by the developer.\n</p>\n<p>\n When screen readers and other assistive technologies do not know the role of\n each element on the web page, they are not able to interact with it\n intelligently, nor are they able to communicate the role to the user. An\n element's features, properties, and methods of conveying information to and/or\n from the user can't be communicated via assistive technologies when a role\n value is invalid.\n</p>", + label: + '<p>\n Effective form labels are required to make forms accessible. The purpose of\n form elements such as checkboxes, radio buttons, input fields, etcetera, is\n often apparent to sighted users, even if the form element is not\n programmatically labeled. Screen readers users require useful form labels to\n identify form fields. Adding a label to all form elements eliminates ambiguity\n and contributes to a more accessible product.\n</p>\n<p>\n When labels for form elements are absent, screen reader users do not know the\n input data expectations. Screen readers cannot programmatically determine\n information about input objects without an established label relationship (or\n redundant text serving as a label).\n</p>\n<p>\n The absence of labels prevent fields from receiving focus when read by screen\n readers, and users with impaired motor control do not get the benefit of a\n larger clickable area for the control since clicking the label activates the\n control.\n</p>', + 'landmark-one-main': + '<p>\n Navigating a web page is far simpler for screen reader users if all of the\n content splits between one or more high-level sections. Content outside of\n these sections is difficult to find, and its purpose may be unclear.\n</p>\n\n<p>\n HTML has historically lacked some key semantic markers, such as the ability to\n designate sections of the page as the header, navigation, main content, and\n footer. Using both HTML5 elements and ARIA landmarks in the same element is\n considered a best practice, but the future will favor HTML regions as browser\n support increases.\n</p>', + }; +</script> diff --git a/static/ejs/partials/scripts/utils.ejs b/static/ejs/partials/scripts/utils.ejs new file mode 100644 index 00000000..a6205e54 --- /dev/null +++ b/static/ejs/partials/scripts/utils.ejs @@ -0,0 +1,22 @@ +<%# utility functions %> +<script> + function createElementFromString(htmlString) { + const tempContainer = document.createElement('div'); + tempContainer.innerHTML = htmlString.trim(); + return tempContainer.firstChild; + } + + function getFormattedCategoryTitle(category) { + const titles = { + mustFix: 'Must Fix', + goodToFix: 'Good to Fix', + passed: 'Passed', + }; + + return titles[category]; + } + + function htmlEscapeString(string) { + return string.replaceAll('<', '<'); + } +</script> diff --git a/static/ejs/partials/styles/bootstrap.ejs b/static/ejs/partials/styles/bootstrap.ejs new file mode 100644 index 00000000..d821c30f --- /dev/null +++ b/static/ejs/partials/styles/bootstrap.ejs @@ -0,0 +1,12375 @@ +<style> + @charset "UTF-8"; + /*! + * Bootstrap v5.3.0-alpha3 (https://getbootstrap.com/) + * Copyright 2011-2023 The Bootstrap Authors + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ + :root, + [data-bs-theme='light'] { + --bs-blue: #0d6efd; + --bs-indigo: #6610f2; + --bs-purple: #6f42c1; + --bs-pink: #d63384; + --bs-red: #dc3545; + --bs-orange: #fd7e14; + --bs-yellow: #ffc107; + --bs-green: #198754; + --bs-teal: #20c997; + --bs-cyan: #0dcaf0; + --bs-black: #000; + --bs-white: #fff; + --bs-gray: #6c757d; + --bs-gray-dark: #343a40; + --bs-gray-100: #f8f9fa; + --bs-gray-200: #e9ecef; + --bs-gray-300: #dee2e6; + --bs-gray-400: #ced4da; + --bs-gray-500: #adb5bd; + --bs-gray-600: #6c757d; + --bs-gray-700: #495057; + --bs-gray-800: #343a40; + --bs-gray-900: #212529; + --bs-primary: #0d6efd; + --bs-secondary: #6c757d; + --bs-success: #198754; + --bs-info: #0dcaf0; + --bs-warning: #ffc107; + --bs-danger: #dc3545; + --bs-light: #f8f9fa; + --bs-dark: #212529; + --bs-primary-rgb: 13, 110, 253; + --bs-secondary-rgb: 108, 117, 125; + --bs-success-rgb: 25, 135, 84; + --bs-info-rgb: 13, 202, 240; + --bs-warning-rgb: 255, 193, 7; + --bs-danger-rgb: 220, 53, 69; + --bs-light-rgb: 248, 249, 250; + --bs-dark-rgb: 33, 37, 41; + --bs-primary-text-emphasis: #052c65; + --bs-secondary-text-emphasis: #2b2f32; + --bs-success-text-emphasis: #0a3622; + --bs-info-text-emphasis: #055160; + --bs-warning-text-emphasis: #664d03; + --bs-danger-text-emphasis: #58151c; + --bs-light-text-emphasis: #495057; + --bs-dark-text-emphasis: #495057; + --bs-primary-bg-subtle: #cfe2ff; + --bs-secondary-bg-subtle: #e2e3e5; + --bs-success-bg-subtle: #d1e7dd; + --bs-info-bg-subtle: #cff4fc; + --bs-warning-bg-subtle: #fff3cd; + --bs-danger-bg-subtle: #f8d7da; + --bs-light-bg-subtle: #fcfcfd; + --bs-dark-bg-subtle: #ced4da; + --bs-primary-border-subtle: #9ec5fe; + --bs-secondary-border-subtle: #c4c8cb; + --bs-success-border-subtle: #a3cfbb; + --bs-info-border-subtle: #9eeaf9; + --bs-warning-border-subtle: #ffe69c; + --bs-danger-border-subtle: #f1aeb5; + --bs-light-border-subtle: #e9ecef; + --bs-dark-border-subtle: #adb5bd; + --bs-white-rgb: 255, 255, 255; + --bs-black-rgb: 0, 0, 0; + --bs-font-sans-serif: system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', + 'Noto Sans', 'Liberation Sans', Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', + 'Segoe UI Symbol', 'Noto Color Emoji'; + --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', + monospace; + --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0)); + --bs-body-font-family: var(--bs-font-sans-serif); + --bs-body-font-size: 1rem; + --bs-body-font-weight: 400; + --bs-body-line-height: 1.5; + --bs-body-color: #212529; + --bs-body-color-rgb: 33, 37, 41; + --bs-body-bg: #fff; + --bs-body-bg-rgb: 255, 255, 255; + --bs-emphasis-color: #000; + --bs-emphasis-color-rgb: 0, 0, 0; + --bs-secondary-color: rgba(33, 37, 41, 0.75); + --bs-secondary-color-rgb: 33, 37, 41; + --bs-secondary-bg: #e9ecef; + --bs-secondary-bg-rgb: 233, 236, 239; + --bs-tertiary-color: rgba(33, 37, 41, 0.5); + --bs-tertiary-color-rgb: 33, 37, 41; + --bs-tertiary-bg: #f8f9fa; + --bs-tertiary-bg-rgb: 248, 249, 250; + --bs-link-color: #0d6efd; + --bs-link-color-rgb: 13, 110, 253; + --bs-link-decoration: underline; + --bs-link-hover-color: #0a58ca; + --bs-link-hover-color-rgb: 10, 88, 202; + --bs-code-color: #d63384; + --bs-highlight-bg: #fff3cd; + --bs-border-width: 1px; + --bs-border-style: solid; + --bs-border-color: #dee2e6; + --bs-border-color-translucent: rgba(0, 0, 0, 0.175); + --bs-border-radius: 0.375rem; + --bs-border-radius-sm: 0.25rem; + --bs-border-radius-lg: 0.5rem; + --bs-border-radius-xl: 1rem; + --bs-border-radius-xxl: 2rem; + --bs-border-radius-2xl: var(--bs-border-radius-xxl); + --bs-border-radius-pill: 50rem; + --bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15); + --bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075); + --bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175); + --bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075); + --bs-focus-ring-width: 0.25rem; + --bs-focus-ring-opacity: 0.25; + --bs-focus-ring-color: rgba(13, 110, 253, 0.25); + --bs-form-valid-color: #198754; + --bs-form-valid-border-color: #198754; + --bs-form-invalid-color: #dc3545; + --bs-form-invalid-border-color: #dc3545; + } + + [data-bs-theme='dark'] { + color-scheme: dark; + --bs-body-color: #adb5bd; + --bs-body-color-rgb: 173, 181, 189; + --bs-body-bg: #212529; + --bs-body-bg-rgb: 33, 37, 41; + --bs-emphasis-color: #fff; + --bs-emphasis-color-rgb: 255, 255, 255; + --bs-secondary-color: rgba(173, 181, 189, 0.75); + --bs-secondary-color-rgb: 173, 181, 189; + --bs-secondary-bg: #343a40; + --bs-secondary-bg-rgb: 52, 58, 64; + --bs-tertiary-color: rgba(173, 181, 189, 0.5); + --bs-tertiary-color-rgb: 173, 181, 189; + --bs-tertiary-bg: #2b3035; + --bs-tertiary-bg-rgb: 43, 48, 53; + --bs-primary-text-emphasis: #6ea8fe; + --bs-secondary-text-emphasis: #a7acb1; + --bs-success-text-emphasis: #75b798; + --bs-info-text-emphasis: #6edff6; + --bs-warning-text-emphasis: #ffda6a; + --bs-danger-text-emphasis: #ea868f; + --bs-light-text-emphasis: #f8f9fa; + --bs-dark-text-emphasis: #dee2e6; + --bs-primary-bg-subtle: #031633; + --bs-secondary-bg-subtle: #161719; + --bs-success-bg-subtle: #051b11; + --bs-info-bg-subtle: #032830; + --bs-warning-bg-subtle: #332701; + --bs-danger-bg-subtle: #2c0b0e; + --bs-light-bg-subtle: #343a40; + --bs-dark-bg-subtle: #1a1d20; + --bs-primary-border-subtle: #084298; + --bs-secondary-border-subtle: #41464b; + --bs-success-border-subtle: #0f5132; + --bs-info-border-subtle: #087990; + --bs-warning-border-subtle: #997404; + --bs-danger-border-subtle: #842029; + --bs-light-border-subtle: #495057; + --bs-dark-border-subtle: #343a40; + --bs-link-color: #6ea8fe; + --bs-link-hover-color: #8bb9fe; + --bs-link-color-rgb: 110, 168, 254; + --bs-link-hover-color-rgb: 139, 185, 254; + --bs-code-color: #e685b5; + --bs-border-color: #495057; + --bs-border-color-translucent: rgba(255, 255, 255, 0.15); + --bs-form-valid-color: #75b798; + --bs-form-valid-border-color: #75b798; + --bs-form-invalid-color: #ea868f; + --bs-form-invalid-border-color: #ea868f; + } + + *, + *::before, + *::after { + box-sizing: border-box; + } + + @media (prefers-reduced-motion: no-preference) { + :root { + scroll-behavior: smooth; + } + } + + body { + margin: 0; + font-family: var(--bs-body-font-family); + font-size: var(--bs-body-font-size); + font-weight: var(--bs-body-font-weight); + line-height: var(--bs-body-line-height); + color: var(--bs-body-color); + text-align: var(--bs-body-text-align); + background-color: var(--bs-body-bg); + -webkit-text-size-adjust: 100%; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + } + + hr { + margin: 1rem 0; + color: inherit; + border: 0; + border-top: var(--bs-border-width) solid; + opacity: 0.25; + } + + h6, + .h6, + h5, + .h5, + h4, + .h4, + h3, + .h3, + h2, + .h2, + h1, + .h1 { + margin-top: 0; + margin-bottom: 0.5rem; + font-weight: 500; + line-height: 1.2; + color: var(--bs-heading-color, inherit); + } + + h1, + .h1 { + font-size: calc(1.375rem + 1.5vw); + } + @media (min-width: 1200px) { + h1, + .h1 { + font-size: 2.5rem; + } + } + + h2, + .h2 { + font-size: calc(1.325rem + 0.9vw); + } + @media (min-width: 1200px) { + h2, + .h2 { + font-size: 2rem; + } + } + + h3, + .h3 { + font-size: calc(1.3rem + 0.6vw); + } + @media (min-width: 1200px) { + h3, + .h3 { + font-size: 1.75rem; + } + } + + h4, + .h4 { + font-size: calc(1.275rem + 0.3vw); + } + @media (min-width: 1200px) { + h4, + .h4 { + font-size: 1.5rem; + } + } + + h5, + .h5 { + font-size: 1.25rem; + } + + h6, + .h6 { + font-size: 1rem; + } + + p { + margin-top: 0; + margin-bottom: 1rem; + } + + abbr[title] { + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; + cursor: help; + -webkit-text-decoration-skip-ink: none; + text-decoration-skip-ink: none; + } + + address { + margin-bottom: 1rem; + font-style: normal; + line-height: inherit; + } + + ol, + ul { + padding-left: 2rem; + } + + ol, + ul, + dl { + margin-top: 0; + margin-bottom: 1rem; + } + + ol ol, + ul ul, + ol ul, + ul ol { + margin-bottom: 0; + } + + dt { + font-weight: 700; + } + + dd { + margin-bottom: 0.5rem; + margin-left: 0; + } + + blockquote { + margin: 0 0 1rem; + } + + b, + strong { + font-weight: bolder; + } + + small, + .small { + font-size: 0.875em; + } + + mark, + .mark { + padding: 0.1875em; + background-color: var(--bs-highlight-bg); + } + + sub, + sup { + position: relative; + font-size: 0.75em; + line-height: 0; + vertical-align: baseline; + } + + sub { + bottom: -0.25em; + } + + sup { + top: -0.5em; + } + + a { + color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1)); + text-decoration: underline; + } + a:hover { + --bs-link-color-rgb: var(--bs-link-hover-color-rgb); + } + + a:not([href]):not([class]), + a:not([href]):not([class]):hover { + color: inherit; + text-decoration: none; + } + + pre, + code, + kbd, + samp { + font-family: var(--bs-font-monospace); + font-size: 1em; + } + + pre { + display: block; + margin-top: 0; + margin-bottom: 1rem; + overflow: auto; + font-size: 0.875em; + } + pre code { + font-size: inherit; + color: inherit; + word-break: normal; + } + + code { + font-size: 0.875em; + color: var(--bs-code-color); + word-wrap: break-word; + } + a > code { + color: inherit; + } + + kbd { + padding: 0.1875rem 0.375rem; + font-size: 0.875em; + color: var(--bs-body-bg); + background-color: var(--bs-body-color); + border-radius: 0.25rem; + } + kbd kbd { + padding: 0; + font-size: 1em; + } + + figure { + margin: 0 0 1rem; + } + + img, + svg { + vertical-align: middle; + } + + table { + caption-side: bottom; + border-collapse: collapse; + } + + caption { + padding-top: 0.5rem; + padding-bottom: 0.5rem; + color: var(--bs-secondary-color); + text-align: left; + } + + th { + text-align: inherit; + text-align: -webkit-match-parent; + } + + thead, + tbody, + tfoot, + tr, + td, + th { + border-color: inherit; + border-style: solid; + border-width: 0; + } + + label { + display: inline-block; + } + + button { + border-radius: 0; + } + + button:focus:not(:focus-visible) { + outline: 0; + } + + input, + button, + select, + optgroup, + textarea { + margin: 0; + font-family: inherit; + font-size: inherit; + line-height: inherit; + } + + button, + select { + text-transform: none; + } + + [role='button'] { + cursor: pointer; + } + + select { + word-wrap: normal; + } + select:disabled { + opacity: 1; + } + + [list]:not([type='date']):not([type='datetime-local']):not([type='month']):not([type='week']):not( + [type='time'] + )::-webkit-calendar-picker-indicator { + display: none !important; + } + + button, + [type='button'], + [type='reset'], + [type='submit'] { + -webkit-appearance: button; + } + button:not(:disabled), + [type='button']:not(:disabled), + [type='reset']:not(:disabled), + [type='submit']:not(:disabled) { + cursor: pointer; + } + + ::-moz-focus-inner { + padding: 0; + border-style: none; + } + + textarea { + resize: vertical; + } + + fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; + } + + legend { + float: left; + width: 100%; + padding: 0; + margin-bottom: 0.5rem; + font-size: calc(1.275rem + 0.3vw); + line-height: inherit; + } + @media (min-width: 1200px) { + legend { + font-size: 1.5rem; + } + } + legend + * { + clear: left; + } + + ::-webkit-datetime-edit-fields-wrapper, + ::-webkit-datetime-edit-text, + ::-webkit-datetime-edit-minute, + ::-webkit-datetime-edit-hour-field, + ::-webkit-datetime-edit-day-field, + ::-webkit-datetime-edit-month-field, + ::-webkit-datetime-edit-year-field { + padding: 0; + } + + ::-webkit-inner-spin-button { + height: auto; + } + + [type='search'] { + outline-offset: -2px; + -webkit-appearance: textfield; + } + + /* rtl:raw: +[type="tel"], +[type="url"], +[type="email"], +[type="number"] { + direction: ltr; +} +*/ + ::-webkit-search-decoration { + -webkit-appearance: none; + } + + ::-webkit-color-swatch-wrapper { + padding: 0; + } + + ::-webkit-file-upload-button { + font: inherit; + -webkit-appearance: button; + } + + ::file-selector-button { + font: inherit; + -webkit-appearance: button; + } + + output { + display: inline-block; + } + + iframe { + border: 0; + } + + summary { + display: list-item; + cursor: pointer; + } + + progress { + vertical-align: baseline; + } + + [hidden] { + display: none !important; + } + + .lead { + font-size: 1.25rem; + font-weight: 300; + } + + .display-1 { + font-size: calc(1.625rem + 4.5vw); + font-weight: 300; + line-height: 1.2; + } + @media (min-width: 1200px) { + .display-1 { + font-size: 5rem; + } + } + + .display-2 { + font-size: calc(1.575rem + 3.9vw); + font-weight: 300; + line-height: 1.2; + } + @media (min-width: 1200px) { + .display-2 { + font-size: 4.5rem; + } + } + + .display-3 { + font-size: calc(1.525rem + 3.3vw); + font-weight: 300; + line-height: 1.2; + } + @media (min-width: 1200px) { + .display-3 { + font-size: 4rem; + } + } + + .display-4 { + font-size: calc(1.475rem + 2.7vw); + font-weight: 300; + line-height: 1.2; + } + @media (min-width: 1200px) { + .display-4 { + font-size: 3.5rem; + } + } + + .display-5 { + font-size: calc(1.425rem + 2.1vw); + font-weight: 300; + line-height: 1.2; + } + @media (min-width: 1200px) { + .display-5 { + font-size: 3rem; + } + } + + .display-6 { + font-size: calc(1.375rem + 1.5vw); + font-weight: 300; + line-height: 1.2; + } + @media (min-width: 1200px) { + .display-6 { + font-size: 2.5rem; + } + } + + .list-unstyled { + padding-left: 0; + list-style: none; + } + + .list-inline { + padding-left: 0; + list-style: none; + } + + .list-inline-item { + display: inline-block; + } + .list-inline-item:not(:last-child) { + margin-right: 0.5rem; + } + + .initialism { + font-size: 0.875em; + text-transform: uppercase; + } + + .blockquote { + margin-bottom: 1rem; + font-size: 1.25rem; + } + .blockquote > :last-child { + margin-bottom: 0; + } + + .blockquote-footer { + margin-top: -1rem; + margin-bottom: 1rem; + font-size: 0.875em; + color: #6c757d; + } + .blockquote-footer::before { + content: '— '; + } + + .img-fluid { + max-width: 100%; + height: auto; + } + + .img-thumbnail { + padding: 0.25rem; + background-color: var(--bs-body-bg); + border: var(--bs-border-width) solid var(--bs-border-color); + border-radius: var(--bs-border-radius); + max-width: 100%; + height: auto; + } + + .figure { + display: inline-block; + } + + .figure-img { + margin-bottom: 0.5rem; + line-height: 1; + } + + .figure-caption { + font-size: 0.875em; + color: var(--bs-secondary-color); + } + + .container, + .container-fluid, + .container-xxl, + .container-xl, + .container-lg, + .container-md, + .container-sm { + --bs-gutter-x: 1.5rem; + --bs-gutter-y: 0; + width: 100%; + padding-right: calc(var(--bs-gutter-x) * 0.5); + padding-left: calc(var(--bs-gutter-x) * 0.5); + margin-right: auto; + margin-left: auto; + } + + @media (min-width: 576px) { + .container-sm, + .container { + max-width: 540px; + } + } + @media (min-width: 768px) { + .container-md, + .container-sm, + .container { + max-width: 720px; + } + } + @media (min-width: 992px) { + .container-lg, + .container-md, + .container-sm, + .container { + max-width: 960px; + } + } + @media (min-width: 1200px) { + .container-xl, + .container-lg, + .container-md, + .container-sm, + .container { + max-width: 1140px; + } + } + @media (min-width: 1400px) { + .container-xxl, + .container-xl, + .container-lg, + .container-md, + .container-sm, + .container { + max-width: 1320px; + } + } + :root { + --bs-breakpoint-xs: 0; + --bs-breakpoint-sm: 576px; + --bs-breakpoint-md: 768px; + --bs-breakpoint-lg: 992px; + --bs-breakpoint-xl: 1200px; + --bs-breakpoint-xxl: 1400px; + } + + .row { + --bs-gutter-x: 1.5rem; + --bs-gutter-y: 0; + display: flex; + flex-wrap: wrap; + margin-top: calc(-1 * var(--bs-gutter-y)); + margin-right: calc(-0.5 * var(--bs-gutter-x)); + margin-left: calc(-0.5 * var(--bs-gutter-x)); + } + .row > * { + flex-shrink: 0; + width: 100%; + max-width: 100%; + padding-right: calc(var(--bs-gutter-x) * 0.5); + padding-left: calc(var(--bs-gutter-x) * 0.5); + margin-top: var(--bs-gutter-y); + } + + .col { + flex: 1 0 0%; + } + + .row-cols-auto > * { + flex: 0 0 auto; + width: auto; + } + + .row-cols-1 > * { + flex: 0 0 auto; + width: 100%; + } + + .row-cols-2 > * { + flex: 0 0 auto; + width: 50%; + } + + .row-cols-3 > * { + flex: 0 0 auto; + width: 33.3333333333%; + } + + .row-cols-4 > * { + flex: 0 0 auto; + width: 25%; + } + + .row-cols-5 > * { + flex: 0 0 auto; + width: 20%; + } + + .row-cols-6 > * { + flex: 0 0 auto; + width: 16.6666666667%; + } + + .col-auto { + flex: 0 0 auto; + width: auto; + } + + .col-1 { + flex: 0 0 auto; + width: 8.33333333%; + } + + .col-2 { + flex: 0 0 auto; + width: 16.66666667%; + } + + .col-3 { + flex: 0 0 auto; + width: 25%; + } + + .col-4 { + flex: 0 0 auto; + width: 33.33333333%; + } + + .col-5 { + flex: 0 0 auto; + width: 41.66666667%; + } + + .col-6 { + flex: 0 0 auto; + width: 50%; + } + + .col-7 { + flex: 0 0 auto; + width: 58.33333333%; + } + + .col-8 { + flex: 0 0 auto; + width: 66.66666667%; + } + + .col-9 { + flex: 0 0 auto; + width: 75%; + } + + .col-10 { + flex: 0 0 auto; + width: 83.33333333%; + } + + .col-11 { + flex: 0 0 auto; + width: 91.66666667%; + } + + .col-12 { + flex: 0 0 auto; + width: 100%; + } + + .offset-1 { + margin-left: 8.33333333%; + } + + .offset-2 { + margin-left: 16.66666667%; + } + + .offset-3 { + margin-left: 25%; + } + + .offset-4 { + margin-left: 33.33333333%; + } + + .offset-5 { + margin-left: 41.66666667%; + } + + .offset-6 { + margin-left: 50%; + } + + .offset-7 { + margin-left: 58.33333333%; + } + + .offset-8 { + margin-left: 66.66666667%; + } + + .offset-9 { + margin-left: 75%; + } + + .offset-10 { + margin-left: 83.33333333%; + } + + .offset-11 { + margin-left: 91.66666667%; + } + + .g-0, + .gx-0 { + --bs-gutter-x: 0; + } + + .g-0, + .gy-0 { + --bs-gutter-y: 0; + } + + .g-1, + .gx-1 { + --bs-gutter-x: 0.25rem; + } + + .g-1, + .gy-1 { + --bs-gutter-y: 0.25rem; + } + + .g-2, + .gx-2 { + --bs-gutter-x: 0.5rem; + } + + .g-2, + .gy-2 { + --bs-gutter-y: 0.5rem; + } + + .g-3, + .gx-3 { + --bs-gutter-x: 1rem; + } + + .g-3, + .gy-3 { + --bs-gutter-y: 1rem; + } + + .g-4, + .gx-4 { + --bs-gutter-x: 1.5rem; + } + + .g-4, + .gy-4 { + --bs-gutter-y: 1.5rem; + } + + .g-5, + .gx-5 { + --bs-gutter-x: 3rem; + } + + .g-5, + .gy-5 { + --bs-gutter-y: 3rem; + } + + @media (min-width: 576px) { + .col-sm { + flex: 1 0 0%; + } + .row-cols-sm-auto > * { + flex: 0 0 auto; + width: auto; + } + .row-cols-sm-1 > * { + flex: 0 0 auto; + width: 100%; + } + .row-cols-sm-2 > * { + flex: 0 0 auto; + width: 50%; + } + .row-cols-sm-3 > * { + flex: 0 0 auto; + width: 33.3333333333%; + } + .row-cols-sm-4 > * { + flex: 0 0 auto; + width: 25%; + } + .row-cols-sm-5 > * { + flex: 0 0 auto; + width: 20%; + } + .row-cols-sm-6 > * { + flex: 0 0 auto; + width: 16.6666666667%; + } + .col-sm-auto { + flex: 0 0 auto; + width: auto; + } + .col-sm-1 { + flex: 0 0 auto; + width: 8.33333333%; + } + .col-sm-2 { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-sm-3 { + flex: 0 0 auto; + width: 25%; + } + .col-sm-4 { + flex: 0 0 auto; + width: 33.33333333%; + } + .col-sm-5 { + flex: 0 0 auto; + width: 41.66666667%; + } + .col-sm-6 { + flex: 0 0 auto; + width: 50%; + } + .col-sm-7 { + flex: 0 0 auto; + width: 58.33333333%; + } + .col-sm-8 { + flex: 0 0 auto; + width: 66.66666667%; + } + .col-sm-9 { + flex: 0 0 auto; + width: 75%; + } + .col-sm-10 { + flex: 0 0 auto; + width: 83.33333333%; + } + .col-sm-11 { + flex: 0 0 auto; + width: 91.66666667%; + } + .col-sm-12 { + flex: 0 0 auto; + width: 100%; + } + .offset-sm-0 { + margin-left: 0; + } + .offset-sm-1 { + margin-left: 8.33333333%; + } + .offset-sm-2 { + margin-left: 16.66666667%; + } + .offset-sm-3 { + margin-left: 25%; + } + .offset-sm-4 { + margin-left: 33.33333333%; + } + .offset-sm-5 { + margin-left: 41.66666667%; + } + .offset-sm-6 { + margin-left: 50%; + } + .offset-sm-7 { + margin-left: 58.33333333%; + } + .offset-sm-8 { + margin-left: 66.66666667%; + } + .offset-sm-9 { + margin-left: 75%; + } + .offset-sm-10 { + margin-left: 83.33333333%; + } + .offset-sm-11 { + margin-left: 91.66666667%; + } + .g-sm-0, + .gx-sm-0 { + --bs-gutter-x: 0; + } + .g-sm-0, + .gy-sm-0 { + --bs-gutter-y: 0; + } + .g-sm-1, + .gx-sm-1 { + --bs-gutter-x: 0.25rem; + } + .g-sm-1, + .gy-sm-1 { + --bs-gutter-y: 0.25rem; + } + .g-sm-2, + .gx-sm-2 { + --bs-gutter-x: 0.5rem; + } + .g-sm-2, + .gy-sm-2 { + --bs-gutter-y: 0.5rem; + } + .g-sm-3, + .gx-sm-3 { + --bs-gutter-x: 1rem; + } + .g-sm-3, + .gy-sm-3 { + --bs-gutter-y: 1rem; + } + .g-sm-4, + .gx-sm-4 { + --bs-gutter-x: 1.5rem; + } + .g-sm-4, + .gy-sm-4 { + --bs-gutter-y: 1.5rem; + } + .g-sm-5, + .gx-sm-5 { + --bs-gutter-x: 3rem; + } + .g-sm-5, + .gy-sm-5 { + --bs-gutter-y: 3rem; + } + } + @media (min-width: 768px) { + .col-md { + flex: 1 0 0%; + } + .row-cols-md-auto > * { + flex: 0 0 auto; + width: auto; + } + .row-cols-md-1 > * { + flex: 0 0 auto; + width: 100%; + } + .row-cols-md-2 > * { + flex: 0 0 auto; + width: 50%; + } + .row-cols-md-3 > * { + flex: 0 0 auto; + width: 33.3333333333%; + } + .row-cols-md-4 > * { + flex: 0 0 auto; + width: 25%; + } + .row-cols-md-5 > * { + flex: 0 0 auto; + width: 20%; + } + .row-cols-md-6 > * { + flex: 0 0 auto; + width: 16.6666666667%; + } + .col-md-auto { + flex: 0 0 auto; + width: auto; + } + .col-md-1 { + flex: 0 0 auto; + width: 8.33333333%; + } + .col-md-2 { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-md-3 { + flex: 0 0 auto; + width: 25%; + } + .col-md-4 { + flex: 0 0 auto; + width: 33.33333333%; + } + .col-md-5 { + flex: 0 0 auto; + width: 41.66666667%; + } + .col-md-6 { + flex: 0 0 auto; + width: 50%; + } + .col-md-7 { + flex: 0 0 auto; + width: 58.33333333%; + } + .col-md-8 { + flex: 0 0 auto; + width: 66.66666667%; + } + .col-md-9 { + flex: 0 0 auto; + width: 75%; + } + .col-md-10 { + flex: 0 0 auto; + width: 83.33333333%; + } + .col-md-11 { + flex: 0 0 auto; + width: 91.66666667%; + } + .col-md-12 { + flex: 0 0 auto; + width: 100%; + } + .offset-md-0 { + margin-left: 0; + } + .offset-md-1 { + margin-left: 8.33333333%; + } + .offset-md-2 { + margin-left: 16.66666667%; + } + .offset-md-3 { + margin-left: 25%; + } + .offset-md-4 { + margin-left: 33.33333333%; + } + .offset-md-5 { + margin-left: 41.66666667%; + } + .offset-md-6 { + margin-left: 50%; + } + .offset-md-7 { + margin-left: 58.33333333%; + } + .offset-md-8 { + margin-left: 66.66666667%; + } + .offset-md-9 { + margin-left: 75%; + } + .offset-md-10 { + margin-left: 83.33333333%; + } + .offset-md-11 { + margin-left: 91.66666667%; + } + .g-md-0, + .gx-md-0 { + --bs-gutter-x: 0; + } + .g-md-0, + .gy-md-0 { + --bs-gutter-y: 0; + } + .g-md-1, + .gx-md-1 { + --bs-gutter-x: 0.25rem; + } + .g-md-1, + .gy-md-1 { + --bs-gutter-y: 0.25rem; + } + .g-md-2, + .gx-md-2 { + --bs-gutter-x: 0.5rem; + } + .g-md-2, + .gy-md-2 { + --bs-gutter-y: 0.5rem; + } + .g-md-3, + .gx-md-3 { + --bs-gutter-x: 1rem; + } + .g-md-3, + .gy-md-3 { + --bs-gutter-y: 1rem; + } + .g-md-4, + .gx-md-4 { + --bs-gutter-x: 1.5rem; + } + .g-md-4, + .gy-md-4 { + --bs-gutter-y: 1.5rem; + } + .g-md-5, + .gx-md-5 { + --bs-gutter-x: 3rem; + } + .g-md-5, + .gy-md-5 { + --bs-gutter-y: 3rem; + } + } + @media (min-width: 992px) { + .col-lg { + flex: 1 0 0%; + } + .row-cols-lg-auto > * { + flex: 0 0 auto; + width: auto; + } + .row-cols-lg-1 > * { + flex: 0 0 auto; + width: 100%; + } + .row-cols-lg-2 > * { + flex: 0 0 auto; + width: 50%; + } + .row-cols-lg-3 > * { + flex: 0 0 auto; + width: 33.3333333333%; + } + .row-cols-lg-4 > * { + flex: 0 0 auto; + width: 25%; + } + .row-cols-lg-5 > * { + flex: 0 0 auto; + width: 20%; + } + .row-cols-lg-6 > * { + flex: 0 0 auto; + width: 16.6666666667%; + } + .col-lg-auto { + flex: 0 0 auto; + width: auto; + } + .col-lg-1 { + flex: 0 0 auto; + width: 8.33333333%; + } + .col-lg-2 { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-lg-3 { + flex: 0 0 auto; + width: 25%; + } + .col-lg-4 { + flex: 0 0 auto; + width: 33.33333333%; + } + .col-lg-5 { + flex: 0 0 auto; + width: 41.66666667%; + } + .col-lg-6 { + flex: 0 0 auto; + width: 50%; + } + .col-lg-7 { + flex: 0 0 auto; + width: 58.33333333%; + } + .col-lg-8 { + flex: 0 0 auto; + width: 66.66666667%; + } + .col-lg-9 { + flex: 0 0 auto; + width: 75%; + } + .col-lg-10 { + flex: 0 0 auto; + width: 83.33333333%; + } + .col-lg-11 { + flex: 0 0 auto; + width: 91.66666667%; + } + .col-lg-12 { + flex: 0 0 auto; + width: 100%; + } + .offset-lg-0 { + margin-left: 0; + } + .offset-lg-1 { + margin-left: 8.33333333%; + } + .offset-lg-2 { + margin-left: 16.66666667%; + } + .offset-lg-3 { + margin-left: 25%; + } + .offset-lg-4 { + margin-left: 33.33333333%; + } + .offset-lg-5 { + margin-left: 41.66666667%; + } + .offset-lg-6 { + margin-left: 50%; + } + .offset-lg-7 { + margin-left: 58.33333333%; + } + .offset-lg-8 { + margin-left: 66.66666667%; + } + .offset-lg-9 { + margin-left: 75%; + } + .offset-lg-10 { + margin-left: 83.33333333%; + } + .offset-lg-11 { + margin-left: 91.66666667%; + } + .g-lg-0, + .gx-lg-0 { + --bs-gutter-x: 0; + } + .g-lg-0, + .gy-lg-0 { + --bs-gutter-y: 0; + } + .g-lg-1, + .gx-lg-1 { + --bs-gutter-x: 0.25rem; + } + .g-lg-1, + .gy-lg-1 { + --bs-gutter-y: 0.25rem; + } + .g-lg-2, + .gx-lg-2 { + --bs-gutter-x: 0.5rem; + } + .g-lg-2, + .gy-lg-2 { + --bs-gutter-y: 0.5rem; + } + .g-lg-3, + .gx-lg-3 { + --bs-gutter-x: 1rem; + } + .g-lg-3, + .gy-lg-3 { + --bs-gutter-y: 1rem; + } + .g-lg-4, + .gx-lg-4 { + --bs-gutter-x: 1.5rem; + } + .g-lg-4, + .gy-lg-4 { + --bs-gutter-y: 1.5rem; + } + .g-lg-5, + .gx-lg-5 { + --bs-gutter-x: 3rem; + } + .g-lg-5, + .gy-lg-5 { + --bs-gutter-y: 3rem; + } + } + @media (min-width: 1200px) { + .col-xl { + flex: 1 0 0%; + } + .row-cols-xl-auto > * { + flex: 0 0 auto; + width: auto; + } + .row-cols-xl-1 > * { + flex: 0 0 auto; + width: 100%; + } + .row-cols-xl-2 > * { + flex: 0 0 auto; + width: 50%; + } + .row-cols-xl-3 > * { + flex: 0 0 auto; + width: 33.3333333333%; + } + .row-cols-xl-4 > * { + flex: 0 0 auto; + width: 25%; + } + .row-cols-xl-5 > * { + flex: 0 0 auto; + width: 20%; + } + .row-cols-xl-6 > * { + flex: 0 0 auto; + width: 16.6666666667%; + } + .col-xl-auto { + flex: 0 0 auto; + width: auto; + } + .col-xl-1 { + flex: 0 0 auto; + width: 8.33333333%; + } + .col-xl-2 { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-xl-3 { + flex: 0 0 auto; + width: 25%; + } + .col-xl-4 { + flex: 0 0 auto; + width: 33.33333333%; + } + .col-xl-5 { + flex: 0 0 auto; + width: 41.66666667%; + } + .col-xl-6 { + flex: 0 0 auto; + width: 50%; + } + .col-xl-7 { + flex: 0 0 auto; + width: 58.33333333%; + } + .col-xl-8 { + flex: 0 0 auto; + width: 66.66666667%; + } + .col-xl-9 { + flex: 0 0 auto; + width: 75%; + } + .col-xl-10 { + flex: 0 0 auto; + width: 83.33333333%; + } + .col-xl-11 { + flex: 0 0 auto; + width: 91.66666667%; + } + .col-xl-12 { + flex: 0 0 auto; + width: 100%; + } + .offset-xl-0 { + margin-left: 0; + } + .offset-xl-1 { + margin-left: 8.33333333%; + } + .offset-xl-2 { + margin-left: 16.66666667%; + } + .offset-xl-3 { + margin-left: 25%; + } + .offset-xl-4 { + margin-left: 33.33333333%; + } + .offset-xl-5 { + margin-left: 41.66666667%; + } + .offset-xl-6 { + margin-left: 50%; + } + .offset-xl-7 { + margin-left: 58.33333333%; + } + .offset-xl-8 { + margin-left: 66.66666667%; + } + .offset-xl-9 { + margin-left: 75%; + } + .offset-xl-10 { + margin-left: 83.33333333%; + } + .offset-xl-11 { + margin-left: 91.66666667%; + } + .g-xl-0, + .gx-xl-0 { + --bs-gutter-x: 0; + } + .g-xl-0, + .gy-xl-0 { + --bs-gutter-y: 0; + } + .g-xl-1, + .gx-xl-1 { + --bs-gutter-x: 0.25rem; + } + .g-xl-1, + .gy-xl-1 { + --bs-gutter-y: 0.25rem; + } + .g-xl-2, + .gx-xl-2 { + --bs-gutter-x: 0.5rem; + } + .g-xl-2, + .gy-xl-2 { + --bs-gutter-y: 0.5rem; + } + .g-xl-3, + .gx-xl-3 { + --bs-gutter-x: 1rem; + } + .g-xl-3, + .gy-xl-3 { + --bs-gutter-y: 1rem; + } + .g-xl-4, + .gx-xl-4 { + --bs-gutter-x: 1.5rem; + } + .g-xl-4, + .gy-xl-4 { + --bs-gutter-y: 1.5rem; + } + .g-xl-5, + .gx-xl-5 { + --bs-gutter-x: 3rem; + } + .g-xl-5, + .gy-xl-5 { + --bs-gutter-y: 3rem; + } + } + @media (min-width: 1400px) { + .col-xxl { + flex: 1 0 0%; + } + .row-cols-xxl-auto > * { + flex: 0 0 auto; + width: auto; + } + .row-cols-xxl-1 > * { + flex: 0 0 auto; + width: 100%; + } + .row-cols-xxl-2 > * { + flex: 0 0 auto; + width: 50%; + } + .row-cols-xxl-3 > * { + flex: 0 0 auto; + width: 33.3333333333%; + } + .row-cols-xxl-4 > * { + flex: 0 0 auto; + width: 25%; + } + .row-cols-xxl-5 > * { + flex: 0 0 auto; + width: 20%; + } + .row-cols-xxl-6 > * { + flex: 0 0 auto; + width: 16.6666666667%; + } + .col-xxl-auto { + flex: 0 0 auto; + width: auto; + } + .col-xxl-1 { + flex: 0 0 auto; + width: 8.33333333%; + } + .col-xxl-2 { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-xxl-3 { + flex: 0 0 auto; + width: 25%; + } + .col-xxl-4 { + flex: 0 0 auto; + width: 33.33333333%; + } + .col-xxl-5 { + flex: 0 0 auto; + width: 41.66666667%; + } + .col-xxl-6 { + flex: 0 0 auto; + width: 50%; + } + .col-xxl-7 { + flex: 0 0 auto; + width: 58.33333333%; + } + .col-xxl-8 { + flex: 0 0 auto; + width: 66.66666667%; + } + .col-xxl-9 { + flex: 0 0 auto; + width: 75%; + } + .col-xxl-10 { + flex: 0 0 auto; + width: 83.33333333%; + } + .col-xxl-11 { + flex: 0 0 auto; + width: 91.66666667%; + } + .col-xxl-12 { + flex: 0 0 auto; + width: 100%; + } + .offset-xxl-0 { + margin-left: 0; + } + .offset-xxl-1 { + margin-left: 8.33333333%; + } + .offset-xxl-2 { + margin-left: 16.66666667%; + } + .offset-xxl-3 { + margin-left: 25%; + } + .offset-xxl-4 { + margin-left: 33.33333333%; + } + .offset-xxl-5 { + margin-left: 41.66666667%; + } + .offset-xxl-6 { + margin-left: 50%; + } + .offset-xxl-7 { + margin-left: 58.33333333%; + } + .offset-xxl-8 { + margin-left: 66.66666667%; + } + .offset-xxl-9 { + margin-left: 75%; + } + .offset-xxl-10 { + margin-left: 83.33333333%; + } + .offset-xxl-11 { + margin-left: 91.66666667%; + } + .g-xxl-0, + .gx-xxl-0 { + --bs-gutter-x: 0; + } + .g-xxl-0, + .gy-xxl-0 { + --bs-gutter-y: 0; + } + .g-xxl-1, + .gx-xxl-1 { + --bs-gutter-x: 0.25rem; + } + .g-xxl-1, + .gy-xxl-1 { + --bs-gutter-y: 0.25rem; + } + .g-xxl-2, + .gx-xxl-2 { + --bs-gutter-x: 0.5rem; + } + .g-xxl-2, + .gy-xxl-2 { + --bs-gutter-y: 0.5rem; + } + .g-xxl-3, + .gx-xxl-3 { + --bs-gutter-x: 1rem; + } + .g-xxl-3, + .gy-xxl-3 { + --bs-gutter-y: 1rem; + } + .g-xxl-4, + .gx-xxl-4 { + --bs-gutter-x: 1.5rem; + } + .g-xxl-4, + .gy-xxl-4 { + --bs-gutter-y: 1.5rem; + } + .g-xxl-5, + .gx-xxl-5 { + --bs-gutter-x: 3rem; + } + .g-xxl-5, + .gy-xxl-5 { + --bs-gutter-y: 3rem; + } + } + .table { + --bs-table-color: var(--bs-body-color); + --bs-table-bg: transparent; + --bs-table-border-color: var(--bs-border-color); + --bs-table-accent-bg: transparent; + --bs-table-striped-color: var(--bs-body-color); + --bs-table-striped-bg: rgba(0, 0, 0, 0.05); + --bs-table-active-color: var(--bs-body-color); + --bs-table-active-bg: rgba(0, 0, 0, 0.1); + --bs-table-hover-color: var(--bs-body-color); + --bs-table-hover-bg: rgba(0, 0, 0, 0.075); + width: 100%; + margin-bottom: 1rem; + color: var(--bs-table-color); + vertical-align: top; + border-color: var(--bs-table-border-color); + } + .table > :not(caption) > * > * { + padding: 0.5rem 0.5rem; + background-color: var(--bs-table-bg); + border-bottom-width: var(--bs-border-width); + box-shadow: inset 0 0 0 9999px var(--bs-table-accent-bg); + } + .table > tbody { + vertical-align: inherit; + } + .table > thead { + vertical-align: bottom; + } + + .table-group-divider { + border-top: calc(var(--bs-border-width) * 2) solid currentcolor; + } + + .caption-top { + caption-side: top; + } + + .table-sm > :not(caption) > * > * { + padding: 0.25rem 0.25rem; + } + + .table-bordered > :not(caption) > * { + border-width: var(--bs-border-width) 0; + } + .table-bordered > :not(caption) > * > * { + border-width: 0 var(--bs-border-width); + } + + .table-borderless > :not(caption) > * > * { + border-bottom-width: 0; + } + .table-borderless > :not(:first-child) { + border-top-width: 0; + } + + .table-striped > tbody > tr:nth-of-type(odd) > * { + --bs-table-accent-bg: var(--bs-table-striped-bg); + color: var(--bs-table-striped-color); + } + + .table-striped-columns > :not(caption) > tr > :nth-child(even) { + --bs-table-accent-bg: var(--bs-table-striped-bg); + color: var(--bs-table-striped-color); + } + + .table-active { + --bs-table-accent-bg: var(--bs-table-active-bg); + color: var(--bs-table-active-color); + } + + .table-hover > tbody > tr:hover > * { + --bs-table-accent-bg: var(--bs-table-hover-bg); + color: var(--bs-table-hover-color); + } + + .table-primary { + --bs-table-color: #000; + --bs-table-bg: #cfe2ff; + --bs-table-border-color: #bacbe6; + --bs-table-striped-bg: #c5d7f2; + --bs-table-striped-color: #000; + --bs-table-active-bg: #bacbe6; + --bs-table-active-color: #000; + --bs-table-hover-bg: #bfd1ec; + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); + } + + .table-secondary { + --bs-table-color: #000; + --bs-table-bg: #e2e3e5; + --bs-table-border-color: #cbccce; + --bs-table-striped-bg: #d7d8da; + --bs-table-striped-color: #000; + --bs-table-active-bg: #cbccce; + --bs-table-active-color: #000; + --bs-table-hover-bg: #d1d2d4; + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); + } + + .table-success { + --bs-table-color: #000; + --bs-table-bg: #d1e7dd; + --bs-table-border-color: #bcd0c7; + --bs-table-striped-bg: #c7dbd2; + --bs-table-striped-color: #000; + --bs-table-active-bg: #bcd0c7; + --bs-table-active-color: #000; + --bs-table-hover-bg: #c1d6cc; + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); + } + + .table-info { + --bs-table-color: #000; + --bs-table-bg: #cff4fc; + --bs-table-border-color: #badce3; + --bs-table-striped-bg: #c5e8ef; + --bs-table-striped-color: #000; + --bs-table-active-bg: #badce3; + --bs-table-active-color: #000; + --bs-table-hover-bg: #bfe2e9; + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); + } + + .table-warning { + --bs-table-color: #000; + --bs-table-bg: #fff3cd; + --bs-table-border-color: #e6dbb9; + --bs-table-striped-bg: #f2e7c3; + --bs-table-striped-color: #000; + --bs-table-active-bg: #e6dbb9; + --bs-table-active-color: #000; + --bs-table-hover-bg: #ece1be; + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); + } + + .table-danger { + --bs-table-color: #000; + --bs-table-bg: #f8d7da; + --bs-table-border-color: #dfc2c4; + --bs-table-striped-bg: #eccccf; + --bs-table-striped-color: #000; + --bs-table-active-bg: #dfc2c4; + --bs-table-active-color: #000; + --bs-table-hover-bg: #e5c7ca; + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); + } + + .table-light { + --bs-table-color: #000; + --bs-table-bg: #f8f9fa; + --bs-table-border-color: #dfe0e1; + --bs-table-striped-bg: #ecedee; + --bs-table-striped-color: #000; + --bs-table-active-bg: #dfe0e1; + --bs-table-active-color: #000; + --bs-table-hover-bg: #e5e6e7; + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); + } + + .table-dark { + --bs-table-color: #fff; + --bs-table-bg: #212529; + --bs-table-border-color: #373b3e; + --bs-table-striped-bg: #2c3034; + --bs-table-striped-color: #fff; + --bs-table-active-bg: #373b3e; + --bs-table-active-color: #fff; + --bs-table-hover-bg: #323539; + --bs-table-hover-color: #fff; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); + } + + .table-responsive { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } + + @media (max-width: 575.98px) { + .table-responsive-sm { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } + } + @media (max-width: 767.98px) { + .table-responsive-md { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } + } + @media (max-width: 991.98px) { + .table-responsive-lg { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } + } + @media (max-width: 1199.98px) { + .table-responsive-xl { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } + } + @media (max-width: 1399.98px) { + .table-responsive-xxl { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } + } + .form-label { + margin-bottom: 0.5rem; + } + + .col-form-label { + padding-top: calc(0.375rem + var(--bs-border-width)); + padding-bottom: calc(0.375rem + var(--bs-border-width)); + margin-bottom: 0; + font-size: inherit; + line-height: 1.5; + } + + .col-form-label-lg { + padding-top: calc(0.5rem + var(--bs-border-width)); + padding-bottom: calc(0.5rem + var(--bs-border-width)); + font-size: 1.25rem; + } + + .col-form-label-sm { + padding-top: calc(0.25rem + var(--bs-border-width)); + padding-bottom: calc(0.25rem + var(--bs-border-width)); + font-size: 0.875rem; + } + + .form-text { + margin-top: 0.25rem; + font-size: 0.875em; + color: var(--bs-secondary-color); + } + + .form-control { + display: block; + width: 100%; + padding: 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: var(--bs-body-color); + background-color: var(--bs-body-bg); + background-clip: padding-box; + border: var(--bs-border-width) solid var(--bs-border-color); + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + border-radius: var(--bs-border-radius); + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + } + @media (prefers-reduced-motion: reduce) { + .form-control { + transition: none; + } + } + .form-control[type='file'] { + overflow: hidden; + } + .form-control[type='file']:not(:disabled):not([readonly]) { + cursor: pointer; + } + .form-control:focus { + color: var(--bs-body-color); + background-color: var(--bs-body-bg); + border-color: #86b7fe; + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); + } + .form-control::-webkit-date-and-time-value { + min-width: 85px; + height: 1.5em; + margin: 0; + } + .form-control::-webkit-datetime-edit { + display: block; + padding: 0; + } + .form-control::-moz-placeholder { + color: var(--bs-secondary-color); + opacity: 1; + } + .form-control::placeholder { + color: var(--bs-secondary-color); + opacity: 1; + } + .form-control:disabled { + background-color: var(--bs-secondary-bg); + opacity: 1; + } + .form-control::-webkit-file-upload-button { + padding: 0.375rem 0.75rem; + margin: -0.375rem -0.75rem; + -webkit-margin-end: 0.75rem; + margin-inline-end: 0.75rem; + color: var(--bs-body-color); + background-color: var(--bs-tertiary-bg); + pointer-events: none; + border-color: inherit; + border-style: solid; + border-width: 0; + border-inline-end-width: var(--bs-border-width); + border-radius: 0; + -webkit-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + } + .form-control::file-selector-button { + padding: 0.375rem 0.75rem; + margin: -0.375rem -0.75rem; + -webkit-margin-end: 0.75rem; + margin-inline-end: 0.75rem; + color: var(--bs-body-color); + background-color: var(--bs-tertiary-bg); + pointer-events: none; + border-color: inherit; + border-style: solid; + border-width: 0; + border-inline-end-width: var(--bs-border-width); + border-radius: 0; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + } + @media (prefers-reduced-motion: reduce) { + .form-control::-webkit-file-upload-button { + -webkit-transition: none; + transition: none; + } + .form-control::file-selector-button { + transition: none; + } + } + .form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button { + background-color: var(--bs-secondary-bg); + } + .form-control:hover:not(:disabled):not([readonly])::file-selector-button { + background-color: var(--bs-secondary-bg); + } + + .form-control-plaintext { + display: block; + width: 100%; + padding: 0.375rem 0; + margin-bottom: 0; + line-height: 1.5; + color: var(--bs-body-color); + background-color: transparent; + border: solid transparent; + border-width: var(--bs-border-width) 0; + } + .form-control-plaintext:focus { + outline: 0; + } + .form-control-plaintext.form-control-sm, + .form-control-plaintext.form-control-lg { + padding-right: 0; + padding-left: 0; + } + + .form-control-sm { + min-height: calc(1.5em + 0.5rem + calc(var(--bs-border-width) * 2)); + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + border-radius: var(--bs-border-radius-sm); + } + .form-control-sm::-webkit-file-upload-button { + padding: 0.25rem 0.5rem; + margin: -0.25rem -0.5rem; + -webkit-margin-end: 0.5rem; + margin-inline-end: 0.5rem; + } + .form-control-sm::file-selector-button { + padding: 0.25rem 0.5rem; + margin: -0.25rem -0.5rem; + -webkit-margin-end: 0.5rem; + margin-inline-end: 0.5rem; + } + + .form-control-lg { + min-height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2)); + padding: 0.5rem 1rem; + font-size: 1.25rem; + border-radius: var(--bs-border-radius-lg); + } + .form-control-lg::-webkit-file-upload-button { + padding: 0.5rem 1rem; + margin: -0.5rem -1rem; + -webkit-margin-end: 1rem; + margin-inline-end: 1rem; + } + .form-control-lg::file-selector-button { + padding: 0.5rem 1rem; + margin: -0.5rem -1rem; + -webkit-margin-end: 1rem; + margin-inline-end: 1rem; + } + + textarea.form-control { + min-height: calc(1.5em + 0.75rem + calc(var(--bs-border-width) * 2)); + } + textarea.form-control-sm { + min-height: calc(1.5em + 0.5rem + calc(var(--bs-border-width) * 2)); + } + textarea.form-control-lg { + min-height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2)); + } + + .form-control-color { + width: 3rem; + height: calc(1.5em + 0.75rem + calc(var(--bs-border-width) * 2)); + padding: 0.375rem; + } + .form-control-color:not(:disabled):not([readonly]) { + cursor: pointer; + } + .form-control-color::-moz-color-swatch { + border: 0 !important; + border-radius: var(--bs-border-radius); + } + .form-control-color::-webkit-color-swatch { + border: 0 !important; + border-radius: var(--bs-border-radius); + } + .form-control-color.form-control-sm { + height: calc(1.5em + 0.5rem + calc(var(--bs-border-width) * 2)); + } + .form-control-color.form-control-lg { + height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2)); + } + + .form-select { + --bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"); + display: block; + width: 100%; + padding: 0.375rem 2.25rem 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: var(--bs-body-color); + background-color: var(--bs-body-bg); + background-image: var(--bs-form-select-bg-img), var(--bs-form-select-bg-icon, none); + background-repeat: no-repeat; + background-position: right 0.75rem center; + background-size: 16px 12px; + border: var(--bs-border-width) solid var(--bs-border-color); + border-radius: var(--bs-border-radius); + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + } + @media (prefers-reduced-motion: reduce) { + .form-select { + transition: none; + } + } + .form-select:focus { + border-color: #86b7fe; + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); + } + .form-select[multiple], + .form-select[size]:not([size='1']) { + padding-right: 0.75rem; + background-image: none; + } + .form-select:disabled { + background-color: var(--bs-secondary-bg); + } + .form-select:-moz-focusring { + color: transparent; + text-shadow: 0 0 0 var(--bs-body-color); + } + + .form-select-sm { + padding-top: 0.25rem; + padding-bottom: 0.25rem; + padding-left: 0.5rem; + font-size: 0.875rem; + border-radius: var(--bs-border-radius-sm); + } + + .form-select-lg { + padding-top: 0.5rem; + padding-bottom: 0.5rem; + padding-left: 1rem; + font-size: 1.25rem; + border-radius: var(--bs-border-radius-lg); + } + + [data-bs-theme='dark'] .form-select { + --bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23adb5bd' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"); + } + + .form-check { + display: block; + min-height: 1.5rem; + padding-left: 1.5em; + margin-bottom: 0.125rem; + } + .form-check .form-check-input { + float: left; + margin-left: -1.5em; + } + + .form-check-reverse { + padding-right: 1.5em; + padding-left: 0; + text-align: right; + } + .form-check-reverse .form-check-input { + float: right; + margin-right: -1.5em; + margin-left: 0; + } + + .form-check-input { + --bs-form-check-bg: var(--bs-body-bg); + width: 1em; + height: 1em; + margin-top: 0.25em; + vertical-align: top; + background-color: var(--bs-form-check-bg); + background-image: var(--bs-form-check-bg-image); + background-repeat: no-repeat; + background-position: center; + background-size: contain; + border: var(--bs-border-width) solid var(--bs-border-color); + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + -webkit-print-color-adjust: exact; + color-adjust: exact; + print-color-adjust: exact; + } + .form-check-input[type='checkbox'] { + border-radius: 0.25em; + } + .form-check-input[type='radio'] { + border-radius: 50%; + } + .form-check-input:active { + filter: brightness(90%); + } + .form-check-input:focus { + border-color: #86b7fe; + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); + } + .form-check-input:checked { + background-color: #0d6efd; + border-color: #0d6efd; + } + .form-check-input:checked[type='checkbox'] { + --bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e"); + } + .form-check-input:checked[type='radio'] { + --bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e"); + } + .form-check-input[type='checkbox']:indeterminate { + background-color: #0d6efd; + border-color: #0d6efd; + --bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e"); + } + .form-check-input:disabled { + pointer-events: none; + filter: none; + opacity: 0.5; + } + .form-check-input[disabled] ~ .form-check-label, + .form-check-input:disabled ~ .form-check-label { + cursor: default; + opacity: 0.5; + } + + .form-switch { + padding-left: 2.5em; + } + .form-switch .form-check-input { + --bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e"); + width: 2em; + margin-left: -2.5em; + background-image: var(--bs-form-switch-bg); + background-position: left center; + border-radius: 2em; + transition: background-position 0.15s ease-in-out; + } + @media (prefers-reduced-motion: reduce) { + .form-switch .form-check-input { + transition: none; + } + } + .form-switch .form-check-input:focus { + --bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e"); + } + .form-switch .form-check-input:checked { + background-position: right center; + --bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e"); + } + .form-switch.form-check-reverse { + padding-right: 2.5em; + padding-left: 0; + } + .form-switch.form-check-reverse .form-check-input { + margin-right: -2.5em; + margin-left: 0; + } + + .form-check-inline { + display: inline-block; + margin-right: 1rem; + } + + .btn-check { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; + } + .btn-check[disabled] + .btn, + .btn-check:disabled + .btn { + pointer-events: none; + filter: none; + opacity: 0.65; + } + + [data-bs-theme='dark'] .form-switch .form-check-input:not(:checked):not(:focus) { + --bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e"); + } + + .form-range { + width: 100%; + height: 1.5rem; + padding: 0; + background-color: transparent; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + } + .form-range:focus { + outline: 0; + } + .form-range:focus::-webkit-slider-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25); + } + .form-range:focus::-moz-range-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25); + } + .form-range::-moz-focus-outer { + border: 0; + } + .form-range::-webkit-slider-thumb { + width: 1rem; + height: 1rem; + margin-top: -0.25rem; + background-color: #0d6efd; + border: 0; + border-radius: 1rem; + -webkit-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, + box-shadow 0.15s ease-in-out; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, + box-shadow 0.15s ease-in-out; + -webkit-appearance: none; + appearance: none; + } + @media (prefers-reduced-motion: reduce) { + .form-range::-webkit-slider-thumb { + -webkit-transition: none; + transition: none; + } + } + .form-range::-webkit-slider-thumb:active { + background-color: #b6d4fe; + } + .form-range::-webkit-slider-runnable-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: var(--bs-tertiary-bg); + border-color: transparent; + border-radius: 1rem; + } + .form-range::-moz-range-thumb { + width: 1rem; + height: 1rem; + background-color: #0d6efd; + border: 0; + border-radius: 1rem; + -moz-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, + box-shadow 0.15s ease-in-out; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, + box-shadow 0.15s ease-in-out; + -moz-appearance: none; + appearance: none; + } + @media (prefers-reduced-motion: reduce) { + .form-range::-moz-range-thumb { + -moz-transition: none; + transition: none; + } + } + .form-range::-moz-range-thumb:active { + background-color: #b6d4fe; + } + .form-range::-moz-range-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: var(--bs-tertiary-bg); + border-color: transparent; + border-radius: 1rem; + } + .form-range:disabled { + pointer-events: none; + } + .form-range:disabled::-webkit-slider-thumb { + background-color: var(--bs-secondary-color); + } + .form-range:disabled::-moz-range-thumb { + background-color: var(--bs-secondary-color); + } + + .form-floating { + position: relative; + } + .form-floating > .form-control, + .form-floating > .form-control-plaintext, + .form-floating > .form-select { + height: calc(3.5rem + calc(var(--bs-border-width) * 2)); + line-height: 1.25; + } + .form-floating > label { + position: absolute; + top: 0; + left: 0; + z-index: 2; + height: 100%; + padding: 1rem 0.75rem; + overflow: hidden; + text-align: start; + text-overflow: ellipsis; + white-space: nowrap; + pointer-events: none; + border: var(--bs-border-width) solid transparent; + transform-origin: 0 0; + transition: opacity 0.1s ease-in-out, transform 0.1s ease-in-out; + } + @media (prefers-reduced-motion: reduce) { + .form-floating > label { + transition: none; + } + } + .form-floating > .form-control, + .form-floating > .form-control-plaintext { + padding: 1rem 0.75rem; + } + .form-floating > .form-control::-moz-placeholder, + .form-floating > .form-control-plaintext::-moz-placeholder { + color: transparent; + } + .form-floating > .form-control::placeholder, + .form-floating > .form-control-plaintext::placeholder { + color: transparent; + } + .form-floating > .form-control:not(:-moz-placeholder-shown), + .form-floating > .form-control-plaintext:not(:-moz-placeholder-shown) { + padding-top: 1.625rem; + padding-bottom: 0.625rem; + } + .form-floating > .form-control:focus, + .form-floating > .form-control:not(:placeholder-shown), + .form-floating > .form-control-plaintext:focus, + .form-floating > .form-control-plaintext:not(:placeholder-shown) { + padding-top: 1.625rem; + padding-bottom: 0.625rem; + } + .form-floating > .form-control:-webkit-autofill, + .form-floating > .form-control-plaintext:-webkit-autofill { + padding-top: 1.625rem; + padding-bottom: 0.625rem; + } + .form-floating > .form-select { + padding-top: 1.625rem; + padding-bottom: 0.625rem; + } + .form-floating > .form-control:not(:-moz-placeholder-shown) ~ label { + color: rgba(var(--bs-body-color-rgb), 0.65); + transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); + } + .form-floating > .form-control:focus ~ label, + .form-floating > .form-control:not(:placeholder-shown) ~ label, + .form-floating > .form-control-plaintext ~ label, + .form-floating > .form-select ~ label { + color: rgba(var(--bs-body-color-rgb), 0.65); + transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); + } + .form-floating > .form-control:not(:-moz-placeholder-shown) ~ label::after { + position: absolute; + inset: 1rem 0.375rem; + z-index: -1; + height: 1.5em; + content: ''; + background-color: var(--bs-body-bg); + border-radius: var(--bs-border-radius); + } + .form-floating > .form-control:focus ~ label::after, + .form-floating > .form-control:not(:placeholder-shown) ~ label::after, + .form-floating > .form-control-plaintext ~ label::after, + .form-floating > .form-select ~ label::after { + position: absolute; + inset: 1rem 0.375rem; + z-index: -1; + height: 1.5em; + content: ''; + background-color: var(--bs-body-bg); + border-radius: var(--bs-border-radius); + } + .form-floating > .form-control:-webkit-autofill ~ label { + color: rgba(var(--bs-body-color-rgb), 0.65); + transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); + } + .form-floating > .form-control-plaintext ~ label { + border-width: var(--bs-border-width) 0; + } + .form-floating > :disabled ~ label { + color: #6c757d; + } + .form-floating > :disabled ~ label::after { + background-color: var(--bs-secondary-bg); + } + + .input-group { + position: relative; + display: flex; + flex-wrap: wrap; + align-items: stretch; + width: 100%; + } + .input-group > .form-control, + .input-group > .form-select, + .input-group > .form-floating { + position: relative; + flex: 1 1 auto; + width: 1%; + min-width: 0; + } + .input-group > .form-control:focus, + .input-group > .form-select:focus, + .input-group > .form-floating:focus-within { + z-index: 5; + } + .input-group .btn { + position: relative; + z-index: 2; + } + .input-group .btn:focus { + z-index: 5; + } + + .input-group-text { + display: flex; + align-items: center; + padding: 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: var(--bs-body-color); + text-align: center; + white-space: nowrap; + background-color: var(--bs-tertiary-bg); + border: var(--bs-border-width) solid var(--bs-border-color); + border-radius: var(--bs-border-radius); + } + + .input-group-lg > .form-control, + .input-group-lg > .form-select, + .input-group-lg > .input-group-text, + .input-group-lg > .btn { + padding: 0.5rem 1rem; + font-size: 1.25rem; + border-radius: var(--bs-border-radius-lg); + } + + .input-group-sm > .form-control, + .input-group-sm > .form-select, + .input-group-sm > .input-group-text, + .input-group-sm > .btn { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + border-radius: var(--bs-border-radius-sm); + } + + .input-group-lg > .form-select, + .input-group-sm > .form-select { + padding-right: 3rem; + } + + .input-group:not(.has-validation) + > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating), + .input-group:not(.has-validation) > .dropdown-toggle:nth-last-child(n + 3), + .input-group:not(.has-validation) > .form-floating:not(:last-child) > .form-control, + .input-group:not(.has-validation) > .form-floating:not(:last-child) > .form-select { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + .input-group.has-validation + > :nth-last-child(n + 3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating), + .input-group.has-validation > .dropdown-toggle:nth-last-child(n + 4), + .input-group.has-validation > .form-floating:nth-last-child(n + 3) > .form-control, + .input-group.has-validation > .form-floating:nth-last-child(n + 3) > .form-select { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + .input-group + > :not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not( + .invalid-tooltip + ):not(.invalid-feedback) { + margin-left: calc(var(--bs-border-width) * -1); + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + .input-group > .form-floating:not(:first-child) > .form-control, + .input-group > .form-floating:not(:first-child) > .form-select { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + + .valid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 0.875em; + color: var(--bs-form-valid-color); + } + + .valid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: 0.25rem 0.5rem; + margin-top: 0.1rem; + font-size: 0.875rem; + color: #fff; + background-color: var(--bs-success); + border-radius: var(--bs-border-radius); + } + + .was-validated :valid ~ .valid-feedback, + .was-validated :valid ~ .valid-tooltip, + .is-valid ~ .valid-feedback, + .is-valid ~ .valid-tooltip { + display: block; + } + + .was-validated .form-control:valid, + .form-control.is-valid { + border-color: var(--bs-form-valid-border-color); + padding-right: calc(1.5em + 0.75rem); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right calc(0.375em + 0.1875rem) center; + background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); + } + .was-validated .form-control:valid:focus, + .form-control.is-valid:focus { + border-color: var(--bs-form-valid-border-color); + box-shadow: 0 0 0 0.25rem rgba(var(--bs-success-rgb), 0.25); + } + + .was-validated textarea.form-control:valid, + textarea.form-control.is-valid { + padding-right: calc(1.5em + 0.75rem); + background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); + } + + .was-validated .form-select:valid, + .form-select.is-valid { + border-color: var(--bs-form-valid-border-color); + } + .was-validated .form-select:valid:not([multiple]):not([size]), + .was-validated .form-select:valid:not([multiple])[size='1'], + .form-select.is-valid:not([multiple]):not([size]), + .form-select.is-valid:not([multiple])[size='1'] { + --bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); + padding-right: 4.125rem; + background-position: right 0.75rem center, center right 2.25rem; + background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); + } + .was-validated .form-select:valid:focus, + .form-select.is-valid:focus { + border-color: var(--bs-form-valid-border-color); + box-shadow: 0 0 0 0.25rem rgba(var(--bs-success-rgb), 0.25); + } + + .was-validated .form-control-color:valid, + .form-control-color.is-valid { + width: calc(3rem + calc(1.5em + 0.75rem)); + } + + .was-validated .form-check-input:valid, + .form-check-input.is-valid { + border-color: var(--bs-form-valid-border-color); + } + .was-validated .form-check-input:valid:checked, + .form-check-input.is-valid:checked { + background-color: var(--bs-form-valid-color); + } + .was-validated .form-check-input:valid:focus, + .form-check-input.is-valid:focus { + box-shadow: 0 0 0 0.25rem rgba(var(--bs-success-rgb), 0.25); + } + .was-validated .form-check-input:valid ~ .form-check-label, + .form-check-input.is-valid ~ .form-check-label { + color: var(--bs-form-valid-color); + } + + .form-check-inline .form-check-input ~ .valid-feedback { + margin-left: 0.5em; + } + + .was-validated .input-group > .form-control:not(:focus):valid, + .input-group > .form-control:not(:focus).is-valid, + .was-validated .input-group > .form-select:not(:focus):valid, + .input-group > .form-select:not(:focus).is-valid, + .was-validated .input-group > .form-floating:not(:focus-within):valid, + .input-group > .form-floating:not(:focus-within).is-valid { + z-index: 3; + } + + .invalid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 0.875em; + color: var(--bs-form-invalid-color); + } + + .invalid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: 0.25rem 0.5rem; + margin-top: 0.1rem; + font-size: 0.875rem; + color: #fff; + background-color: var(--bs-danger); + border-radius: var(--bs-border-radius); + } + + .was-validated :invalid ~ .invalid-feedback, + .was-validated :invalid ~ .invalid-tooltip, + .is-invalid ~ .invalid-feedback, + .is-invalid ~ .invalid-tooltip { + display: block; + } + + .was-validated .form-control:invalid, + .form-control.is-invalid { + border-color: var(--bs-form-invalid-border-color); + padding-right: calc(1.5em + 0.75rem); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right calc(0.375em + 0.1875rem) center; + background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); + } + .was-validated .form-control:invalid:focus, + .form-control.is-invalid:focus { + border-color: var(--bs-form-invalid-border-color); + box-shadow: 0 0 0 0.25rem rgba(var(--bs-danger-rgb), 0.25); + } + + .was-validated textarea.form-control:invalid, + textarea.form-control.is-invalid { + padding-right: calc(1.5em + 0.75rem); + background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); + } + + .was-validated .form-select:invalid, + .form-select.is-invalid { + border-color: var(--bs-form-invalid-border-color); + } + .was-validated .form-select:invalid:not([multiple]):not([size]), + .was-validated .form-select:invalid:not([multiple])[size='1'], + .form-select.is-invalid:not([multiple]):not([size]), + .form-select.is-invalid:not([multiple])[size='1'] { + --bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e"); + padding-right: 4.125rem; + background-position: right 0.75rem center, center right 2.25rem; + background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); + } + .was-validated .form-select:invalid:focus, + .form-select.is-invalid:focus { + border-color: var(--bs-form-invalid-border-color); + box-shadow: 0 0 0 0.25rem rgba(var(--bs-danger-rgb), 0.25); + } + + .was-validated .form-control-color:invalid, + .form-control-color.is-invalid { + width: calc(3rem + calc(1.5em + 0.75rem)); + } + + .was-validated .form-check-input:invalid, + .form-check-input.is-invalid { + border-color: var(--bs-form-invalid-border-color); + } + .was-validated .form-check-input:invalid:checked, + .form-check-input.is-invalid:checked { + background-color: var(--bs-form-invalid-color); + } + .was-validated .form-check-input:invalid:focus, + .form-check-input.is-invalid:focus { + box-shadow: 0 0 0 0.25rem rgba(var(--bs-danger-rgb), 0.25); + } + .was-validated .form-check-input:invalid ~ .form-check-label, + .form-check-input.is-invalid ~ .form-check-label { + color: var(--bs-form-invalid-color); + } + + .form-check-inline .form-check-input ~ .invalid-feedback { + margin-left: 0.5em; + } + + .was-validated .input-group > .form-control:not(:focus):invalid, + .input-group > .form-control:not(:focus).is-invalid, + .was-validated .input-group > .form-select:not(:focus):invalid, + .input-group > .form-select:not(:focus).is-invalid, + .was-validated .input-group > .form-floating:not(:focus-within):invalid, + .input-group > .form-floating:not(:focus-within).is-invalid { + z-index: 4; + } + + .btn { + --bs-btn-padding-x: 0.75rem; + --bs-btn-padding-y: 0.375rem; + --bs-btn-font-family: ; + --bs-btn-font-size: 1rem; + --bs-btn-font-weight: 400; + --bs-btn-line-height: 1.5; + --bs-btn-color: var(--bs-body-color); + --bs-btn-bg: transparent; + --bs-btn-border-width: var(--bs-border-width); + --bs-btn-border-color: transparent; + --bs-btn-border-radius: var(--bs-border-radius); + --bs-btn-hover-border-color: transparent; + --bs-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); + --bs-btn-disabled-opacity: 0.65; + --bs-btn-focus-box-shadow: 0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), 0.5); + display: inline-block; + padding: var(--bs-btn-padding-y) var(--bs-btn-padding-x); + font-family: var(--bs-btn-font-family); + font-size: var(--bs-btn-font-size); + font-weight: var(--bs-btn-font-weight); + line-height: var(--bs-btn-line-height); + color: var(--bs-btn-color); + text-align: center; + text-decoration: none; + vertical-align: middle; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + border: var(--bs-btn-border-width) solid var(--bs-btn-border-color); + border-radius: var(--bs-btn-border-radius); + background-color: var(--bs-btn-bg); + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + } + @media (prefers-reduced-motion: reduce) { + .btn { + transition: none; + } + } + .btn:hover { + color: var(--bs-btn-hover-color); + background-color: var(--bs-btn-hover-bg); + border-color: var(--bs-btn-hover-border-color); + } + .btn-check + .btn:hover { + color: var(--bs-btn-color); + background-color: var(--bs-btn-bg); + border-color: var(--bs-btn-border-color); + } + .btn:focus-visible { + color: var(--bs-btn-hover-color); + background-color: var(--bs-btn-hover-bg); + border-color: var(--bs-btn-hover-border-color); + outline: 0; + box-shadow: var(--bs-btn-focus-box-shadow); + } + .btn-check:focus-visible + .btn { + border-color: var(--bs-btn-hover-border-color); + outline: 0; + box-shadow: var(--bs-btn-focus-box-shadow); + } + .btn-check:checked + .btn, + :not(.btn-check) + .btn:active, + .btn:first-child:active, + .btn.active, + .btn.show { + color: var(--bs-btn-active-color); + background-color: var(--bs-btn-active-bg); + border-color: var(--bs-btn-active-border-color); + } + .btn-check:checked + .btn:focus-visible, + :not(.btn-check) + .btn:active:focus-visible, + .btn:first-child:active:focus-visible, + .btn.active:focus-visible, + .btn.show:focus-visible { + box-shadow: var(--bs-btn-focus-box-shadow); + } + .btn:disabled, + .btn.disabled, + fieldset:disabled .btn { + color: var(--bs-btn-disabled-color); + pointer-events: none; + background-color: var(--bs-btn-disabled-bg); + border-color: var(--bs-btn-disabled-border-color); + opacity: var(--bs-btn-disabled-opacity); + } + + .btn-primary { + --bs-btn-color: #fff; + --bs-btn-bg: #0d6efd; + --bs-btn-border-color: #0d6efd; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #0b5ed7; + --bs-btn-hover-border-color: #0a58ca; + --bs-btn-focus-shadow-rgb: 49, 132, 253; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #0a58ca; + --bs-btn-active-border-color: #0a53be; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #0d6efd; + --bs-btn-disabled-border-color: #0d6efd; + } + + .btn-secondary { + --bs-btn-color: #fff; + --bs-btn-bg: #6c757d; + --bs-btn-border-color: #6c757d; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #5c636a; + --bs-btn-hover-border-color: #565e64; + --bs-btn-focus-shadow-rgb: 130, 138, 145; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #565e64; + --bs-btn-active-border-color: #51585e; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #6c757d; + --bs-btn-disabled-border-color: #6c757d; + } + + .btn-success { + --bs-btn-color: #fff; + --bs-btn-bg: #198754; + --bs-btn-border-color: #198754; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #157347; + --bs-btn-hover-border-color: #146c43; + --bs-btn-focus-shadow-rgb: 60, 153, 110; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #146c43; + --bs-btn-active-border-color: #13653f; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #198754; + --bs-btn-disabled-border-color: #198754; + } + + .btn-info { + --bs-btn-color: #000; + --bs-btn-bg: #0dcaf0; + --bs-btn-border-color: #0dcaf0; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #31d2f2; + --bs-btn-hover-border-color: #25cff2; + --bs-btn-focus-shadow-rgb: 11, 172, 204; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #3dd5f3; + --bs-btn-active-border-color: #25cff2; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #000; + --bs-btn-disabled-bg: #0dcaf0; + --bs-btn-disabled-border-color: #0dcaf0; + } + + .btn-warning { + --bs-btn-color: #000; + --bs-btn-bg: #ffc107; + --bs-btn-border-color: #ffc107; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #ffca2c; + --bs-btn-hover-border-color: #ffc720; + --bs-btn-focus-shadow-rgb: 217, 164, 6; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #ffcd39; + --bs-btn-active-border-color: #ffc720; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #000; + --bs-btn-disabled-bg: #ffc107; + --bs-btn-disabled-border-color: #ffc107; + } + + .btn-danger { + --bs-btn-color: #fff; + --bs-btn-bg: #dc3545; + --bs-btn-border-color: #dc3545; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #bb2d3b; + --bs-btn-hover-border-color: #b02a37; + --bs-btn-focus-shadow-rgb: 225, 83, 97; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #b02a37; + --bs-btn-active-border-color: #a52834; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #dc3545; + --bs-btn-disabled-border-color: #dc3545; + } + + .btn-light { + --bs-btn-color: #000; + --bs-btn-bg: #f8f9fa; + --bs-btn-border-color: #f8f9fa; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #d3d4d5; + --bs-btn-hover-border-color: #c6c7c8; + --bs-btn-focus-shadow-rgb: 211, 212, 213; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #c6c7c8; + --bs-btn-active-border-color: #babbbc; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #000; + --bs-btn-disabled-bg: #f8f9fa; + --bs-btn-disabled-border-color: #f8f9fa; + } + + .btn-dark { + --bs-btn-color: #fff; + --bs-btn-bg: #212529; + --bs-btn-border-color: #212529; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #424649; + --bs-btn-hover-border-color: #373b3e; + --bs-btn-focus-shadow-rgb: 66, 70, 73; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #4d5154; + --bs-btn-active-border-color: #373b3e; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #212529; + --bs-btn-disabled-border-color: #212529; + } + + .btn-outline-primary { + --bs-btn-color: #0d6efd; + --bs-btn-border-color: #0d6efd; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #0d6efd; + --bs-btn-hover-border-color: #0d6efd; + --bs-btn-focus-shadow-rgb: 13, 110, 253; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #0d6efd; + --bs-btn-active-border-color: #0d6efd; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #0d6efd; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #0d6efd; + --bs-gradient: none; + } + + .btn-outline-secondary { + --bs-btn-color: #6c757d; + --bs-btn-border-color: #6c757d; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #6c757d; + --bs-btn-hover-border-color: #6c757d; + --bs-btn-focus-shadow-rgb: 108, 117, 125; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #6c757d; + --bs-btn-active-border-color: #6c757d; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #6c757d; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #6c757d; + --bs-gradient: none; + } + + .btn-outline-success { + --bs-btn-color: #198754; + --bs-btn-border-color: #198754; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #198754; + --bs-btn-hover-border-color: #198754; + --bs-btn-focus-shadow-rgb: 25, 135, 84; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #198754; + --bs-btn-active-border-color: #198754; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #198754; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #198754; + --bs-gradient: none; + } + + .btn-outline-info { + --bs-btn-color: #0dcaf0; + --bs-btn-border-color: #0dcaf0; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #0dcaf0; + --bs-btn-hover-border-color: #0dcaf0; + --bs-btn-focus-shadow-rgb: 13, 202, 240; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #0dcaf0; + --bs-btn-active-border-color: #0dcaf0; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #0dcaf0; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #0dcaf0; + --bs-gradient: none; + } + + .btn-outline-warning { + --bs-btn-color: #ffc107; + --bs-btn-border-color: #ffc107; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #ffc107; + --bs-btn-hover-border-color: #ffc107; + --bs-btn-focus-shadow-rgb: 255, 193, 7; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #ffc107; + --bs-btn-active-border-color: #ffc107; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #ffc107; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #ffc107; + --bs-gradient: none; + } + + .btn-outline-danger { + --bs-btn-color: #dc3545; + --bs-btn-border-color: #dc3545; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #dc3545; + --bs-btn-hover-border-color: #dc3545; + --bs-btn-focus-shadow-rgb: 220, 53, 69; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #dc3545; + --bs-btn-active-border-color: #dc3545; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #dc3545; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #dc3545; + --bs-gradient: none; + } + + .btn-outline-light { + --bs-btn-color: #f8f9fa; + --bs-btn-border-color: #f8f9fa; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #f8f9fa; + --bs-btn-hover-border-color: #f8f9fa; + --bs-btn-focus-shadow-rgb: 248, 249, 250; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #f8f9fa; + --bs-btn-active-border-color: #f8f9fa; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #f8f9fa; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #f8f9fa; + --bs-gradient: none; + } + + .btn-outline-dark { + --bs-btn-color: #212529; + --bs-btn-border-color: #212529; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #212529; + --bs-btn-hover-border-color: #212529; + --bs-btn-focus-shadow-rgb: 33, 37, 41; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #212529; + --bs-btn-active-border-color: #212529; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #212529; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #212529; + --bs-gradient: none; + } + + .btn-link { + --bs-btn-font-weight: 400; + --bs-btn-color: var(--bs-link-color); + --bs-btn-bg: transparent; + --bs-btn-border-color: transparent; + --bs-btn-hover-color: var(--bs-link-hover-color); + --bs-btn-hover-border-color: transparent; + --bs-btn-active-color: var(--bs-link-hover-color); + --bs-btn-active-border-color: transparent; + --bs-btn-disabled-color: #6c757d; + --bs-btn-disabled-border-color: transparent; + --bs-btn-box-shadow: 0 0 0 #000; + --bs-btn-focus-shadow-rgb: 49, 132, 253; + text-decoration: underline; + } + .btn-link:focus-visible { + color: var(--bs-btn-color); + } + .btn-link:hover { + color: var(--bs-btn-hover-color); + } + + .btn-lg, + .btn-group-lg > .btn { + --bs-btn-padding-y: 0.5rem; + --bs-btn-padding-x: 1rem; + --bs-btn-font-size: 1.25rem; + --bs-btn-border-radius: var(--bs-border-radius-lg); + } + + .btn-sm, + .btn-group-sm > .btn { + --bs-btn-padding-y: 0.25rem; + --bs-btn-padding-x: 0.5rem; + --bs-btn-font-size: 0.875rem; + --bs-btn-border-radius: var(--bs-border-radius-sm); + } + + .fade { + transition: opacity 0.15s linear; + } + @media (prefers-reduced-motion: reduce) { + .fade { + transition: none; + } + } + .fade:not(.show) { + opacity: 0; + } + + .collapse:not(.show) { + display: none; + } + + .collapsing { + height: 0; + overflow: hidden; + transition: height 0.35s ease; + } + @media (prefers-reduced-motion: reduce) { + .collapsing { + transition: none; + } + } + .collapsing.collapse-horizontal { + width: 0; + height: auto; + transition: width 0.35s ease; + } + @media (prefers-reduced-motion: reduce) { + .collapsing.collapse-horizontal { + transition: none; + } + } + + .dropup, + .dropend, + .dropdown, + .dropstart, + .dropup-center, + .dropdown-center { + position: relative; + } + + .dropdown-toggle { + white-space: nowrap; + } + .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ''; + border-top: 0.3em solid; + border-right: 0.3em solid transparent; + border-bottom: 0; + border-left: 0.3em solid transparent; + } + .dropdown-toggle:empty::after { + margin-left: 0; + } + + .dropdown-menu { + --bs-dropdown-zindex: 1000; + --bs-dropdown-min-width: 10rem; + --bs-dropdown-padding-x: 0; + --bs-dropdown-padding-y: 0.5rem; + --bs-dropdown-spacer: 0.125rem; + --bs-dropdown-font-size: 1rem; + --bs-dropdown-color: var(--bs-body-color); + --bs-dropdown-bg: var(--bs-body-bg); + --bs-dropdown-border-color: var(--bs-border-color-translucent); + --bs-dropdown-border-radius: var(--bs-border-radius); + --bs-dropdown-border-width: var(--bs-border-width); + --bs-dropdown-inner-border-radius: calc(var(--bs-border-radius) - var(--bs-border-width)); + --bs-dropdown-divider-bg: var(--bs-border-color-translucent); + --bs-dropdown-divider-margin-y: 0.5rem; + --bs-dropdown-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15); + --bs-dropdown-link-color: var(--bs-body-color); + --bs-dropdown-link-hover-color: var(--bs-body-color); + --bs-dropdown-link-hover-bg: var(--bs-tertiary-bg); + --bs-dropdown-link-active-color: #fff; + --bs-dropdown-link-active-bg: #0d6efd; + --bs-dropdown-link-disabled-color: var(--bs-tertiary-color); + --bs-dropdown-item-padding-x: 1rem; + --bs-dropdown-item-padding-y: 0.25rem; + --bs-dropdown-header-color: #6c757d; + --bs-dropdown-header-padding-x: 1rem; + --bs-dropdown-header-padding-y: 0.5rem; + position: absolute; + z-index: var(--bs-dropdown-zindex); + display: none; + min-width: var(--bs-dropdown-min-width); + padding: var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x); + margin: 0; + font-size: var(--bs-dropdown-font-size); + color: var(--bs-dropdown-color); + text-align: left; + list-style: none; + background-color: var(--bs-dropdown-bg); + background-clip: padding-box; + border: var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color); + border-radius: var(--bs-dropdown-border-radius); + } + .dropdown-menu[data-bs-popper] { + top: 100%; + left: 0; + margin-top: var(--bs-dropdown-spacer); + } + + .dropdown-menu-start { + --bs-position: start; + } + .dropdown-menu-start[data-bs-popper] { + right: auto; + left: 0; + } + + .dropdown-menu-end { + --bs-position: end; + } + .dropdown-menu-end[data-bs-popper] { + right: 0; + left: auto; + } + + @media (min-width: 576px) { + .dropdown-menu-sm-start { + --bs-position: start; + } + .dropdown-menu-sm-start[data-bs-popper] { + right: auto; + left: 0; + } + .dropdown-menu-sm-end { + --bs-position: end; + } + .dropdown-menu-sm-end[data-bs-popper] { + right: 0; + left: auto; + } + } + @media (min-width: 768px) { + .dropdown-menu-md-start { + --bs-position: start; + } + .dropdown-menu-md-start[data-bs-popper] { + right: auto; + left: 0; + } + .dropdown-menu-md-end { + --bs-position: end; + } + .dropdown-menu-md-end[data-bs-popper] { + right: 0; + left: auto; + } + } + @media (min-width: 992px) { + .dropdown-menu-lg-start { + --bs-position: start; + } + .dropdown-menu-lg-start[data-bs-popper] { + right: auto; + left: 0; + } + .dropdown-menu-lg-end { + --bs-position: end; + } + .dropdown-menu-lg-end[data-bs-popper] { + right: 0; + left: auto; + } + } + @media (min-width: 1200px) { + .dropdown-menu-xl-start { + --bs-position: start; + } + .dropdown-menu-xl-start[data-bs-popper] { + right: auto; + left: 0; + } + .dropdown-menu-xl-end { + --bs-position: end; + } + .dropdown-menu-xl-end[data-bs-popper] { + right: 0; + left: auto; + } + } + @media (min-width: 1400px) { + .dropdown-menu-xxl-start { + --bs-position: start; + } + .dropdown-menu-xxl-start[data-bs-popper] { + right: auto; + left: 0; + } + .dropdown-menu-xxl-end { + --bs-position: end; + } + .dropdown-menu-xxl-end[data-bs-popper] { + right: 0; + left: auto; + } + } + .dropup .dropdown-menu[data-bs-popper] { + top: auto; + bottom: 100%; + margin-top: 0; + margin-bottom: var(--bs-dropdown-spacer); + } + .dropup .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ''; + border-top: 0; + border-right: 0.3em solid transparent; + border-bottom: 0.3em solid; + border-left: 0.3em solid transparent; + } + .dropup .dropdown-toggle:empty::after { + margin-left: 0; + } + + .dropend .dropdown-menu[data-bs-popper] { + top: 0; + right: auto; + left: 100%; + margin-top: 0; + margin-left: var(--bs-dropdown-spacer); + } + .dropend .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ''; + border-top: 0.3em solid transparent; + border-right: 0; + border-bottom: 0.3em solid transparent; + border-left: 0.3em solid; + } + .dropend .dropdown-toggle:empty::after { + margin-left: 0; + } + .dropend .dropdown-toggle::after { + vertical-align: 0; + } + + .dropstart .dropdown-menu[data-bs-popper] { + top: 0; + right: 100%; + left: auto; + margin-top: 0; + margin-right: var(--bs-dropdown-spacer); + } + .dropstart .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ''; + } + .dropstart .dropdown-toggle::after { + display: none; + } + .dropstart .dropdown-toggle::before { + display: inline-block; + margin-right: 0.255em; + vertical-align: 0.255em; + content: ''; + border-top: 0.3em solid transparent; + border-right: 0.3em solid; + border-bottom: 0.3em solid transparent; + } + .dropstart .dropdown-toggle:empty::after { + margin-left: 0; + } + .dropstart .dropdown-toggle::before { + vertical-align: 0; + } + + .dropdown-divider { + height: 0; + margin: var(--bs-dropdown-divider-margin-y) 0; + overflow: hidden; + border-top: 1px solid var(--bs-dropdown-divider-bg); + opacity: 1; + } + + .dropdown-item { + display: block; + width: 100%; + padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x); + clear: both; + font-weight: 400; + color: var(--bs-dropdown-link-color); + text-align: inherit; + text-decoration: none; + white-space: nowrap; + background-color: transparent; + border: 0; + border-radius: var(--bs-dropdown-item-border-radius, 0); + } + .dropdown-item:hover, + .dropdown-item:focus { + color: var(--bs-dropdown-link-hover-color); + background-color: var(--bs-dropdown-link-hover-bg); + } + .dropdown-item.active, + .dropdown-item:active { + color: var(--bs-dropdown-link-active-color); + text-decoration: none; + background-color: var(--bs-dropdown-link-active-bg); + } + .dropdown-item.disabled, + .dropdown-item:disabled { + color: var(--bs-dropdown-link-disabled-color); + pointer-events: none; + background-color: transparent; + } + + .dropdown-menu.show { + display: block; + } + + .dropdown-header { + display: block; + padding: var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x); + margin-bottom: 0; + font-size: 0.875rem; + color: var(--bs-dropdown-header-color); + white-space: nowrap; + } + + .dropdown-item-text { + display: block; + padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x); + color: var(--bs-dropdown-link-color); + } + + .dropdown-menu-dark { + --bs-dropdown-color: #dee2e6; + --bs-dropdown-bg: #343a40; + --bs-dropdown-border-color: var(--bs-border-color-translucent); + --bs-dropdown-box-shadow: ; + --bs-dropdown-link-color: #dee2e6; + --bs-dropdown-link-hover-color: #fff; + --bs-dropdown-divider-bg: var(--bs-border-color-translucent); + --bs-dropdown-link-hover-bg: rgba(255, 255, 255, 0.15); + --bs-dropdown-link-active-color: #fff; + --bs-dropdown-link-active-bg: #0d6efd; + --bs-dropdown-link-disabled-color: #adb5bd; + --bs-dropdown-header-color: #adb5bd; + } + + .btn-group, + .btn-group-vertical { + position: relative; + display: inline-flex; + vertical-align: middle; + } + .btn-group > .btn, + .btn-group-vertical > .btn { + position: relative; + flex: 1 1 auto; + } + .btn-group > .btn-check:checked + .btn, + .btn-group > .btn-check:focus + .btn, + .btn-group > .btn:hover, + .btn-group > .btn:focus, + .btn-group > .btn:active, + .btn-group > .btn.active, + .btn-group-vertical > .btn-check:checked + .btn, + .btn-group-vertical > .btn-check:focus + .btn, + .btn-group-vertical > .btn:hover, + .btn-group-vertical > .btn:focus, + .btn-group-vertical > .btn:active, + .btn-group-vertical > .btn.active { + z-index: 1; + } + + .btn-toolbar { + display: flex; + flex-wrap: wrap; + justify-content: flex-start; + } + .btn-toolbar .input-group { + width: auto; + } + + .btn-group { + border-radius: var(--bs-border-radius); + } + .btn-group > :not(.btn-check:first-child) + .btn, + .btn-group > .btn-group:not(:first-child) { + margin-left: calc(var(--bs-border-width) * -1); + } + .btn-group > .btn:not(:last-child):not(.dropdown-toggle), + .btn-group > .btn.dropdown-toggle-split:first-child, + .btn-group > .btn-group:not(:last-child) > .btn { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + .btn-group > .btn:nth-child(n + 3), + .btn-group > :not(.btn-check) + .btn, + .btn-group > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + + .dropdown-toggle-split { + padding-right: 0.5625rem; + padding-left: 0.5625rem; + } + .dropdown-toggle-split::after, + .dropup .dropdown-toggle-split::after, + .dropend .dropdown-toggle-split::after { + margin-left: 0; + } + .dropstart .dropdown-toggle-split::before { + margin-right: 0; + } + + .btn-sm + .dropdown-toggle-split, + .btn-group-sm > .btn + .dropdown-toggle-split { + padding-right: 0.375rem; + padding-left: 0.375rem; + } + + .btn-lg + .dropdown-toggle-split, + .btn-group-lg > .btn + .dropdown-toggle-split { + padding-right: 0.75rem; + padding-left: 0.75rem; + } + + .btn-group-vertical { + flex-direction: column; + align-items: flex-start; + justify-content: center; + } + .btn-group-vertical > .btn, + .btn-group-vertical > .btn-group { + width: 100%; + } + .btn-group-vertical > .btn:not(:first-child), + .btn-group-vertical > .btn-group:not(:first-child) { + margin-top: calc(var(--bs-border-width) * -1); + } + .btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle), + .btn-group-vertical > .btn-group:not(:last-child) > .btn { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; + } + .btn-group-vertical > .btn ~ .btn, + .btn-group-vertical > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-top-right-radius: 0; + } + + .nav { + --bs-nav-link-padding-x: 1rem; + --bs-nav-link-padding-y: 0.5rem; + --bs-nav-link-font-weight: ; + --bs-nav-link-color: var(--bs-link-color); + --bs-nav-link-hover-color: var(--bs-link-hover-color); + --bs-nav-link-disabled-color: var(--bs-secondary-color); + display: flex; + flex-wrap: wrap; + padding-left: 0; + margin-bottom: 0; + list-style: none; + } + + .nav-link { + display: block; + padding: var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x); + font-size: var(--bs-nav-link-font-size); + font-weight: var(--bs-nav-link-font-weight); + color: var(--bs-nav-link-color); + text-decoration: none; + background: none; + border: 0; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out; + } + @media (prefers-reduced-motion: reduce) { + .nav-link { + transition: none; + } + } + .nav-link:hover, + .nav-link:focus { + color: var(--bs-nav-link-hover-color); + } + .nav-link:focus-visible { + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); + } + .nav-link.disabled { + color: var(--bs-nav-link-disabled-color); + pointer-events: none; + cursor: default; + } + + .nav-tabs { + --bs-nav-tabs-border-width: var(--bs-border-width); + --bs-nav-tabs-border-color: var(--bs-border-color); + --bs-nav-tabs-border-radius: var(--bs-border-radius); + --bs-nav-tabs-link-hover-border-color: var(--bs-secondary-bg) var(--bs-secondary-bg) + var(--bs-border-color); + --bs-nav-tabs-link-active-color: var(--bs-emphasis-color); + --bs-nav-tabs-link-active-bg: var(--bs-body-bg); + --bs-nav-tabs-link-active-border-color: var(--bs-border-color) var(--bs-border-color) + var(--bs-body-bg); + border-bottom: var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color); + } + .nav-tabs .nav-link { + margin-bottom: calc(-1 * var(--bs-nav-tabs-border-width)); + border: var(--bs-nav-tabs-border-width) solid transparent; + border-top-left-radius: var(--bs-nav-tabs-border-radius); + border-top-right-radius: var(--bs-nav-tabs-border-radius); + } + .nav-tabs .nav-link:hover, + .nav-tabs .nav-link:focus { + isolation: isolate; + border-color: var(--bs-nav-tabs-link-hover-border-color); + } + .nav-tabs .nav-link.disabled, + .nav-tabs .nav-link:disabled { + color: var(--bs-nav-link-disabled-color); + background-color: transparent; + border-color: transparent; + } + .nav-tabs .nav-link.active, + .nav-tabs .nav-item.show .nav-link { + color: var(--bs-nav-tabs-link-active-color); + background-color: var(--bs-nav-tabs-link-active-bg); + border-color: var(--bs-nav-tabs-link-active-border-color); + } + .nav-tabs .dropdown-menu { + margin-top: calc(-1 * var(--bs-nav-tabs-border-width)); + border-top-left-radius: 0; + border-top-right-radius: 0; + } + + .nav-pills { + --bs-nav-pills-border-radius: var(--bs-border-radius); + --bs-nav-pills-link-active-color: #fff; + --bs-nav-pills-link-active-bg: #0d6efd; + } + .nav-pills .nav-link { + border-radius: var(--bs-nav-pills-border-radius); + } + .nav-pills .nav-link:disabled { + color: var(--bs-nav-link-disabled-color); + background-color: transparent; + border-color: transparent; + } + .nav-pills .nav-link.active, + .nav-pills .show > .nav-link { + color: var(--bs-nav-pills-link-active-color); + background-color: var(--bs-nav-pills-link-active-bg); + } + + .nav-underline { + --bs-nav-underline-gap: 1rem; + --bs-nav-underline-border-width: 0.125rem; + --bs-nav-underline-link-active-color: var(--bs-emphasis-color); + gap: var(--bs-nav-underline-gap); + } + .nav-underline .nav-link { + padding-right: 0; + padding-left: 0; + border-bottom: var(--bs-nav-underline-border-width) solid transparent; + } + .nav-underline .nav-link:hover, + .nav-underline .nav-link:focus { + border-bottom-color: currentcolor; + } + .nav-underline .nav-link.active, + .nav-underline .show > .nav-link { + font-weight: 700; + color: var(--bs-nav-underline-link-active-color); + border-bottom-color: currentcolor; + } + + .nav-fill > .nav-link, + .nav-fill .nav-item { + flex: 1 1 auto; + text-align: center; + } + + .nav-justified > .nav-link, + .nav-justified .nav-item { + flex-basis: 0; + flex-grow: 1; + text-align: center; + } + + .nav-fill .nav-item .nav-link, + .nav-justified .nav-item .nav-link { + width: 100%; + } + + .tab-content > .tab-pane { + display: none; + } + .tab-content > .active { + display: block; + } + + .navbar { + --bs-navbar-padding-x: 0; + --bs-navbar-padding-y: 0.5rem; + --bs-navbar-color: rgba(var(--bs-emphasis-color-rgb), 0.65); + --bs-navbar-hover-color: rgba(var(--bs-emphasis-color-rgb), 0.8); + --bs-navbar-disabled-color: rgba(var(--bs-emphasis-color-rgb), 0.3); + --bs-navbar-active-color: rgba(var(--bs-emphasis-color-rgb), 1); + --bs-navbar-brand-padding-y: 0.3125rem; + --bs-navbar-brand-margin-end: 1rem; + --bs-navbar-brand-font-size: 1.25rem; + --bs-navbar-brand-color: rgba(var(--bs-emphasis-color-rgb), 1); + --bs-navbar-brand-hover-color: rgba(var(--bs-emphasis-color-rgb), 1); + --bs-navbar-nav-link-padding-x: 0.5rem; + --bs-navbar-toggler-padding-y: 0.25rem; + --bs-navbar-toggler-padding-x: 0.75rem; + --bs-navbar-toggler-font-size: 1.25rem; + --bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%2833, 37, 41, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); + --bs-navbar-toggler-border-color: rgba(var(--bs-emphasis-color-rgb), 0.15); + --bs-navbar-toggler-border-radius: var(--bs-border-radius); + --bs-navbar-toggler-focus-width: 0.25rem; + --bs-navbar-toggler-transition: box-shadow 0.15s ease-in-out; + position: relative; + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: space-between; + padding: var(--bs-navbar-padding-y) var(--bs-navbar-padding-x); + } + .navbar > .container, + .navbar > .container-fluid, + .navbar > .container-sm, + .navbar > .container-md, + .navbar > .container-lg, + .navbar > .container-xl, + .navbar > .container-xxl { + display: flex; + flex-wrap: inherit; + align-items: center; + justify-content: space-between; + } + .navbar-brand { + padding-top: var(--bs-navbar-brand-padding-y); + padding-bottom: var(--bs-navbar-brand-padding-y); + margin-right: var(--bs-navbar-brand-margin-end); + font-size: var(--bs-navbar-brand-font-size); + color: var(--bs-navbar-brand-color); + text-decoration: none; + white-space: nowrap; + } + .navbar-brand:hover, + .navbar-brand:focus { + color: var(--bs-navbar-brand-hover-color); + } + + .navbar-nav { + --bs-nav-link-padding-x: 0; + --bs-nav-link-padding-y: 0.5rem; + --bs-nav-link-font-weight: ; + --bs-nav-link-color: var(--bs-navbar-color); + --bs-nav-link-hover-color: var(--bs-navbar-hover-color); + --bs-nav-link-disabled-color: var(--bs-navbar-disabled-color); + display: flex; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; + list-style: none; + } + .navbar-nav .nav-link.active, + .navbar-nav .nav-link.show { + color: var(--bs-navbar-active-color); + } + .navbar-nav .dropdown-menu { + position: static; + } + + .navbar-text { + padding-top: 0.5rem; + padding-bottom: 0.5rem; + color: var(--bs-navbar-color); + } + .navbar-text a, + .navbar-text a:hover, + .navbar-text a:focus { + color: var(--bs-navbar-active-color); + } + + .navbar-collapse { + flex-basis: 100%; + flex-grow: 1; + align-items: center; + } + + .navbar-toggler { + padding: var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x); + font-size: var(--bs-navbar-toggler-font-size); + line-height: 1; + color: var(--bs-navbar-color); + background-color: transparent; + border: var(--bs-border-width) solid var(--bs-navbar-toggler-border-color); + border-radius: var(--bs-navbar-toggler-border-radius); + transition: var(--bs-navbar-toggler-transition); + } + @media (prefers-reduced-motion: reduce) { + .navbar-toggler { + transition: none; + } + } + .navbar-toggler:hover { + text-decoration: none; + } + .navbar-toggler:focus { + text-decoration: none; + outline: 0; + box-shadow: 0 0 0 var(--bs-navbar-toggler-focus-width); + } + + .navbar-toggler-icon { + display: inline-block; + width: 1.5em; + height: 1.5em; + vertical-align: middle; + background-image: var(--bs-navbar-toggler-icon-bg); + background-repeat: no-repeat; + background-position: center; + background-size: 100%; + } + + .navbar-nav-scroll { + max-height: var(--bs-scroll-height, 75vh); + overflow-y: auto; + } + + @media (min-width: 576px) { + .navbar-expand-sm { + flex-wrap: nowrap; + justify-content: flex-start; + } + .navbar-expand-sm .navbar-nav { + flex-direction: row; + } + .navbar-expand-sm .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-sm .navbar-nav .nav-link { + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); + } + .navbar-expand-sm .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-sm .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-sm .navbar-toggler { + display: none; + } + .navbar-expand-sm .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; + } + .navbar-expand-sm .offcanvas .offcanvas-header { + display: none; + } + .navbar-expand-sm .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } + } + @media (min-width: 768px) { + .navbar-expand-md { + flex-wrap: nowrap; + justify-content: flex-start; + } + .navbar-expand-md .navbar-nav { + flex-direction: row; + } + .navbar-expand-md .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-md .navbar-nav .nav-link { + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); + } + .navbar-expand-md .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-md .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-md .navbar-toggler { + display: none; + } + .navbar-expand-md .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; + } + .navbar-expand-md .offcanvas .offcanvas-header { + display: none; + } + .navbar-expand-md .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } + } + @media (min-width: 992px) { + .navbar-expand-lg { + flex-wrap: nowrap; + justify-content: flex-start; + } + .navbar-expand-lg .navbar-nav { + flex-direction: row; + } + .navbar-expand-lg .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-lg .navbar-nav .nav-link { + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); + } + .navbar-expand-lg .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-lg .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-lg .navbar-toggler { + display: none; + } + .navbar-expand-lg .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; + } + .navbar-expand-lg .offcanvas .offcanvas-header { + display: none; + } + .navbar-expand-lg .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } + } + @media (min-width: 1200px) { + .navbar-expand-xl { + flex-wrap: nowrap; + justify-content: flex-start; + } + .navbar-expand-xl .navbar-nav { + flex-direction: row; + } + .navbar-expand-xl .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-xl .navbar-nav .nav-link { + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); + } + .navbar-expand-xl .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-xl .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-xl .navbar-toggler { + display: none; + } + .navbar-expand-xl .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; + } + .navbar-expand-xl .offcanvas .offcanvas-header { + display: none; + } + .navbar-expand-xl .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } + } + @media (min-width: 1400px) { + .navbar-expand-xxl { + flex-wrap: nowrap; + justify-content: flex-start; + } + .navbar-expand-xxl .navbar-nav { + flex-direction: row; + } + .navbar-expand-xxl .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-xxl .navbar-nav .nav-link { + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); + } + .navbar-expand-xxl .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-xxl .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-xxl .navbar-toggler { + display: none; + } + .navbar-expand-xxl .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; + } + .navbar-expand-xxl .offcanvas .offcanvas-header { + display: none; + } + .navbar-expand-xxl .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } + } + .navbar-expand { + flex-wrap: nowrap; + justify-content: flex-start; + } + .navbar-expand .navbar-nav { + flex-direction: row; + } + .navbar-expand .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand .navbar-nav .nav-link { + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); + } + .navbar-expand .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand .navbar-toggler { + display: none; + } + .navbar-expand .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; + } + .navbar-expand .offcanvas .offcanvas-header { + display: none; + } + .navbar-expand .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } + + .navbar-dark { + --bs-navbar-color: rgba(255, 255, 255, 0.55); + --bs-navbar-hover-color: rgba(255, 255, 255, 0.75); + --bs-navbar-disabled-color: rgba(255, 255, 255, 0.25); + --bs-navbar-active-color: #fff; + --bs-navbar-brand-color: #fff; + --bs-navbar-brand-hover-color: #fff; + --bs-navbar-toggler-border-color: rgba(255, 255, 255, 0.1); + --bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); + } + + [data-bs-theme='dark'] .navbar-toggler-icon { + --bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); + } + + .card { + --bs-card-spacer-y: 1rem; + --bs-card-spacer-x: 1rem; + --bs-card-title-spacer-y: 0.5rem; + --bs-card-title-color: ; + --bs-card-subtitle-color: ; + --bs-card-border-width: var(--bs-border-width); + --bs-card-border-color: var(--bs-border-color-translucent); + --bs-card-border-radius: var(--bs-border-radius); + --bs-card-box-shadow: ; + --bs-card-inner-border-radius: calc(var(--bs-border-radius) - (var(--bs-border-width))); + --bs-card-cap-padding-y: 0.5rem; + --bs-card-cap-padding-x: 1rem; + --bs-card-cap-bg: rgba(var(--bs-body-color-rgb), 0.03); + --bs-card-cap-color: ; + --bs-card-height: ; + --bs-card-color: ; + --bs-card-bg: var(--bs-body-bg); + --bs-card-img-overlay-padding: 1rem; + --bs-card-group-margin: 0.75rem; + position: relative; + display: flex; + flex-direction: column; + min-width: 0; + height: var(--bs-card-height); + color: var(--bs-body-color); + word-wrap: break-word; + background-color: var(--bs-card-bg); + background-clip: border-box; + border: var(--bs-card-border-width) solid var(--bs-card-border-color); + border-radius: var(--bs-card-border-radius); + } + .card > hr { + margin-right: 0; + margin-left: 0; + } + .card > .list-group { + border-top: inherit; + border-bottom: inherit; + } + .card > .list-group:first-child { + border-top-width: 0; + border-top-left-radius: var(--bs-card-inner-border-radius); + border-top-right-radius: var(--bs-card-inner-border-radius); + } + .card > .list-group:last-child { + border-bottom-width: 0; + border-bottom-right-radius: var(--bs-card-inner-border-radius); + border-bottom-left-radius: var(--bs-card-inner-border-radius); + } + .card > .card-header + .list-group, + .card > .list-group + .card-footer { + border-top: 0; + } + + .card-body { + flex: 1 1 auto; + padding: var(--bs-card-spacer-y) var(--bs-card-spacer-x); + color: var(--bs-card-color); + } + + .card-title { + margin-bottom: var(--bs-card-title-spacer-y); + color: var(--bs-card-title-color); + } + + .card-subtitle { + margin-top: calc(-0.5 * var(--bs-card-title-spacer-y)); + margin-bottom: 0; + color: var(--bs-card-subtitle-color); + } + + .card-text:last-child { + margin-bottom: 0; + } + + .card-link + .card-link { + margin-left: var(--bs-card-spacer-x); + } + + .card-header { + padding: var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x); + margin-bottom: 0; + color: var(--bs-card-cap-color); + background-color: var(--bs-card-cap-bg); + border-bottom: var(--bs-card-border-width) solid var(--bs-card-border-color); + } + .card-header:first-child { + border-radius: var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0; + } + + .card-footer { + padding: var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x); + color: var(--bs-card-cap-color); + background-color: var(--bs-card-cap-bg); + border-top: var(--bs-card-border-width) solid var(--bs-card-border-color); + } + .card-footer:last-child { + border-radius: 0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius); + } + + .card-header-tabs { + margin-right: calc(-0.5 * var(--bs-card-cap-padding-x)); + margin-bottom: calc(-1 * var(--bs-card-cap-padding-y)); + margin-left: calc(-0.5 * var(--bs-card-cap-padding-x)); + border-bottom: 0; + } + .card-header-tabs .nav-link.active { + background-color: var(--bs-card-bg); + border-bottom-color: var(--bs-card-bg); + } + + .card-header-pills { + margin-right: calc(-0.5 * var(--bs-card-cap-padding-x)); + margin-left: calc(-0.5 * var(--bs-card-cap-padding-x)); + } + + .card-img-overlay { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: var(--bs-card-img-overlay-padding); + border-radius: var(--bs-card-inner-border-radius); + } + + .card-img, + .card-img-top, + .card-img-bottom { + width: 100%; + } + + .card-img, + .card-img-top { + border-top-left-radius: var(--bs-card-inner-border-radius); + border-top-right-radius: var(--bs-card-inner-border-radius); + } + + .card-img, + .card-img-bottom { + border-bottom-right-radius: var(--bs-card-inner-border-radius); + border-bottom-left-radius: var(--bs-card-inner-border-radius); + } + + .card-group > .card { + margin-bottom: var(--bs-card-group-margin); + } + @media (min-width: 576px) { + .card-group { + display: flex; + flex-flow: row wrap; + } + .card-group > .card { + flex: 1 0 0%; + margin-bottom: 0; + } + .card-group > .card + .card { + margin-left: 0; + border-left: 0; + } + .card-group > .card:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + .card-group > .card:not(:last-child) .card-img-top, + .card-group > .card:not(:last-child) .card-header { + border-top-right-radius: 0; + } + .card-group > .card:not(:last-child) .card-img-bottom, + .card-group > .card:not(:last-child) .card-footer { + border-bottom-right-radius: 0; + } + .card-group > .card:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + .card-group > .card:not(:first-child) .card-img-top, + .card-group > .card:not(:first-child) .card-header { + border-top-left-radius: 0; + } + .card-group > .card:not(:first-child) .card-img-bottom, + .card-group > .card:not(:first-child) .card-footer { + border-bottom-left-radius: 0; + } + } + + .accordion { + --bs-accordion-color: var(--bs-body-color); + --bs-accordion-bg: var(--bs-body-bg); + --bs-accordion-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, border-radius 0.15s ease; + --bs-accordion-border-color: var(--bs-border-color); + --bs-accordion-border-width: var(--bs-border-width); + --bs-accordion-border-radius: var(--bs-border-radius); + --bs-accordion-inner-border-radius: calc(var(--bs-border-radius) - (var(--bs-border-width))); + --bs-accordion-btn-padding-x: 1.25rem; + --bs-accordion-btn-padding-y: 1rem; + --bs-accordion-btn-color: var(--bs-body-color); + --bs-accordion-btn-bg: var(--bs-accordion-bg); + --bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); + --bs-accordion-btn-icon-width: 1.25rem; + --bs-accordion-btn-icon-transform: rotate(-180deg); + --bs-accordion-btn-icon-transition: transform 0.2s ease-in-out; + --bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23052c65'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); + --bs-accordion-btn-focus-border-color: #86b7fe; + --bs-accordion-btn-focus-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); + --bs-accordion-body-padding-x: 1.25rem; + --bs-accordion-body-padding-y: 1rem; + --bs-accordion-active-color: var(--bs-primary-text-emphasis); + --bs-accordion-active-bg: var(--bs-primary-bg-subtle); + } + + .accordion-button { + position: relative; + display: flex; + align-items: center; + width: 100%; + padding: var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x); + font-size: 1rem; + color: var(--bs-accordion-btn-color); + text-align: left; + background-color: var(--bs-accordion-btn-bg); + border: 0; + border-radius: 0; + overflow-anchor: none; + transition: var(--bs-accordion-transition); + } + @media (prefers-reduced-motion: reduce) { + .accordion-button { + transition: none; + } + } + .accordion-button:not(.collapsed) { + color: var(--bs-accordion-active-color); + background-color: var(--bs-accordion-active-bg); + box-shadow: inset 0 calc(-1 * var(--bs-accordion-border-width)) 0 + var(--bs-accordion-border-color); + } + .accordion-button:not(.collapsed)::after { + background-image: var(--bs-accordion-btn-active-icon); + transform: var(--bs-accordion-btn-icon-transform); + } + .accordion-button::after { + flex-shrink: 0; + width: var(--bs-accordion-btn-icon-width); + height: var(--bs-accordion-btn-icon-width); + margin-left: auto; + content: ''; + background-image: var(--bs-accordion-btn-icon); + background-repeat: no-repeat; + background-size: var(--bs-accordion-btn-icon-width); + transition: var(--bs-accordion-btn-icon-transition); + } + @media (prefers-reduced-motion: reduce) { + .accordion-button::after { + transition: none; + } + } + .accordion-button:hover { + z-index: 2; + } + .accordion-button:focus { + z-index: 3; + border-color: var(--bs-accordion-btn-focus-border-color); + outline: 0; + box-shadow: var(--bs-accordion-btn-focus-box-shadow); + } + + .accordion-header { + margin-bottom: 0; + } + + .accordion-item { + color: var(--bs-accordion-color); + background-color: var(--bs-accordion-bg); + border: var(--bs-accordion-border-width) solid var(--bs-accordion-border-color); + } + .accordion-item:first-of-type { + border-top-left-radius: var(--bs-accordion-border-radius); + border-top-right-radius: var(--bs-accordion-border-radius); + } + .accordion-item:first-of-type .accordion-button { + border-top-left-radius: var(--bs-accordion-inner-border-radius); + border-top-right-radius: var(--bs-accordion-inner-border-radius); + } + .accordion-item:not(:first-of-type) { + border-top: 0; + } + .accordion-item:last-of-type { + border-bottom-right-radius: var(--bs-accordion-border-radius); + border-bottom-left-radius: var(--bs-accordion-border-radius); + } + .accordion-item:last-of-type .accordion-button.collapsed { + border-bottom-right-radius: var(--bs-accordion-inner-border-radius); + border-bottom-left-radius: var(--bs-accordion-inner-border-radius); + } + .accordion-item:last-of-type .accordion-collapse { + border-bottom-right-radius: var(--bs-accordion-border-radius); + border-bottom-left-radius: var(--bs-accordion-border-radius); + } + + .accordion-body { + padding: var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x); + } + + .accordion-flush .accordion-collapse { + border-width: 0; + } + .accordion-flush .accordion-item { + border-right: 0; + border-left: 0; + border-radius: 0; + } + .accordion-flush .accordion-item:first-child { + border-top: 0; + } + .accordion-flush .accordion-item:last-child { + border-bottom: 0; + } + .accordion-flush .accordion-item .accordion-button, + .accordion-flush .accordion-item .accordion-button.collapsed { + border-radius: 0; + } + + [data-bs-theme='dark'] .accordion-button::after { + --bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); + --bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); + } + + .breadcrumb { + --bs-breadcrumb-padding-x: 0; + --bs-breadcrumb-padding-y: 0; + --bs-breadcrumb-margin-bottom: 1rem; + --bs-breadcrumb-bg: ; + --bs-breadcrumb-border-radius: ; + --bs-breadcrumb-divider-color: var(--bs-secondary-color); + --bs-breadcrumb-item-padding-x: 0.5rem; + --bs-breadcrumb-item-active-color: var(--bs-secondary-color); + display: flex; + flex-wrap: wrap; + padding: var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x); + margin-bottom: var(--bs-breadcrumb-margin-bottom); + font-size: var(--bs-breadcrumb-font-size); + list-style: none; + background-color: var(--bs-breadcrumb-bg); + border-radius: var(--bs-breadcrumb-border-radius); + } + + .breadcrumb-item + .breadcrumb-item { + padding-left: var(--bs-breadcrumb-item-padding-x); + } + .breadcrumb-item + .breadcrumb-item::before { + float: left; + padding-right: var(--bs-breadcrumb-item-padding-x); + color: var(--bs-breadcrumb-divider-color); + content: var(--bs-breadcrumb-divider, '/') /* rtl: var(--bs-breadcrumb-divider, "/") */; + } + .breadcrumb-item.active { + color: var(--bs-breadcrumb-item-active-color); + } + + .pagination { + --bs-pagination-padding-x: 0.75rem; + --bs-pagination-padding-y: 0.375rem; + --bs-pagination-font-size: 1rem; + --bs-pagination-color: var(--bs-link-color); + --bs-pagination-bg: var(--bs-body-bg); + --bs-pagination-border-width: var(--bs-border-width); + --bs-pagination-border-color: var(--bs-border-color); + --bs-pagination-border-radius: var(--bs-border-radius); + --bs-pagination-hover-color: var(--bs-link-hover-color); + --bs-pagination-hover-bg: var(--bs-tertiary-bg); + --bs-pagination-hover-border-color: var(--bs-border-color); + --bs-pagination-focus-color: var(--bs-link-hover-color); + --bs-pagination-focus-bg: var(--bs-secondary-bg); + --bs-pagination-focus-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); + --bs-pagination-active-color: #fff; + --bs-pagination-active-bg: #0d6efd; + --bs-pagination-active-border-color: #0d6efd; + --bs-pagination-disabled-color: var(--bs-secondary-color); + --bs-pagination-disabled-bg: var(--bs-secondary-bg); + --bs-pagination-disabled-border-color: var(--bs-border-color); + display: flex; + padding-left: 0; + list-style: none; + } + + .page-link { + position: relative; + display: block; + padding: var(--bs-pagination-padding-y) var(--bs-pagination-padding-x); + font-size: var(--bs-pagination-font-size); + color: var(--bs-pagination-color); + text-decoration: none; + background-color: var(--bs-pagination-bg); + border: var(--bs-pagination-border-width) solid var(--bs-pagination-border-color); + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + } + @media (prefers-reduced-motion: reduce) { + .page-link { + transition: none; + } + } + .page-link:hover { + z-index: 2; + color: var(--bs-pagination-hover-color); + background-color: var(--bs-pagination-hover-bg); + border-color: var(--bs-pagination-hover-border-color); + } + .page-link:focus { + z-index: 3; + color: var(--bs-pagination-focus-color); + background-color: var(--bs-pagination-focus-bg); + outline: 0; + box-shadow: var(--bs-pagination-focus-box-shadow); + } + .page-link.active, + .active > .page-link { + z-index: 3; + color: var(--bs-pagination-active-color); + background-color: var(--bs-pagination-active-bg); + border-color: var(--bs-pagination-active-border-color); + } + .page-link.disabled, + .disabled > .page-link { + color: var(--bs-pagination-disabled-color); + pointer-events: none; + background-color: var(--bs-pagination-disabled-bg); + border-color: var(--bs-pagination-disabled-border-color); + } + + .page-item:not(:first-child) .page-link { + margin-left: calc(var(--bs-border-width) * -1); + } + .page-item:first-child .page-link { + border-top-left-radius: var(--bs-pagination-border-radius); + border-bottom-left-radius: var(--bs-pagination-border-radius); + } + .page-item:last-child .page-link { + border-top-right-radius: var(--bs-pagination-border-radius); + border-bottom-right-radius: var(--bs-pagination-border-radius); + } + + .pagination-lg { + --bs-pagination-padding-x: 1.5rem; + --bs-pagination-padding-y: 0.75rem; + --bs-pagination-font-size: 1.25rem; + --bs-pagination-border-radius: var(--bs-border-radius-lg); + } + + .pagination-sm { + --bs-pagination-padding-x: 0.5rem; + --bs-pagination-padding-y: 0.25rem; + --bs-pagination-font-size: 0.875rem; + --bs-pagination-border-radius: var(--bs-border-radius-sm); + } + + .badge { + --bs-badge-padding-x: 0.65em; + --bs-badge-padding-y: 0.35em; + --bs-badge-font-size: 0.75em; + --bs-badge-font-weight: 700; + --bs-badge-color: #fff; + --bs-badge-border-radius: var(--bs-border-radius); + display: inline-block; + padding: var(--bs-badge-padding-y) var(--bs-badge-padding-x); + font-size: var(--bs-badge-font-size); + font-weight: var(--bs-badge-font-weight); + line-height: 1; + color: var(--bs-badge-color); + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: var(--bs-badge-border-radius); + } + .badge:empty { + display: none; + } + + .btn .badge { + position: relative; + top: -1px; + } + + .alert { + --bs-alert-bg: transparent; + --bs-alert-padding-x: 1rem; + --bs-alert-padding-y: 1rem; + --bs-alert-margin-bottom: 1rem; + --bs-alert-color: inherit; + --bs-alert-border-color: transparent; + --bs-alert-border: var(--bs-border-width) solid var(--bs-alert-border-color); + --bs-alert-border-radius: var(--bs-border-radius); + --bs-alert-link-color: inherit; + position: relative; + padding: var(--bs-alert-padding-y) var(--bs-alert-padding-x); + margin-bottom: var(--bs-alert-margin-bottom); + color: var(--bs-alert-color); + background-color: var(--bs-alert-bg); + border: var(--bs-alert-border); + border-radius: var(--bs-alert-border-radius); + } + + .alert-heading { + color: inherit; + } + + .alert-link { + font-weight: 700; + color: var(--bs-alert-link-color); + } + + .alert-dismissible { + padding-right: 3rem; + } + .alert-dismissible .btn-close { + position: absolute; + top: 0; + right: 0; + z-index: 2; + padding: 1.25rem 1rem; + } + + .alert-primary { + --bs-alert-color: var(--bs-primary-text-emphasis); + --bs-alert-bg: var(--bs-primary-bg-subtle); + --bs-alert-border-color: var(--bs-primary-border-subtle); + --bs-alert-link-color: var(--bs-primary-text-emphasis); + } + + .alert-secondary { + --bs-alert-color: var(--bs-secondary-text-emphasis); + --bs-alert-bg: var(--bs-secondary-bg-subtle); + --bs-alert-border-color: var(--bs-secondary-border-subtle); + --bs-alert-link-color: var(--bs-secondary-text-emphasis); + } + + .alert-success { + --bs-alert-color: var(--bs-success-text-emphasis); + --bs-alert-bg: var(--bs-success-bg-subtle); + --bs-alert-border-color: var(--bs-success-border-subtle); + --bs-alert-link-color: var(--bs-success-text-emphasis); + } + + .alert-info { + --bs-alert-color: var(--bs-info-text-emphasis); + --bs-alert-bg: var(--bs-info-bg-subtle); + --bs-alert-border-color: var(--bs-info-border-subtle); + --bs-alert-link-color: var(--bs-info-text-emphasis); + } + + .alert-warning { + --bs-alert-color: var(--bs-warning-text-emphasis); + --bs-alert-bg: var(--bs-warning-bg-subtle); + --bs-alert-border-color: var(--bs-warning-border-subtle); + --bs-alert-link-color: var(--bs-warning-text-emphasis); + } + + .alert-danger { + --bs-alert-color: var(--bs-danger-text-emphasis); + --bs-alert-bg: var(--bs-danger-bg-subtle); + --bs-alert-border-color: var(--bs-danger-border-subtle); + --bs-alert-link-color: var(--bs-danger-text-emphasis); + } + + .alert-light { + --bs-alert-color: var(--bs-light-text-emphasis); + --bs-alert-bg: var(--bs-light-bg-subtle); + --bs-alert-border-color: var(--bs-light-border-subtle); + --bs-alert-link-color: var(--bs-light-text-emphasis); + } + + .alert-dark { + --bs-alert-color: var(--bs-dark-text-emphasis); + --bs-alert-bg: var(--bs-dark-bg-subtle); + --bs-alert-border-color: var(--bs-dark-border-subtle); + --bs-alert-link-color: var(--bs-dark-text-emphasis); + } + + @keyframes progress-bar-stripes { + 0% { + background-position-x: 1rem; + } + } + .progress, + .progress-stacked { + --bs-progress-height: 1rem; + --bs-progress-font-size: 0.75rem; + --bs-progress-bg: var(--bs-secondary-bg); + --bs-progress-border-radius: var(--bs-border-radius); + --bs-progress-box-shadow: var(--bs-box-shadow-inset); + --bs-progress-bar-color: #fff; + --bs-progress-bar-bg: #0d6efd; + --bs-progress-bar-transition: width 0.6s ease; + display: flex; + height: var(--bs-progress-height); + overflow: hidden; + font-size: var(--bs-progress-font-size); + background-color: var(--bs-progress-bg); + border-radius: var(--bs-progress-border-radius); + } + + .progress-bar { + display: flex; + flex-direction: column; + justify-content: center; + overflow: hidden; + color: var(--bs-progress-bar-color); + text-align: center; + white-space: nowrap; + background-color: var(--bs-progress-bar-bg); + transition: var(--bs-progress-bar-transition); + } + @media (prefers-reduced-motion: reduce) { + .progress-bar { + transition: none; + } + } + + .progress-bar-striped { + background-image: linear-gradient( + 45deg, + rgba(255, 255, 255, 0.15) 25%, + transparent 25%, + transparent 50%, + rgba(255, 255, 255, 0.15) 50%, + rgba(255, 255, 255, 0.15) 75%, + transparent 75%, + transparent + ); + background-size: var(--bs-progress-height) var(--bs-progress-height); + } + + .progress-stacked > .progress { + overflow: visible; + } + + .progress-stacked > .progress > .progress-bar { + width: 100%; + } + + .progress-bar-animated { + animation: 1s linear infinite progress-bar-stripes; + } + @media (prefers-reduced-motion: reduce) { + .progress-bar-animated { + animation: none; + } + } + + .list-group { + --bs-list-group-color: var(--bs-body-color); + --bs-list-group-bg: var(--bs-body-bg); + --bs-list-group-border-color: var(--bs-border-color); + --bs-list-group-border-width: var(--bs-border-width); + --bs-list-group-border-radius: var(--bs-border-radius); + --bs-list-group-item-padding-x: 1rem; + --bs-list-group-item-padding-y: 0.5rem; + --bs-list-group-action-color: var(--bs-secondary-color); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-tertiary-bg); + --bs-list-group-action-active-color: var(--bs-body-color); + --bs-list-group-action-active-bg: var(--bs-secondary-bg); + --bs-list-group-disabled-color: var(--bs-secondary-color); + --bs-list-group-disabled-bg: var(--bs-body-bg); + --bs-list-group-active-color: #fff; + --bs-list-group-active-bg: #0d6efd; + --bs-list-group-active-border-color: #0d6efd; + display: flex; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; + border-radius: var(--bs-list-group-border-radius); + } + + .list-group-numbered { + list-style-type: none; + counter-reset: section; + } + .list-group-numbered > .list-group-item::before { + content: counters(section, '.') '. '; + counter-increment: section; + } + + .list-group-item-action { + width: 100%; + color: var(--bs-list-group-action-color); + text-align: inherit; + } + .list-group-item-action:hover, + .list-group-item-action:focus { + z-index: 1; + color: var(--bs-list-group-action-hover-color); + text-decoration: none; + background-color: var(--bs-list-group-action-hover-bg); + } + .list-group-item-action:active { + color: var(--bs-list-group-action-active-color); + background-color: var(--bs-list-group-action-active-bg); + } + + .list-group-item { + position: relative; + display: block; + padding: var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x); + color: var(--bs-list-group-color); + text-decoration: none; + background-color: var(--bs-list-group-bg); + border: var(--bs-list-group-border-width) solid var(--bs-list-group-border-color); + } + .list-group-item:first-child { + border-top-left-radius: inherit; + border-top-right-radius: inherit; + } + .list-group-item:last-child { + border-bottom-right-radius: inherit; + border-bottom-left-radius: inherit; + } + .list-group-item.disabled, + .list-group-item:disabled { + color: var(--bs-list-group-disabled-color); + pointer-events: none; + background-color: var(--bs-list-group-disabled-bg); + } + .list-group-item.active { + z-index: 2; + color: var(--bs-list-group-active-color); + background-color: var(--bs-list-group-active-bg); + border-color: var(--bs-list-group-active-border-color); + } + .list-group-item + .list-group-item { + border-top-width: 0; + } + .list-group-item + .list-group-item.active { + margin-top: calc(-1 * var(--bs-list-group-border-width)); + border-top-width: var(--bs-list-group-border-width); + } + + .list-group-horizontal { + flex-direction: row; + } + .list-group-horizontal > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0; + } + .list-group-horizontal > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); + border-bottom-left-radius: 0; + } + .list-group-horizontal > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal > .list-group-item + .list-group-item { + border-top-width: var(--bs-list-group-border-width); + border-left-width: 0; + } + .list-group-horizontal > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); + } + + @media (min-width: 576px) { + .list-group-horizontal-sm { + flex-direction: row; + } + .list-group-horizontal-sm > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0; + } + .list-group-horizontal-sm > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); + border-bottom-left-radius: 0; + } + .list-group-horizontal-sm > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-sm > .list-group-item + .list-group-item { + border-top-width: var(--bs-list-group-border-width); + border-left-width: 0; + } + .list-group-horizontal-sm > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); + } + } + @media (min-width: 768px) { + .list-group-horizontal-md { + flex-direction: row; + } + .list-group-horizontal-md > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0; + } + .list-group-horizontal-md > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); + border-bottom-left-radius: 0; + } + .list-group-horizontal-md > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-md > .list-group-item + .list-group-item { + border-top-width: var(--bs-list-group-border-width); + border-left-width: 0; + } + .list-group-horizontal-md > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); + } + } + @media (min-width: 992px) { + .list-group-horizontal-lg { + flex-direction: row; + } + .list-group-horizontal-lg > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0; + } + .list-group-horizontal-lg > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); + border-bottom-left-radius: 0; + } + .list-group-horizontal-lg > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-lg > .list-group-item + .list-group-item { + border-top-width: var(--bs-list-group-border-width); + border-left-width: 0; + } + .list-group-horizontal-lg > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); + } + } + @media (min-width: 1200px) { + .list-group-horizontal-xl { + flex-direction: row; + } + .list-group-horizontal-xl > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0; + } + .list-group-horizontal-xl > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); + border-bottom-left-radius: 0; + } + .list-group-horizontal-xl > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-xl > .list-group-item + .list-group-item { + border-top-width: var(--bs-list-group-border-width); + border-left-width: 0; + } + .list-group-horizontal-xl > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); + } + } + @media (min-width: 1400px) { + .list-group-horizontal-xxl { + flex-direction: row; + } + .list-group-horizontal-xxl > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0; + } + .list-group-horizontal-xxl > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); + border-bottom-left-radius: 0; + } + .list-group-horizontal-xxl > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-xxl > .list-group-item + .list-group-item { + border-top-width: var(--bs-list-group-border-width); + border-left-width: 0; + } + .list-group-horizontal-xxl > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); + } + } + .list-group-flush { + border-radius: 0; + } + .list-group-flush > .list-group-item { + border-width: 0 0 var(--bs-list-group-border-width); + } + .list-group-flush > .list-group-item:last-child { + border-bottom-width: 0; + } + + .list-group-item-primary { + --bs-list-group-color: var(--bs-primary-text-emphasis); + --bs-list-group-bg: var(--bs-primary-bg-subtle); + --bs-list-group-border-color: var(--bs-primary-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-primary-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-primary-border-subtle); + --bs-list-group-active-color: var(--bs-primary-bg-subtle); + --bs-list-group-active-bg: var(--bs-primary-text-emphasis); + --bs-list-group-active-border-color: var(--bs-primary-text-emphasis); + } + + .list-group-item-secondary { + --bs-list-group-color: var(--bs-secondary-text-emphasis); + --bs-list-group-bg: var(--bs-secondary-bg-subtle); + --bs-list-group-border-color: var(--bs-secondary-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-secondary-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-secondary-border-subtle); + --bs-list-group-active-color: var(--bs-secondary-bg-subtle); + --bs-list-group-active-bg: var(--bs-secondary-text-emphasis); + --bs-list-group-active-border-color: var(--bs-secondary-text-emphasis); + } + + .list-group-item-success { + --bs-list-group-color: var(--bs-success-text-emphasis); + --bs-list-group-bg: var(--bs-success-bg-subtle); + --bs-list-group-border-color: var(--bs-success-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-success-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-success-border-subtle); + --bs-list-group-active-color: var(--bs-success-bg-subtle); + --bs-list-group-active-bg: var(--bs-success-text-emphasis); + --bs-list-group-active-border-color: var(--bs-success-text-emphasis); + } + + .list-group-item-info { + --bs-list-group-color: var(--bs-info-text-emphasis); + --bs-list-group-bg: var(--bs-info-bg-subtle); + --bs-list-group-border-color: var(--bs-info-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-info-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-info-border-subtle); + --bs-list-group-active-color: var(--bs-info-bg-subtle); + --bs-list-group-active-bg: var(--bs-info-text-emphasis); + --bs-list-group-active-border-color: var(--bs-info-text-emphasis); + } + + .list-group-item-warning { + --bs-list-group-color: var(--bs-warning-text-emphasis); + --bs-list-group-bg: var(--bs-warning-bg-subtle); + --bs-list-group-border-color: var(--bs-warning-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-warning-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-warning-border-subtle); + --bs-list-group-active-color: var(--bs-warning-bg-subtle); + --bs-list-group-active-bg: var(--bs-warning-text-emphasis); + --bs-list-group-active-border-color: var(--bs-warning-text-emphasis); + } + + .list-group-item-danger { + --bs-list-group-color: var(--bs-danger-text-emphasis); + --bs-list-group-bg: var(--bs-danger-bg-subtle); + --bs-list-group-border-color: var(--bs-danger-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-danger-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-danger-border-subtle); + --bs-list-group-active-color: var(--bs-danger-bg-subtle); + --bs-list-group-active-bg: var(--bs-danger-text-emphasis); + --bs-list-group-active-border-color: var(--bs-danger-text-emphasis); + } + + .list-group-item-light { + --bs-list-group-color: var(--bs-light-text-emphasis); + --bs-list-group-bg: var(--bs-light-bg-subtle); + --bs-list-group-border-color: var(--bs-light-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-light-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-light-border-subtle); + --bs-list-group-active-color: var(--bs-light-bg-subtle); + --bs-list-group-active-bg: var(--bs-light-text-emphasis); + --bs-list-group-active-border-color: var(--bs-light-text-emphasis); + } + + .list-group-item-dark { + --bs-list-group-color: var(--bs-dark-text-emphasis); + --bs-list-group-bg: var(--bs-dark-bg-subtle); + --bs-list-group-border-color: var(--bs-dark-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-dark-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-dark-border-subtle); + --bs-list-group-active-color: var(--bs-dark-bg-subtle); + --bs-list-group-active-bg: var(--bs-dark-text-emphasis); + --bs-list-group-active-border-color: var(--bs-dark-text-emphasis); + } + + .btn-close { + --bs-btn-close-color: #000; + --bs-btn-close-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e"); + --bs-btn-close-opacity: 0.5; + --bs-btn-close-hover-opacity: 0.75; + --bs-btn-close-focus-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); + --bs-btn-close-focus-opacity: 1; + --bs-btn-close-disabled-opacity: 0.25; + --bs-btn-close-white-filter: invert(1) grayscale(100%) brightness(200%); + box-sizing: content-box; + width: 1em; + height: 1em; + padding: 0.25em 0.25em; + color: var(--bs-btn-close-color); + background: transparent var(--bs-btn-close-bg) center/1em auto no-repeat; + border: 0; + border-radius: 0.375rem; + opacity: var(--bs-btn-close-opacity); + } + .btn-close:hover { + color: var(--bs-btn-close-color); + text-decoration: none; + opacity: var(--bs-btn-close-hover-opacity); + } + .btn-close:focus { + outline: 0; + box-shadow: var(--bs-btn-close-focus-shadow); + opacity: var(--bs-btn-close-focus-opacity); + } + .btn-close:disabled, + .btn-close.disabled { + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + opacity: var(--bs-btn-close-disabled-opacity); + } + + .btn-close-white { + filter: var(--bs-btn-close-white-filter); + } + + [data-bs-theme='dark'] .btn-close { + filter: var(--bs-btn-close-white-filter); + } + + .toast { + --bs-toast-zindex: 1090; + --bs-toast-padding-x: 0.75rem; + --bs-toast-padding-y: 0.5rem; + --bs-toast-spacing: 1.5rem; + --bs-toast-max-width: 350px; + --bs-toast-font-size: 0.875rem; + --bs-toast-color: ; + --bs-toast-bg: rgba(var(--bs-body-bg-rgb), 0.85); + --bs-toast-border-width: var(--bs-border-width); + --bs-toast-border-color: var(--bs-border-color-translucent); + --bs-toast-border-radius: var(--bs-border-radius); + --bs-toast-box-shadow: var(--bs-box-shadow); + --bs-toast-header-color: var(--bs-secondary-color); + --bs-toast-header-bg: rgba(var(--bs-body-bg-rgb), 0.85); + --bs-toast-header-border-color: var(--bs-border-color-translucent); + width: var(--bs-toast-max-width); + max-width: 100%; + font-size: var(--bs-toast-font-size); + color: var(--bs-toast-color); + pointer-events: auto; + background-color: var(--bs-toast-bg); + background-clip: padding-box; + border: var(--bs-toast-border-width) solid var(--bs-toast-border-color); + box-shadow: var(--bs-toast-box-shadow); + border-radius: var(--bs-toast-border-radius); + } + .toast.showing { + opacity: 0; + } + .toast:not(.show) { + display: none; + } + + .toast-container { + --bs-toast-zindex: 1090; + position: absolute; + z-index: var(--bs-toast-zindex); + width: -webkit-max-content; + width: -moz-max-content; + width: max-content; + max-width: 100%; + pointer-events: none; + } + .toast-container > :not(:last-child) { + margin-bottom: var(--bs-toast-spacing); + } + + .toast-header { + display: flex; + align-items: center; + padding: var(--bs-toast-padding-y) var(--bs-toast-padding-x); + color: var(--bs-toast-header-color); + background-color: var(--bs-toast-header-bg); + background-clip: padding-box; + border-bottom: var(--bs-toast-border-width) solid var(--bs-toast-header-border-color); + border-top-left-radius: calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width)); + border-top-right-radius: calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width)); + } + .toast-header .btn-close { + margin-right: calc(-0.5 * var(--bs-toast-padding-x)); + margin-left: var(--bs-toast-padding-x); + } + + .toast-body { + padding: var(--bs-toast-padding-x); + word-wrap: break-word; + } + + .modal { + --bs-modal-zindex: 1055; + --bs-modal-width: 500px; + --bs-modal-padding: 1rem; + --bs-modal-margin: 0.5rem; + --bs-modal-color: ; + --bs-modal-bg: var(--bs-body-bg); + --bs-modal-border-color: var(--bs-border-color-translucent); + --bs-modal-border-width: var(--bs-border-width); + --bs-modal-border-radius: var(--bs-border-radius-lg); + --bs-modal-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075); + --bs-modal-inner-border-radius: calc(var(--bs-border-radius-lg) - (var(--bs-border-width))); + --bs-modal-header-padding-x: 1rem; + --bs-modal-header-padding-y: 1rem; + --bs-modal-header-padding: 1rem 1rem; + --bs-modal-header-border-color: var(--bs-border-color); + --bs-modal-header-border-width: var(--bs-border-width); + --bs-modal-title-line-height: 1.5; + --bs-modal-footer-gap: 0.5rem; + --bs-modal-footer-bg: ; + --bs-modal-footer-border-color: var(--bs-border-color); + --bs-modal-footer-border-width: var(--bs-border-width); + position: fixed; + top: 0; + left: 0; + z-index: var(--bs-modal-zindex); + display: none; + width: 100%; + height: 100%; + overflow-x: hidden; + overflow-y: auto; + outline: 0; + } + + .modal-dialog { + position: relative; + width: auto; + margin: var(--bs-modal-margin); + pointer-events: none; + } + .modal.fade .modal-dialog { + transition: transform 0.3s ease-out; + transform: translate(0, -50px); + } + @media (prefers-reduced-motion: reduce) { + .modal.fade .modal-dialog { + transition: none; + } + } + .modal.show .modal-dialog { + transform: none; + } + .modal.modal-static .modal-dialog { + transform: scale(1.02); + } + + .modal-dialog-scrollable { + height: calc(100% - var(--bs-modal-margin) * 2); + } + .modal-dialog-scrollable .modal-content { + max-height: 100%; + overflow: hidden; + } + .modal-dialog-scrollable .modal-body { + overflow-y: auto; + } + + .modal-dialog-centered { + display: flex; + align-items: center; + min-height: calc(100% - var(--bs-modal-margin) * 2); + } + + .modal-content { + position: relative; + display: flex; + flex-direction: column; + width: 100%; + color: var(--bs-modal-color); + pointer-events: auto; + background-color: var(--bs-modal-bg); + background-clip: padding-box; + border: var(--bs-modal-border-width) solid var(--bs-modal-border-color); + border-radius: var(--bs-modal-border-radius); + outline: 0; + } + + .modal-backdrop { + --bs-backdrop-zindex: 1050; + --bs-backdrop-bg: #000; + --bs-backdrop-opacity: 0.5; + position: fixed; + top: 0; + left: 0; + z-index: var(--bs-backdrop-zindex); + width: 100vw; + height: 100vh; + background-color: var(--bs-backdrop-bg); + } + .modal-backdrop.fade { + opacity: 0; + } + .modal-backdrop.show { + opacity: var(--bs-backdrop-opacity); + } + + .modal-header { + display: flex; + flex-shrink: 0; + align-items: center; + justify-content: space-between; + padding: var(--bs-modal-header-padding); + border-bottom: var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color); + border-top-left-radius: var(--bs-modal-inner-border-radius); + border-top-right-radius: var(--bs-modal-inner-border-radius); + } + .modal-header .btn-close { + padding: calc(var(--bs-modal-header-padding-y) * 0.5) + calc(var(--bs-modal-header-padding-x) * 0.5); + margin: calc(-0.5 * var(--bs-modal-header-padding-y)) + calc(-0.5 * var(--bs-modal-header-padding-x)) calc(-0.5 * var(--bs-modal-header-padding-y)) + auto; + } + + .modal-title { + margin-bottom: 0; + line-height: var(--bs-modal-title-line-height); + } + + .modal-body { + position: relative; + flex: 1 1 auto; + padding: var(--bs-modal-padding); + } + + .modal-footer { + display: flex; + flex-shrink: 0; + flex-wrap: wrap; + align-items: center; + justify-content: flex-end; + padding: calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap) * 0.5); + background-color: var(--bs-modal-footer-bg); + border-top: var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color); + border-bottom-right-radius: var(--bs-modal-inner-border-radius); + border-bottom-left-radius: var(--bs-modal-inner-border-radius); + } + .modal-footer > * { + margin: calc(var(--bs-modal-footer-gap) * 0.5); + } + + @media (min-width: 576px) { + .modal { + --bs-modal-margin: 1.75rem; + --bs-modal-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15); + } + .modal-dialog { + max-width: var(--bs-modal-width); + margin-right: auto; + margin-left: auto; + } + .modal-sm { + --bs-modal-width: 300px; + } + } + @media (min-width: 992px) { + .modal-lg, + .modal-xl { + --bs-modal-width: 800px; + } + } + @media (min-width: 1200px) { + .modal-xl { + --bs-modal-width: 1140px; + } + } + .modal-fullscreen { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen .modal-header, + .modal-fullscreen .modal-footer { + border-radius: 0; + } + .modal-fullscreen .modal-body { + overflow-y: auto; + } + + @media (max-width: 575.98px) { + .modal-fullscreen-sm-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-sm-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-sm-down .modal-header, + .modal-fullscreen-sm-down .modal-footer { + border-radius: 0; + } + .modal-fullscreen-sm-down .modal-body { + overflow-y: auto; + } + } + @media (max-width: 767.98px) { + .modal-fullscreen-md-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-md-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-md-down .modal-header, + .modal-fullscreen-md-down .modal-footer { + border-radius: 0; + } + .modal-fullscreen-md-down .modal-body { + overflow-y: auto; + } + } + @media (max-width: 991.98px) { + .modal-fullscreen-lg-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-lg-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-lg-down .modal-header, + .modal-fullscreen-lg-down .modal-footer { + border-radius: 0; + } + .modal-fullscreen-lg-down .modal-body { + overflow-y: auto; + } + } + @media (max-width: 1199.98px) { + .modal-fullscreen-xl-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-xl-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-xl-down .modal-header, + .modal-fullscreen-xl-down .modal-footer { + border-radius: 0; + } + .modal-fullscreen-xl-down .modal-body { + overflow-y: auto; + } + } + @media (max-width: 1399.98px) { + .modal-fullscreen-xxl-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-xxl-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-xxl-down .modal-header, + .modal-fullscreen-xxl-down .modal-footer { + border-radius: 0; + } + .modal-fullscreen-xxl-down .modal-body { + overflow-y: auto; + } + } + .tooltip { + --bs-tooltip-zindex: 1080; + --bs-tooltip-max-width: 200px; + --bs-tooltip-padding-x: 0.5rem; + --bs-tooltip-padding-y: 0.25rem; + --bs-tooltip-margin: ; + --bs-tooltip-font-size: 0.875rem; + --bs-tooltip-color: var(--bs-body-bg); + --bs-tooltip-bg: var(--bs-emphasis-color); + --bs-tooltip-border-radius: var(--bs-border-radius); + --bs-tooltip-opacity: 0.9; + --bs-tooltip-arrow-width: 0.8rem; + --bs-tooltip-arrow-height: 0.4rem; + z-index: var(--bs-tooltip-zindex); + display: block; + margin: var(--bs-tooltip-margin); + font-family: var(--bs-font-sans-serif); + font-style: normal; + font-weight: 400; + line-height: 1.5; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + white-space: normal; + word-spacing: normal; + line-break: auto; + font-size: var(--bs-tooltip-font-size); + word-wrap: break-word; + opacity: 0; + } + .tooltip.show { + opacity: var(--bs-tooltip-opacity); + } + .tooltip .tooltip-arrow { + display: block; + width: var(--bs-tooltip-arrow-width); + height: var(--bs-tooltip-arrow-height); + } + .tooltip .tooltip-arrow::before { + position: absolute; + content: ''; + border-color: transparent; + border-style: solid; + } + + .bs-tooltip-top .tooltip-arrow, + .bs-tooltip-auto[data-popper-placement^='top'] .tooltip-arrow { + bottom: calc(-1 * var(--bs-tooltip-arrow-height)); + } + .bs-tooltip-top .tooltip-arrow::before, + .bs-tooltip-auto[data-popper-placement^='top'] .tooltip-arrow::before { + top: -1px; + border-width: var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * 0.5) 0; + border-top-color: var(--bs-tooltip-bg); + } + + /* rtl:begin:ignore */ + .bs-tooltip-end .tooltip-arrow, + .bs-tooltip-auto[data-popper-placement^='right'] .tooltip-arrow { + left: calc(-1 * var(--bs-tooltip-arrow-height)); + width: var(--bs-tooltip-arrow-height); + height: var(--bs-tooltip-arrow-width); + } + .bs-tooltip-end .tooltip-arrow::before, + .bs-tooltip-auto[data-popper-placement^='right'] .tooltip-arrow::before { + right: -1px; + border-width: calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height) + calc(var(--bs-tooltip-arrow-width) * 0.5) 0; + border-right-color: var(--bs-tooltip-bg); + } + + /* rtl:end:ignore */ + .bs-tooltip-bottom .tooltip-arrow, + .bs-tooltip-auto[data-popper-placement^='bottom'] .tooltip-arrow { + top: calc(-1 * var(--bs-tooltip-arrow-height)); + } + .bs-tooltip-bottom .tooltip-arrow::before, + .bs-tooltip-auto[data-popper-placement^='bottom'] .tooltip-arrow::before { + bottom: -1px; + border-width: 0 calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height); + border-bottom-color: var(--bs-tooltip-bg); + } + + /* rtl:begin:ignore */ + .bs-tooltip-start .tooltip-arrow, + .bs-tooltip-auto[data-popper-placement^='left'] .tooltip-arrow { + right: calc(-1 * var(--bs-tooltip-arrow-height)); + width: var(--bs-tooltip-arrow-height); + height: var(--bs-tooltip-arrow-width); + } + .bs-tooltip-start .tooltip-arrow::before, + .bs-tooltip-auto[data-popper-placement^='left'] .tooltip-arrow::before { + left: -1px; + border-width: calc(var(--bs-tooltip-arrow-width) * 0.5) 0 + calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height); + border-left-color: var(--bs-tooltip-bg); + } + + /* rtl:end:ignore */ + .tooltip-inner { + max-width: var(--bs-tooltip-max-width); + padding: var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x); + color: var(--bs-tooltip-color); + text-align: center; + background-color: var(--bs-tooltip-bg); + border-radius: var(--bs-tooltip-border-radius); + } + + .popover { + --bs-popover-zindex: 1070; + --bs-popover-max-width: 276px; + --bs-popover-font-size: 0.875rem; + --bs-popover-bg: var(--bs-body-bg); + --bs-popover-border-width: var(--bs-border-width); + --bs-popover-border-color: var(--bs-border-color-translucent); + --bs-popover-border-radius: var(--bs-border-radius-lg); + --bs-popover-inner-border-radius: calc(var(--bs-border-radius-lg) - var(--bs-border-width)); + --bs-popover-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15); + --bs-popover-header-padding-x: 1rem; + --bs-popover-header-padding-y: 0.5rem; + --bs-popover-header-font-size: 1rem; + --bs-popover-header-color: ; + --bs-popover-header-bg: var(--bs-secondary-bg); + --bs-popover-body-padding-x: 1rem; + --bs-popover-body-padding-y: 1rem; + --bs-popover-body-color: var(--bs-body-color); + --bs-popover-arrow-width: 1rem; + --bs-popover-arrow-height: 0.5rem; + --bs-popover-arrow-border: var(--bs-popover-border-color); + z-index: var(--bs-popover-zindex); + display: block; + max-width: var(--bs-popover-max-width); + font-family: var(--bs-font-sans-serif); + font-style: normal; + font-weight: 400; + line-height: 1.5; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + white-space: normal; + word-spacing: normal; + line-break: auto; + font-size: var(--bs-popover-font-size); + word-wrap: break-word; + background-color: var(--bs-popover-bg); + background-clip: padding-box; + border: var(--bs-popover-border-width) solid var(--bs-popover-border-color); + border-radius: var(--bs-popover-border-radius); + } + .popover .popover-arrow { + display: block; + width: var(--bs-popover-arrow-width); + height: var(--bs-popover-arrow-height); + } + .popover .popover-arrow::before, + .popover .popover-arrow::after { + position: absolute; + display: block; + content: ''; + border-color: transparent; + border-style: solid; + border-width: 0; + } + + .bs-popover-top > .popover-arrow, + .bs-popover-auto[data-popper-placement^='top'] > .popover-arrow { + bottom: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width)); + } + .bs-popover-top > .popover-arrow::before, + .bs-popover-auto[data-popper-placement^='top'] > .popover-arrow::before, + .bs-popover-top > .popover-arrow::after, + .bs-popover-auto[data-popper-placement^='top'] > .popover-arrow::after { + border-width: var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * 0.5) 0; + } + .bs-popover-top > .popover-arrow::before, + .bs-popover-auto[data-popper-placement^='top'] > .popover-arrow::before { + bottom: 0; + border-top-color: var(--bs-popover-arrow-border); + } + .bs-popover-top > .popover-arrow::after, + .bs-popover-auto[data-popper-placement^='top'] > .popover-arrow::after { + bottom: var(--bs-popover-border-width); + border-top-color: var(--bs-popover-bg); + } + + /* rtl:begin:ignore */ + .bs-popover-end > .popover-arrow, + .bs-popover-auto[data-popper-placement^='right'] > .popover-arrow { + left: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width)); + width: var(--bs-popover-arrow-height); + height: var(--bs-popover-arrow-width); + } + .bs-popover-end > .popover-arrow::before, + .bs-popover-auto[data-popper-placement^='right'] > .popover-arrow::before, + .bs-popover-end > .popover-arrow::after, + .bs-popover-auto[data-popper-placement^='right'] > .popover-arrow::after { + border-width: calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height) + calc(var(--bs-popover-arrow-width) * 0.5) 0; + } + .bs-popover-end > .popover-arrow::before, + .bs-popover-auto[data-popper-placement^='right'] > .popover-arrow::before { + left: 0; + border-right-color: var(--bs-popover-arrow-border); + } + .bs-popover-end > .popover-arrow::after, + .bs-popover-auto[data-popper-placement^='right'] > .popover-arrow::after { + left: var(--bs-popover-border-width); + border-right-color: var(--bs-popover-bg); + } + + /* rtl:end:ignore */ + .bs-popover-bottom > .popover-arrow, + .bs-popover-auto[data-popper-placement^='bottom'] > .popover-arrow { + top: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width)); + } + .bs-popover-bottom > .popover-arrow::before, + .bs-popover-auto[data-popper-placement^='bottom'] > .popover-arrow::before, + .bs-popover-bottom > .popover-arrow::after, + .bs-popover-auto[data-popper-placement^='bottom'] > .popover-arrow::after { + border-width: 0 calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height); + } + .bs-popover-bottom > .popover-arrow::before, + .bs-popover-auto[data-popper-placement^='bottom'] > .popover-arrow::before { + top: 0; + border-bottom-color: var(--bs-popover-arrow-border); + } + .bs-popover-bottom > .popover-arrow::after, + .bs-popover-auto[data-popper-placement^='bottom'] > .popover-arrow::after { + top: var(--bs-popover-border-width); + border-bottom-color: var(--bs-popover-bg); + } + .bs-popover-bottom .popover-header::before, + .bs-popover-auto[data-popper-placement^='bottom'] .popover-header::before { + position: absolute; + top: 0; + left: 50%; + display: block; + width: var(--bs-popover-arrow-width); + margin-left: calc(-0.5 * var(--bs-popover-arrow-width)); + content: ''; + border-bottom: var(--bs-popover-border-width) solid var(--bs-popover-header-bg); + } + + /* rtl:begin:ignore */ + .bs-popover-start > .popover-arrow, + .bs-popover-auto[data-popper-placement^='left'] > .popover-arrow { + right: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width)); + width: var(--bs-popover-arrow-height); + height: var(--bs-popover-arrow-width); + } + .bs-popover-start > .popover-arrow::before, + .bs-popover-auto[data-popper-placement^='left'] > .popover-arrow::before, + .bs-popover-start > .popover-arrow::after, + .bs-popover-auto[data-popper-placement^='left'] > .popover-arrow::after { + border-width: calc(var(--bs-popover-arrow-width) * 0.5) 0 + calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height); + } + .bs-popover-start > .popover-arrow::before, + .bs-popover-auto[data-popper-placement^='left'] > .popover-arrow::before { + right: 0; + border-left-color: var(--bs-popover-arrow-border); + } + .bs-popover-start > .popover-arrow::after, + .bs-popover-auto[data-popper-placement^='left'] > .popover-arrow::after { + right: var(--bs-popover-border-width); + border-left-color: var(--bs-popover-bg); + } + + /* rtl:end:ignore */ + .popover-header { + padding: var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x); + margin-bottom: 0; + font-size: var(--bs-popover-header-font-size); + color: var(--bs-popover-header-color); + background-color: var(--bs-popover-header-bg); + border-bottom: var(--bs-popover-border-width) solid var(--bs-popover-border-color); + border-top-left-radius: var(--bs-popover-inner-border-radius); + border-top-right-radius: var(--bs-popover-inner-border-radius); + } + .popover-header:empty { + display: none; + } + + .popover-body { + padding: var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x); + color: var(--bs-popover-body-color); + } + + .carousel { + position: relative; + } + + .carousel.pointer-event { + touch-action: pan-y; + } + + .carousel-inner { + position: relative; + width: 100%; + overflow: hidden; + } + .carousel-inner::after { + display: block; + clear: both; + content: ''; + } + + .carousel-item { + position: relative; + display: none; + float: left; + width: 100%; + margin-right: -100%; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + transition: transform 0.6s ease-in-out; + } + @media (prefers-reduced-motion: reduce) { + .carousel-item { + transition: none; + } + } + + .carousel-item.active, + .carousel-item-next, + .carousel-item-prev { + display: block; + } + + .carousel-item-next:not(.carousel-item-start), + .active.carousel-item-end { + transform: translateX(100%); + } + + .carousel-item-prev:not(.carousel-item-end), + .active.carousel-item-start { + transform: translateX(-100%); + } + + .carousel-fade .carousel-item { + opacity: 0; + transition-property: opacity; + transform: none; + } + .carousel-fade .carousel-item.active, + .carousel-fade .carousel-item-next.carousel-item-start, + .carousel-fade .carousel-item-prev.carousel-item-end { + z-index: 1; + opacity: 1; + } + .carousel-fade .active.carousel-item-start, + .carousel-fade .active.carousel-item-end { + z-index: 0; + opacity: 0; + transition: opacity 0s 0.6s; + } + @media (prefers-reduced-motion: reduce) { + .carousel-fade .active.carousel-item-start, + .carousel-fade .active.carousel-item-end { + transition: none; + } + } + + .carousel-control-prev, + .carousel-control-next { + position: absolute; + top: 0; + bottom: 0; + z-index: 1; + display: flex; + align-items: center; + justify-content: center; + width: 15%; + padding: 0; + color: #fff; + text-align: center; + background: none; + border: 0; + opacity: 0.5; + transition: opacity 0.15s ease; + } + @media (prefers-reduced-motion: reduce) { + .carousel-control-prev, + .carousel-control-next { + transition: none; + } + } + .carousel-control-prev:hover, + .carousel-control-prev:focus, + .carousel-control-next:hover, + .carousel-control-next:focus { + color: #fff; + text-decoration: none; + outline: 0; + opacity: 0.9; + } + + .carousel-control-prev { + left: 0; + } + + .carousel-control-next { + right: 0; + } + + .carousel-control-prev-icon, + .carousel-control-next-icon { + display: inline-block; + width: 2rem; + height: 2rem; + background-repeat: no-repeat; + background-position: 50%; + background-size: 100% 100%; + } + + /* rtl:options: { + "autoRename": true, + "stringMap":[ { + "name" : "prev-next", + "search" : "prev", + "replace" : "next" + } ] +} */ + .carousel-control-prev-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e"); + } + + .carousel-control-next-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); + } + + .carousel-indicators { + position: absolute; + right: 0; + bottom: 0; + left: 0; + z-index: 2; + display: flex; + justify-content: center; + padding: 0; + margin-right: 15%; + margin-bottom: 1rem; + margin-left: 15%; + } + .carousel-indicators [data-bs-target] { + box-sizing: content-box; + flex: 0 1 auto; + width: 30px; + height: 3px; + padding: 0; + margin-right: 3px; + margin-left: 3px; + text-indent: -999px; + cursor: pointer; + background-color: #fff; + background-clip: padding-box; + border: 0; + border-top: 10px solid transparent; + border-bottom: 10px solid transparent; + opacity: 0.5; + transition: opacity 0.6s ease; + } + @media (prefers-reduced-motion: reduce) { + .carousel-indicators [data-bs-target] { + transition: none; + } + } + .carousel-indicators .active { + opacity: 1; + } + + .carousel-caption { + position: absolute; + right: 15%; + bottom: 1.25rem; + left: 15%; + padding-top: 1.25rem; + padding-bottom: 1.25rem; + color: #fff; + text-align: center; + } + + .carousel-dark .carousel-control-prev-icon, + .carousel-dark .carousel-control-next-icon { + filter: invert(1) grayscale(100); + } + .carousel-dark .carousel-indicators [data-bs-target] { + background-color: #000; + } + .carousel-dark .carousel-caption { + color: #000; + } + + [data-bs-theme='dark'] .carousel .carousel-control-prev-icon, + [data-bs-theme='dark'] .carousel .carousel-control-next-icon, + [data-bs-theme='dark'].carousel .carousel-control-prev-icon, + [data-bs-theme='dark'].carousel .carousel-control-next-icon { + filter: invert(1) grayscale(100); + } + [data-bs-theme='dark'] .carousel .carousel-indicators [data-bs-target], + [data-bs-theme='dark'].carousel .carousel-indicators [data-bs-target] { + background-color: #000; + } + [data-bs-theme='dark'] .carousel .carousel-caption, + [data-bs-theme='dark'].carousel .carousel-caption { + color: #000; + } + + .spinner-grow, + .spinner-border { + display: inline-block; + width: var(--bs-spinner-width); + height: var(--bs-spinner-height); + vertical-align: var(--bs-spinner-vertical-align); + border-radius: 50%; + animation: var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name); + } + + @keyframes spinner-border { + to { + transform: rotate(360deg) /* rtl:ignore */; + } + } + .spinner-border { + --bs-spinner-width: 2rem; + --bs-spinner-height: 2rem; + --bs-spinner-vertical-align: -0.125em; + --bs-spinner-border-width: 0.25em; + --bs-spinner-animation-speed: 0.75s; + --bs-spinner-animation-name: spinner-border; + border: var(--bs-spinner-border-width) solid currentcolor; + border-right-color: transparent; + } + + .spinner-border-sm { + --bs-spinner-width: 1rem; + --bs-spinner-height: 1rem; + --bs-spinner-border-width: 0.2em; + } + + @keyframes spinner-grow { + 0% { + transform: scale(0); + } + 50% { + opacity: 1; + transform: none; + } + } + .spinner-grow { + --bs-spinner-width: 2rem; + --bs-spinner-height: 2rem; + --bs-spinner-vertical-align: -0.125em; + --bs-spinner-animation-speed: 0.75s; + --bs-spinner-animation-name: spinner-grow; + background-color: currentcolor; + opacity: 0; + } + + .spinner-grow-sm { + --bs-spinner-width: 1rem; + --bs-spinner-height: 1rem; + } + + @media (prefers-reduced-motion: reduce) { + .spinner-border, + .spinner-grow { + --bs-spinner-animation-speed: 1.5s; + } + } + .offcanvas, + .offcanvas-xxl, + .offcanvas-xl, + .offcanvas-lg, + .offcanvas-md, + .offcanvas-sm { + --bs-offcanvas-zindex: 1045; + --bs-offcanvas-width: 400px; + --bs-offcanvas-height: 30vh; + --bs-offcanvas-padding-x: 1rem; + --bs-offcanvas-padding-y: 1rem; + --bs-offcanvas-color: var(--bs-body-color); + --bs-offcanvas-bg: var(--bs-body-bg); + --bs-offcanvas-border-width: var(--bs-border-width); + --bs-offcanvas-border-color: var(--bs-border-color-translucent); + --bs-offcanvas-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075); + --bs-offcanvas-transition: transform 0.3s ease-in-out; + --bs-offcanvas-title-line-height: 1.5; + } + + @media (max-width: 575.98px) { + .offcanvas-sm { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: var(--bs-offcanvas-transition); + } + } + @media (max-width: 575.98px) and (prefers-reduced-motion: reduce) { + .offcanvas-sm { + transition: none; + } + } + @media (max-width: 575.98px) { + .offcanvas-sm.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(-100%); + } + } + @media (max-width: 575.98px) { + .offcanvas-sm.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(100%); + } + } + @media (max-width: 575.98px) { + .offcanvas-sm.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(-100%); + } + } + @media (max-width: 575.98px) { + .offcanvas-sm.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(100%); + } + } + @media (max-width: 575.98px) { + .offcanvas-sm.showing, + .offcanvas-sm.show:not(.hiding) { + transform: none; + } + } + @media (max-width: 575.98px) { + .offcanvas-sm.showing, + .offcanvas-sm.hiding, + .offcanvas-sm.show { + visibility: visible; + } + } + @media (min-width: 576px) { + .offcanvas-sm { + --bs-offcanvas-height: auto; + --bs-offcanvas-border-width: 0; + background-color: transparent !important; + } + .offcanvas-sm .offcanvas-header { + display: none; + } + .offcanvas-sm .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + background-color: transparent !important; + } + } + + @media (max-width: 767.98px) { + .offcanvas-md { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: var(--bs-offcanvas-transition); + } + } + @media (max-width: 767.98px) and (prefers-reduced-motion: reduce) { + .offcanvas-md { + transition: none; + } + } + @media (max-width: 767.98px) { + .offcanvas-md.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(-100%); + } + } + @media (max-width: 767.98px) { + .offcanvas-md.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(100%); + } + } + @media (max-width: 767.98px) { + .offcanvas-md.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(-100%); + } + } + @media (max-width: 767.98px) { + .offcanvas-md.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(100%); + } + } + @media (max-width: 767.98px) { + .offcanvas-md.showing, + .offcanvas-md.show:not(.hiding) { + transform: none; + } + } + @media (max-width: 767.98px) { + .offcanvas-md.showing, + .offcanvas-md.hiding, + .offcanvas-md.show { + visibility: visible; + } + } + @media (min-width: 768px) { + .offcanvas-md { + --bs-offcanvas-height: auto; + --bs-offcanvas-border-width: 0; + background-color: transparent !important; + } + .offcanvas-md .offcanvas-header { + display: none; + } + .offcanvas-md .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + background-color: transparent !important; + } + } + + @media (max-width: 991.98px) { + .offcanvas-lg { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: var(--bs-offcanvas-transition); + } + } + @media (max-width: 991.98px) and (prefers-reduced-motion: reduce) { + .offcanvas-lg { + transition: none; + } + } + @media (max-width: 991.98px) { + .offcanvas-lg.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(-100%); + } + } + @media (max-width: 991.98px) { + .offcanvas-lg.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(100%); + } + } + @media (max-width: 991.98px) { + .offcanvas-lg.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(-100%); + } + } + @media (max-width: 991.98px) { + .offcanvas-lg.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(100%); + } + } + @media (max-width: 991.98px) { + .offcanvas-lg.showing, + .offcanvas-lg.show:not(.hiding) { + transform: none; + } + } + @media (max-width: 991.98px) { + .offcanvas-lg.showing, + .offcanvas-lg.hiding, + .offcanvas-lg.show { + visibility: visible; + } + } + @media (min-width: 992px) { + .offcanvas-lg { + --bs-offcanvas-height: auto; + --bs-offcanvas-border-width: 0; + background-color: transparent !important; + } + .offcanvas-lg .offcanvas-header { + display: none; + } + .offcanvas-lg .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + background-color: transparent !important; + } + } + + @media (max-width: 1199.98px) { + .offcanvas-xl { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: var(--bs-offcanvas-transition); + } + } + @media (max-width: 1199.98px) and (prefers-reduced-motion: reduce) { + .offcanvas-xl { + transition: none; + } + } + @media (max-width: 1199.98px) { + .offcanvas-xl.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(-100%); + } + } + @media (max-width: 1199.98px) { + .offcanvas-xl.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(100%); + } + } + @media (max-width: 1199.98px) { + .offcanvas-xl.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(-100%); + } + } + @media (max-width: 1199.98px) { + .offcanvas-xl.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(100%); + } + } + @media (max-width: 1199.98px) { + .offcanvas-xl.showing, + .offcanvas-xl.show:not(.hiding) { + transform: none; + } + } + @media (max-width: 1199.98px) { + .offcanvas-xl.showing, + .offcanvas-xl.hiding, + .offcanvas-xl.show { + visibility: visible; + } + } + @media (min-width: 1200px) { + .offcanvas-xl { + --bs-offcanvas-height: auto; + --bs-offcanvas-border-width: 0; + background-color: transparent !important; + } + .offcanvas-xl .offcanvas-header { + display: none; + } + .offcanvas-xl .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + background-color: transparent !important; + } + } + + @media (max-width: 1399.98px) { + .offcanvas-xxl { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: var(--bs-offcanvas-transition); + } + } + @media (max-width: 1399.98px) and (prefers-reduced-motion: reduce) { + .offcanvas-xxl { + transition: none; + } + } + @media (max-width: 1399.98px) { + .offcanvas-xxl.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(-100%); + } + } + @media (max-width: 1399.98px) { + .offcanvas-xxl.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(100%); + } + } + @media (max-width: 1399.98px) { + .offcanvas-xxl.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(-100%); + } + } + @media (max-width: 1399.98px) { + .offcanvas-xxl.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(100%); + } + } + @media (max-width: 1399.98px) { + .offcanvas-xxl.showing, + .offcanvas-xxl.show:not(.hiding) { + transform: none; + } + } + @media (max-width: 1399.98px) { + .offcanvas-xxl.showing, + .offcanvas-xxl.hiding, + .offcanvas-xxl.show { + visibility: visible; + } + } + @media (min-width: 1400px) { + .offcanvas-xxl { + --bs-offcanvas-height: auto; + --bs-offcanvas-border-width: 0; + background-color: transparent !important; + } + .offcanvas-xxl .offcanvas-header { + display: none; + } + .offcanvas-xxl .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + background-color: transparent !important; + } + } + + .offcanvas { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: var(--bs-offcanvas-transition); + } + @media (prefers-reduced-motion: reduce) { + .offcanvas { + transition: none; + } + } + .offcanvas.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(-100%); + } + .offcanvas.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(100%); + } + .offcanvas.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(-100%); + } + .offcanvas.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(100%); + } + .offcanvas.showing, + .offcanvas.show:not(.hiding) { + transform: none; + } + .offcanvas.showing, + .offcanvas.hiding, + .offcanvas.show { + visibility: visible; + } + + .offcanvas-backdrop { + position: fixed; + top: 0; + left: 0; + z-index: 1040; + width: 100vw; + height: 100vh; + background-color: #000; + } + .offcanvas-backdrop.fade { + opacity: 0; + } + .offcanvas-backdrop.show { + opacity: 0.5; + } + + .offcanvas-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x); + } + .offcanvas-header .btn-close { + padding: calc(var(--bs-offcanvas-padding-y) * 0.5) calc(var(--bs-offcanvas-padding-x) * 0.5); + margin-top: calc(-0.5 * var(--bs-offcanvas-padding-y)); + margin-right: calc(-0.5 * var(--bs-offcanvas-padding-x)); + margin-bottom: calc(-0.5 * var(--bs-offcanvas-padding-y)); + } + + .offcanvas-title { + margin-bottom: 0; + line-height: var(--bs-offcanvas-title-line-height); + } + + .offcanvas-body { + flex-grow: 1; + padding: var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x); + overflow-y: auto; + } + + .placeholder { + display: inline-block; + min-height: 1em; + vertical-align: middle; + cursor: wait; + background-color: currentcolor; + opacity: 0.5; + } + .placeholder.btn::before { + display: inline-block; + content: ''; + } + + .placeholder-xs { + min-height: 0.6em; + } + + .placeholder-sm { + min-height: 0.8em; + } + + .placeholder-lg { + min-height: 1.2em; + } + + .placeholder-glow .placeholder { + animation: placeholder-glow 2s ease-in-out infinite; + } + + @keyframes placeholder-glow { + 50% { + opacity: 0.2; + } + } + .placeholder-wave { + -webkit-mask-image: linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%); + mask-image: linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%); + -webkit-mask-size: 200% 100%; + mask-size: 200% 100%; + animation: placeholder-wave 2s linear infinite; + } + + @keyframes placeholder-wave { + 100% { + -webkit-mask-position: -200% 0%; + mask-position: -200% 0%; + } + } + .clearfix::after { + display: block; + clear: both; + content: ''; + } + + .text-bg-primary { + color: #fff !important; + background-color: RGBA(13, 110, 253, var(--bs-bg-opacity, 1)) !important; + } + + .text-bg-secondary { + color: #fff !important; + background-color: RGBA(108, 117, 125, var(--bs-bg-opacity, 1)) !important; + } + + .text-bg-success { + color: #fff !important; + background-color: RGBA(25, 135, 84, var(--bs-bg-opacity, 1)) !important; + } + + .text-bg-info { + color: #000 !important; + background-color: RGBA(13, 202, 240, var(--bs-bg-opacity, 1)) !important; + } + + .text-bg-warning { + color: #000 !important; + background-color: RGBA(255, 193, 7, var(--bs-bg-opacity, 1)) !important; + } + + .text-bg-danger { + color: #fff !important; + background-color: RGBA(220, 53, 69, var(--bs-bg-opacity, 1)) !important; + } + + .text-bg-light { + color: #000 !important; + background-color: RGBA(248, 249, 250, var(--bs-bg-opacity, 1)) !important; + } + + .text-bg-dark { + color: #fff !important; + background-color: RGBA(33, 37, 41, var(--bs-bg-opacity, 1)) !important; + } + + .link-primary { + color: RGBA(var(--bs-primary-rgb, var(--bs-link-opacity, 1))); + -webkit-text-decoration-color: RGBA(var(--bs-primary-rgb), var(--bs-link-underline-opacity, 1)); + text-decoration-color: RGBA(var(--bs-primary-rgb), var(--bs-link-underline-opacity, 1)); + } + .link-primary:hover, + .link-primary:focus { + color: RGBA(10, 88, 202, var(--bs-link-opacity, 1)); + -webkit-text-decoration-color: RGBA(10, 88, 202, var(--bs-link-underline-opacity, 1)); + text-decoration-color: RGBA(10, 88, 202, var(--bs-link-underline-opacity, 1)); + } + + .link-secondary { + color: RGBA(var(--bs-secondary-rgb, var(--bs-link-opacity, 1))); + -webkit-text-decoration-color: RGBA( + var(--bs-secondary-rgb), + var(--bs-link-underline-opacity, 1) + ); + text-decoration-color: RGBA(var(--bs-secondary-rgb), var(--bs-link-underline-opacity, 1)); + } + .link-secondary:hover, + .link-secondary:focus { + color: RGBA(86, 94, 100, var(--bs-link-opacity, 1)); + -webkit-text-decoration-color: RGBA(86, 94, 100, var(--bs-link-underline-opacity, 1)); + text-decoration-color: RGBA(86, 94, 100, var(--bs-link-underline-opacity, 1)); + } + + .link-success { + color: RGBA(var(--bs-success-rgb, var(--bs-link-opacity, 1))); + -webkit-text-decoration-color: RGBA(var(--bs-success-rgb), var(--bs-link-underline-opacity, 1)); + text-decoration-color: RGBA(var(--bs-success-rgb), var(--bs-link-underline-opacity, 1)); + } + .link-success:hover, + .link-success:focus { + color: RGBA(20, 108, 67, var(--bs-link-opacity, 1)); + -webkit-text-decoration-color: RGBA(20, 108, 67, var(--bs-link-underline-opacity, 1)); + text-decoration-color: RGBA(20, 108, 67, var(--bs-link-underline-opacity, 1)); + } + + .link-info { + color: RGBA(var(--bs-info-rgb, var(--bs-link-opacity, 1))); + -webkit-text-decoration-color: RGBA(var(--bs-info-rgb), var(--bs-link-underline-opacity, 1)); + text-decoration-color: RGBA(var(--bs-info-rgb), var(--bs-link-underline-opacity, 1)); + } + .link-info:hover, + .link-info:focus { + color: RGBA(61, 213, 243, var(--bs-link-opacity, 1)); + -webkit-text-decoration-color: RGBA(61, 213, 243, var(--bs-link-underline-opacity, 1)); + text-decoration-color: RGBA(61, 213, 243, var(--bs-link-underline-opacity, 1)); + } + + .link-warning { + color: RGBA(var(--bs-warning-rgb, var(--bs-link-opacity, 1))); + -webkit-text-decoration-color: RGBA(var(--bs-warning-rgb), var(--bs-link-underline-opacity, 1)); + text-decoration-color: RGBA(var(--bs-warning-rgb), var(--bs-link-underline-opacity, 1)); + } + .link-warning:hover, + .link-warning:focus { + color: RGBA(255, 205, 57, var(--bs-link-opacity, 1)); + -webkit-text-decoration-color: RGBA(255, 205, 57, var(--bs-link-underline-opacity, 1)); + text-decoration-color: RGBA(255, 205, 57, var(--bs-link-underline-opacity, 1)); + } + + .link-danger { + color: RGBA(var(--bs-danger-rgb, var(--bs-link-opacity, 1))); + -webkit-text-decoration-color: RGBA(var(--bs-danger-rgb), var(--bs-link-underline-opacity, 1)); + text-decoration-color: RGBA(var(--bs-danger-rgb), var(--bs-link-underline-opacity, 1)); + } + .link-danger:hover, + .link-danger:focus { + color: RGBA(176, 42, 55, var(--bs-link-opacity, 1)); + -webkit-text-decoration-color: RGBA(176, 42, 55, var(--bs-link-underline-opacity, 1)); + text-decoration-color: RGBA(176, 42, 55, var(--bs-link-underline-opacity, 1)); + } + + .link-light { + color: RGBA(var(--bs-light-rgb, var(--bs-link-opacity, 1))); + -webkit-text-decoration-color: RGBA(var(--bs-light-rgb), var(--bs-link-underline-opacity, 1)); + text-decoration-color: RGBA(var(--bs-light-rgb), var(--bs-link-underline-opacity, 1)); + } + .link-light:hover, + .link-light:focus { + color: RGBA(249, 250, 251, var(--bs-link-opacity, 1)); + -webkit-text-decoration-color: RGBA(249, 250, 251, var(--bs-link-underline-opacity, 1)); + text-decoration-color: RGBA(249, 250, 251, var(--bs-link-underline-opacity, 1)); + } + + .link-dark { + color: RGBA(var(--bs-dark-rgb, var(--bs-link-opacity, 1))); + -webkit-text-decoration-color: RGBA(var(--bs-dark-rgb), var(--bs-link-underline-opacity, 1)); + text-decoration-color: RGBA(var(--bs-dark-rgb), var(--bs-link-underline-opacity, 1)); + } + .link-dark:hover, + .link-dark:focus { + color: RGBA(26, 30, 33, var(--bs-link-opacity, 1)); + -webkit-text-decoration-color: RGBA(26, 30, 33, var(--bs-link-underline-opacity, 1)); + text-decoration-color: RGBA(26, 30, 33, var(--bs-link-underline-opacity, 1)); + } + + .link-body-emphasis { + color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 1)); + -webkit-text-decoration-color: RGBA( + var(--bs-emphasis-color-rgb), + var(--bs-link-underline-opacity, 1) + ); + text-decoration-color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 1)); + } + .link-body-emphasis:hover, + .link-body-emphasis:focus { + color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 0.75)); + -webkit-text-decoration-color: RGBA( + var(--bs-emphasis-color-rgb), + var(--bs-link-underline-opacity, 0.75) + ); + text-decoration-color: RGBA( + var(--bs-emphasis-color-rgb), + var(--bs-link-underline-opacity, 0.75) + ); + } + + .focus-ring:focus { + outline: 0; + box-shadow: var(--bs-focus-ring-x, 0) var(--bs-focus-ring-y, 0) var(--bs-focus-ring-blur, 0) + var(--bs-focus-ring-width) var(--bs-focus-ring-color); + } + + .icon-link { + display: inline-flex; + gap: 0.375rem; + align-items: center; + -webkit-text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 0.5)); + text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 0.5)); + text-underline-offset: 0.25em; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + } + .icon-link > .bi { + flex-shrink: 0; + width: 1em; + height: 1em; + fill: currentcolor; + transition: 0.2s ease-in-out transform; + } + @media (prefers-reduced-motion: reduce) { + .icon-link > .bi { + transition: none; + } + } + + .icon-link-hover:hover > .bi, + .icon-link-hover:focus-visible > .bi { + transform: var(--bs-icon-link-transform, translate3d(0.25em, 0, 0)); + } + + .ratio { + position: relative; + width: 100%; + } + .ratio::before { + display: block; + padding-top: var(--bs-aspect-ratio); + content: ''; + } + .ratio > * { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + } + + .ratio-1x1 { + --bs-aspect-ratio: 100%; + } + + .ratio-4x3 { + --bs-aspect-ratio: 75%; + } + + .ratio-16x9 { + --bs-aspect-ratio: 56.25%; + } + + .ratio-21x9 { + --bs-aspect-ratio: 42.8571428571%; + } + + .fixed-top { + position: fixed; + top: 0; + right: 0; + left: 0; + z-index: 1030; + } + + .fixed-bottom { + position: fixed; + right: 0; + bottom: 0; + left: 0; + z-index: 1030; + } + + .sticky-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020; + } + + .sticky-bottom { + position: -webkit-sticky; + position: sticky; + bottom: 0; + z-index: 1020; + } + + @media (min-width: 576px) { + .sticky-sm-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020; + } + .sticky-sm-bottom { + position: -webkit-sticky; + position: sticky; + bottom: 0; + z-index: 1020; + } + } + @media (min-width: 768px) { + .sticky-md-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020; + } + .sticky-md-bottom { + position: -webkit-sticky; + position: sticky; + bottom: 0; + z-index: 1020; + } + } + @media (min-width: 992px) { + .sticky-lg-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020; + } + .sticky-lg-bottom { + position: -webkit-sticky; + position: sticky; + bottom: 0; + z-index: 1020; + } + } + @media (min-width: 1200px) { + .sticky-xl-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020; + } + .sticky-xl-bottom { + position: -webkit-sticky; + position: sticky; + bottom: 0; + z-index: 1020; + } + } + @media (min-width: 1400px) { + .sticky-xxl-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020; + } + .sticky-xxl-bottom { + position: -webkit-sticky; + position: sticky; + bottom: 0; + z-index: 1020; + } + } + .hstack { + display: flex; + flex-direction: row; + align-items: center; + align-self: stretch; + } + + .vstack { + display: flex; + flex: 1 1 auto; + flex-direction: column; + align-self: stretch; + } + + .visually-hidden, + .visually-hidden-focusable:not(:focus):not(:focus-within) { + width: 1px !important; + height: 1px !important; + padding: 0 !important; + margin: -1px !important; + overflow: hidden !important; + clip: rect(0, 0, 0, 0) !important; + white-space: nowrap !important; + border: 0 !important; + } + .visually-hidden:not(caption), + .visually-hidden-focusable:not(:focus):not(:focus-within):not(caption) { + position: absolute !important; + } + + .stretched-link::after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1; + content: ''; + } + + .text-truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + + .vr { + display: inline-block; + align-self: stretch; + width: 1px; + min-height: 1em; + background-color: currentcolor; + opacity: 0.25; + } + + .align-baseline { + vertical-align: baseline !important; + } + + .align-top { + vertical-align: top !important; + } + + .align-middle { + vertical-align: middle !important; + } + + .align-bottom { + vertical-align: bottom !important; + } + + .align-text-bottom { + vertical-align: text-bottom !important; + } + + .align-text-top { + vertical-align: text-top !important; + } + + .float-start { + float: left !important; + } + + .float-end { + float: right !important; + } + + .float-none { + float: none !important; + } + + .object-fit-contain { + -o-object-fit: contain !important; + object-fit: contain !important; + } + + .object-fit-cover { + -o-object-fit: cover !important; + object-fit: cover !important; + } + + .object-fit-fill { + -o-object-fit: fill !important; + object-fit: fill !important; + } + + .object-fit-scale { + -o-object-fit: scale-down !important; + object-fit: scale-down !important; + } + + .object-fit-none { + -o-object-fit: none !important; + object-fit: none !important; + } + + .opacity-0 { + opacity: 0 !important; + } + + .opacity-25 { + opacity: 0.25 !important; + } + + .opacity-50 { + opacity: 0.5 !important; + } + + .opacity-75 { + opacity: 0.75 !important; + } + + .opacity-100 { + opacity: 1 !important; + } + + .overflow-auto { + overflow: auto !important; + } + + .overflow-hidden { + overflow: hidden !important; + } + + .overflow-visible { + overflow: visible !important; + } + + .overflow-scroll { + overflow: scroll !important; + } + + .overflow-x-auto { + overflow-x: auto !important; + } + + .overflow-x-hidden { + overflow-x: hidden !important; + } + + .overflow-x-visible { + overflow-x: visible !important; + } + + .overflow-x-scroll { + overflow-x: scroll !important; + } + + .overflow-y-auto { + overflow-y: auto !important; + } + + .overflow-y-hidden { + overflow-y: hidden !important; + } + + .overflow-y-visible { + overflow-y: visible !important; + } + + .overflow-y-scroll { + overflow-y: scroll !important; + } + + .d-inline { + display: inline !important; + } + + .d-inline-block { + display: inline-block !important; + } + + .d-block { + display: block !important; + } + + .d-grid { + display: grid !important; + } + + .d-inline-grid { + display: inline-grid !important; + } + + .d-table { + display: table !important; + } + + .d-table-row { + display: table-row !important; + } + + .d-table-cell { + display: table-cell !important; + } + + .d-flex { + display: flex !important; + } + + .d-inline-flex { + display: inline-flex !important; + } + + .d-none { + display: none !important; + } + + .shadow { + box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important; + } + + .shadow-sm { + box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important; + } + + .shadow-lg { + box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important; + } + + .shadow-none { + box-shadow: none !important; + } + + .focus-ring-primary { + --bs-focus-ring-color: rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity)); + } + + .focus-ring-secondary { + --bs-focus-ring-color: rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity)); + } + + .focus-ring-success { + --bs-focus-ring-color: rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity)); + } + + .focus-ring-info { + --bs-focus-ring-color: rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity)); + } + + .focus-ring-warning { + --bs-focus-ring-color: rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity)); + } + + .focus-ring-danger { + --bs-focus-ring-color: rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity)); + } + + .focus-ring-light { + --bs-focus-ring-color: rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity)); + } + + .focus-ring-dark { + --bs-focus-ring-color: rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity)); + } + + .position-static { + position: static !important; + } + + .position-relative { + position: relative !important; + } + + .position-absolute { + position: absolute !important; + } + + .position-fixed { + position: fixed !important; + } + + .position-sticky { + position: -webkit-sticky !important; + position: sticky !important; + } + + .top-0 { + top: 0 !important; + } + + .top-50 { + top: 50% !important; + } + + .top-100 { + top: 100% !important; + } + + .bottom-0 { + bottom: 0 !important; + } + + .bottom-50 { + bottom: 50% !important; + } + + .bottom-100 { + bottom: 100% !important; + } + + .start-0 { + left: 0 !important; + } + + .start-50 { + left: 50% !important; + } + + .start-100 { + left: 100% !important; + } + + .end-0 { + right: 0 !important; + } + + .end-50 { + right: 50% !important; + } + + .end-100 { + right: 100% !important; + } + + .translate-middle { + transform: translate(-50%, -50%) !important; + } + + .translate-middle-x { + transform: translateX(-50%) !important; + } + + .translate-middle-y { + transform: translateY(-50%) !important; + } + + .border { + border: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; + } + + .border-0 { + border: 0 !important; + } + + .border-top { + border-top: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; + } + + .border-top-0 { + border-top: 0 !important; + } + + .border-end { + border-right: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; + } + + .border-end-0 { + border-right: 0 !important; + } + + .border-bottom { + border-bottom: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; + } + + .border-bottom-0 { + border-bottom: 0 !important; + } + + .border-start { + border-left: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; + } + + .border-start-0 { + border-left: 0 !important; + } + + .border-primary { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-primary-rgb), var(--bs-border-opacity)) !important; + } + + .border-secondary { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-secondary-rgb), var(--bs-border-opacity)) !important; + } + + .border-success { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-success-rgb), var(--bs-border-opacity)) !important; + } + + .border-info { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-info-rgb), var(--bs-border-opacity)) !important; + } + + .border-warning { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-warning-rgb), var(--bs-border-opacity)) !important; + } + + .border-danger { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-danger-rgb), var(--bs-border-opacity)) !important; + } + + .border-light { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-light-rgb), var(--bs-border-opacity)) !important; + } + + .border-dark { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-dark-rgb), var(--bs-border-opacity)) !important; + } + + .border-black { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-black-rgb), var(--bs-border-opacity)) !important; + } + + .border-white { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-white-rgb), var(--bs-border-opacity)) !important; + } + + .border-primary-subtle { + border-color: var(--bs-primary-border-subtle) !important; + } + + .border-secondary-subtle { + border-color: var(--bs-secondary-border-subtle) !important; + } + + .border-success-subtle { + border-color: var(--bs-success-border-subtle) !important; + } + + .border-info-subtle { + border-color: var(--bs-info-border-subtle) !important; + } + + .border-warning-subtle { + border-color: var(--bs-warning-border-subtle) !important; + } + + .border-danger-subtle { + border-color: var(--bs-danger-border-subtle) !important; + } + + .border-light-subtle { + border-color: var(--bs-light-border-subtle) !important; + } + + .border-dark-subtle { + border-color: var(--bs-dark-border-subtle) !important; + } + + .border-1 { + border-width: 1px !important; + } + + .border-2 { + border-width: 2px !important; + } + + .border-3 { + border-width: 3px !important; + } + + .border-4 { + border-width: 4px !important; + } + + .border-5 { + border-width: 5px !important; + } + + .border-opacity-10 { + --bs-border-opacity: 0.1; + } + + .border-opacity-25 { + --bs-border-opacity: 0.25; + } + + .border-opacity-50 { + --bs-border-opacity: 0.5; + } + + .border-opacity-75 { + --bs-border-opacity: 0.75; + } + + .border-opacity-100 { + --bs-border-opacity: 1; + } + + .w-25 { + width: 25% !important; + } + + .w-50 { + width: 50% !important; + } + + .w-75 { + width: 75% !important; + } + + .w-100 { + width: 100% !important; + } + + .w-auto { + width: auto !important; + } + + .mw-100 { + max-width: 100% !important; + } + + .vw-100 { + width: 100vw !important; + } + + .min-vw-100 { + min-width: 100vw !important; + } + + .h-25 { + height: 25% !important; + } + + .h-50 { + height: 50% !important; + } + + .h-75 { + height: 75% !important; + } + + .h-100 { + height: 100% !important; + } + + .h-auto { + height: auto !important; + } + + .mh-100 { + max-height: 100% !important; + } + + .vh-100 { + height: 100vh !important; + } + + .min-vh-100 { + min-height: 100vh !important; + } + + .flex-fill { + flex: 1 1 auto !important; + } + + .flex-row { + flex-direction: row !important; + } + + .flex-column { + flex-direction: column !important; + } + + .flex-row-reverse { + flex-direction: row-reverse !important; + } + + .flex-column-reverse { + flex-direction: column-reverse !important; + } + + .flex-grow-0 { + flex-grow: 0 !important; + } + + .flex-grow-1 { + flex-grow: 1 !important; + } + + .flex-shrink-0 { + flex-shrink: 0 !important; + } + + .flex-shrink-1 { + flex-shrink: 1 !important; + } + + .flex-wrap { + flex-wrap: wrap !important; + } + + .flex-nowrap { + flex-wrap: nowrap !important; + } + + .flex-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + + .justify-content-start { + justify-content: flex-start !important; + } + + .justify-content-end { + justify-content: flex-end !important; + } + + .justify-content-center { + justify-content: center !important; + } + + .justify-content-between { + justify-content: space-between !important; + } + + .justify-content-around { + justify-content: space-around !important; + } + + .justify-content-evenly { + justify-content: space-evenly !important; + } + + .align-items-start { + align-items: flex-start !important; + } + + .align-items-end { + align-items: flex-end !important; + } + + .align-items-center { + align-items: center !important; + } + + .align-items-baseline { + align-items: baseline !important; + } + + .align-items-stretch { + align-items: stretch !important; + } + + .align-content-start { + align-content: flex-start !important; + } + + .align-content-end { + align-content: flex-end !important; + } + + .align-content-center { + align-content: center !important; + } + + .align-content-between { + align-content: space-between !important; + } + + .align-content-around { + align-content: space-around !important; + } + + .align-content-stretch { + align-content: stretch !important; + } + + .align-self-auto { + align-self: auto !important; + } + + .align-self-start { + align-self: flex-start !important; + } + + .align-self-end { + align-self: flex-end !important; + } + + .align-self-center { + align-self: center !important; + } + + .align-self-baseline { + align-self: baseline !important; + } + + .align-self-stretch { + align-self: stretch !important; + } + + .order-first { + order: -1 !important; + } + + .order-0 { + order: 0 !important; + } + + .order-1 { + order: 1 !important; + } + + .order-2 { + order: 2 !important; + } + + .order-3 { + order: 3 !important; + } + + .order-4 { + order: 4 !important; + } + + .order-5 { + order: 5 !important; + } + + .order-last { + order: 6 !important; + } + + .m-0 { + margin: 0 !important; + } + + .m-1 { + margin: 0.25rem !important; + } + + .m-2 { + margin: 0.5rem !important; + } + + .m-3 { + margin: 1rem !important; + } + + .m-4 { + margin: 1.5rem !important; + } + + .m-5 { + margin: 3rem !important; + } + + .m-auto { + margin: auto !important; + } + + .mx-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + + .mx-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + + .mx-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + + .mx-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + + .mx-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + + .mx-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + + .mx-auto { + margin-right: auto !important; + margin-left: auto !important; + } + + .my-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + + .my-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + + .my-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + + .my-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + + .my-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + + .my-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + + .my-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + + .mt-0 { + margin-top: 0 !important; + } + + .mt-1 { + margin-top: 0.25rem !important; + } + + .mt-2 { + margin-top: 0.5rem !important; + } + + .mt-3 { + margin-top: 1rem !important; + } + + .mt-4 { + margin-top: 1.5rem !important; + } + + .mt-5 { + margin-top: 3rem !important; + } + + .mt-auto { + margin-top: auto !important; + } + + .me-0 { + margin-right: 0 !important; + } + + .me-1 { + margin-right: 0.25rem !important; + } + + .me-2 { + margin-right: 0.5rem !important; + } + + .me-3 { + margin-right: 1rem !important; + } + + .me-4 { + margin-right: 1.5rem !important; + } + + .me-5 { + margin-right: 3rem !important; + } + + .me-auto { + margin-right: auto !important; + } + + .mb-0 { + margin-bottom: 0 !important; + } + + .mb-1 { + margin-bottom: 0.25rem !important; + } + + .mb-2 { + margin-bottom: 0.5rem !important; + } + + .mb-3 { + margin-bottom: 1rem !important; + } + + .mb-4 { + margin-bottom: 1.5rem !important; + } + + .mb-5 { + margin-bottom: 3rem !important; + } + + .mb-auto { + margin-bottom: auto !important; + } + + .ms-0 { + margin-left: 0 !important; + } + + .ms-1 { + margin-left: 0.25rem !important; + } + + .ms-2 { + margin-left: 0.5rem !important; + } + + .ms-3 { + margin-left: 1rem !important; + } + + .ms-4 { + margin-left: 1.5rem !important; + } + + .ms-5 { + margin-left: 3rem !important; + } + + .ms-auto { + margin-left: auto !important; + } + + .p-0 { + padding: 0 !important; + } + + .p-1 { + padding: 0.25rem !important; + } + + .p-2 { + padding: 0.5rem !important; + } + + .p-3 { + padding: 1rem !important; + } + + .p-4 { + padding: 1.5rem !important; + } + + .p-5 { + padding: 3rem !important; + } + + .px-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + + .px-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + + .px-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + + .px-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + + .px-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + + .px-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + + .py-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + + .py-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + + .py-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + + .py-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + + .py-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + + .py-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + + .pt-0 { + padding-top: 0 !important; + } + + .pt-1 { + padding-top: 0.25rem !important; + } + + .pt-2 { + padding-top: 0.5rem !important; + } + + .pt-3 { + padding-top: 1rem !important; + } + + .pt-4 { + padding-top: 1.5rem !important; + } + + .pt-5 { + padding-top: 3rem !important; + } + + .pe-0 { + padding-right: 0 !important; + } + + .pe-1 { + padding-right: 0.25rem !important; + } + + .pe-2 { + padding-right: 0.5rem !important; + } + + .pe-3 { + padding-right: 1rem !important; + } + + .pe-4 { + padding-right: 1.5rem !important; + } + + .pe-5 { + padding-right: 3rem !important; + } + + .pb-0 { + padding-bottom: 0 !important; + } + + .pb-1 { + padding-bottom: 0.25rem !important; + } + + .pb-2 { + padding-bottom: 0.5rem !important; + } + + .pb-3 { + padding-bottom: 1rem !important; + } + + .pb-4 { + padding-bottom: 1.5rem !important; + } + + .pb-5 { + padding-bottom: 3rem !important; + } + + .ps-0 { + padding-left: 0 !important; + } + + .ps-1 { + padding-left: 0.25rem !important; + } + + .ps-2 { + padding-left: 0.5rem !important; + } + + .ps-3 { + padding-left: 1rem !important; + } + + .ps-4 { + padding-left: 1.5rem !important; + } + + .ps-5 { + padding-left: 3rem !important; + } + + .gap-0 { + gap: 0 !important; + } + + .gap-1 { + gap: 0.25rem !important; + } + + .gap-2 { + gap: 0.5rem !important; + } + + .gap-3 { + gap: 1rem !important; + } + + .gap-4 { + gap: 1.5rem !important; + } + + .gap-5 { + gap: 3rem !important; + } + + .row-gap-0 { + row-gap: 0 !important; + } + + .row-gap-1 { + row-gap: 0.25rem !important; + } + + .row-gap-2 { + row-gap: 0.5rem !important; + } + + .row-gap-3 { + row-gap: 1rem !important; + } + + .row-gap-4 { + row-gap: 1.5rem !important; + } + + .row-gap-5 { + row-gap: 3rem !important; + } + + .column-gap-0 { + -moz-column-gap: 0 !important; + column-gap: 0 !important; + } + + .column-gap-1 { + -moz-column-gap: 0.25rem !important; + column-gap: 0.25rem !important; + } + + .column-gap-2 { + -moz-column-gap: 0.5rem !important; + column-gap: 0.5rem !important; + } + + .column-gap-3 { + -moz-column-gap: 1rem !important; + column-gap: 1rem !important; + } + + .column-gap-4 { + -moz-column-gap: 1.5rem !important; + column-gap: 1.5rem !important; + } + + .column-gap-5 { + -moz-column-gap: 3rem !important; + column-gap: 3rem !important; + } + + .font-monospace { + font-family: var(--bs-font-monospace) !important; + } + + .fs-1 { + font-size: calc(1.375rem + 1.5vw) !important; + } + + .fs-2 { + font-size: calc(1.325rem + 0.9vw) !important; + } + + .fs-3 { + font-size: calc(1.3rem + 0.6vw) !important; + } + + .fs-4 { + font-size: calc(1.275rem + 0.3vw) !important; + } + + .fs-5 { + font-size: 1.25rem !important; + } + + .fs-6 { + font-size: 1rem !important; + } + + .fst-italic { + font-style: italic !important; + } + + .fst-normal { + font-style: normal !important; + } + + .fw-lighter { + font-weight: lighter !important; + } + + .fw-light { + font-weight: 300 !important; + } + + .fw-normal { + font-weight: 400 !important; + } + + .fw-medium { + font-weight: 500 !important; + } + + .fw-semibold { + font-weight: 600 !important; + } + + .fw-bold { + font-weight: 700 !important; + } + + .fw-bolder { + font-weight: bolder !important; + } + + .lh-1 { + line-height: 1 !important; + } + + .lh-sm { + line-height: 1.25 !important; + } + + .lh-base { + line-height: 1.5 !important; + } + + .lh-lg { + line-height: 2 !important; + } + + .text-start { + text-align: left !important; + } + + .text-end { + text-align: right !important; + } + + .text-center { + text-align: center !important; + } + + .text-decoration-none { + text-decoration: none !important; + } + + .text-decoration-underline { + text-decoration: underline !important; + } + + .text-decoration-line-through { + text-decoration: line-through !important; + } + + .text-lowercase { + text-transform: lowercase !important; + } + + .text-uppercase { + text-transform: uppercase !important; + } + + .text-capitalize { + text-transform: capitalize !important; + } + + .text-wrap { + white-space: normal !important; + } + + .text-nowrap { + white-space: nowrap !important; + } + + /* rtl:begin:remove */ + .text-break { + word-wrap: break-word !important; + word-break: break-word !important; + } + + /* rtl:end:remove */ + .text-primary { + --bs-text-opacity: 1; + color: rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important; + } + + .text-secondary { + --bs-text-opacity: 1; + color: rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important; + } + + .text-success { + --bs-text-opacity: 1; + color: rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important; + } + + .text-info { + --bs-text-opacity: 1; + color: rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important; + } + + .text-warning { + --bs-text-opacity: 1; + color: rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important; + } + + .text-danger { + --bs-text-opacity: 1; + color: rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important; + } + + .text-light { + --bs-text-opacity: 1; + color: rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important; + } + + .text-dark { + --bs-text-opacity: 1; + color: rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important; + } + + .text-black { + --bs-text-opacity: 1; + color: rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important; + } + + .text-white { + --bs-text-opacity: 1; + color: rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important; + } + + .text-body { + --bs-text-opacity: 1; + color: rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important; + } + + .text-muted { + --bs-text-opacity: 1; + color: var(--bs-secondary-color) !important; + } + + .text-black-50 { + --bs-text-opacity: 1; + color: rgba(0, 0, 0, 0.5) !important; + } + + .text-white-50 { + --bs-text-opacity: 1; + color: rgba(255, 255, 255, 0.5) !important; + } + + .text-body-secondary { + --bs-text-opacity: 1; + color: var(--bs-secondary-color) !important; + } + + .text-body-tertiary { + --bs-text-opacity: 1; + color: var(--bs-tertiary-color) !important; + } + + .text-body-emphasis { + --bs-text-opacity: 1; + color: var(--bs-emphasis-color) !important; + } + + .text-reset { + --bs-text-opacity: 1; + color: inherit !important; + } + + .text-opacity-25 { + --bs-text-opacity: 0.25; + } + + .text-opacity-50 { + --bs-text-opacity: 0.5; + } + + .text-opacity-75 { + --bs-text-opacity: 0.75; + } + + .text-opacity-100 { + --bs-text-opacity: 1; + } + + .text-primary-emphasis { + color: var(--bs-primary-text-emphasis) !important; + } + + .text-secondary-emphasis { + color: var(--bs-secondary-text-emphasis) !important; + } + + .text-success-emphasis { + color: var(--bs-success-text-emphasis) !important; + } + + .text-info-emphasis { + color: var(--bs-info-text-emphasis) !important; + } + + .text-warning-emphasis { + color: var(--bs-warning-text-emphasis) !important; + } + + .text-danger-emphasis { + color: var(--bs-danger-text-emphasis) !important; + } + + .text-light-emphasis { + color: var(--bs-light-text-emphasis) !important; + } + + .text-dark-emphasis { + color: var(--bs-dark-text-emphasis) !important; + } + + .link-opacity-10 { + --bs-link-opacity: 0.1; + } + + .link-opacity-10-hover:hover { + --bs-link-opacity: 0.1; + } + + .link-opacity-25 { + --bs-link-opacity: 0.25; + } + + .link-opacity-25-hover:hover { + --bs-link-opacity: 0.25; + } + + .link-opacity-50 { + --bs-link-opacity: 0.5; + } + + .link-opacity-50-hover:hover { + --bs-link-opacity: 0.5; + } + + .link-opacity-75 { + --bs-link-opacity: 0.75; + } + + .link-opacity-75-hover:hover { + --bs-link-opacity: 0.75; + } + + .link-opacity-100 { + --bs-link-opacity: 1; + } + + .link-opacity-100-hover:hover { + --bs-link-opacity: 1; + } + + .link-offset-1 { + text-underline-offset: 0.125em !important; + } + + .link-offset-1-hover:hover { + text-underline-offset: 0.125em !important; + } + + .link-offset-2 { + text-underline-offset: 0.25em !important; + } + + .link-offset-2-hover:hover { + text-underline-offset: 0.25em !important; + } + + .link-offset-3 { + text-underline-offset: 0.375em !important; + } + + .link-offset-3-hover:hover { + text-underline-offset: 0.375em !important; + } + + .link-underline-primary { + --bs-link-underline-opacity: 1; + -webkit-text-decoration-color: rgba( + var(--bs-primary-rgb), + var(--bs-link-underline-opacity) + ) !important; + text-decoration-color: rgba(var(--bs-primary-rgb), var(--bs-link-underline-opacity)) !important; + } + + .link-underline-secondary { + --bs-link-underline-opacity: 1; + -webkit-text-decoration-color: rgba( + var(--bs-secondary-rgb), + var(--bs-link-underline-opacity) + ) !important; + text-decoration-color: rgba( + var(--bs-secondary-rgb), + var(--bs-link-underline-opacity) + ) !important; + } + + .link-underline-success { + --bs-link-underline-opacity: 1; + -webkit-text-decoration-color: rgba( + var(--bs-success-rgb), + var(--bs-link-underline-opacity) + ) !important; + text-decoration-color: rgba(var(--bs-success-rgb), var(--bs-link-underline-opacity)) !important; + } + + .link-underline-info { + --bs-link-underline-opacity: 1; + -webkit-text-decoration-color: rgba( + var(--bs-info-rgb), + var(--bs-link-underline-opacity) + ) !important; + text-decoration-color: rgba(var(--bs-info-rgb), var(--bs-link-underline-opacity)) !important; + } + + .link-underline-warning { + --bs-link-underline-opacity: 1; + -webkit-text-decoration-color: rgba( + var(--bs-warning-rgb), + var(--bs-link-underline-opacity) + ) !important; + text-decoration-color: rgba(var(--bs-warning-rgb), var(--bs-link-underline-opacity)) !important; + } + + .link-underline-danger { + --bs-link-underline-opacity: 1; + -webkit-text-decoration-color: rgba( + var(--bs-danger-rgb), + var(--bs-link-underline-opacity) + ) !important; + text-decoration-color: rgba(var(--bs-danger-rgb), var(--bs-link-underline-opacity)) !important; + } + + .link-underline-light { + --bs-link-underline-opacity: 1; + -webkit-text-decoration-color: rgba( + var(--bs-light-rgb), + var(--bs-link-underline-opacity) + ) !important; + text-decoration-color: rgba(var(--bs-light-rgb), var(--bs-link-underline-opacity)) !important; + } + + .link-underline-dark { + --bs-link-underline-opacity: 1; + -webkit-text-decoration-color: rgba( + var(--bs-dark-rgb), + var(--bs-link-underline-opacity) + ) !important; + text-decoration-color: rgba(var(--bs-dark-rgb), var(--bs-link-underline-opacity)) !important; + } + + .link-underline { + --bs-link-underline-opacity: 1; + -webkit-text-decoration-color: rgba( + var(--bs-link-color-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; + text-decoration-color: rgba( + var(--bs-link-color-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; + } + + .link-underline-opacity-0 { + --bs-link-underline-opacity: 0; + } + + .link-underline-opacity-0-hover:hover { + --bs-link-underline-opacity: 0; + } + + .link-underline-opacity-10 { + --bs-link-underline-opacity: 0.1; + } + + .link-underline-opacity-10-hover:hover { + --bs-link-underline-opacity: 0.1; + } + + .link-underline-opacity-25 { + --bs-link-underline-opacity: 0.25; + } + + .link-underline-opacity-25-hover:hover { + --bs-link-underline-opacity: 0.25; + } + + .link-underline-opacity-50 { + --bs-link-underline-opacity: 0.5; + } + + .link-underline-opacity-50-hover:hover { + --bs-link-underline-opacity: 0.5; + } + + .link-underline-opacity-75 { + --bs-link-underline-opacity: 0.75; + } + + .link-underline-opacity-75-hover:hover { + --bs-link-underline-opacity: 0.75; + } + + .link-underline-opacity-100 { + --bs-link-underline-opacity: 1; + } + + .link-underline-opacity-100-hover:hover { + --bs-link-underline-opacity: 1; + } + + .bg-primary { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important; + } + + .bg-secondary { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important; + } + + .bg-success { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important; + } + + .bg-info { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important; + } + + .bg-warning { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important; + } + + .bg-danger { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important; + } + + .bg-light { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important; + } + + .bg-dark { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important; + } + + .bg-black { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important; + } + + .bg-white { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important; + } + + .bg-body { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important; + } + + .bg-transparent { + --bs-bg-opacity: 1; + background-color: transparent !important; + } + + .bg-body-secondary { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-secondary-bg-rgb), var(--bs-bg-opacity)) !important; + } + + .bg-body-tertiary { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-tertiary-bg-rgb), var(--bs-bg-opacity)) !important; + } + + .bg-opacity-10 { + --bs-bg-opacity: 0.1; + } + + .bg-opacity-25 { + --bs-bg-opacity: 0.25; + } + + .bg-opacity-50 { + --bs-bg-opacity: 0.5; + } + + .bg-opacity-75 { + --bs-bg-opacity: 0.75; + } + + .bg-opacity-100 { + --bs-bg-opacity: 1; + } + + .bg-primary-subtle { + background-color: var(--bs-primary-bg-subtle) !important; + } + + .bg-secondary-subtle { + background-color: var(--bs-secondary-bg-subtle) !important; + } + + .bg-success-subtle { + background-color: var(--bs-success-bg-subtle) !important; + } + + .bg-info-subtle { + background-color: var(--bs-info-bg-subtle) !important; + } + + .bg-warning-subtle { + background-color: var(--bs-warning-bg-subtle) !important; + } + + .bg-danger-subtle { + background-color: var(--bs-danger-bg-subtle) !important; + } + + .bg-light-subtle { + background-color: var(--bs-light-bg-subtle) !important; + } + + .bg-dark-subtle { + background-color: var(--bs-dark-bg-subtle) !important; + } + + .bg-gradient { + background-image: var(--bs-gradient) !important; + } + + .user-select-all { + -webkit-user-select: all !important; + -moz-user-select: all !important; + user-select: all !important; + } + + .user-select-auto { + -webkit-user-select: auto !important; + -moz-user-select: auto !important; + user-select: auto !important; + } + + .user-select-none { + -webkit-user-select: none !important; + -moz-user-select: none !important; + user-select: none !important; + } + + .pe-none { + pointer-events: none !important; + } + + .pe-auto { + pointer-events: auto !important; + } + + .rounded { + border-radius: var(--bs-border-radius) !important; + } + + .rounded-0 { + border-radius: 0 !important; + } + + .rounded-1 { + border-radius: var(--bs-border-radius-sm) !important; + } + + .rounded-2 { + border-radius: var(--bs-border-radius) !important; + } + + .rounded-3 { + border-radius: var(--bs-border-radius-lg) !important; + } + + .rounded-4 { + border-radius: var(--bs-border-radius-xl) !important; + } + + .rounded-5 { + border-radius: var(--bs-border-radius-xxl) !important; + } + + .rounded-circle { + border-radius: 50% !important; + } + + .rounded-pill { + border-radius: var(--bs-border-radius-pill) !important; + } + + .rounded-top { + border-top-left-radius: var(--bs-border-radius) !important; + border-top-right-radius: var(--bs-border-radius) !important; + } + + .rounded-top-0 { + border-top-left-radius: 0 !important; + border-top-right-radius: 0 !important; + } + + .rounded-top-1 { + border-top-left-radius: var(--bs-border-radius-sm) !important; + border-top-right-radius: var(--bs-border-radius-sm) !important; + } + + .rounded-top-2 { + border-top-left-radius: var(--bs-border-radius) !important; + border-top-right-radius: var(--bs-border-radius) !important; + } + + .rounded-top-3 { + border-top-left-radius: var(--bs-border-radius-lg) !important; + border-top-right-radius: var(--bs-border-radius-lg) !important; + } + + .rounded-top-4 { + border-top-left-radius: var(--bs-border-radius-xl) !important; + border-top-right-radius: var(--bs-border-radius-xl) !important; + } + + .rounded-top-5 { + border-top-left-radius: var(--bs-border-radius-xxl) !important; + border-top-right-radius: var(--bs-border-radius-xxl) !important; + } + + .rounded-top-circle { + border-top-left-radius: 50% !important; + border-top-right-radius: 50% !important; + } + + .rounded-top-pill { + border-top-left-radius: var(--bs-border-radius-pill) !important; + border-top-right-radius: var(--bs-border-radius-pill) !important; + } + + .rounded-end { + border-top-right-radius: var(--bs-border-radius) !important; + border-bottom-right-radius: var(--bs-border-radius) !important; + } + + .rounded-end-0 { + border-top-right-radius: 0 !important; + border-bottom-right-radius: 0 !important; + } + + .rounded-end-1 { + border-top-right-radius: var(--bs-border-radius-sm) !important; + border-bottom-right-radius: var(--bs-border-radius-sm) !important; + } + + .rounded-end-2 { + border-top-right-radius: var(--bs-border-radius) !important; + border-bottom-right-radius: var(--bs-border-radius) !important; + } + + .rounded-end-3 { + border-top-right-radius: var(--bs-border-radius-lg) !important; + border-bottom-right-radius: var(--bs-border-radius-lg) !important; + } + + .rounded-end-4 { + border-top-right-radius: var(--bs-border-radius-xl) !important; + border-bottom-right-radius: var(--bs-border-radius-xl) !important; + } + + .rounded-end-5 { + border-top-right-radius: var(--bs-border-radius-xxl) !important; + border-bottom-right-radius: var(--bs-border-radius-xxl) !important; + } + + .rounded-end-circle { + border-top-right-radius: 50% !important; + border-bottom-right-radius: 50% !important; + } + + .rounded-end-pill { + border-top-right-radius: var(--bs-border-radius-pill) !important; + border-bottom-right-radius: var(--bs-border-radius-pill) !important; + } + + .rounded-bottom { + border-bottom-right-radius: var(--bs-border-radius) !important; + border-bottom-left-radius: var(--bs-border-radius) !important; + } + + .rounded-bottom-0 { + border-bottom-right-radius: 0 !important; + border-bottom-left-radius: 0 !important; + } + + .rounded-bottom-1 { + border-bottom-right-radius: var(--bs-border-radius-sm) !important; + border-bottom-left-radius: var(--bs-border-radius-sm) !important; + } + + .rounded-bottom-2 { + border-bottom-right-radius: var(--bs-border-radius) !important; + border-bottom-left-radius: var(--bs-border-radius) !important; + } + + .rounded-bottom-3 { + border-bottom-right-radius: var(--bs-border-radius-lg) !important; + border-bottom-left-radius: var(--bs-border-radius-lg) !important; + } + + .rounded-bottom-4 { + border-bottom-right-radius: var(--bs-border-radius-xl) !important; + border-bottom-left-radius: var(--bs-border-radius-xl) !important; + } + + .rounded-bottom-5 { + border-bottom-right-radius: var(--bs-border-radius-xxl) !important; + border-bottom-left-radius: var(--bs-border-radius-xxl) !important; + } + + .rounded-bottom-circle { + border-bottom-right-radius: 50% !important; + border-bottom-left-radius: 50% !important; + } + + .rounded-bottom-pill { + border-bottom-right-radius: var(--bs-border-radius-pill) !important; + border-bottom-left-radius: var(--bs-border-radius-pill) !important; + } + + .rounded-start { + border-bottom-left-radius: var(--bs-border-radius) !important; + border-top-left-radius: var(--bs-border-radius) !important; + } + + .rounded-start-0 { + border-bottom-left-radius: 0 !important; + border-top-left-radius: 0 !important; + } + + .rounded-start-1 { + border-bottom-left-radius: var(--bs-border-radius-sm) !important; + border-top-left-radius: var(--bs-border-radius-sm) !important; + } + + .rounded-start-2 { + border-bottom-left-radius: var(--bs-border-radius) !important; + border-top-left-radius: var(--bs-border-radius) !important; + } + + .rounded-start-3 { + border-bottom-left-radius: var(--bs-border-radius-lg) !important; + border-top-left-radius: var(--bs-border-radius-lg) !important; + } + + .rounded-start-4 { + border-bottom-left-radius: var(--bs-border-radius-xl) !important; + border-top-left-radius: var(--bs-border-radius-xl) !important; + } + + .rounded-start-5 { + border-bottom-left-radius: var(--bs-border-radius-xxl) !important; + border-top-left-radius: var(--bs-border-radius-xxl) !important; + } + + .rounded-start-circle { + border-bottom-left-radius: 50% !important; + border-top-left-radius: 50% !important; + } + + .rounded-start-pill { + border-bottom-left-radius: var(--bs-border-radius-pill) !important; + border-top-left-radius: var(--bs-border-radius-pill) !important; + } + + .visible { + visibility: visible !important; + } + + .invisible { + visibility: hidden !important; + } + + .z-n1 { + z-index: -1 !important; + } + + .z-0 { + z-index: 0 !important; + } + + .z-1 { + z-index: 1 !important; + } + + .z-2 { + z-index: 2 !important; + } + + .z-3 { + z-index: 3 !important; + } + + @media (min-width: 576px) { + .float-sm-start { + float: left !important; + } + .float-sm-end { + float: right !important; + } + .float-sm-none { + float: none !important; + } + .object-fit-sm-contain { + -o-object-fit: contain !important; + object-fit: contain !important; + } + .object-fit-sm-cover { + -o-object-fit: cover !important; + object-fit: cover !important; + } + .object-fit-sm-fill { + -o-object-fit: fill !important; + object-fit: fill !important; + } + .object-fit-sm-scale { + -o-object-fit: scale-down !important; + object-fit: scale-down !important; + } + .object-fit-sm-none { + -o-object-fit: none !important; + object-fit: none !important; + } + .d-sm-inline { + display: inline !important; + } + .d-sm-inline-block { + display: inline-block !important; + } + .d-sm-block { + display: block !important; + } + .d-sm-grid { + display: grid !important; + } + .d-sm-inline-grid { + display: inline-grid !important; + } + .d-sm-table { + display: table !important; + } + .d-sm-table-row { + display: table-row !important; + } + .d-sm-table-cell { + display: table-cell !important; + } + .d-sm-flex { + display: flex !important; + } + .d-sm-inline-flex { + display: inline-flex !important; + } + .d-sm-none { + display: none !important; + } + .flex-sm-fill { + flex: 1 1 auto !important; + } + .flex-sm-row { + flex-direction: row !important; + } + .flex-sm-column { + flex-direction: column !important; + } + .flex-sm-row-reverse { + flex-direction: row-reverse !important; + } + .flex-sm-column-reverse { + flex-direction: column-reverse !important; + } + .flex-sm-grow-0 { + flex-grow: 0 !important; + } + .flex-sm-grow-1 { + flex-grow: 1 !important; + } + .flex-sm-shrink-0 { + flex-shrink: 0 !important; + } + .flex-sm-shrink-1 { + flex-shrink: 1 !important; + } + .flex-sm-wrap { + flex-wrap: wrap !important; + } + .flex-sm-nowrap { + flex-wrap: nowrap !important; + } + .flex-sm-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + .justify-content-sm-start { + justify-content: flex-start !important; + } + .justify-content-sm-end { + justify-content: flex-end !important; + } + .justify-content-sm-center { + justify-content: center !important; + } + .justify-content-sm-between { + justify-content: space-between !important; + } + .justify-content-sm-around { + justify-content: space-around !important; + } + .justify-content-sm-evenly { + justify-content: space-evenly !important; + } + .align-items-sm-start { + align-items: flex-start !important; + } + .align-items-sm-end { + align-items: flex-end !important; + } + .align-items-sm-center { + align-items: center !important; + } + .align-items-sm-baseline { + align-items: baseline !important; + } + .align-items-sm-stretch { + align-items: stretch !important; + } + .align-content-sm-start { + align-content: flex-start !important; + } + .align-content-sm-end { + align-content: flex-end !important; + } + .align-content-sm-center { + align-content: center !important; + } + .align-content-sm-between { + align-content: space-between !important; + } + .align-content-sm-around { + align-content: space-around !important; + } + .align-content-sm-stretch { + align-content: stretch !important; + } + .align-self-sm-auto { + align-self: auto !important; + } + .align-self-sm-start { + align-self: flex-start !important; + } + .align-self-sm-end { + align-self: flex-end !important; + } + .align-self-sm-center { + align-self: center !important; + } + .align-self-sm-baseline { + align-self: baseline !important; + } + .align-self-sm-stretch { + align-self: stretch !important; + } + .order-sm-first { + order: -1 !important; + } + .order-sm-0 { + order: 0 !important; + } + .order-sm-1 { + order: 1 !important; + } + .order-sm-2 { + order: 2 !important; + } + .order-sm-3 { + order: 3 !important; + } + .order-sm-4 { + order: 4 !important; + } + .order-sm-5 { + order: 5 !important; + } + .order-sm-last { + order: 6 !important; + } + .m-sm-0 { + margin: 0 !important; + } + .m-sm-1 { + margin: 0.25rem !important; + } + .m-sm-2 { + margin: 0.5rem !important; + } + .m-sm-3 { + margin: 1rem !important; + } + .m-sm-4 { + margin: 1.5rem !important; + } + .m-sm-5 { + margin: 3rem !important; + } + .m-sm-auto { + margin: auto !important; + } + .mx-sm-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .mx-sm-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .mx-sm-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .mx-sm-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .mx-sm-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .mx-sm-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .mx-sm-auto { + margin-right: auto !important; + margin-left: auto !important; + } + .my-sm-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .my-sm-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-sm-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .my-sm-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .my-sm-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .my-sm-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .my-sm-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + .mt-sm-0 { + margin-top: 0 !important; + } + .mt-sm-1 { + margin-top: 0.25rem !important; + } + .mt-sm-2 { + margin-top: 0.5rem !important; + } + .mt-sm-3 { + margin-top: 1rem !important; + } + .mt-sm-4 { + margin-top: 1.5rem !important; + } + .mt-sm-5 { + margin-top: 3rem !important; + } + .mt-sm-auto { + margin-top: auto !important; + } + .me-sm-0 { + margin-right: 0 !important; + } + .me-sm-1 { + margin-right: 0.25rem !important; + } + .me-sm-2 { + margin-right: 0.5rem !important; + } + .me-sm-3 { + margin-right: 1rem !important; + } + .me-sm-4 { + margin-right: 1.5rem !important; + } + .me-sm-5 { + margin-right: 3rem !important; + } + .me-sm-auto { + margin-right: auto !important; + } + .mb-sm-0 { + margin-bottom: 0 !important; + } + .mb-sm-1 { + margin-bottom: 0.25rem !important; + } + .mb-sm-2 { + margin-bottom: 0.5rem !important; + } + .mb-sm-3 { + margin-bottom: 1rem !important; + } + .mb-sm-4 { + margin-bottom: 1.5rem !important; + } + .mb-sm-5 { + margin-bottom: 3rem !important; + } + .mb-sm-auto { + margin-bottom: auto !important; + } + .ms-sm-0 { + margin-left: 0 !important; + } + .ms-sm-1 { + margin-left: 0.25rem !important; + } + .ms-sm-2 { + margin-left: 0.5rem !important; + } + .ms-sm-3 { + margin-left: 1rem !important; + } + .ms-sm-4 { + margin-left: 1.5rem !important; + } + .ms-sm-5 { + margin-left: 3rem !important; + } + .ms-sm-auto { + margin-left: auto !important; + } + .p-sm-0 { + padding: 0 !important; + } + .p-sm-1 { + padding: 0.25rem !important; + } + .p-sm-2 { + padding: 0.5rem !important; + } + .p-sm-3 { + padding: 1rem !important; + } + .p-sm-4 { + padding: 1.5rem !important; + } + .p-sm-5 { + padding: 3rem !important; + } + .px-sm-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .px-sm-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .px-sm-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .px-sm-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .px-sm-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .px-sm-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-sm-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .py-sm-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-sm-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .py-sm-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .py-sm-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .py-sm-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .pt-sm-0 { + padding-top: 0 !important; + } + .pt-sm-1 { + padding-top: 0.25rem !important; + } + .pt-sm-2 { + padding-top: 0.5rem !important; + } + .pt-sm-3 { + padding-top: 1rem !important; + } + .pt-sm-4 { + padding-top: 1.5rem !important; + } + .pt-sm-5 { + padding-top: 3rem !important; + } + .pe-sm-0 { + padding-right: 0 !important; + } + .pe-sm-1 { + padding-right: 0.25rem !important; + } + .pe-sm-2 { + padding-right: 0.5rem !important; + } + .pe-sm-3 { + padding-right: 1rem !important; + } + .pe-sm-4 { + padding-right: 1.5rem !important; + } + .pe-sm-5 { + padding-right: 3rem !important; + } + .pb-sm-0 { + padding-bottom: 0 !important; + } + .pb-sm-1 { + padding-bottom: 0.25rem !important; + } + .pb-sm-2 { + padding-bottom: 0.5rem !important; + } + .pb-sm-3 { + padding-bottom: 1rem !important; + } + .pb-sm-4 { + padding-bottom: 1.5rem !important; + } + .pb-sm-5 { + padding-bottom: 3rem !important; + } + .ps-sm-0 { + padding-left: 0 !important; + } + .ps-sm-1 { + padding-left: 0.25rem !important; + } + .ps-sm-2 { + padding-left: 0.5rem !important; + } + .ps-sm-3 { + padding-left: 1rem !important; + } + .ps-sm-4 { + padding-left: 1.5rem !important; + } + .ps-sm-5 { + padding-left: 3rem !important; + } + .gap-sm-0 { + gap: 0 !important; + } + .gap-sm-1 { + gap: 0.25rem !important; + } + .gap-sm-2 { + gap: 0.5rem !important; + } + .gap-sm-3 { + gap: 1rem !important; + } + .gap-sm-4 { + gap: 1.5rem !important; + } + .gap-sm-5 { + gap: 3rem !important; + } + .row-gap-sm-0 { + row-gap: 0 !important; + } + .row-gap-sm-1 { + row-gap: 0.25rem !important; + } + .row-gap-sm-2 { + row-gap: 0.5rem !important; + } + .row-gap-sm-3 { + row-gap: 1rem !important; + } + .row-gap-sm-4 { + row-gap: 1.5rem !important; + } + .row-gap-sm-5 { + row-gap: 3rem !important; + } + .column-gap-sm-0 { + -moz-column-gap: 0 !important; + column-gap: 0 !important; + } + .column-gap-sm-1 { + -moz-column-gap: 0.25rem !important; + column-gap: 0.25rem !important; + } + .column-gap-sm-2 { + -moz-column-gap: 0.5rem !important; + column-gap: 0.5rem !important; + } + .column-gap-sm-3 { + -moz-column-gap: 1rem !important; + column-gap: 1rem !important; + } + .column-gap-sm-4 { + -moz-column-gap: 1.5rem !important; + column-gap: 1.5rem !important; + } + .column-gap-sm-5 { + -moz-column-gap: 3rem !important; + column-gap: 3rem !important; + } + .text-sm-start { + text-align: left !important; + } + .text-sm-end { + text-align: right !important; + } + .text-sm-center { + text-align: center !important; + } + } + @media (min-width: 768px) { + .float-md-start { + float: left !important; + } + .float-md-end { + float: right !important; + } + .float-md-none { + float: none !important; + } + .object-fit-md-contain { + -o-object-fit: contain !important; + object-fit: contain !important; + } + .object-fit-md-cover { + -o-object-fit: cover !important; + object-fit: cover !important; + } + .object-fit-md-fill { + -o-object-fit: fill !important; + object-fit: fill !important; + } + .object-fit-md-scale { + -o-object-fit: scale-down !important; + object-fit: scale-down !important; + } + .object-fit-md-none { + -o-object-fit: none !important; + object-fit: none !important; + } + .d-md-inline { + display: inline !important; + } + .d-md-inline-block { + display: inline-block !important; + } + .d-md-block { + display: block !important; + } + .d-md-grid { + display: grid !important; + } + .d-md-inline-grid { + display: inline-grid !important; + } + .d-md-table { + display: table !important; + } + .d-md-table-row { + display: table-row !important; + } + .d-md-table-cell { + display: table-cell !important; + } + .d-md-flex { + display: flex !important; + } + .d-md-inline-flex { + display: inline-flex !important; + } + .d-md-none { + display: none !important; + } + .flex-md-fill { + flex: 1 1 auto !important; + } + .flex-md-row { + flex-direction: row !important; + } + .flex-md-column { + flex-direction: column !important; + } + .flex-md-row-reverse { + flex-direction: row-reverse !important; + } + .flex-md-column-reverse { + flex-direction: column-reverse !important; + } + .flex-md-grow-0 { + flex-grow: 0 !important; + } + .flex-md-grow-1 { + flex-grow: 1 !important; + } + .flex-md-shrink-0 { + flex-shrink: 0 !important; + } + .flex-md-shrink-1 { + flex-shrink: 1 !important; + } + .flex-md-wrap { + flex-wrap: wrap !important; + } + .flex-md-nowrap { + flex-wrap: nowrap !important; + } + .flex-md-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + .justify-content-md-start { + justify-content: flex-start !important; + } + .justify-content-md-end { + justify-content: flex-end !important; + } + .justify-content-md-center { + justify-content: center !important; + } + .justify-content-md-between { + justify-content: space-between !important; + } + .justify-content-md-around { + justify-content: space-around !important; + } + .justify-content-md-evenly { + justify-content: space-evenly !important; + } + .align-items-md-start { + align-items: flex-start !important; + } + .align-items-md-end { + align-items: flex-end !important; + } + .align-items-md-center { + align-items: center !important; + } + .align-items-md-baseline { + align-items: baseline !important; + } + .align-items-md-stretch { + align-items: stretch !important; + } + .align-content-md-start { + align-content: flex-start !important; + } + .align-content-md-end { + align-content: flex-end !important; + } + .align-content-md-center { + align-content: center !important; + } + .align-content-md-between { + align-content: space-between !important; + } + .align-content-md-around { + align-content: space-around !important; + } + .align-content-md-stretch { + align-content: stretch !important; + } + .align-self-md-auto { + align-self: auto !important; + } + .align-self-md-start { + align-self: flex-start !important; + } + .align-self-md-end { + align-self: flex-end !important; + } + .align-self-md-center { + align-self: center !important; + } + .align-self-md-baseline { + align-self: baseline !important; + } + .align-self-md-stretch { + align-self: stretch !important; + } + .order-md-first { + order: -1 !important; + } + .order-md-0 { + order: 0 !important; + } + .order-md-1 { + order: 1 !important; + } + .order-md-2 { + order: 2 !important; + } + .order-md-3 { + order: 3 !important; + } + .order-md-4 { + order: 4 !important; + } + .order-md-5 { + order: 5 !important; + } + .order-md-last { + order: 6 !important; + } + .m-md-0 { + margin: 0 !important; + } + .m-md-1 { + margin: 0.25rem !important; + } + .m-md-2 { + margin: 0.5rem !important; + } + .m-md-3 { + margin: 1rem !important; + } + .m-md-4 { + margin: 1.5rem !important; + } + .m-md-5 { + margin: 3rem !important; + } + .m-md-auto { + margin: auto !important; + } + .mx-md-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .mx-md-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .mx-md-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .mx-md-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .mx-md-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .mx-md-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .mx-md-auto { + margin-right: auto !important; + margin-left: auto !important; + } + .my-md-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .my-md-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-md-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .my-md-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .my-md-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .my-md-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .my-md-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + .mt-md-0 { + margin-top: 0 !important; + } + .mt-md-1 { + margin-top: 0.25rem !important; + } + .mt-md-2 { + margin-top: 0.5rem !important; + } + .mt-md-3 { + margin-top: 1rem !important; + } + .mt-md-4 { + margin-top: 1.5rem !important; + } + .mt-md-5 { + margin-top: 3rem !important; + } + .mt-md-auto { + margin-top: auto !important; + } + .me-md-0 { + margin-right: 0 !important; + } + .me-md-1 { + margin-right: 0.25rem !important; + } + .me-md-2 { + margin-right: 0.5rem !important; + } + .me-md-3 { + margin-right: 1rem !important; + } + .me-md-4 { + margin-right: 1.5rem !important; + } + .me-md-5 { + margin-right: 3rem !important; + } + .me-md-auto { + margin-right: auto !important; + } + .mb-md-0 { + margin-bottom: 0 !important; + } + .mb-md-1 { + margin-bottom: 0.25rem !important; + } + .mb-md-2 { + margin-bottom: 0.5rem !important; + } + .mb-md-3 { + margin-bottom: 1rem !important; + } + .mb-md-4 { + margin-bottom: 1.5rem !important; + } + .mb-md-5 { + margin-bottom: 3rem !important; + } + .mb-md-auto { + margin-bottom: auto !important; + } + .ms-md-0 { + margin-left: 0 !important; + } + .ms-md-1 { + margin-left: 0.25rem !important; + } + .ms-md-2 { + margin-left: 0.5rem !important; + } + .ms-md-3 { + margin-left: 1rem !important; + } + .ms-md-4 { + margin-left: 1.5rem !important; + } + .ms-md-5 { + margin-left: 3rem !important; + } + .ms-md-auto { + margin-left: auto !important; + } + .p-md-0 { + padding: 0 !important; + } + .p-md-1 { + padding: 0.25rem !important; + } + .p-md-2 { + padding: 0.5rem !important; + } + .p-md-3 { + padding: 1rem !important; + } + .p-md-4 { + padding: 1.5rem !important; + } + .p-md-5 { + padding: 3rem !important; + } + .px-md-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .px-md-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .px-md-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .px-md-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .px-md-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .px-md-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-md-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .py-md-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-md-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .py-md-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .py-md-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .py-md-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .pt-md-0 { + padding-top: 0 !important; + } + .pt-md-1 { + padding-top: 0.25rem !important; + } + .pt-md-2 { + padding-top: 0.5rem !important; + } + .pt-md-3 { + padding-top: 1rem !important; + } + .pt-md-4 { + padding-top: 1.5rem !important; + } + .pt-md-5 { + padding-top: 3rem !important; + } + .pe-md-0 { + padding-right: 0 !important; + } + .pe-md-1 { + padding-right: 0.25rem !important; + } + .pe-md-2 { + padding-right: 0.5rem !important; + } + .pe-md-3 { + padding-right: 1rem !important; + } + .pe-md-4 { + padding-right: 1.5rem !important; + } + .pe-md-5 { + padding-right: 3rem !important; + } + .pb-md-0 { + padding-bottom: 0 !important; + } + .pb-md-1 { + padding-bottom: 0.25rem !important; + } + .pb-md-2 { + padding-bottom: 0.5rem !important; + } + .pb-md-3 { + padding-bottom: 1rem !important; + } + .pb-md-4 { + padding-bottom: 1.5rem !important; + } + .pb-md-5 { + padding-bottom: 3rem !important; + } + .ps-md-0 { + padding-left: 0 !important; + } + .ps-md-1 { + padding-left: 0.25rem !important; + } + .ps-md-2 { + padding-left: 0.5rem !important; + } + .ps-md-3 { + padding-left: 1rem !important; + } + .ps-md-4 { + padding-left: 1.5rem !important; + } + .ps-md-5 { + padding-left: 3rem !important; + } + .gap-md-0 { + gap: 0 !important; + } + .gap-md-1 { + gap: 0.25rem !important; + } + .gap-md-2 { + gap: 0.5rem !important; + } + .gap-md-3 { + gap: 1rem !important; + } + .gap-md-4 { + gap: 1.5rem !important; + } + .gap-md-5 { + gap: 3rem !important; + } + .row-gap-md-0 { + row-gap: 0 !important; + } + .row-gap-md-1 { + row-gap: 0.25rem !important; + } + .row-gap-md-2 { + row-gap: 0.5rem !important; + } + .row-gap-md-3 { + row-gap: 1rem !important; + } + .row-gap-md-4 { + row-gap: 1.5rem !important; + } + .row-gap-md-5 { + row-gap: 3rem !important; + } + .column-gap-md-0 { + -moz-column-gap: 0 !important; + column-gap: 0 !important; + } + .column-gap-md-1 { + -moz-column-gap: 0.25rem !important; + column-gap: 0.25rem !important; + } + .column-gap-md-2 { + -moz-column-gap: 0.5rem !important; + column-gap: 0.5rem !important; + } + .column-gap-md-3 { + -moz-column-gap: 1rem !important; + column-gap: 1rem !important; + } + .column-gap-md-4 { + -moz-column-gap: 1.5rem !important; + column-gap: 1.5rem !important; + } + .column-gap-md-5 { + -moz-column-gap: 3rem !important; + column-gap: 3rem !important; + } + .text-md-start { + text-align: left !important; + } + .text-md-end { + text-align: right !important; + } + .text-md-center { + text-align: center !important; + } + } + @media (min-width: 992px) { + .float-lg-start { + float: left !important; + } + .float-lg-end { + float: right !important; + } + .float-lg-none { + float: none !important; + } + .object-fit-lg-contain { + -o-object-fit: contain !important; + object-fit: contain !important; + } + .object-fit-lg-cover { + -o-object-fit: cover !important; + object-fit: cover !important; + } + .object-fit-lg-fill { + -o-object-fit: fill !important; + object-fit: fill !important; + } + .object-fit-lg-scale { + -o-object-fit: scale-down !important; + object-fit: scale-down !important; + } + .object-fit-lg-none { + -o-object-fit: none !important; + object-fit: none !important; + } + .d-lg-inline { + display: inline !important; + } + .d-lg-inline-block { + display: inline-block !important; + } + .d-lg-block { + display: block !important; + } + .d-lg-grid { + display: grid !important; + } + .d-lg-inline-grid { + display: inline-grid !important; + } + .d-lg-table { + display: table !important; + } + .d-lg-table-row { + display: table-row !important; + } + .d-lg-table-cell { + display: table-cell !important; + } + .d-lg-flex { + display: flex !important; + } + .d-lg-inline-flex { + display: inline-flex !important; + } + .d-lg-none { + display: none !important; + } + .flex-lg-fill { + flex: 1 1 auto !important; + } + .flex-lg-row { + flex-direction: row !important; + } + .flex-lg-column { + flex-direction: column !important; + } + .flex-lg-row-reverse { + flex-direction: row-reverse !important; + } + .flex-lg-column-reverse { + flex-direction: column-reverse !important; + } + .flex-lg-grow-0 { + flex-grow: 0 !important; + } + .flex-lg-grow-1 { + flex-grow: 1 !important; + } + .flex-lg-shrink-0 { + flex-shrink: 0 !important; + } + .flex-lg-shrink-1 { + flex-shrink: 1 !important; + } + .flex-lg-wrap { + flex-wrap: wrap !important; + } + .flex-lg-nowrap { + flex-wrap: nowrap !important; + } + .flex-lg-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + .justify-content-lg-start { + justify-content: flex-start !important; + } + .justify-content-lg-end { + justify-content: flex-end !important; + } + .justify-content-lg-center { + justify-content: center !important; + } + .justify-content-lg-between { + justify-content: space-between !important; + } + .justify-content-lg-around { + justify-content: space-around !important; + } + .justify-content-lg-evenly { + justify-content: space-evenly !important; + } + .align-items-lg-start { + align-items: flex-start !important; + } + .align-items-lg-end { + align-items: flex-end !important; + } + .align-items-lg-center { + align-items: center !important; + } + .align-items-lg-baseline { + align-items: baseline !important; + } + .align-items-lg-stretch { + align-items: stretch !important; + } + .align-content-lg-start { + align-content: flex-start !important; + } + .align-content-lg-end { + align-content: flex-end !important; + } + .align-content-lg-center { + align-content: center !important; + } + .align-content-lg-between { + align-content: space-between !important; + } + .align-content-lg-around { + align-content: space-around !important; + } + .align-content-lg-stretch { + align-content: stretch !important; + } + .align-self-lg-auto { + align-self: auto !important; + } + .align-self-lg-start { + align-self: flex-start !important; + } + .align-self-lg-end { + align-self: flex-end !important; + } + .align-self-lg-center { + align-self: center !important; + } + .align-self-lg-baseline { + align-self: baseline !important; + } + .align-self-lg-stretch { + align-self: stretch !important; + } + .order-lg-first { + order: -1 !important; + } + .order-lg-0 { + order: 0 !important; + } + .order-lg-1 { + order: 1 !important; + } + .order-lg-2 { + order: 2 !important; + } + .order-lg-3 { + order: 3 !important; + } + .order-lg-4 { + order: 4 !important; + } + .order-lg-5 { + order: 5 !important; + } + .order-lg-last { + order: 6 !important; + } + .m-lg-0 { + margin: 0 !important; + } + .m-lg-1 { + margin: 0.25rem !important; + } + .m-lg-2 { + margin: 0.5rem !important; + } + .m-lg-3 { + margin: 1rem !important; + } + .m-lg-4 { + margin: 1.5rem !important; + } + .m-lg-5 { + margin: 3rem !important; + } + .m-lg-auto { + margin: auto !important; + } + .mx-lg-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .mx-lg-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .mx-lg-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .mx-lg-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .mx-lg-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .mx-lg-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .mx-lg-auto { + margin-right: auto !important; + margin-left: auto !important; + } + .my-lg-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .my-lg-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-lg-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .my-lg-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .my-lg-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .my-lg-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .my-lg-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + .mt-lg-0 { + margin-top: 0 !important; + } + .mt-lg-1 { + margin-top: 0.25rem !important; + } + .mt-lg-2 { + margin-top: 0.5rem !important; + } + .mt-lg-3 { + margin-top: 1rem !important; + } + .mt-lg-4 { + margin-top: 1.5rem !important; + } + .mt-lg-5 { + margin-top: 3rem !important; + } + .mt-lg-auto { + margin-top: auto !important; + } + .me-lg-0 { + margin-right: 0 !important; + } + .me-lg-1 { + margin-right: 0.25rem !important; + } + .me-lg-2 { + margin-right: 0.5rem !important; + } + .me-lg-3 { + margin-right: 1rem !important; + } + .me-lg-4 { + margin-right: 1.5rem !important; + } + .me-lg-5 { + margin-right: 3rem !important; + } + .me-lg-auto { + margin-right: auto !important; + } + .mb-lg-0 { + margin-bottom: 0 !important; + } + .mb-lg-1 { + margin-bottom: 0.25rem !important; + } + .mb-lg-2 { + margin-bottom: 0.5rem !important; + } + .mb-lg-3 { + margin-bottom: 1rem !important; + } + .mb-lg-4 { + margin-bottom: 1.5rem !important; + } + .mb-lg-5 { + margin-bottom: 3rem !important; + } + .mb-lg-auto { + margin-bottom: auto !important; + } + .ms-lg-0 { + margin-left: 0 !important; + } + .ms-lg-1 { + margin-left: 0.25rem !important; + } + .ms-lg-2 { + margin-left: 0.5rem !important; + } + .ms-lg-3 { + margin-left: 1rem !important; + } + .ms-lg-4 { + margin-left: 1.5rem !important; + } + .ms-lg-5 { + margin-left: 3rem !important; + } + .ms-lg-auto { + margin-left: auto !important; + } + .p-lg-0 { + padding: 0 !important; + } + .p-lg-1 { + padding: 0.25rem !important; + } + .p-lg-2 { + padding: 0.5rem !important; + } + .p-lg-3 { + padding: 1rem !important; + } + .p-lg-4 { + padding: 1.5rem !important; + } + .p-lg-5 { + padding: 3rem !important; + } + .px-lg-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .px-lg-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .px-lg-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .px-lg-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .px-lg-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .px-lg-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-lg-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .py-lg-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-lg-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .py-lg-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .py-lg-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .py-lg-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .pt-lg-0 { + padding-top: 0 !important; + } + .pt-lg-1 { + padding-top: 0.25rem !important; + } + .pt-lg-2 { + padding-top: 0.5rem !important; + } + .pt-lg-3 { + padding-top: 1rem !important; + } + .pt-lg-4 { + padding-top: 1.5rem !important; + } + .pt-lg-5 { + padding-top: 3rem !important; + } + .pe-lg-0 { + padding-right: 0 !important; + } + .pe-lg-1 { + padding-right: 0.25rem !important; + } + .pe-lg-2 { + padding-right: 0.5rem !important; + } + .pe-lg-3 { + padding-right: 1rem !important; + } + .pe-lg-4 { + padding-right: 1.5rem !important; + } + .pe-lg-5 { + padding-right: 3rem !important; + } + .pb-lg-0 { + padding-bottom: 0 !important; + } + .pb-lg-1 { + padding-bottom: 0.25rem !important; + } + .pb-lg-2 { + padding-bottom: 0.5rem !important; + } + .pb-lg-3 { + padding-bottom: 1rem !important; + } + .pb-lg-4 { + padding-bottom: 1.5rem !important; + } + .pb-lg-5 { + padding-bottom: 3rem !important; + } + .ps-lg-0 { + padding-left: 0 !important; + } + .ps-lg-1 { + padding-left: 0.25rem !important; + } + .ps-lg-2 { + padding-left: 0.5rem !important; + } + .ps-lg-3 { + padding-left: 1rem !important; + } + .ps-lg-4 { + padding-left: 1.5rem !important; + } + .ps-lg-5 { + padding-left: 3rem !important; + } + .gap-lg-0 { + gap: 0 !important; + } + .gap-lg-1 { + gap: 0.25rem !important; + } + .gap-lg-2 { + gap: 0.5rem !important; + } + .gap-lg-3 { + gap: 1rem !important; + } + .gap-lg-4 { + gap: 1.5rem !important; + } + .gap-lg-5 { + gap: 3rem !important; + } + .row-gap-lg-0 { + row-gap: 0 !important; + } + .row-gap-lg-1 { + row-gap: 0.25rem !important; + } + .row-gap-lg-2 { + row-gap: 0.5rem !important; + } + .row-gap-lg-3 { + row-gap: 1rem !important; + } + .row-gap-lg-4 { + row-gap: 1.5rem !important; + } + .row-gap-lg-5 { + row-gap: 3rem !important; + } + .column-gap-lg-0 { + -moz-column-gap: 0 !important; + column-gap: 0 !important; + } + .column-gap-lg-1 { + -moz-column-gap: 0.25rem !important; + column-gap: 0.25rem !important; + } + .column-gap-lg-2 { + -moz-column-gap: 0.5rem !important; + column-gap: 0.5rem !important; + } + .column-gap-lg-3 { + -moz-column-gap: 1rem !important; + column-gap: 1rem !important; + } + .column-gap-lg-4 { + -moz-column-gap: 1.5rem !important; + column-gap: 1.5rem !important; + } + .column-gap-lg-5 { + -moz-column-gap: 3rem !important; + column-gap: 3rem !important; + } + .text-lg-start { + text-align: left !important; + } + .text-lg-end { + text-align: right !important; + } + .text-lg-center { + text-align: center !important; + } + } + @media (min-width: 1200px) { + .float-xl-start { + float: left !important; + } + .float-xl-end { + float: right !important; + } + .float-xl-none { + float: none !important; + } + .object-fit-xl-contain { + -o-object-fit: contain !important; + object-fit: contain !important; + } + .object-fit-xl-cover { + -o-object-fit: cover !important; + object-fit: cover !important; + } + .object-fit-xl-fill { + -o-object-fit: fill !important; + object-fit: fill !important; + } + .object-fit-xl-scale { + -o-object-fit: scale-down !important; + object-fit: scale-down !important; + } + .object-fit-xl-none { + -o-object-fit: none !important; + object-fit: none !important; + } + .d-xl-inline { + display: inline !important; + } + .d-xl-inline-block { + display: inline-block !important; + } + .d-xl-block { + display: block !important; + } + .d-xl-grid { + display: grid !important; + } + .d-xl-inline-grid { + display: inline-grid !important; + } + .d-xl-table { + display: table !important; + } + .d-xl-table-row { + display: table-row !important; + } + .d-xl-table-cell { + display: table-cell !important; + } + .d-xl-flex { + display: flex !important; + } + .d-xl-inline-flex { + display: inline-flex !important; + } + .d-xl-none { + display: none !important; + } + .flex-xl-fill { + flex: 1 1 auto !important; + } + .flex-xl-row { + flex-direction: row !important; + } + .flex-xl-column { + flex-direction: column !important; + } + .flex-xl-row-reverse { + flex-direction: row-reverse !important; + } + .flex-xl-column-reverse { + flex-direction: column-reverse !important; + } + .flex-xl-grow-0 { + flex-grow: 0 !important; + } + .flex-xl-grow-1 { + flex-grow: 1 !important; + } + .flex-xl-shrink-0 { + flex-shrink: 0 !important; + } + .flex-xl-shrink-1 { + flex-shrink: 1 !important; + } + .flex-xl-wrap { + flex-wrap: wrap !important; + } + .flex-xl-nowrap { + flex-wrap: nowrap !important; + } + .flex-xl-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + .justify-content-xl-start { + justify-content: flex-start !important; + } + .justify-content-xl-end { + justify-content: flex-end !important; + } + .justify-content-xl-center { + justify-content: center !important; + } + .justify-content-xl-between { + justify-content: space-between !important; + } + .justify-content-xl-around { + justify-content: space-around !important; + } + .justify-content-xl-evenly { + justify-content: space-evenly !important; + } + .align-items-xl-start { + align-items: flex-start !important; + } + .align-items-xl-end { + align-items: flex-end !important; + } + .align-items-xl-center { + align-items: center !important; + } + .align-items-xl-baseline { + align-items: baseline !important; + } + .align-items-xl-stretch { + align-items: stretch !important; + } + .align-content-xl-start { + align-content: flex-start !important; + } + .align-content-xl-end { + align-content: flex-end !important; + } + .align-content-xl-center { + align-content: center !important; + } + .align-content-xl-between { + align-content: space-between !important; + } + .align-content-xl-around { + align-content: space-around !important; + } + .align-content-xl-stretch { + align-content: stretch !important; + } + .align-self-xl-auto { + align-self: auto !important; + } + .align-self-xl-start { + align-self: flex-start !important; + } + .align-self-xl-end { + align-self: flex-end !important; + } + .align-self-xl-center { + align-self: center !important; + } + .align-self-xl-baseline { + align-self: baseline !important; + } + .align-self-xl-stretch { + align-self: stretch !important; + } + .order-xl-first { + order: -1 !important; + } + .order-xl-0 { + order: 0 !important; + } + .order-xl-1 { + order: 1 !important; + } + .order-xl-2 { + order: 2 !important; + } + .order-xl-3 { + order: 3 !important; + } + .order-xl-4 { + order: 4 !important; + } + .order-xl-5 { + order: 5 !important; + } + .order-xl-last { + order: 6 !important; + } + .m-xl-0 { + margin: 0 !important; + } + .m-xl-1 { + margin: 0.25rem !important; + } + .m-xl-2 { + margin: 0.5rem !important; + } + .m-xl-3 { + margin: 1rem !important; + } + .m-xl-4 { + margin: 1.5rem !important; + } + .m-xl-5 { + margin: 3rem !important; + } + .m-xl-auto { + margin: auto !important; + } + .mx-xl-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .mx-xl-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .mx-xl-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .mx-xl-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .mx-xl-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .mx-xl-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .mx-xl-auto { + margin-right: auto !important; + margin-left: auto !important; + } + .my-xl-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .my-xl-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-xl-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .my-xl-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .my-xl-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .my-xl-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .my-xl-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + .mt-xl-0 { + margin-top: 0 !important; + } + .mt-xl-1 { + margin-top: 0.25rem !important; + } + .mt-xl-2 { + margin-top: 0.5rem !important; + } + .mt-xl-3 { + margin-top: 1rem !important; + } + .mt-xl-4 { + margin-top: 1.5rem !important; + } + .mt-xl-5 { + margin-top: 3rem !important; + } + .mt-xl-auto { + margin-top: auto !important; + } + .me-xl-0 { + margin-right: 0 !important; + } + .me-xl-1 { + margin-right: 0.25rem !important; + } + .me-xl-2 { + margin-right: 0.5rem !important; + } + .me-xl-3 { + margin-right: 1rem !important; + } + .me-xl-4 { + margin-right: 1.5rem !important; + } + .me-xl-5 { + margin-right: 3rem !important; + } + .me-xl-auto { + margin-right: auto !important; + } + .mb-xl-0 { + margin-bottom: 0 !important; + } + .mb-xl-1 { + margin-bottom: 0.25rem !important; + } + .mb-xl-2 { + margin-bottom: 0.5rem !important; + } + .mb-xl-3 { + margin-bottom: 1rem !important; + } + .mb-xl-4 { + margin-bottom: 1.5rem !important; + } + .mb-xl-5 { + margin-bottom: 3rem !important; + } + .mb-xl-auto { + margin-bottom: auto !important; + } + .ms-xl-0 { + margin-left: 0 !important; + } + .ms-xl-1 { + margin-left: 0.25rem !important; + } + .ms-xl-2 { + margin-left: 0.5rem !important; + } + .ms-xl-3 { + margin-left: 1rem !important; + } + .ms-xl-4 { + margin-left: 1.5rem !important; + } + .ms-xl-5 { + margin-left: 3rem !important; + } + .ms-xl-auto { + margin-left: auto !important; + } + .p-xl-0 { + padding: 0 !important; + } + .p-xl-1 { + padding: 0.25rem !important; + } + .p-xl-2 { + padding: 0.5rem !important; + } + .p-xl-3 { + padding: 1rem !important; + } + .p-xl-4 { + padding: 1.5rem !important; + } + .p-xl-5 { + padding: 3rem !important; + } + .px-xl-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .px-xl-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .px-xl-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .px-xl-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .px-xl-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .px-xl-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-xl-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .py-xl-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-xl-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .py-xl-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .py-xl-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .py-xl-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .pt-xl-0 { + padding-top: 0 !important; + } + .pt-xl-1 { + padding-top: 0.25rem !important; + } + .pt-xl-2 { + padding-top: 0.5rem !important; + } + .pt-xl-3 { + padding-top: 1rem !important; + } + .pt-xl-4 { + padding-top: 1.5rem !important; + } + .pt-xl-5 { + padding-top: 3rem !important; + } + .pe-xl-0 { + padding-right: 0 !important; + } + .pe-xl-1 { + padding-right: 0.25rem !important; + } + .pe-xl-2 { + padding-right: 0.5rem !important; + } + .pe-xl-3 { + padding-right: 1rem !important; + } + .pe-xl-4 { + padding-right: 1.5rem !important; + } + .pe-xl-5 { + padding-right: 3rem !important; + } + .pb-xl-0 { + padding-bottom: 0 !important; + } + .pb-xl-1 { + padding-bottom: 0.25rem !important; + } + .pb-xl-2 { + padding-bottom: 0.5rem !important; + } + .pb-xl-3 { + padding-bottom: 1rem !important; + } + .pb-xl-4 { + padding-bottom: 1.5rem !important; + } + .pb-xl-5 { + padding-bottom: 3rem !important; + } + .ps-xl-0 { + padding-left: 0 !important; + } + .ps-xl-1 { + padding-left: 0.25rem !important; + } + .ps-xl-2 { + padding-left: 0.5rem !important; + } + .ps-xl-3 { + padding-left: 1rem !important; + } + .ps-xl-4 { + padding-left: 1.5rem !important; + } + .ps-xl-5 { + padding-left: 3rem !important; + } + .gap-xl-0 { + gap: 0 !important; + } + .gap-xl-1 { + gap: 0.25rem !important; + } + .gap-xl-2 { + gap: 0.5rem !important; + } + .gap-xl-3 { + gap: 1rem !important; + } + .gap-xl-4 { + gap: 1.5rem !important; + } + .gap-xl-5 { + gap: 3rem !important; + } + .row-gap-xl-0 { + row-gap: 0 !important; + } + .row-gap-xl-1 { + row-gap: 0.25rem !important; + } + .row-gap-xl-2 { + row-gap: 0.5rem !important; + } + .row-gap-xl-3 { + row-gap: 1rem !important; + } + .row-gap-xl-4 { + row-gap: 1.5rem !important; + } + .row-gap-xl-5 { + row-gap: 3rem !important; + } + .column-gap-xl-0 { + -moz-column-gap: 0 !important; + column-gap: 0 !important; + } + .column-gap-xl-1 { + -moz-column-gap: 0.25rem !important; + column-gap: 0.25rem !important; + } + .column-gap-xl-2 { + -moz-column-gap: 0.5rem !important; + column-gap: 0.5rem !important; + } + .column-gap-xl-3 { + -moz-column-gap: 1rem !important; + column-gap: 1rem !important; + } + .column-gap-xl-4 { + -moz-column-gap: 1.5rem !important; + column-gap: 1.5rem !important; + } + .column-gap-xl-5 { + -moz-column-gap: 3rem !important; + column-gap: 3rem !important; + } + .text-xl-start { + text-align: left !important; + } + .text-xl-end { + text-align: right !important; + } + .text-xl-center { + text-align: center !important; + } + } + @media (min-width: 1400px) { + .float-xxl-start { + float: left !important; + } + .float-xxl-end { + float: right !important; + } + .float-xxl-none { + float: none !important; + } + .object-fit-xxl-contain { + -o-object-fit: contain !important; + object-fit: contain !important; + } + .object-fit-xxl-cover { + -o-object-fit: cover !important; + object-fit: cover !important; + } + .object-fit-xxl-fill { + -o-object-fit: fill !important; + object-fit: fill !important; + } + .object-fit-xxl-scale { + -o-object-fit: scale-down !important; + object-fit: scale-down !important; + } + .object-fit-xxl-none { + -o-object-fit: none !important; + object-fit: none !important; + } + .d-xxl-inline { + display: inline !important; + } + .d-xxl-inline-block { + display: inline-block !important; + } + .d-xxl-block { + display: block !important; + } + .d-xxl-grid { + display: grid !important; + } + .d-xxl-inline-grid { + display: inline-grid !important; + } + .d-xxl-table { + display: table !important; + } + .d-xxl-table-row { + display: table-row !important; + } + .d-xxl-table-cell { + display: table-cell !important; + } + .d-xxl-flex { + display: flex !important; + } + .d-xxl-inline-flex { + display: inline-flex !important; + } + .d-xxl-none { + display: none !important; + } + .flex-xxl-fill { + flex: 1 1 auto !important; + } + .flex-xxl-row { + flex-direction: row !important; + } + .flex-xxl-column { + flex-direction: column !important; + } + .flex-xxl-row-reverse { + flex-direction: row-reverse !important; + } + .flex-xxl-column-reverse { + flex-direction: column-reverse !important; + } + .flex-xxl-grow-0 { + flex-grow: 0 !important; + } + .flex-xxl-grow-1 { + flex-grow: 1 !important; + } + .flex-xxl-shrink-0 { + flex-shrink: 0 !important; + } + .flex-xxl-shrink-1 { + flex-shrink: 1 !important; + } + .flex-xxl-wrap { + flex-wrap: wrap !important; + } + .flex-xxl-nowrap { + flex-wrap: nowrap !important; + } + .flex-xxl-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + .justify-content-xxl-start { + justify-content: flex-start !important; + } + .justify-content-xxl-end { + justify-content: flex-end !important; + } + .justify-content-xxl-center { + justify-content: center !important; + } + .justify-content-xxl-between { + justify-content: space-between !important; + } + .justify-content-xxl-around { + justify-content: space-around !important; + } + .justify-content-xxl-evenly { + justify-content: space-evenly !important; + } + .align-items-xxl-start { + align-items: flex-start !important; + } + .align-items-xxl-end { + align-items: flex-end !important; + } + .align-items-xxl-center { + align-items: center !important; + } + .align-items-xxl-baseline { + align-items: baseline !important; + } + .align-items-xxl-stretch { + align-items: stretch !important; + } + .align-content-xxl-start { + align-content: flex-start !important; + } + .align-content-xxl-end { + align-content: flex-end !important; + } + .align-content-xxl-center { + align-content: center !important; + } + .align-content-xxl-between { + align-content: space-between !important; + } + .align-content-xxl-around { + align-content: space-around !important; + } + .align-content-xxl-stretch { + align-content: stretch !important; + } + .align-self-xxl-auto { + align-self: auto !important; + } + .align-self-xxl-start { + align-self: flex-start !important; + } + .align-self-xxl-end { + align-self: flex-end !important; + } + .align-self-xxl-center { + align-self: center !important; + } + .align-self-xxl-baseline { + align-self: baseline !important; + } + .align-self-xxl-stretch { + align-self: stretch !important; + } + .order-xxl-first { + order: -1 !important; + } + .order-xxl-0 { + order: 0 !important; + } + .order-xxl-1 { + order: 1 !important; + } + .order-xxl-2 { + order: 2 !important; + } + .order-xxl-3 { + order: 3 !important; + } + .order-xxl-4 { + order: 4 !important; + } + .order-xxl-5 { + order: 5 !important; + } + .order-xxl-last { + order: 6 !important; + } + .m-xxl-0 { + margin: 0 !important; + } + .m-xxl-1 { + margin: 0.25rem !important; + } + .m-xxl-2 { + margin: 0.5rem !important; + } + .m-xxl-3 { + margin: 1rem !important; + } + .m-xxl-4 { + margin: 1.5rem !important; + } + .m-xxl-5 { + margin: 3rem !important; + } + .m-xxl-auto { + margin: auto !important; + } + .mx-xxl-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .mx-xxl-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .mx-xxl-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .mx-xxl-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .mx-xxl-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .mx-xxl-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .mx-xxl-auto { + margin-right: auto !important; + margin-left: auto !important; + } + .my-xxl-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .my-xxl-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-xxl-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .my-xxl-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .my-xxl-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .my-xxl-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .my-xxl-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + .mt-xxl-0 { + margin-top: 0 !important; + } + .mt-xxl-1 { + margin-top: 0.25rem !important; + } + .mt-xxl-2 { + margin-top: 0.5rem !important; + } + .mt-xxl-3 { + margin-top: 1rem !important; + } + .mt-xxl-4 { + margin-top: 1.5rem !important; + } + .mt-xxl-5 { + margin-top: 3rem !important; + } + .mt-xxl-auto { + margin-top: auto !important; + } + .me-xxl-0 { + margin-right: 0 !important; + } + .me-xxl-1 { + margin-right: 0.25rem !important; + } + .me-xxl-2 { + margin-right: 0.5rem !important; + } + .me-xxl-3 { + margin-right: 1rem !important; + } + .me-xxl-4 { + margin-right: 1.5rem !important; + } + .me-xxl-5 { + margin-right: 3rem !important; + } + .me-xxl-auto { + margin-right: auto !important; + } + .mb-xxl-0 { + margin-bottom: 0 !important; + } + .mb-xxl-1 { + margin-bottom: 0.25rem !important; + } + .mb-xxl-2 { + margin-bottom: 0.5rem !important; + } + .mb-xxl-3 { + margin-bottom: 1rem !important; + } + .mb-xxl-4 { + margin-bottom: 1.5rem !important; + } + .mb-xxl-5 { + margin-bottom: 3rem !important; + } + .mb-xxl-auto { + margin-bottom: auto !important; + } + .ms-xxl-0 { + margin-left: 0 !important; + } + .ms-xxl-1 { + margin-left: 0.25rem !important; + } + .ms-xxl-2 { + margin-left: 0.5rem !important; + } + .ms-xxl-3 { + margin-left: 1rem !important; + } + .ms-xxl-4 { + margin-left: 1.5rem !important; + } + .ms-xxl-5 { + margin-left: 3rem !important; + } + .ms-xxl-auto { + margin-left: auto !important; + } + .p-xxl-0 { + padding: 0 !important; + } + .p-xxl-1 { + padding: 0.25rem !important; + } + .p-xxl-2 { + padding: 0.5rem !important; + } + .p-xxl-3 { + padding: 1rem !important; + } + .p-xxl-4 { + padding: 1.5rem !important; + } + .p-xxl-5 { + padding: 3rem !important; + } + .px-xxl-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .px-xxl-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .px-xxl-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .px-xxl-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .px-xxl-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .px-xxl-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-xxl-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .py-xxl-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-xxl-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .py-xxl-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .py-xxl-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .py-xxl-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .pt-xxl-0 { + padding-top: 0 !important; + } + .pt-xxl-1 { + padding-top: 0.25rem !important; + } + .pt-xxl-2 { + padding-top: 0.5rem !important; + } + .pt-xxl-3 { + padding-top: 1rem !important; + } + .pt-xxl-4 { + padding-top: 1.5rem !important; + } + .pt-xxl-5 { + padding-top: 3rem !important; + } + .pe-xxl-0 { + padding-right: 0 !important; + } + .pe-xxl-1 { + padding-right: 0.25rem !important; + } + .pe-xxl-2 { + padding-right: 0.5rem !important; + } + .pe-xxl-3 { + padding-right: 1rem !important; + } + .pe-xxl-4 { + padding-right: 1.5rem !important; + } + .pe-xxl-5 { + padding-right: 3rem !important; + } + .pb-xxl-0 { + padding-bottom: 0 !important; + } + .pb-xxl-1 { + padding-bottom: 0.25rem !important; + } + .pb-xxl-2 { + padding-bottom: 0.5rem !important; + } + .pb-xxl-3 { + padding-bottom: 1rem !important; + } + .pb-xxl-4 { + padding-bottom: 1.5rem !important; + } + .pb-xxl-5 { + padding-bottom: 3rem !important; + } + .ps-xxl-0 { + padding-left: 0 !important; + } + .ps-xxl-1 { + padding-left: 0.25rem !important; + } + .ps-xxl-2 { + padding-left: 0.5rem !important; + } + .ps-xxl-3 { + padding-left: 1rem !important; + } + .ps-xxl-4 { + padding-left: 1.5rem !important; + } + .ps-xxl-5 { + padding-left: 3rem !important; + } + .gap-xxl-0 { + gap: 0 !important; + } + .gap-xxl-1 { + gap: 0.25rem !important; + } + .gap-xxl-2 { + gap: 0.5rem !important; + } + .gap-xxl-3 { + gap: 1rem !important; + } + .gap-xxl-4 { + gap: 1.5rem !important; + } + .gap-xxl-5 { + gap: 3rem !important; + } + .row-gap-xxl-0 { + row-gap: 0 !important; + } + .row-gap-xxl-1 { + row-gap: 0.25rem !important; + } + .row-gap-xxl-2 { + row-gap: 0.5rem !important; + } + .row-gap-xxl-3 { + row-gap: 1rem !important; + } + .row-gap-xxl-4 { + row-gap: 1.5rem !important; + } + .row-gap-xxl-5 { + row-gap: 3rem !important; + } + .column-gap-xxl-0 { + -moz-column-gap: 0 !important; + column-gap: 0 !important; + } + .column-gap-xxl-1 { + -moz-column-gap: 0.25rem !important; + column-gap: 0.25rem !important; + } + .column-gap-xxl-2 { + -moz-column-gap: 0.5rem !important; + column-gap: 0.5rem !important; + } + .column-gap-xxl-3 { + -moz-column-gap: 1rem !important; + column-gap: 1rem !important; + } + .column-gap-xxl-4 { + -moz-column-gap: 1.5rem !important; + column-gap: 1.5rem !important; + } + .column-gap-xxl-5 { + -moz-column-gap: 3rem !important; + column-gap: 3rem !important; + } + .text-xxl-start { + text-align: left !important; + } + .text-xxl-end { + text-align: right !important; + } + .text-xxl-center { + text-align: center !important; + } + } + @media (min-width: 1200px) { + .fs-1 { + font-size: 2.5rem !important; + } + .fs-2 { + font-size: 2rem !important; + } + .fs-3 { + font-size: 1.75rem !important; + } + .fs-4 { + font-size: 1.5rem !important; + } + } + @media print { + .d-print-inline { + display: inline !important; + } + .d-print-inline-block { + display: inline-block !important; + } + .d-print-block { + display: block !important; + } + .d-print-grid { + display: grid !important; + } + .d-print-inline-grid { + display: inline-grid !important; + } + .d-print-table { + display: table !important; + } + .d-print-table-row { + display: table-row !important; + } + .d-print-table-cell { + display: table-cell !important; + } + .d-print-flex { + display: flex !important; + } + .d-print-inline-flex { + display: inline-flex !important; + } + .d-print-none { + display: none !important; + } + } +</style> diff --git a/static/ejs/partials/styles/highlightjs.ejs b/static/ejs/partials/styles/highlightjs.ejs new file mode 100644 index 00000000..84d7547e --- /dev/null +++ b/static/ejs/partials/styles/highlightjs.ejs @@ -0,0 +1,54 @@ +<style> + pre code.hljs { + display: block; + overflow-x: auto; + } + .hljs { + color: #333333; + } + .hljs ::selection, + .hljs::selection { + background-color: #c5c8c6; + color: #333333; + } + .hljs-comment { + color: #707070; + } + .hljs-tag { + color: #002a94; + } + .hljs-operator, + .hljs-punctuation, + .hljs-subst { + color: #007373; + } + .hljs-operator { + opacity: 0.7; + } + .hljs-bullet, + .hljs-deletion, + .hljs-name, + .hljs-selector-tag, + .hljs-template-variable, + .hljs-variable { + color: #002a94; + } + .hljs-attr, + .hljs-link, + .hljs-literal, + .hljs-number, + .hljs-symbol, + .hljs-variable.constant_ { + color: #007373; + } + .hljs-addition, + .hljs-code, + .hljs-string, + .hljs-title.class_.inherited__ { + color: #dd1144; + } + .hljs-meta .hljs-keyword, + .hljs-meta-keyword { + font-weight: 700; + } +</style> diff --git a/static/ejs/partials/styles/styles.ejs b/static/ejs/partials/styles/styles.ejs new file mode 100644 index 00000000..12b68102 --- /dev/null +++ b/static/ejs/partials/styles/styles.ejs @@ -0,0 +1,677 @@ +<style> + @import url('https://fonts.googleapis.com/css2?family=Viga&display=swap'); + @import url('https://fonts.googleapis.com/css2?family=Open+Sans:wght@400;700&display=swap'); + + /* Boostrap CSS overrides */ + #accessibility-site-report:root { + --bs-border-color: #b5c5ca; + --bs-border-radius: 0.25rem; + } + + #accessibility-site-report .row > * { + padding-left: 0; + padding-right: 0; + } + + .card { + background-color: #fff; + box-shadow: 0 2px 4px 0 rgb(0 0 0 / 20%); + border-width: 0; + border-radius: 0; + color: unset; + } + + #accessibility-site-report body, + #accessibility-site-report html { + all: unset; + font-family: 'Open Sans', 'Helvetica', sans-serif; + background-color: #f4f6f9; + margin: 0; + min-height: 100vh; + line-height: 1.75rem; + } + + #accessibility-site-report hr { + border-color: #b5c5ca; + opacity: 1; + } + h6, .h6, h5, .h5, h4, .h4, h3, .h3, h2, .h2, h1, .h1 { + color: unset; + } + #accessibility-site-report h1 { + font-family: 'Viga', 'Helvetica', sans-serif; + font-weight: 700; + font-size: 2rem; + margin-top: 0; + color: #333333; + line-height: 2.5rem; + } + #accessibility-site-report h2 { + font-size: 1.125rem; + font-weight: 700; + margin-top: 0; + margin-bottom: 1rem; + line-height: 2rem; + } + #accessibility-site-report p { + font-size: 1rem; + margin-top: 0; + margin-bottom: 1rem; + } + #accessibility-site-report a { + color: #0047fa; + text-decoration: none; + } + #accessibility-site-report a:hover { + color: #002b99; + text-decoration: none; + } + /* End of Boostrap CSS overrides */ + :root { + --must-fix-icon: url("data:image/svg+xml,%3Csvg width='20' height='20' viewBox='0 0 20 20' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M17.1429 0H2.85714C1.27919 0 0 1.27919 0 2.85714V17.1429C0 18.7208 1.27919 20 2.85714 20H17.1429C18.7208 20 20 18.7208 20 17.1429V2.85714C20 1.27919 18.7208 0 17.1429 0Z' fill='%23D7260F'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.4292 9.99822V5.71251C11.4292 4.92353 10.7896 4.28394 10.0006 4.28394C9.21161 4.28394 8.57202 4.92353 8.57202 5.71251V9.99822C8.57202 10.7872 9.21161 11.4268 10.0006 11.4268C10.7896 11.4268 11.4292 10.7872 11.4292 9.99822ZM10.0006 12.8554C9.21202 12.8554 8.57202 13.4954 8.57202 14.2839C8.57202 15.0725 9.21202 15.7125 10.0006 15.7125C10.7892 15.7125 11.4292 15.0725 11.4292 14.2839C11.4292 13.4954 10.7892 12.8554 10.0006 12.8554Z' fill='white'/%3E%3C/svg%3E%0A"); + + --good-to-fix-icon: url("data:image/svg+xml,%3Csvg width='20' height='20' viewBox='0 0 20 20' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M17.1429 0H2.85714C1.27919 0 0 1.27919 0 2.85714V17.1429C0 18.7208 1.27919 20 2.85714 20H17.1429C18.7208 20 20 18.7208 20 17.1429V2.85714C20 1.27919 18.7208 0 17.1429 0Z' fill='%23F79009'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10 6.5625C8.10131 6.5625 6.5625 8.10131 6.5625 10C6.5625 11.8987 8.10131 13.4375 10 13.4375C11.8987 13.4375 13.4375 11.8987 13.4375 10C13.4375 8.10131 11.8987 6.5625 10 6.5625ZM4.84375 10C4.84375 7.15207 7.15207 4.84375 10 4.84375C12.8479 4.84375 15.1562 7.15207 15.1562 10C15.1562 12.8479 12.8479 15.1562 10 15.1562C7.15207 15.1562 4.84375 12.8479 4.84375 10Z' fill='white'/%3E%3C/svg%3E%0A"); + + --passed-icon: url("data:image/svg+xml,%3Csvg width='20' height='20' viewBox='0 0 20 20' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M17.1429 0H2.85714C1.27919 0 0 1.27919 0 2.85714V17.1429C0 18.7208 1.27919 20 2.85714 20H17.1429C18.7208 20 20 18.7208 20 17.1429V2.85714C20 1.27919 18.7208 0 17.1429 0Z' fill='%23039855'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M15.1781 5.3131C15.7942 5.80597 15.8941 6.70496 15.4012 7.32105L9.68694 14.4639C9.19407 15.08 8.29508 15.1799 7.67899 14.687C7.0629 14.1941 6.96301 13.2951 7.45589 12.6791L13.1702 5.5362C13.663 4.92011 14.562 4.82023 15.1781 5.3131Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M4.70415 9.70455C5.26204 9.14666 6.16656 9.14666 6.72446 9.70455L9.5816 12.5617C10.1395 13.1196 10.1395 14.0241 9.5816 14.582C9.02371 15.1399 8.11919 15.1399 7.56129 14.582L4.70415 11.7249C4.14626 11.167 4.14626 10.2624 4.70415 9.70455Z' fill='white'/%3E%3C/svg%3E%0A"); + } + * { + color: #333; + } + a[target='_blank']:after { + content: url("data:image/svg+xml,%3Csvg width='12' height='12' viewBox='0 0 12 12' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M6.477 2.625C6.477 2.52554 6.43749 2.43016 6.36716 2.35984C6.29684 2.28951 6.20146 2.25 6.102 2.25H1.125C0.826631 2.25 0.540483 2.36853 0.329505 2.5795C0.118526 2.79048 0 3.07663 0 3.375L0 10.875C0 11.1734 0.118526 11.4595 0.329505 11.6705C0.540483 11.8815 0.826631 12 1.125 12H8.625C8.92337 12 9.20952 11.8815 9.42049 11.6705C9.63147 11.4595 9.75 11.1734 9.75 10.875V5.898C9.75 5.79854 9.71049 5.70316 9.64016 5.63283C9.56984 5.56251 9.47446 5.523 9.375 5.523C9.27554 5.523 9.18016 5.56251 9.10983 5.63283C9.03951 5.70316 9 5.79854 9 5.898V10.875C9 10.9745 8.96049 11.0698 8.89016 11.1402C8.81984 11.2105 8.72446 11.25 8.625 11.25H1.125C1.02554 11.25 0.930161 11.2105 0.859835 11.1402C0.789509 11.0698 0.75 10.9745 0.75 10.875V3.375C0.75 3.27554 0.789509 3.18016 0.859835 3.10984C0.930161 3.03951 1.02554 3 1.125 3H6.102C6.20146 3 6.29684 2.96049 6.36716 2.89016C6.43749 2.81984 6.477 2.72446 6.477 2.625Z' fill='%230047FA'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M12 0.375C12 0.275544 11.9605 0.180161 11.8902 0.109835C11.8198 0.0395088 11.7245 0 11.625 0L7.875 0C7.77554 0 7.68016 0.0395088 7.60983 0.109835C7.53951 0.180161 7.5 0.275544 7.5 0.375C7.5 0.474456 7.53951 0.569839 7.60983 0.640165C7.68016 0.710491 7.77554 0.75 7.875 0.75H10.7197L4.6095 6.8595C4.57463 6.89437 4.54697 6.93576 4.5281 6.98131C4.50924 7.02687 4.49952 7.07569 4.49952 7.125C4.49952 7.17431 4.50924 7.22313 4.5281 7.26869C4.54697 7.31424 4.57463 7.35563 4.6095 7.3905C4.64436 7.42537 4.68576 7.45302 4.73131 7.47189C4.77686 7.49076 4.82569 7.50047 4.875 7.50047C4.92431 7.50047 4.97313 7.49076 5.01869 7.47189C5.06424 7.45302 5.10563 7.42537 5.1405 7.3905L11.25 1.28025V4.125C11.25 4.22446 11.2895 4.31984 11.3598 4.39016C11.4302 4.46049 11.5255 4.5 11.625 4.5C11.7245 4.5 11.8198 4.46049 11.8902 4.39016C11.9605 4.31984 12 4.22446 12 4.125V0.375Z' fill='%230047FA'/%3E%3C/svg%3E%0A"); + display: inline-block; + padding-left: 0.5rem; + text-decoration-line: none; + } + /* hr { + border-color: #b5c5ca !important; + opacity: 1 !important; + } */ + #header .card { + box-shadow: 0 3px 5px 0 #736ccb1a; + } + footer .card { + box-shadow: 0 -3px 5px 0 #736ccb1a; + } + .toggleWrapper { + padding: 0 50px; + text-align: right; + } + @media (max-width: 767px) { + .toggleWrapper { + border-top: 1px solid #e1e7eb; + padding-top: 1.5rem !important; + margin-top: 1.5rem !important; + justify-content: center; + } + } + .toggleWrapper input { + position: absolute; + left: -99em; + } + .toggle { + cursor: pointer; + display: inline-block; + position: relative; + width: 45px; + height: 26px; + background-color: #83d8ff; + border-radius: 84px; + transition: background-color 0.2s cubic-bezier(0.445, 0.05, 0.55, 0.95); + margin-bottom: 0; + margin-top: 10px; + } + .toggle:before { + content: 'Light'; + position: absolute; + left: -50px; + font-size: 18px; + color: #0047fa; + } + .toggle:after { + content: 'Dark'; + position: absolute; + right: -48px; + font-size: 18px; + color: #333333; + } + .toggle__handler { + display: inline-block; + position: relative; + z-index: 1; + top: 2px; + left: -21px; + width: 22px; + height: 22px; + background-color: #fff; + border-radius: 50px; + box-shadow: 0 2px 6px rgba(0, 0, 0, 0.3); + transition: all 0.4s cubic-bezier(0.68, -0.55, 0.265, 1.55); + transform: rotate(-45deg); + cursor: pointer; + } + .toggle__handler .crater { + position: absolute; + background-color: #e8cda5; + opacity: 0; + transition: opacity 0.2s ease-in-out; + border-radius: 100%; + } + .toggle__handler .crater--1 { + top: 9px; + left: 6px; + width: 2px; + height: 2px; + } + .toggle__handler .crater--2 { + top: 13px; + left: 11px; + width: 3px; + height: 3px; + } + .toggle__handler .crater--3 { + top: 5px; + left: 13px; + width: 4px; + height: 4px; + } + .star { + position: absolute; + background-color: #fff; + transition: all 0.3s cubic-bezier(0.445, 0.05, 0.55, 0.95); + border-radius: 50%; + } + .star--1 { + top: 6px; + left: 8px; + z-index: 0; + width: 30px; + height: 1px; + } + .star--2 { + top: 10px; + left: 15px; + z-index: 1; + width: 19px; + height: 1px; + } + .star--3 { + top: 14px; + left: 12px; + z-index: 0; + width: 30px; + height: 1px; + } + .star--4, + .star--5, + .star--6 { + opacity: 0; + transition: all 0.3s 0 cubic-bezier(0.445, 0.05, 0.55, 0.95); + } + .star--4 { + top: 19px; + left: 14px; + z-index: 0; + width: 1px; + height: 1px; + transform: translate3d(3px, 0, 0); + } + .star--5 { + top: 6px; + left: 15px; + z-index: 0; + width: 2px; + height: 2px; + transform: translate3d(3px, 0, 0); + } + .star--6 { + top: 16px; + left: 18px; + z-index: 0; + width: 1px; + height: 1px; + transform: translate3d(3px, 0, 0); + } + input:checked + .toggle { + background-color: #749dd6; + } + input:checked + .toggle:before { + color: #333333; + } + input:checked + .toggle:after { + color: #a68fce; + } + input:checked + .toggle .toggle__handler { + background-color: #ffe5b5; + transform: translate3d(19px, 0, 0) rotate(0); + } + input:checked + .toggle .toggle__handler .crater { + opacity: 1; + } + input:checked + .toggle .star--1 { + width: 2px; + height: 2px; + } + input:checked + .toggle .star--2 { + width: 3px; + height: 3px; + transform: translate3d(-5px, 0, 0); + } + input:checked + .toggle .star--3 { + width: 2px; + height: 2px; + transform: translate3d(-7px, 0, 0); + } + input:checked + .toggle .star--4, + input:checked + .toggle .star--5, + input:checked + .toggle .star--6 { + opacity: 1; + transform: translate3d(0, 0, 0); + } + input:checked + .toggle .star--4 { + transition: all 0.3s 0.2s cubic-bezier(0.445, 0.05, 0.55, 0.95); + } + input:checked + .toggle .star--5 { + transition: all 0.3s 0.3s cubic-bezier(0.445, 0.05, 0.55, 0.95); + } + input:checked + .toggle .star--6 { + transition: all 0.3s 0.4s cubic-bezier(0.445, 0.05, 0.55, 0.95); + } + .scan-about-item { + margin-bottom: 1rem; + display: flex; + align-items: center; + } + .scan-about-item svg { + margin-right: 0.875rem; + } + .scan-about-item a { + display: inline-block; + } + #wcag-compliance-card, + #top-five-card { + border-radius: 0.25rem; + } + .wcag-compliance-passes-panel { + margin: 1.5rem 0; + padding: 1rem; + border: 1px solid #b5c5ca; + border-radius: 0.25rem; + } + .wcag-compliance-passes-bar { + margin-top: 0.5rem; + height: 0.475rem; + border-radius: 0.25rem; + background-color: #e7ecee; + position: relative; + } + .wcag-compliance-passes-bar-progress { + background-color: #785ef0; + position: absolute; + left: 0; + height: 100%; + border-radius: inherit; + } + #wcagModalToggle { + background: none; + border: 0; + padding: 0; + display: flex; + align-items: center; + } + #wcagModalToggle:hover svg path { + fill: #86b7fe; + } + #wcagModal .modal-dialog { + margin-top: 10vh; + } + #wcagModal .modal-header { + border: none; + padding: 1rem 1.5rem 0 1.5rem; + } + #wcagModal .modal-title { + font-size: 1.125rem; + } + #wcagModal .modal-body { + padding: 1.5rem; + } + #wcagLinksAccordion .accordion-button:not(.collapsed) { + font-weight: bold; + background-color: inherit; + color: inherit; + box-shadow: none; + } + #wcagLinksAccordion .accordion-button:not(.collapsed):focus { + box-shadow: var(--bs-accordion-btn-focus-box-shadow); + } + #wcagLinksAccordion .accordion-button:not(.collapsed)::after { + background-image: var(--bs-accordion-btn-icon); + } + #wcagLinksList { + list-style-type: none; + column-count: 3; + margin: 0; + padding: 0; + } + #wcagLinksList li { + margin-bottom: 0.5rem; + } + .category-selector { + border: 1px solid #b5c5ca; + background-color: white; + border-radius: 0.25rem; + padding: 1rem; + width: 100%; + text-align: start; + display: flex; + flex-direction: column; + } + .category-selector:focus { + outline: none; + } + .category-selector.selected { + border: 2px solid #0047fa; + padding: calc(1rem - 1px); + cursor: default; + } + .category-selector:not(.selected):focus, + .category-selector:not(.selected):hover { + cursor: pointer; + background-color: #f2f6ff; + border: 1px solid #0047fa; + } + .category-selector h3 { + font-size: 1.125rem; + } + .category-selector .category-name::before { + height: 1.25rem; + width: 1.25rem; + margin-right: 0.5rem; + content: ''; + background-repeat: no-repeat; + background-size: 1.25rem; + display: inline-block; + } + .category-selector.selected .category-name { + color: #0047fa; + } + .category-selector.mustFix .category-name::before { + background-image: var(--must-fix-icon); + } + .category-selector.goodToFix .category-name::before { + background-image: var(--good-to-fix-icon); + } + .category-selector.passed .category-name::before { + background-image: var(--passed-icon); + } + .category-selector span { + color: #4a6168; + text-align: start; + } + #scan-about { + width: 300px; + padding: 1.5rem 1rem; + overflow-wrap: anywhere; + } + #scan-about > div { + display: flex; + align-items: center; + margin-bottom: 1rem; + } + #scan-about > div > svg { + flex-shrink: 0; + margin-right: 1rem; + height: 1.125rem; + width: 1.125rem; + } + #footer { + padding: 0.75rem 1rem; + box-shadow: 0 -0.25rem 10px #736ccb1a; + font-size: 0.875rem; + line-height: 1rem; + } + .rule-item { + display: flex; + align-items: center; + justify-content: space-between; + padding: 1rem; + width: 100%; + background-color: transparent; + border: 0; + border-bottom: 1px solid #b5c5ca; + } + .rule-item:hover { + background-color: white; + box-shadow: 0 0.125rem 4px #0000001a; + } + .rule-items-count { + width: 2.25rem; + height: 2.25rem; + font-weight: bold; + border-radius: 0.375rem; + color: white; + display: inline-flex; + align-items: center; + justify-content: center; + margin-right: 1rem; + } + .rule-items-count.mustFix { + background-color: #d7260f; + } + .rule-items-count.passed { + background-color: #039855; + } + .rule-items-count.goodToFix { + background-color: #f79009; + } + #expandedRule { + width: 55%; + overflow-y: auto; + } + #expandedRuleName { + font-size: 1.5rem; + font-weight: bold; + line-height: 2rem; + } + #expandedRuleDescription { + margin-top: 2rem; + } + #expandedRuleHelpUrl { + display: block; + margin-bottom: 1rem; + width: fit-content; + } + #expandedRule h4 { + font-size: 1rem; + font-weight: bold; + line-height: 1.75rem; + } + #expandedRule .offcanvas-header { + position: static; + margin-bottom: 2rem; + } + #expandedRule .offcanvas-body { + background-color: #f6f8f9; + border-top: 1px solid #b5c5ca; + padding: 2rem 1.5rem; + overflow-y: unset; + } + .conformance-bubble { + color: white; + width: 2.5rem; + height: 1.875rem; + display: flex; + align-items: center; + justify-content: center; + border-radius: 0.3rem; + margin-right: 1rem; + } + .conformance-bubble.wcag2a { + background-color: #53389e; + } + .conformance-bubble.wcag2a:before { + content: 'A'; + } + .conformance-bubble.wcag2aa, + .conformance-bubble.wcag21aa { + background-color: #7f56d9; + } + .conformance-bubble.wcag2aa:before, + .conformance-bubble.wcag21aa:before { + content: 'AA'; + } + .conformance-bubble.best-practice { + background-color: #b692f6; + } + .conformance-bubble.best-practice::before { + content: url("data:image/svg+xml,%3Csvg width='11' height='15' viewBox='0 0 11 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M4.27122 14.4973C3.32493 14.4973 2.55693 13.7293 2.55693 12.7831V9.35449H7.69979V12.7831C7.69979 13.7293 6.93179 14.4973 5.9855 14.4973H4.27122Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M7.69712 12.0171H5.98283V10.6234C5.98626 10.4297 6.00169 10.2497 6.03598 10.0766C6.14912 9.48343 6.47312 9.03771 6.79369 8.62971L7.20855 8.12057C7.38512 7.90457 7.5634 7.69029 7.7314 7.46743C8.43598 6.54171 8.67769 5.55257 8.47026 4.44343C8.18055 2.89371 6.74912 1.72114 5.14112 1.71429C3.5074 1.72114 2.07598 2.89371 1.78626 4.44343C1.58055 5.55257 1.82226 6.54171 2.52512 7.46743C2.69655 7.692 2.87483 7.90971 3.05483 8.12743L3.46283 8.63143C3.83312 9.08743 4.17255 9.50914 4.28226 10.0783C4.31483 10.2514 4.33026 10.4331 4.33369 10.6114V12.0171H2.6194V10.6234C2.61769 10.5566 2.61255 10.4794 2.59883 10.4023C2.56969 10.2531 2.38626 10.0269 2.22683 9.828L1.7314 9.216C1.53769 8.98114 1.34569 8.748 1.16055 8.50629C0.161118 7.19143 -0.195453 5.71886 0.101118 4.128C0.545118 1.74514 2.65198 0.0102857 5.10855 0C7.60455 0.0102857 9.7114 1.74514 10.1554 4.128C10.452 5.71886 10.0954 7.19143 9.09598 8.50629C8.91426 8.74457 8.72398 8.97771 8.53198 9.20914L8.1394 9.69429C7.94055 9.94457 7.75883 10.1863 7.7194 10.4006C7.70398 10.4811 7.69883 10.56 7.69712 10.6389V12.0171Z' fill='white'/%3E%3C/svg%3E%0A"); + padding-top: 2.5px; + } + #expandedRuleCategorySelectors { + display: flex; + } + #expandedRuleCategorySelectors .category-selector { + border-radius: 0; + } + #expandedRuleCategorySelectors .category-selector:first-child { + border-top-left-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; + } + #expandedRuleCategorySelectors .category-selector:last-child { + border-top-right-radius: 0.25rem; + border-bottom-right-radius: 0.25rem; + } + #expandedRuleCategorySelectors .category-name::before { + height: 1.125rem; + width: 1.125rem; + background-size: 1.125rem; + } + #expandedRuleCategoryContent h5 { + font-size: 1.125rem; + font-weight: bold; + line-height: 2rem; + } + #expandedRuleCategoryContent .accordion-button { + padding: 1rem 1rem 1rem 1.25rem; + } + #expandedRuleCategoryContent .accordion-button:not(.collapsed) { + background-color: inherit; + color: inherit; + } + #expandedRuleCategoryContent .accordion-button::after { + content: none; + } + #expandedRuleCategoryContent .accordion-button::before { + content: ''; + width: 0.75rem; + height: 1rem; + background-image: url("data:image/svg+xml,%3Csvg width='9' height='16' viewBox='0 0 9 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M1.03847 16C0.833084 16 0.632305 15.9388 0.461529 15.8241C0.290753 15.7095 0.157649 15.5465 0.0790493 15.3558C0.000449621 15.1651 -0.0201154 14.9553 0.0199549 14.7529C0.0600251 14.5505 0.158931 14.3645 0.304165 14.2186L6.49293 7.99975L0.304165 1.78088C0.109639 1.58514 0.000422347 1.31979 0.000518839 1.04315C0.000615331 0.766523 0.110018 0.501248 0.30468 0.30564C0.499341 0.110032 0.763331 9.70251e-05 1.03862 6.41929e-08C1.31392 -9.68968e-05 1.57798 0.109652 1.77278 0.305123L8.69586 7.26187C8.8906 7.45757 9 7.72299 9 7.99975C9 8.2765 8.8906 8.54192 8.69586 8.73763L1.77278 15.6944C1.67646 15.7914 1.562 15.8684 1.43598 15.9208C1.30996 15.9733 1.17487 16.0002 1.03847 16Z' fill='%230047FA'/%3E%3C/svg%3E%0A"); + background-repeat: no-repeat; + background-size: auto; + transition: transform 0.2s ease-in-out; + margin-right: 1rem; + flex-shrink: 0; + } + #expandedRuleCategoryContent .accordion-button:not(.collapsed)::before { + transform: rotate(90deg); + } + #expandedRuleCategoryContent .accordion-button .counter { + padding: 0.5rem; + min-width: 61px; + border: 1px solid #b5c5ca; + border-radius: 0.375rem; + padding: 0.25rem 0.5rem; + font-weight: bold; + display: flex; + align-items: center; + justify-content: space-between; + text-align: end; + flex-shrink: 0; + } + #expandedRuleCategoryContent .accordion-button .counter::before { + height: 1.125rem; + width: 1.125rem; + margin-right: 0.375rem; + content: ''; + background-repeat: no-repeat; + background-size: 1.125rem; + display: inline-block; + } + #expandedRuleCategoryContent .mustFix .accordion-button .counter::before { + background-image: var(--must-fix-icon); + } + #expandedRuleCategoryContent .goodToFix .accordion-button .counter::before { + background-image: var(--good-to-fix-icon); + } + #expandedRuleCategoryContent .mustFix .accordion-body .card { + border-top: 0.25rem solid #d7260f; + } + #expandedRuleCategoryContent .goodToFix .accordion-body .card { + border-top: 0.25rem solid #f79009; + } + #expandedRuleCategoryContent .accordion-body .card .needsReview { + color: #4a6168; + background-color: #f6f8f9; + border-bottom: 1px solid #d1dbde; + padding: 0.5rem 1rem; + display: flex; + align-items: center; + } + #expandedRuleCategoryContent .accordion-body .card .needsReview::before { + content: ''; + width: 1.25rem; + height: 1.25rem; + margin-right: 0.5rem; + background-repeat: no-repeat; + background-size: 1.25rem; + display: inline-block; + flex-shrink: 0; + } + #expandedRuleCategoryContent .mustFix .accordion-body .card .needsReview::before { + background-image: url("data:image/svg+xml,%3Csvg width='20' height='20' viewBox='0 0 20 20' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M18.5714 19.5H1.42857C0.916142 19.5 0.5 19.0839 0.5 18.5714V1.42857C0.5 0.916142 0.916142 0.5 1.42857 0.5H18.5714C19.0839 0.5 19.5 0.916142 19.5 1.42857V18.5714C19.5 19.0839 19.0839 19.5 18.5714 19.5Z' stroke='%23D7260F'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M7.72337 6.7417C7.88706 6.03485 8.16236 5.50658 8.54926 5.15688C8.98081 4.81461 9.4942 4.64348 10.0894 4.64348C10.7144 4.64348 11.213 4.80717 11.585 5.13456C11.957 5.46194 12.143 5.86372 12.143 6.33991C12.143 6.69706 12.0388 7.00211 11.8305 7.25509C11.6966 7.43366 11.2799 7.80568 10.5805 8.37116C9.88855 8.95152 9.4198 9.46491 9.17426 9.91134C8.95105 10.3801 8.83944 10.9381 8.83944 11.5854V12.0988L8.86176 12.2328C8.86176 12.3221 8.87479 12.4039 8.90083 12.4783C8.92687 12.5527 8.95291 12.6122 8.97895 12.6569C9.00499 12.7015 9.04964 12.7406 9.11288 12.7741C9.17612 12.8075 9.22449 12.8336 9.25797 12.8522C9.29145 12.8708 9.35284 12.8838 9.44212 12.8913C9.53141 12.8987 9.59279 12.9024 9.62627 12.9024H9.82159H10.0002C10.2457 12.9024 10.428 12.8931 10.547 12.8745C10.6661 12.8559 10.7721 12.8001 10.8651 12.7071C10.9581 12.6141 11.0046 12.4709 11.0046 12.2774C11.0046 12.0244 11.0195 11.764 11.0493 11.4962C11.0716 11.2209 11.1162 11.0051 11.1832 10.8488C11.2799 10.6107 11.5924 10.2759 12.1207 9.84438C13.1177 9.0036 13.7576 8.35629 14.0403 7.90241C14.338 7.41878 14.4868 6.92027 14.4868 6.40688C14.4868 5.43961 14.0775 4.61373 13.2591 3.9292C12.463 3.20003 11.3692 2.83545 9.97784 2.83545C8.66831 2.83545 7.61177 3.19259 6.80819 3.90688C6.07158 4.53188 5.64748 5.31312 5.53587 6.25063C5.52099 6.29527 5.51355 6.36967 5.51355 6.47384C5.51355 6.7789 5.62144 7.04118 5.83721 7.26067C6.05299 7.48017 6.30968 7.58991 6.6073 7.58991C6.86028 7.58991 7.08721 7.50993 7.2881 7.34996C7.489 7.18999 7.6192 6.98724 7.67873 6.7417H7.72337ZM10.0002 13.9515C9.55373 13.9515 9.17055 14.1078 8.8506 14.4203C8.53066 14.7328 8.37069 15.1122 8.37069 15.5587C8.37069 15.9977 8.53066 16.379 8.8506 16.7026C9.17055 17.0263 9.55373 17.1881 10.0002 17.1881C10.4466 17.1881 10.8298 17.0263 11.1497 16.7026C11.4697 16.379 11.6296 15.9977 11.6296 15.5587C11.6296 15.1122 11.4697 14.7328 11.1497 14.4203C10.8298 14.1078 10.4466 13.9515 10.0002 13.9515Z' fill='%23D7260F'/%3E%3C/svg%3E%0A"); + } + #expandedRuleCategoryContent .goodToFix .accordion-body .card .needsReview::before { + background-image: url("data:image/svg+xml,%3Csvg width='20' height='20' viewBox='0 0 20 20' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M18.5714 19.5H1.42857C0.916142 19.5 0.5 19.0839 0.5 18.5714V1.42857C0.5 0.916142 0.916142 0.5 1.42857 0.5H18.5714C19.0839 0.5 19.5 0.916142 19.5 1.42857V18.5714C19.5 19.0839 19.0839 19.5 18.5714 19.5Z' stroke='%23F79009'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M7.72331 6.7417C7.887 6.03485 8.1623 5.50658 8.5492 5.15688C8.98075 4.81461 9.49414 4.64348 10.0894 4.64348C10.7144 4.64348 11.2129 4.80717 11.5849 5.13456C11.9569 5.46194 12.143 5.86372 12.143 6.33991C12.143 6.69706 12.0388 7.00211 11.8305 7.25509C11.6965 7.43366 11.2799 7.80568 10.5805 8.37116C9.88849 8.95152 9.41974 9.46491 9.1742 9.91134C8.95099 10.3801 8.83938 10.9381 8.83938 11.5854V12.0988L8.8617 12.2328C8.8617 12.3221 8.87472 12.4039 8.90077 12.4783C8.92681 12.5527 8.95285 12.6122 8.97889 12.6569C9.00493 12.7015 9.04958 12.7406 9.11282 12.7741C9.17606 12.8075 9.22443 12.8336 9.25791 12.8522C9.29139 12.8708 9.35277 12.8838 9.44206 12.8913C9.53135 12.8987 9.59273 12.9024 9.62621 12.9024H9.82152H10.0001C10.2456 12.9024 10.4279 12.8931 10.547 12.8745C10.666 12.8559 10.772 12.8001 10.8651 12.7071C10.9581 12.6141 11.0046 12.4709 11.0046 12.2774C11.0046 12.0244 11.0194 11.764 11.0492 11.4962C11.0715 11.2209 11.1162 11.0051 11.1831 10.8488C11.2799 10.6107 11.5924 10.2759 12.1206 9.84438C13.1177 9.0036 13.7575 8.35628 14.0403 7.90241C14.3379 7.41878 14.4867 6.92027 14.4867 6.40688C14.4867 5.43961 14.0775 4.61373 13.259 3.9292C12.4629 3.20003 11.3692 2.83545 9.97777 2.83545C8.66824 2.83545 7.61171 3.19259 6.80813 3.90688C6.07152 4.53188 5.64742 5.31312 5.53581 6.25063C5.52093 6.29527 5.51349 6.36967 5.51349 6.47384C5.51349 6.7789 5.62137 7.04118 5.83715 7.26067C6.05292 7.48017 6.30962 7.58991 6.60724 7.58991C6.86022 7.58991 7.08715 7.50993 7.28804 7.34996C7.48894 7.18999 7.61914 6.98724 7.67867 6.7417H7.72331ZM10.0001 13.9515C9.55367 13.9515 9.17048 14.1078 8.85054 14.4203C8.5306 14.7328 8.37063 15.1122 8.37063 15.5587C8.37063 15.9977 8.5306 16.379 8.85054 16.7026C9.17048 17.0263 9.55367 17.1881 10.0001 17.1881C10.4465 17.1881 10.8297 17.0263 11.1497 16.7026C11.4696 16.379 11.6296 15.9977 11.6296 15.5587C11.6296 15.1122 11.4696 14.7328 11.1497 14.4203C10.8297 14.1078 10.4465 13.9515 10.0001 13.9515Z' fill='%23F79009'/%3E%3C/svg%3E%0A"); + } + .page-item-card-section-content { + margin-left: 1rem; + width: 80%; + flex-shrink: 0; + } + #expandedRuleCategoryContent .accordion-body pre { + background-color: #f6f8f9; + border: 1px solid #b5c5ca; + font-size: 1rem; + padding: 0.5rem; + white-space: normal; + margin-bottom: 0; + line-height: 1.25rem; + } + #expandedRuleCategoryContent .page-accordion-content-title { + font-weight: bold; + margin-top: 1rem; + display: flex; + align-items: center; + } + #expandedRuleCategoryContent .page-accordion-content-title::before { + height: 1.125rem; + width: 1.125rem; + margin-right: 0.5rem; + content: ''; + background-repeat: no-repeat; + background-size: 1.125rem; + display: inline-block; + } + #expandedRuleCategoryContent .mustFix .page-accordion-content-title::before { + background-image: var(--must-fix-icon); + } + #expandedRuleCategoryContent .goodToFix .page-accordion-content-title::before { + background-image: var(--good-to-fix-icon); + } + #expandedRuleCategoryContent .page-items-count { + border: 1px solid #b5c5ca; + border-radius: 0.475rem; + margin-left: 0.5rem; + padding: 0 0.5rem; + } +</style> diff --git a/static/ejs/report.ejs b/static/ejs/report.ejs new file mode 100644 index 00000000..74454724 --- /dev/null +++ b/static/ejs/report.ejs @@ -0,0 +1,47 @@ +<!DOCTYPE html> +<html lang="en" id="accessibility-site-report"> + <head lang="en"> + <meta charset="UTF-8" /> + <meta name="viewport" content="width=device-width, initial-scale=1" /> + <title>Accessibility Site Report</title> + <link + rel="icon" + type="image/svg+xml" + href="data:image/svg+xml, %3Csvg width='48' height='48' viewBox='0 0 48 48' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='24' cy='24' r='24' fill='%23785EF0'%3E%3C/circle%3E%3Cpath d='M16.2528 24.9725V23.832C16.2528 21.5526 14.4057 19.7056 12.1264 19.7056C9.84708 19.7056 8 21.5526 8 23.832V27.0721C8 29.2906 9.74991 31.0986 11.9448 31.1939V29.2806C11.9448 26.905 13.8772 24.9725 16.2528 24.9725Z' fill='white'%3E%3C/path%3E%3Cpath d='M12.308 29.28V31.1979H16.2528V25.3352C14.0779 25.3352 12.308 27.1051 12.308 29.28Z' fill='white'%3E%3C/path%3E%3Cpath d='M22.8201 25.3289H18.6937V31.1997H22.8201V25.3289Z' fill='white'%3E%3C/path%3E%3Cpath d='M22.8201 17.6016C20.5408 17.6016 18.6937 19.4486 18.6937 21.728V24.9672H22.8201V17.6016Z' fill='white'%3E%3C/path%3E%3Cpath d='M29.3876 17.6016C27.1082 17.6016 25.2612 19.4486 25.2612 21.728V24.9672H29.3876V17.6016Z' fill='white'%3E%3C/path%3E%3Cpath d='M29.3876 25.3289H25.2612V31.1997H29.3876V25.3289Z' fill='white'%3E%3C/path%3E%3Cpath d='M36.3182 31.199C38.5976 31.199 40.4446 29.3519 40.4446 27.0726V25.3281H36.3182V31.199Z' fill='white'%3E%3C/path%3E%3Cpath d='M40.4446 19.7056C38.1653 19.7056 36.3182 21.5526 36.3182 23.832V24.9644H40.4446V19.7056Z' fill='white'%3E%3C/path%3E%3Cpath d='M35.955 23.832C35.955 21.5526 34.1079 19.7056 31.8286 19.7056V22.844C31.8286 23.6195 32.0429 24.3441 32.4143 24.9644H35.955V23.832Z' fill='white'%3E%3C/path%3E%3Cpath d='M35.955 26.9709V25.3281H32.6595C33.4123 26.3261 34.6083 26.9709 35.955 26.9709Z' fill='white'%3E%3C/path%3E%3C/svg%3E" + /> + <%- include('partials/styles/bootstrap') %> + <%- include('partials/styles/highlightjs') %> + <%- include('partials/styles/styles') %> + </head> + <body class="d-flex flex-column"> + <%- include('partials/header') %> + <%- include('partials/main') %> + <%- include('partials/scripts/popper') %> + <%- include('partials/scripts/bootstrap') %> + <%- include('partials/scripts/highlightjs') %> + <%- include('partials/scripts/utils') %> + <%- include('partials/scripts/categorySummary') %> + <%- include('partials/scripts/ruleOffcanvas') %> + <script> + const scanItems = <%- JSON.stringify( + { + ...items, + passed: { + rules: items.passed.rules.map(r => delete r.pagesAffected), + ...items.passed + }, + } + ) %> + </script> + <script> + document.addEventListener('DOMContentLoaded', function () { + var tooltipTriggerList = [].slice.call( + document.querySelectorAll('[data-bs-toggle="tooltip"]'), + ); + var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) { + return new bootstrap.Tooltip(tooltipTriggerEl); + }); + }); + </script> + </body> +</html> diff --git a/static/mustache/.prettierrc b/static/mustache/.prettierrc new file mode 100644 index 00000000..222861c3 --- /dev/null +++ b/static/mustache/.prettierrc @@ -0,0 +1,4 @@ +{ + "tabWidth": 2, + "useTabs": false +} diff --git a/static/Attention Deficit.mustache b/static/mustache/Attention Deficit.mustache similarity index 100% rename from static/Attention Deficit.mustache rename to static/mustache/Attention Deficit.mustache diff --git a/static/Blind.mustache b/static/mustache/Blind.mustache similarity index 100% rename from static/Blind.mustache rename to static/mustache/Blind.mustache diff --git a/static/Cognitive.mustache b/static/mustache/Cognitive.mustache similarity index 100% rename from static/Cognitive.mustache rename to static/mustache/Cognitive.mustache diff --git a/static/Colorblindness.mustache b/static/mustache/Colorblindness.mustache similarity index 100% rename from static/Colorblindness.mustache rename to static/mustache/Colorblindness.mustache diff --git a/static/Deaf.mustache b/static/mustache/Deaf.mustache similarity index 100% rename from static/Deaf.mustache rename to static/mustache/Deaf.mustache diff --git a/static/Deafblind.mustache b/static/mustache/Deafblind.mustache similarity index 100% rename from static/Deafblind.mustache rename to static/mustache/Deafblind.mustache diff --git a/static/Dyslexia.mustache b/static/mustache/Dyslexia.mustache similarity index 100% rename from static/Dyslexia.mustache rename to static/mustache/Dyslexia.mustache diff --git a/static/Low Vision.mustache b/static/mustache/Low Vision.mustache similarity index 100% rename from static/Low Vision.mustache rename to static/mustache/Low Vision.mustache diff --git a/static/Mobility.mustache b/static/mustache/Mobility.mustache similarity index 100% rename from static/Mobility.mustache rename to static/mustache/Mobility.mustache diff --git a/static/Sighted Keyboard Users.mustache b/static/mustache/Sighted Keyboard Users.mustache similarity index 100% rename from static/Sighted Keyboard Users.mustache rename to static/mustache/Sighted Keyboard Users.mustache diff --git a/static/report.mustache b/static/mustache/report.mustache similarity index 100% rename from static/report.mustache rename to static/mustache/report.mustache