diff --git a/assets/js/search.js b/assets/js/search.js new file mode 100644 index 00000000..a81fdf30 --- /dev/null +++ b/assets/js/search.js @@ -0,0 +1,113 @@ +/* +Copyright 2018 Google LLC + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Local override of Docsy's search.js. Adds dual-mode support: the +// pre-search mode picker (see layouts/_partials/search-input.html) stores +// the user's choice, and the Enter-to-search redirect below carries it as +// ?mode=ai so the results page opens directly in AI-assisted mode. +// Standard search remains the default when nothing is stored. + +(function ($) { + 'use strict'; + + var STORAGE_KEY = 'interlisp-search-mode'; + + function getPreferredMode() { + try { + return window.localStorage.getItem(STORAGE_KEY) === 'ai' ? 'ai' : 'standard'; + } catch (_) { + return 'standard'; + } + } + + function setPreferredMode(mode, skipEvent) { + try { + window.localStorage.setItem(STORAGE_KEY, mode === 'ai' ? 'ai' : 'standard'); + } catch (_) {} + syncPickers(mode); + if (!skipEvent) { + // Notify the results-page toggle (vertex-search.js) on the same page. + try { + window.dispatchEvent(new CustomEvent('interlisp:search-mode-change', { + detail: { mode: mode } + })); + } catch (_) {} + } + } + + function syncPickers(mode) { + var useAi = mode === 'ai'; + var pickers = document.querySelectorAll('input.td-search-mode'); + for (var i = 0; i < pickers.length; i++) { + pickers[i].checked = useAi; + var group = pickers[i].closest('.td-search-mode-switch'); + if (group) { + var labels = group.querySelectorAll('.td-search-mode-label'); + for (var j = 0; j < labels.length; j++) { + var active = labels[j].getAttribute('data-search-mode') === mode; + if (active) { + labels[j].classList.add('is-active'); + } else { + labels[j].classList.remove('is-active'); + } + } + } + } + } + + var Search = { + init: function () { + $(document).ready(function () { + // Reflect the stored preference in every pre-search picker. + syncPickers(getPreferredMode()); + + $(document).on('change', 'input.td-search-mode', function () { + setPreferredMode($(this).is(':checked') ? 'ai' : 'standard'); + }); + + // Side labels set an explicit mode (they must not merely toggle). + $(document).on('click', '.td-search-mode-label', function () { + setPreferredMode($(this).data('search-mode') === 'ai' ? 'ai' : 'standard'); + }); + + $(document).on('keypress', '.td-search input', function (e) { + if (e.keyCode !== 13) { + return; + } + + var query = $(this).val(); + var params = new URLSearchParams(); + params.set('q', query); + if (getPreferredMode() === 'ai') { + params.set('mode', 'ai'); + } + var searchPage = '{{ "search/" | absURL }}?' + params.toString(); + document.location = searchPage; + + return false; + }); + }); + }, + }; + + Search.init(); + + // Shared with vertex-search.js (results-page toggle). + window.interlispSearchMode = { + get: getPreferredMode, + set: setPreferredMode + }; +})(jQuery); diff --git a/assets/js/vertex-search.js b/assets/js/vertex-search.js new file mode 100644 index 00000000..7bec5908 --- /dev/null +++ b/assets/js/vertex-search.js @@ -0,0 +1,404 @@ +import { marked } from 'marked'; +import DOMPurify from 'dompurify'; + +(function () { + 'use strict'; + + marked.setOptions({ + gfm: true, + breaks: true + }); + + // Only run on the search results page + const config = document.getElementById('vertex-search-config'); + if (!config) return; + + const FUNCTION_URL = config.dataset.searchUrl; + if (!FUNCTION_URL) { + console.warn('Vertex search URL not configured'); + return; + } + + const statusEl = document.getElementById('vertex-search-status'); + const hitsEl = document.getElementById('vertex-search-hits'); + const summaryEl = document.getElementById('vertex-search-summary'); + const summaryTxt = document.getElementById('summary-text'); + + // Dual-mode search: Standard (Google CSE, default) vs AI-assisted (Vertex). + const googleContainer = document.getElementById('google-search-container'); + const vertexContainer = document.getElementById('vertex-search-container'); + const standardRadio = document.getElementById('search-mode-standard'); + const aiRadio = document.getElementById('search-mode-ai'); + + const aiAvailable = Boolean(FUNCTION_URL) && aiRadio && !aiRadio.disabled; + const standardAvailable = standardRadio && !standardRadio.disabled; + + let lastAiQuery = null; + + // Shared preference with the pre-search picker (assets/js/search.js). + // The explicit ?mode= URL param always wins; the stored value is only a + // fallback so a remembered choice applies to fresh searches. + const STORAGE_KEY = 'interlisp-search-mode'; + + function getStoredMode() { + if (window.interlispSearchMode) return window.interlispSearchMode.get(); + try { + return window.localStorage.getItem(STORAGE_KEY) === 'ai' ? 'ai' : 'standard'; + } catch (_) { + return 'standard'; + } + } + + function syncEntryPickers(mode) { + const useAi = mode === 'ai'; + const pickers = document.querySelectorAll('input.td-search-mode'); + for (let i = 0; i < pickers.length; i++) { + pickers[i].checked = useAi; + const group = pickers[i].closest('.td-search-mode-switch'); + if (group) { + const labels = group.querySelectorAll('.td-search-mode-label'); + for (let j = 0; j < labels.length; j++) { + const active = labels[j].getAttribute('data-search-mode') === mode; + if (active) { + labels[j].classList.add('is-active'); + } else { + labels[j].classList.remove('is-active'); + } + } + } + } + } + + function publishMode(mode) { + // Store the user's explicit choice and reflect it in the navbar / + // sidebar pickers. skipEvent=true: this change originates here, so + // don't bounce the change event back. + if (window.interlispSearchMode) { + window.interlispSearchMode.set(mode, true); + } else { + try { + window.localStorage.setItem(STORAGE_KEY, mode); + } catch (_) {} + syncEntryPickers(mode); + } + } + + function currentQuery() { + return new URLSearchParams(window.location.search).get('q') || ''; + } + + function setMode(mode, options) { + const updateUrl = !options || options.updateUrl !== false; + const useAi = mode === 'ai' && aiAvailable; + + if (vertexContainer) vertexContainer.hidden = !useAi; + if (googleContainer) googleContainer.hidden = useAi; + if (aiRadio && standardRadio) { + (useAi ? aiRadio : standardRadio).checked = true; + } + + if (updateUrl) { + const params = new URLSearchParams(window.location.search); + if (useAi) { + params.set('mode', 'ai'); + } else { + params.delete('mode'); + } + const next = `${window.location.pathname}?${params.toString()}`; + window.history.replaceState(null, '', next); + publishMode(useAi ? 'ai' : 'standard'); + } else { + syncEntryPickers(useAi ? 'ai' : 'standard'); + } + + if (useAi) { + const q = currentQuery(); + if (q !== lastAiQuery) { + doSearch(q); + } + } + } + + function escapeHtml(str) { + if (!str) return ''; + return str + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, '''); + } + + // Allowlist http(s) URLs only. Prevents `javascript:` / `data:` payloads + // from backend or index content becoming clickable links. + function safeHttpUrl(raw) { + try { + const u = new URL(raw, window.location.origin); + return (u.protocol === 'http:' || u.protocol === 'https:') ? u.toString() : null; + } catch (_) { + return null; + } + } + + function renderSummaryMarkdown(summaryText, citationCount) { + const linkedMarkdown = (summaryText || '').replace(/\[(\d+)\]/g, (_, num) => { + const index = Number(num); + if (!Number.isInteger(index) || index < 1 || index > citationCount) return `[${num}]`; + return `[${num}](#source-row-${index})`; + }); + + const html = marked.parse(linkedMarkdown); + return DOMPurify.sanitize(html, { + ALLOWED_TAGS: [ + 'a', 'p', 'ul', 'ol', 'li', 'strong', 'em', 'code', 'pre', + 'blockquote', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'br' + ], + ALLOWED_ATTR: ['href', 'title', 'target', 'rel', 'id', 'class'] + }); + } + + function renderResultSnippet(snippetText, result) { + if (!snippetText) return ''; + const normalized = normalizeSnippetText(snippetText, result); + const html = marked.parse(normalized); + return DOMPurify.sanitize(html, { + ALLOWED_TAGS: ['p', 'b', 'strong', 'em', 'code', 'pre', 'br', 'ul', 'ol', 'li', 'a'], + ALLOWED_ATTR: ['href', 'title', 'target', 'rel'] + }); + } + + function decodeHtmlEntities(text) { + const textarea = document.createElement('textarea'); + textarea.innerHTML = String(text || ''); + return textarea.value; + } + + function normalizeSnippetText(text, result) { + let output = decodeHtmlEntities(text); + + // Repair malformed highlight markers like "bIssue/b" or "bmedley issues/b". + output = output.replace(/(^|[\s(\[{])b([^\n]{1,120}?)\/b(?=[\s)\]}.,;:!?]|$)/gi, + (match, prefix, value) => `${prefix}${value.trim()}`); + + // Repair specific backend artifact where stripped highlight markers + // leak into URLs (e.g. "https://bgithub/b.com/Interlisp/bmedley/b/..."). + // Intentionally narrow: generic "/b" rewrites corrupt legitimate URLs + // like https://blog.example.com, so only fix the known corrupted domain + // here. GitHub issue links are fully reconstructed in + // normalizeGithubIssueMentions() below. + output = output + .replace(/https:\/\/bgithub\/b\.com/gi, 'https://github.com') + .replace(/\s*\.\.\.\s*/g, ' '); + + output = normalizeGithubIssueMentions(output, result); + + // Drop noisy raw URL tails often appended by snippet extraction. + output = output.replace(/https?:\/\/\S+$/i, ''); + + // Normalize whitespace for cleaner one-line snippets. + output = output.replace(/\s+/g, ' ').trim(); + return output; + } + + function normalizeGithubIssueMentions(text, result) { + const repo = result?.repo; + if (!repo) return text; + + // Fix malformed markdown links like: [Issue 609](https://bgithub/b.com/Interlisp/bmedley/b/bissues/b/609) + let output = text.replace( + /\[(Issue\s+#?\d+)\]\((https?:\/\/[^)]+)\)/gi, + (match, label, rawUrl) => { + const issueNumberMatch = label.match(/(\d+)/); + if (!issueNumberMatch) return match; + const issueNumber = issueNumberMatch[1]; + const cleanUrl = `https://github.com/Interlisp/${repo}/issues/${issueNumber}`; + return `[${label}](${cleanUrl})`; + } + ); + + // Convert plain text mentions like "Issue 609" or "Issue #609" into links. + output = output.replace(/\bIssue\s+#?(\d+)\b/g, (match, num) => { + const issueUrl = `https://github.com/Interlisp/${repo}/issues/${num}`; + return `[Issue ${num}](${issueUrl})`; + }); + + return output; + } + + function formatDisplayUrl(rawUrl) { + if (!rawUrl) return ''; + + try { + const parsed = new URL(rawUrl); + const host = parsed.host.replace(/^www\./, ''); + const pathSegments = parsed.pathname.split('/').filter(Boolean); + const path = pathSegments.length > 0 ? ` › ${pathSegments.join(' › ')}` : ''; + return `${host}${path}`; + } catch (_) { + return rawUrl; + } + } + + async function doSearch(q) { + lastAiQuery = q; + if (!q) { + statusEl.textContent = 'Enter a search query above.'; + statusEl.style.display = ''; + return; + } + + // Update page title to reflect query + document.title = `Search: ${q}`; + statusEl.style.display = ''; + statusEl.innerHTML = ' Searching for ' + + escapeHtml(q) + '…'; + + try { + const url = new URL(FUNCTION_URL); + url.searchParams.set('q', q); + + // Pass referring section as context if coming from a content page + const ref = document.referrer; + if (ref) { + try { + const refPath = new URL(ref).pathname.split('/').filter(Boolean); + if (refPath.length > 0) url.searchParams.set('context', refPath[0]); + } catch (_) {} + } + + const resp = await fetch(url.toString()); + if (!resp.ok) throw new Error(`HTTP ${resp.status}`); + const data = await resp.json(); + + // Hide spinner + statusEl.style.display = 'none'; + + // Show AI summary if available + if (data.summary?.summaryText) { + const refs = data.summary?.citations || []; + const validRefs = refs.filter(r => r.title || r.uri); + + summaryTxt.innerHTML = renderSummaryMarkdown(data.summary.summaryText, validRefs.length); + + const inlineRefs = summaryTxt.querySelectorAll('a[href^="#source-row-"]'); + inlineRefs.forEach((el) => { + el.classList.add('summary-inline-citation'); + el.setAttribute('aria-label', `Jump to source ${el.textContent}`); + }); + + summaryEl.style.display = 'block'; + + // Remove stale source rows before rendering the latest list. + const previousCitations = summaryEl.querySelector('.search-citations'); + if (previousCitations) previousCitations.remove(); + + if (validRefs.length > 0) { + const citationHtml = validRefs.map((ref, i) => { + const safeUri = ref.uri ? safeHttpUrl(ref.uri) : null; + const label = escapeHtml(ref.title || ref.uri || 'Unknown source'); + const linkOrText = safeUri + ? `${label}` + : `${label}`; + return ` +
+ [${i + 1}] + ${linkOrText} +
+ `; + }).join(''); + + const citationsDiv = document.createElement('div'); + citationsDiv.className = 'search-citations mt-3'; + citationsDiv.innerHTML = '

Sources

' + citationHtml; + summaryEl.querySelector('.ai-summary').appendChild(citationsDiv); + } + } else { + summaryTxt.innerHTML = ''; + summaryEl.style.display = 'none'; + } + + // Show results + if (!data.results || data.results.length === 0) { + hitsEl.innerHTML = `

No results found for ${escapeHtml(q)}.

`; + return; + } + + // Show result count + hitsEl.innerHTML = + `

${data.results.length} results for ${escapeHtml(q)}

` + + data.results.map(r => { + const safeUrl = r.url ? safeHttpUrl(r.url) : null; + const title = escapeHtml(r.title || 'Untitled'); + const titleHtml = safeUrl + ? `${title}` + : `${title}`; + return ` +
+
+ ${titleHtml} +
+

${escapeHtml(formatDisplayUrl(r.url))}

+ ${r.snippet ? `
${renderResultSnippet(r.snippet, r)}
` : ''} + ${(r.type || r.repo || r.state) + ? `

+ ${r.type ? `${escapeHtml(r.type)}` : ''} + ${r.repo ? `${escapeHtml(r.repo)}` : ''} + ${r.state ? `${escapeHtml(r.state)}` : ''} +

` + : ''} +
+ `; + }).join(''); + + } catch (err) { + statusEl.textContent = 'Search error: ' + err.message; + console.error('Vertex search error:', err); + } + } + + // Standard search is the default; AI search only runs when toggled on + // (or when the URL carries ?mode=ai). This avoids Vertex cost/latency + // for users who never opt in. + function initMode() { + const params = new URLSearchParams(window.location.search); + const modeParam = params.get('mode'); + // Explicit ?mode= wins; otherwise fall back to the remembered + // pre-search choice, defaulting to Standard. + const wantsAi = modeParam === 'ai' || (modeParam === null && getStoredMode() === 'ai'); + + if (!aiAvailable || !standardAvailable) { + // Only one backend configured: lock to it. + setMode(aiAvailable ? 'ai' : 'standard', { updateUrl: false }); + return; + } + + setMode(wantsAi ? 'ai' : 'standard', { updateUrl: false }); + } + + // Follow pre-search picker changes made elsewhere on this page + // (navbar / sidebar), e.g. while viewing the results page. + window.addEventListener('interlisp:search-mode-change', (e) => { + if (e && e.detail && (e.detail.mode === 'ai' || e.detail.mode === 'standard')) { + setMode(e.detail.mode); + } + }); + + if (standardRadio) { + standardRadio.addEventListener('change', () => { + if (standardRadio.checked) setMode('standard'); + }); + } + if (aiRadio) { + aiRadio.addEventListener('change', () => { + if (aiRadio.checked) setMode('ai'); + }); + } + + // Run search on page load + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', initMode); + } else { + initMode(); + } + +})(); \ No newline at end of file diff --git a/assets/scss/_styles_project.scss b/assets/scss/_styles_project.scss index 7f05b07e..bcd774f4 100644 --- a/assets/scss/_styles_project.scss +++ b/assets/scss/_styles_project.scss @@ -93,3 +93,246 @@ padding: 0.5rem 0; } } + +// Search mode toggle (Standard vs AI-assisted) +.search-mode-toggle { + .btn { + font-size: 0.875rem; + } +} + +// Pre-search mode picker: a "Standard [switch] AI" control on its own row, +// centered under the search box in both the navbar and the sidebar. +// The switch takes a full flex row; in the sidebar the section-nav collapse +// button is explicitly ordered ahead of it so the first row stays +// [search box] [collapse button]. +.td-navbar__search { + display: flex; + align-items: center; + flex-wrap: wrap; + gap: 0.5rem; +} + +.td-navbar__search, +.td-sidebar__search { + .td-search { + flex: 1 1 10rem; + min-width: 0; + width: auto; + } +} + +.td-sidebar__search { + flex-wrap: wrap; + gap: 0.5rem; + + .td-sidebar__toggle { + order: 1; + } +} + +// Flanking-label switch: "Standard [switch] AI", centered below the box. +.td-search-mode-switch { + display: flex; + align-items: center; + justify-content: center; + flex: 0 0 100%; + order: 2; + gap: 0.375rem; + + .form-check { + margin-bottom: 0; + min-height: 0; + display: inline-flex; + align-items: center; + } +} + +.td-search-mode-label { + background: none; + border: none; + padding: 0; + font-size: 0.8rem; + line-height: 1.2; + color: inherit; + opacity: 0.65; + cursor: pointer; + white-space: nowrap; + + &:hover { + opacity: 1; + text-decoration: underline; + } + + &.is-active { + opacity: 1; + font-weight: 600; + } +} + +// Vertex AI Search styles +.ai-summary { + background: #f0f7ff; + border-left: 4px solid #1a73e8; + padding: 1rem 1.25rem; + margin-bottom: 1.5rem; + border-radius: 0 4px 4px 0; + + .ai-badge { + font-size: 0.75rem; + font-weight: 600; + color: #1a73e8; + text-transform: uppercase; + letter-spacing: 0.05em; + display: block; + margin-bottom: 0.5rem; + } + + p { margin: 0 0 0.75rem; } + + p:last-child { + margin-bottom: 0; + } + + ul, + ol { + margin: 0.5rem 0 0.75rem 1.25rem; + } + + li { + margin-bottom: 0.35rem; + } + + h1, + h2, + h3, + h4, + h5, + h6 { + margin: 0.9rem 0 0.5rem; + font-size: 1rem; + font-weight: 700; + color: #124fa8; + } + + code { + color: #0b4aa2; + background: rgba(26, 115, 232, 0.1); + border-radius: 3px; + padding: 0 0.2rem; + } +} + +.summary-inline-citation { + margin-left: 0.1rem; + text-decoration: none; + font-weight: 600; + color: #1a73e8; + + &:hover, + &:focus { + text-decoration: underline; + } +} + +.td-search-hit { + padding: 1rem 0; + border-bottom: 1px solid #e8e8e8; + + &:last-child { border-bottom: none; } + + &__title { + margin: 0 0 0.25rem; + font-size: 1rem; + line-height: 1.35; + a { + color: #1a0dab; + text-decoration: none; + } + + a:hover, + a:focus { + text-decoration: underline; + } + } + + &__snippet { + font-size: 0.875rem; + color: #545454; + margin: 0.25rem 0; + + p { + margin: 0 0 0.4rem; + } + + p:last-child { + margin-bottom: 0; + } + + b, + strong { + color: #1f1f1f; + font-weight: 700; + } + } + + &__url { + color: #0b8043; + margin: 0; + word-break: break-word; + } + + &__meta { + margin-top: 0.4rem; + } +} + +.search-meta-chip { + display: inline-block; + margin-right: 0.35rem; + margin-bottom: 0.2rem; + padding: 0.08rem 0.45rem; + font-size: 0.72rem; + border-radius: 999px; + background: #eef2f7; + color: #4a5568; + border: 1px solid #dde3eb; +} + +.td-search-loading, +.td-search-no-results, +.td-search-error { + padding: 1rem 0; + color: #666; +} + +.search-citations { + border-top: 1px solid #d0e4ff; + padding-top: 0.75rem; + margin-top: 0.75rem; + + .citations-label { + font-size: 0.7rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.05em; + color: #1a73e8; + margin-bottom: 0.4rem; + } + } + + .search-citation { + font-size: 0.8rem; + margin-bottom: 0.25rem; + + .citation-number { + color: #1a73e8; + font-weight: 600; + margin-right: 0.4rem; + } + + a { + color: #444; + &:hover { color: #1a73e8; } + } + } \ No newline at end of file diff --git a/config/_default/params.yaml b/config/_default/params.yaml index d1957ff6..3125f763 100644 --- a/config/_default/params.yaml +++ b/config/_default/params.yaml @@ -57,6 +57,9 @@ copyright: # gcs_engine_id: search engine gcs_engine_id: 33ef4cbe0703b4f3a +# Vertex AI Search Cloud Function URL +vertex_search_url: "https://us-central1-interlispsearch.cloudfunctions.net/search" + # Zotero Group ID for bibliography management zotero_group_id: 2914042 diff --git a/layouts/_partials/hooks/head-end.html b/layouts/_partials/hooks/head-end.html index 14f526e3..4d3dd5ec 100644 --- a/layouts/_partials/hooks/head-end.html +++ b/layouts/_partials/hooks/head-end.html @@ -1,5 +1,8 @@ + +{{ $searchJS := resources.Get "js/vertex-search.js" | js.Build | fingerprint }} + {{- /* Emit a page-level robots directive when front matter sets `robots`. Docsy's head.html already emits "index, follow" for production pages; when both tags are present, search engines apply the most restrictive diff --git a/layouts/_partials/search-input.html b/layouts/_partials/search-input.html new file mode 100644 index 00000000..6a3a1cb7 --- /dev/null +++ b/layouts/_partials/search-input.html @@ -0,0 +1,86 @@ +{{/* cSpell:ignore docsy docsearch absurlreplacer */ -}} + +{{/* Local override of Docsy's search-input partial. Adds a pre-search + Standard / AI-assisted mode picker next to the search box when both + backends are configured. The picker's value is stored (localStorage) + and honored by assets/js/search.js on redirect, and stays in sync + with the results-page toggle in layouts/search.html. */ -}} + +{{ .Scratch.Set "docsy-search" 0 -}} + +{{ if .Site.Params.gcs_engine_id -}} +{{ .Scratch.Add "docsy-search" 1 -}} + + + +{{- end -}} + + +{{ if and .Site.Params.search (isset .Site.Params.search "algolia") -}} +{{ .Scratch.Add "docsy-search" 1 -}} +{{ .Scratch.Add "docsearch-id-num" 1 -}} + + + +{{- end -}} + + +{{ if .Site.Params.offlineSearch -}} +{{ .Scratch.Add "docsy-search" 1 -}} + +{{ $offlineSearchIndex := resources.Get "json/offline-search-index.json" | resources.ExecuteAsTemplate "offline-search-index.json" . -}} +{{ if hugo.IsProduction -}} +{{/* Use `md5` as finger print hash function to shorten file name to avoid `file name too long` error. */ -}} +{{ $offlineSearchIndex = $offlineSearchIndex | fingerprint "md5" -}} +{{ end -}} +{{ $offlineSearchLink := $offlineSearchIndex.RelPermalink -}} + + + +{{- end -}} + +{{ if and .Site.Params.gcs_engine_id .Site.Params.vertex_search_url -}} +
+ +
+ +
+ +
+{{- end -}} + +{{ if gt (.Scratch.Get "docsy-search") 1 -}} +{{ warnf `You have more than one site-search option configured: choose only one. + For details, see https://www.docsy.dev/docs/content/search.` -}} +{{ end -}} diff --git a/layouts/search.html b/layouts/search.html new file mode 100644 index 00000000..718f4b62 --- /dev/null +++ b/layouts/search.html @@ -0,0 +1,74 @@ +{{ define "main" }} +
+
+

{{ .Title }}

+ + {{ $gcsID := .Site.Params.gcs_engine_id }} + {{ $vertexURL := .Site.Params.vertex_search_url }} + +
+
+ + + + + +
+
+ Standard search uses Google. Turn on AI-assisted search for an AI summary with cited sources. +
+
+ + {{/* Standard Google Custom Search (currently deployed behavior, default) */}} +
+ {{ with $gcsID -}} + + + {{ else -}} +

Standard search is not configured.

+ {{ end -}} +
+ + {{/* AI-assisted Vertex search (only active when toggled on) */}} + +
+
+{{ end }} diff --git a/package-lock.json b/package-lock.json index 82470702..e7a6b14c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2,6 +2,8 @@ "name": "Interlisp.github.io", + "version": "1.0.0", + "lockfileVersion": 2, "requires": true, @@ -10,12 +12,14 @@ "": { - "name": "Interlisp.github.io", - "dependencies": { + "dompurify": "^3.3.1", + "jquery": "^3.7.1", + "marked": "^15.0.12", + "tabpanel": "^0.2.0" }, @@ -44,6 +48,8 @@ "dev": true, + "license": "ISC", + "dependencies": { "minipass": "^7.0.4" @@ -68,6 +74,8 @@ "dev": true, + "license": "MIT", + "dependencies": { "@nodelib/fs.stat": "2.0.5", @@ -94,6 +102,8 @@ "dev": true, + "license": "MIT", + "engines": { "node": ">= 8" @@ -112,6 +122,8 @@ "dev": true, + "license": "MIT", + "dependencies": { "@nodelib/fs.scandir": "2.1.5", @@ -128,67 +140,35 @@ }, - "node_modules/adm-zip": { - - "version": "0.5.16", - - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.16.tgz", - - "integrity": "sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==", - - "dev": true, - - "engines": { - - "node": ">=12.0" - - } - - }, - - "node_modules/ansi-regex": { - - "version": "5.0.1", - - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "node_modules/@types/trusted-types": { - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "version": "2.0.7", - "dev": true, + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", - "engines": { + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", - "node": ">=8" + "license": "MIT", - } + "optional": true }, - "node_modules/ansi-styles": { + "node_modules/adm-zip": { - "version": "4.3.0", + "version": "0.5.17", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.17.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "integrity": "sha512-+Ut8d9LLqwEvHHJl1+PIHqoyDxFgVN847JTVM3Izi3xHDWPE4UtzzXysMZQs64DMcrJfBeS/uoEP4AD3HQHnQQ==", "dev": true, - "dependencies": { - - "color-convert": "^2.0.1" - - }, + "license": "MIT", "engines": { - "node": ">=8" - - }, - - "funding": { - - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=12.0" } @@ -196,14 +176,16 @@ "node_modules/anymatch": { - "version": "3.1.2", + "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, + "license": "ISC", + "dependencies": { "normalize-path": "^3.0.0", @@ -222,11 +204,11 @@ "node_modules/autoprefixer": { - "version": "10.4.8", + "version": "10.5.0", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.8.tgz", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.0.tgz", - "integrity": "sha512-75Jr6Q/XpTqEf6D2ltS5uMewJIx5irCU1oBYJrWjFenq/m12WRRrz6g15L1EIoYvPLXTbEry7rDOwrcYNj77xw==", + "integrity": "sha512-FMhOoZV4+qR6aTUALKX2rEqGG+oyATvwBt9IIzVR5rMa2HRWPkxf+P+PAJLD1I/H5/II+HuZcBJYEFBpq39ong==", "dev": true, @@ -246,21 +228,29 @@ "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + + { + + "type": "github", + + "url": "https://github.com/sponsors/ai" + } ], - "dependencies": { + "license": "MIT", - "browserslist": "^4.21.3", + "dependencies": { - "caniuse-lite": "^1.0.30001373", + "browserslist": "^4.28.2", - "fraction.js": "^4.2.0", + "caniuse-lite": "^1.0.30001787", - "normalize-range": "^0.1.2", + "fraction.js": "^5.3.4", - "picocolors": "^1.0.0", + "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" @@ -286,20 +276,54 @@ }, + "node_modules/baseline-browser-mapping": { + + "version": "2.10.29", + + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.29.tgz", + + "integrity": "sha512-Asa2krT+XTPZINCS+2QcyS8WTkObE77RwkydwF7h6DmnKqbvlalz93m/dnphUyCa6SWSP51VgtEUf2FN+gelFQ==", + + "dev": true, + + "license": "Apache-2.0", + + "bin": { + + "baseline-browser-mapping": "dist/cli.cjs" + + }, + + "engines": { + + "node": ">=6.0.0" + + } + + }, + "node_modules/binary-extensions": { - "version": "2.2.0", + "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "dev": true, + "license": "MIT", + "engines": { "node": ">=8" + }, + + "funding": { + + "url": "https://github.com/sponsors/sindresorhus" + } }, @@ -314,6 +338,8 @@ "dev": true, + "license": "MIT", + "dependencies": { "fill-range": "^7.1.1" @@ -330,11 +356,11 @@ "node_modules/browserslist": { - "version": "4.21.3", + "version": "4.28.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", - "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", "dev": true, @@ -354,19 +380,31 @@ "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + + { + + "type": "github", + + "url": "https://github.com/sponsors/ai" + } ], + "license": "MIT", + "dependencies": { - "caniuse-lite": "^1.0.30001370", + "baseline-browser-mapping": "^2.10.12", + + "caniuse-lite": "^1.0.30001782", - "electron-to-chromium": "^1.4.202", + "electron-to-chromium": "^1.5.328", - "node-releases": "^2.0.6", + "node-releases": "^2.0.36", - "update-browserslist-db": "^1.0.5" + "update-browserslist-db": "^1.2.3" }, @@ -386,11 +424,11 @@ "node_modules/caniuse-lite": { - "version": "1.0.30001378", + "version": "1.0.30001792", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001378.tgz", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz", - "integrity": "sha512-JVQnfoO7FK7WvU4ZkBRbPjaot4+YqxogSDosHv0Hv5mWpUESmN+UubMU6L/hGz8QlQ2aY5U0vR6MOs6j/CXpNA==", + "integrity": "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==", "dev": true, @@ -410,33 +448,33 @@ "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - } + }, - ] + { - }, + "type": "github", - "node_modules/chokidar": { + "url": "https://github.com/sponsors/ai" - "version": "3.5.3", + } - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + ], - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "license": "CC-BY-4.0" - "dev": true, + }, - "funding": [ + "node_modules/chokidar": { - { + "version": "3.6.0", - "type": "individual", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "url": "https://paulmillr.com/funding/" + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - } + "dev": true, - ], + "license": "MIT", "dependencies": { @@ -462,6 +500,12 @@ }, + "funding": { + + "url": "https://paulmillr.com/funding/" + + }, + "optionalDependencies": { "fsevents": "~2.3.2" @@ -480,6 +524,8 @@ "dev": true, + "license": "BlueOak-1.0.0", + "engines": { "node": ">=18" @@ -490,22 +536,188 @@ "node_modules/cliui": { - "version": "7.0.4", + "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, + "license": "ISC", + "dependencies": { "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", + "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" + }, + + "engines": { + + "node": ">=12" + + } + + }, + + "node_modules/cliui/node_modules/ansi-regex": { + + "version": "5.0.1", + + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + + "dev": true, + + "license": "MIT", + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/cliui/node_modules/ansi-styles": { + + "version": "4.3.0", + + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + + "dev": true, + + "license": "MIT", + + "dependencies": { + + "color-convert": "^2.0.1" + + }, + + "engines": { + + "node": ">=8" + + }, + + "funding": { + + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + + } + + }, + + "node_modules/cliui/node_modules/emoji-regex": { + + "version": "8.0.0", + + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + + "dev": true, + + "license": "MIT" + + }, + + "node_modules/cliui/node_modules/string-width": { + + "version": "4.2.3", + + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + + "dev": true, + + "license": "MIT", + + "dependencies": { + + "emoji-regex": "^8.0.0", + + "is-fullwidth-code-point": "^3.0.0", + + "strip-ansi": "^6.0.1" + + }, + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/cliui/node_modules/strip-ansi": { + + "version": "6.0.1", + + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + + "dev": true, + + "license": "MIT", + + "dependencies": { + + "ansi-regex": "^5.0.1" + + }, + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/cliui/node_modules/wrap-ansi": { + + "version": "7.0.0", + + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + + "dev": true, + + "license": "MIT", + + "dependencies": { + + "ansi-styles": "^4.0.0", + + "string-width": "^4.1.0", + + "strip-ansi": "^6.0.0" + + }, + + "engines": { + + "node": ">=10" + + }, + + "funding": { + + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } }, @@ -520,6 +732,8 @@ "dev": true, + "license": "MIT", + "dependencies": { "color-name": "~1.1.4" @@ -542,7 +756,9 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + + "license": "MIT" }, @@ -556,6 +772,8 @@ "dev": true, + "license": "MIT", + "engines": { "node": ">= 0.6.0" @@ -574,6 +792,8 @@ "dev": true, + "license": "MIT", + "dependencies": { "path-type": "^4.0.0" @@ -588,40 +808,50 @@ }, - "node_modules/electron-to-chromium": { + "node_modules/dompurify": { - "version": "1.4.224", + "version": "3.4.3", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.224.tgz", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.3.tgz", - "integrity": "sha512-dOujC5Yzj0nOVE23iD5HKqrRSDj2SD7RazpZS/b/WX85MtO6/LzKDF4TlYZTBteB+7fvSg5JpWh0sN7fImNF8w==", + "integrity": "sha512-VVwJidIJcp1hpg2OMXML3ZVRPYSZiq4aX7qBh83BSIpOaRDqI+qxhXjjIWnpzkOXhmp0L81lnoME1mnCc9H48A==", - "dev": true + "license": "(MPL-2.0 OR Apache-2.0)", + + "optionalDependencies": { + + "@types/trusted-types": "^2.0.7" + + } }, - "node_modules/emoji-regex": { + "node_modules/electron-to-chromium": { - "version": "8.0.0", + "version": "1.5.354", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.354.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "integrity": "sha512-JaBHwWcfIdmSAfWM5l3uwjGd431j8YEMikZ+K/2nXVuBqJKyZ0f+2h4n4JY5AyNiZmnY9qQr2RU3v9DxDmHMNg==", - "dev": true + "dev": true, + + "license": "ISC" }, "node_modules/escalade": { - "version": "3.1.1", + "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, + "license": "MIT", + "engines": { "node": ">=6" @@ -632,14 +862,16 @@ "node_modules/fast-glob": { - "version": "3.2.11", + "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, + "license": "MIT", + "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -650,7 +882,7 @@ "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, @@ -664,14 +896,16 @@ "node_modules/fastq": { - "version": "1.13.0", + "version": "1.20.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", "dev": true, + "license": "ISC", + "dependencies": { "reusify": "^1.0.4" @@ -690,6 +924,8 @@ "dev": true, + "license": "MIT", + "dependencies": { "to-regex-range": "^5.0.1" @@ -706,14 +942,16 @@ "node_modules/fraction.js": { - "version": "4.2.0", + "version": "5.3.4", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", - "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", "dev": true, + "license": "MIT", + "engines": { "node": "*" @@ -722,9 +960,9 @@ "funding": { - "type": "patreon", + "type": "github", - "url": "https://www.patreon.com/infusion" + "url": "https://github.com/sponsors/rawify" } @@ -732,14 +970,16 @@ "node_modules/fs-extra": { - "version": "10.1.0", + "version": "11.3.5", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.5.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "integrity": "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==", "dev": true, + "license": "MIT", + "dependencies": { "graceful-fs": "^4.2.0", @@ -752,7 +992,7 @@ "engines": { - "node": ">=12" + "node": ">=14.14" } @@ -760,16 +1000,18 @@ "node_modules/fsevents": { - "version": "2.3.2", + "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, + "license": "MIT", + "optional": true, "os": [ @@ -796,6 +1038,8 @@ "dev": true, + "license": "ISC", + "engines": { "node": "6.* || 8.* || >= 10.*" @@ -814,6 +1058,8 @@ "dev": true, + "license": "MIT", + "engines": { "node": ">=12" @@ -838,6 +1084,8 @@ "dev": true, + "license": "ISC", + "dependencies": { "is-glob": "^4.0.1" @@ -854,21 +1102,23 @@ "node_modules/globby": { - "version": "13.1.2", + "version": "13.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", - "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", "dev": true, + "license": "MIT", + "dependencies": { "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", + "fast-glob": "^3.3.0", - "ignore": "^5.2.0", + "ignore": "^5.2.4", "merge2": "^1.4.1", @@ -890,15 +1140,43 @@ }, + "node_modules/globby/node_modules/slash": { + + "version": "4.0.0", + + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + + "dev": true, + + "license": "MIT", + + "engines": { + + "node": ">=12" + + }, + + "funding": { + + "url": "https://github.com/sponsors/sindresorhus" + + } + + }, + "node_modules/graceful-fs": { - "version": "4.2.10", + "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true + "dev": true, + + "license": "ISC" }, @@ -914,6 +1192,8 @@ "hasInstallScript": true, + "license": "MIT", + "dependencies": { "adm-zip": "^0.5.16", @@ -940,14 +1220,16 @@ "node_modules/ignore": { - "version": "5.2.0", + "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, + "license": "MIT", + "engines": { "node": ">= 4" @@ -966,6 +1248,8 @@ "dev": true, + "license": "MIT", + "dependencies": { "binary-extensions": "^2.0.0" @@ -990,6 +1274,8 @@ "dev": true, + "license": "MIT", + "engines": { "node": ">=0.10.0" @@ -1008,6 +1294,8 @@ "dev": true, + "license": "MIT", + "engines": { "node": ">=8" @@ -1026,6 +1314,8 @@ "dev": true, + "license": "MIT", + "dependencies": { "is-extglob": "^2.1.1" @@ -1050,6 +1340,8 @@ "dev": true, + "license": "MIT", + "engines": { "node": ">=0.12.0" @@ -1064,20 +1356,24 @@ "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", - "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==" + "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==", + + "license": "MIT" }, "node_modules/jsonfile": { - "version": "6.1.0", + "version": "6.2.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", "dev": true, + "license": "MIT", + "dependencies": { "universalify": "^2.0.0" @@ -1094,17 +1390,49 @@ "node_modules/lilconfig": { - "version": "2.0.6", + "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", "dev": true, + "license": "MIT", + "engines": { - "node": ">=10" + "node": ">=14" + + }, + + "funding": { + + "url": "https://github.com/sponsors/antonk52" + + } + + }, + + "node_modules/marked": { + + "version": "15.0.12", + + "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.12.tgz", + + "integrity": "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==", + + "license": "MIT", + + "bin": { + + "marked": "bin/marked.js" + + }, + + "engines": { + + "node": ">= 18" } @@ -1120,6 +1448,8 @@ "dev": true, + "license": "MIT", + "engines": { "node": ">= 8" @@ -1138,6 +1468,8 @@ "dev": true, + "license": "MIT", + "dependencies": { "braces": "^3.0.3", @@ -1156,14 +1488,16 @@ "node_modules/minipass": { - "version": "7.1.2", + "version": "7.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", "dev": true, + "license": "BlueOak-1.0.0", + "engines": { "node": ">=16 || 14 >=14.17" @@ -1182,6 +1516,8 @@ "dev": true, + "license": "MIT", + "dependencies": { "minipass": "^7.1.2" @@ -1198,11 +1534,11 @@ "node_modules/nanoid": { - "version": "3.3.11", + "version": "3.3.12", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", "dev": true, @@ -1218,6 +1554,8 @@ ], + "license": "MIT", + "bin": { "nanoid": "bin/nanoid.cjs" @@ -1234,13 +1572,15 @@ "node_modules/node-releases": { - "version": "2.0.6", + "version": "2.0.44", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.44.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "integrity": "sha512-5WUyunoPMsvvEhS8AxHtRzP+oA8UCkJ7YRxatWKjngndhDGLiqEVAQKWjFAiAiuL8zMRGzGSJxFnLetoa43qGQ==", - "dev": true + "dev": true, + + "license": "MIT" }, @@ -1254,23 +1594,7 @@ "dev": true, - "engines": { - - "node": ">=0.10.0" - - } - - }, - - "node_modules/normalize-range": { - - "version": "0.1.2", - - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", - - "dev": true, + "license": "MIT", "engines": { @@ -1290,6 +1614,8 @@ "dev": true, + "license": "MIT", + "engines": { "node": ">=8" @@ -1306,20 +1632,24 @@ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true + "dev": true, + + "license": "ISC" }, "node_modules/picomatch": { - "version": "2.3.1", + "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, + "license": "MIT", + "engines": { "node": ">=8.6" @@ -1344,6 +1674,8 @@ "dev": true, + "license": "MIT", + "engines": { "node": ">=0.10.0" @@ -1354,11 +1686,11 @@ "node_modules/postcss": { - "version": "8.5.6", + "version": "8.5.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.14.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "integrity": "sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==", "dev": true, @@ -1390,6 +1722,8 @@ ], + "license": "MIT", + "dependencies": { "nanoid": "^3.3.11", @@ -1410,21 +1744,23 @@ "node_modules/postcss-cli": { - "version": "10.0.0", + "version": "10.1.0", - "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-10.0.0.tgz", + "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-10.1.0.tgz", - "integrity": "sha512-Wjy/00wBBEgQqnSToznxLWDnATznokFGXsHtF/3G8glRZpz5KYlfHcBW/VMJmWAeF2x49zjgy4izjM3/Wx1dKA==", + "integrity": "sha512-Zu7PLORkE9YwNdvOeOVKPmWghprOtjFQU3srMUGbdz3pHJiFh7yZ4geiZFMkjMfB0mtTFR3h8RemR62rPkbOPA==", "dev": true, + "license": "MIT", + "dependencies": { "chokidar": "^3.3.0", "dependency-graph": "^0.11.0", - "fs-extra": "^10.0.0", + "fs-extra": "^11.0.0", "get-stdin": "^9.0.0", @@ -1440,7 +1776,7 @@ "read-cache": "^1.0.0", - "slash": "^4.0.0", + "slash": "^5.0.0", "yargs": "^17.0.0" @@ -1458,29 +1794,51 @@ }, - "peerDependencies": { + "peerDependencies": { + + "postcss": "^8.0.0" + + } + + }, + + "node_modules/postcss-load-config": { + + "version": "4.0.2", + + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + + "dev": true, + + "funding": [ + + { + + "type": "opencollective", - "postcss": "^8.0.0" + "url": "https://opencollective.com/postcss/" - } + }, - }, + { - "node_modules/postcss-load-config": { + "type": "github", - "version": "4.0.1", + "url": "https://github.com/sponsors/ai" - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", + } - "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + ], - "dev": true, + "license": "MIT", "dependencies": { - "lilconfig": "^2.0.5", + "lilconfig": "^3.0.0", - "yaml": "^2.1.1" + "yaml": "^2.3.4" }, @@ -1490,14 +1848,6 @@ }, - "funding": { - - "type": "opencollective", - - "url": "https://opencollective.com/postcss/" - - }, - "peerDependencies": { "postcss": ">=8.0.9", @@ -1526,14 +1876,36 @@ "node_modules/postcss-reporter": { - "version": "7.0.5", + "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.0.5.tgz", + "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.1.0.tgz", - "integrity": "sha512-glWg7VZBilooZGOFPhN9msJ3FQs19Hie7l5a/eE6WglzYqVeH3ong3ShFcp9kDWJT1g2Y/wd59cocf9XxBtkWA==", + "integrity": "sha512-/eoEylGWyy6/DOiMP5lmFRdmDKThqgn7D6hP2dXKJI/0rJSO1ADFNngZfDzxL0YAxFvws+Rtpuji1YIHj4mySA==", "dev": true, + "funding": [ + + { + + "type": "opencollective", + + "url": "https://opencollective.com/postcss/" + + }, + + { + + "type": "github", + + "url": "https://github.com/sponsors/ai" + + } + + ], + + "license": "MIT", + "dependencies": { "picocolors": "^1.0.0", @@ -1548,14 +1920,6 @@ }, - "funding": { - - "type": "opencollective", - - "url": "https://opencollective.com/postcss/" - - }, - "peerDependencies": { "postcss": "^8.1.0" @@ -1572,7 +1936,9 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true + "dev": true, + + "license": "MIT" }, @@ -1586,6 +1952,8 @@ "dev": true, + "license": "MIT", + "engines": { "node": ">= 0.8" @@ -1630,7 +1998,9 @@ } - ] + ], + + "license": "MIT" }, @@ -1644,6 +2014,8 @@ "dev": true, + "license": "MIT", + "dependencies": { "pify": "^2.3.0" @@ -1662,6 +2034,8 @@ "dev": true, + "license": "MIT", + "dependencies": { "picomatch": "^2.2.1" @@ -1686,6 +2060,8 @@ "dev": true, + "license": "MIT", + "engines": { "node": ">=0.10.0" @@ -1696,14 +2072,16 @@ "node_modules/reusify": { - "version": "1.0.4", + "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "dev": true, + "license": "MIT", + "engines": { "iojs": ">=1.0.0", @@ -1752,6 +2130,8 @@ ], + "license": "MIT", + "dependencies": { "queue-microtask": "^1.2.2" @@ -1762,17 +2142,19 @@ "node_modules/slash": { - "version": "4.0.0", + "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", "dev": true, + "license": "MIT", + "engines": { - "node": ">=12" + "node": ">=14.16" }, @@ -1794,61 +2176,11 @@ "dev": true, - "engines": { - - "node": ">=0.10.0" - - } - - }, - - "node_modules/string-width": { - - "version": "4.2.3", - - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - - "dev": true, - - "dependencies": { - - "emoji-regex": "^8.0.0", - - "is-fullwidth-code-point": "^3.0.0", - - "strip-ansi": "^6.0.1" - - }, - - "engines": { - - "node": ">=8" - - } - - }, - - "node_modules/strip-ansi": { - - "version": "6.0.1", - - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - - "dev": true, - - "dependencies": { - - "ansi-regex": "^5.0.1" - - }, + "license": "BSD-3-Clause", "engines": { - "node": ">=8" + "node": ">=0.10.0" } @@ -1866,14 +2198,16 @@ "node_modules/tar": { - "version": "7.5.7", + "version": "7.5.15", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.7.tgz", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.15.tgz", - "integrity": "sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==", + "integrity": "sha512-dzGK0boVlC4W5QFuQN1EFSl3bIDYsk7Tj40U6eIBnK2k/8ml7TZ5agbI5j5+qnoVcAA+rNtBml8SEiLxZpNqRQ==", "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { "@isaacs/fs-minipass": "^4.0.0", @@ -1898,13 +2232,15 @@ "node_modules/thenby": { - "version": "1.3.4", + "version": "1.4.1", - "resolved": "https://registry.npmjs.org/thenby/-/thenby-1.3.4.tgz", + "resolved": "https://registry.npmjs.org/thenby/-/thenby-1.4.1.tgz", - "integrity": "sha512-89Gi5raiWA3QZ4b2ePcEwswC3me9JIg+ToSgtE0JWeCynLnLxNr/f9G+xfo9K+Oj4AFdom8YNJjibIARTJmapQ==", + "integrity": "sha512-D5a/bO0KdalOE3q8MlrRmSxjbKZHT3MQmXkJP+r97Vw8MMwOZKOwUSEyTtK7eSMj2y0kyAjpYMRMZmmLw1FtNQ==", - "dev": true + "dev": true, + + "license": "Apache-2.0" }, @@ -1918,6 +2254,8 @@ "dev": true, + "license": "MIT", + "dependencies": { "is-number": "^7.0.0" @@ -1934,14 +2272,16 @@ "node_modules/universalify": { - "version": "2.0.0", + "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, + "license": "MIT", + "engines": { "node": ">= 10.0.0" @@ -1952,11 +2292,11 @@ "node_modules/update-browserslist-db": { - "version": "1.0.5", + "version": "1.2.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "dev": true, @@ -1976,61 +2316,37 @@ "url": "https://tidelift.com/funding/github/npm/browserslist" - } - - ], - - "dependencies": { - - "escalade": "^3.1.1", - - "picocolors": "^1.0.0" - - }, - - "bin": { - - "browserslist-lint": "cli.js" - - }, - - "peerDependencies": { - - "browserslist": ">= 4.21.0" - - } + }, - }, + { - "node_modules/wrap-ansi": { + "type": "github", - "version": "7.0.0", + "url": "https://github.com/sponsors/ai" - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + } - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + ], - "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - - "string-width": "^4.1.0", + "escalade": "^3.2.0", - "strip-ansi": "^6.0.0" + "picocolors": "^1.1.1" }, - "engines": { + "bin": { - "node": ">=10" + "update-browserslist-db": "cli.js" }, - "funding": { + "peerDependencies": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "browserslist": ">= 4.21.0" } @@ -2046,6 +2362,8 @@ "dev": true, + "license": "ISC", + "engines": { "node": ">=10" @@ -2064,6 +2382,8 @@ "dev": true, + "license": "BlueOak-1.0.0", + "engines": { "node": ">=18" @@ -2074,14 +2394,16 @@ "node_modules/yaml": { - "version": "2.8.2", + "version": "2.9.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", - "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", "dev": true, + "license": "ISC", + "bin": { "yaml": "bin.mjs" @@ -2104,17 +2426,19 @@ "node_modules/yargs": { - "version": "17.5.1", + "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, + "license": "MIT", + "dependencies": { - "cliui": "^7.0.2", + "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -2126,7 +2450,7 @@ "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" + "yargs-parser": "^21.1.1" }, @@ -2140,17 +2464,109 @@ "node_modules/yargs-parser": { - "version": "21.1.1", + "version": "21.1.1", + + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + + "dev": true, + + "license": "ISC", + + "engines": { + + "node": ">=12" + + } + + }, + + "node_modules/yargs/node_modules/ansi-regex": { + + "version": "5.0.1", + + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + + "dev": true, + + "license": "MIT", + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/yargs/node_modules/emoji-regex": { + + "version": "8.0.0", + + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + + "dev": true, + + "license": "MIT" + + }, + + "node_modules/yargs/node_modules/string-width": { + + "version": "4.2.3", + + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + + "dev": true, + + "license": "MIT", + + "dependencies": { + + "emoji-regex": "^8.0.0", + + "is-fullwidth-code-point": "^3.0.0", + + "strip-ansi": "^6.0.1" + + }, + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/yargs/node_modules/strip-ansi": { + + "version": "6.0.1", + + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + + "dev": true, + + "license": "MIT", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "dependencies": { - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "ansi-regex": "^5.0.1" - "dev": true, + }, "engines": { - "node": ">=12" + "node": ">=8" } @@ -2230,55 +2646,37 @@ }, - "adm-zip": { + "@types/trusted-types": { - "version": "0.5.16", + "version": "2.0.7", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.16.tgz", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", - "integrity": "sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", - "dev": true + "optional": true }, - "ansi-regex": { + "adm-zip": { - "version": "5.0.1", + "version": "0.5.17", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.17.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "integrity": "sha512-+Ut8d9LLqwEvHHJl1+PIHqoyDxFgVN847JTVM3Izi3xHDWPE4UtzzXysMZQs64DMcrJfBeS/uoEP4AD3HQHnQQ==", "dev": true }, - "ansi-styles": { - - "version": "4.3.0", - - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - - "dev": true, - - "requires": { - - "color-convert": "^2.0.1" - - } - - }, - "anymatch": { - "version": "3.1.2", + "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, @@ -2294,25 +2692,23 @@ "autoprefixer": { - "version": "10.4.8", + "version": "10.5.0", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.8.tgz", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.0.tgz", - "integrity": "sha512-75Jr6Q/XpTqEf6D2ltS5uMewJIx5irCU1oBYJrWjFenq/m12WRRrz6g15L1EIoYvPLXTbEry7rDOwrcYNj77xw==", + "integrity": "sha512-FMhOoZV4+qR6aTUALKX2rEqGG+oyATvwBt9IIzVR5rMa2HRWPkxf+P+PAJLD1I/H5/II+HuZcBJYEFBpq39ong==", "dev": true, "requires": { - "browserslist": "^4.21.3", - - "caniuse-lite": "^1.0.30001373", + "browserslist": "^4.28.2", - "fraction.js": "^4.2.0", + "caniuse-lite": "^1.0.30001787", - "normalize-range": "^0.1.2", + "fraction.js": "^5.3.4", - "picocolors": "^1.0.0", + "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" @@ -2320,13 +2716,25 @@ }, + "baseline-browser-mapping": { + + "version": "2.10.29", + + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.29.tgz", + + "integrity": "sha512-Asa2krT+XTPZINCS+2QcyS8WTkObE77RwkydwF7h6DmnKqbvlalz93m/dnphUyCa6SWSP51VgtEUf2FN+gelFQ==", + + "dev": true + + }, + "binary-extensions": { - "version": "2.2.0", + "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "dev": true @@ -2352,23 +2760,25 @@ "browserslist": { - "version": "4.21.3", + "version": "4.28.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", - "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001370", + "baseline-browser-mapping": "^2.10.12", + + "caniuse-lite": "^1.0.30001782", - "electron-to-chromium": "^1.4.202", + "electron-to-chromium": "^1.5.328", - "node-releases": "^2.0.6", + "node-releases": "^2.0.36", - "update-browserslist-db": "^1.0.5" + "update-browserslist-db": "^1.2.3" } @@ -2376,11 +2786,11 @@ "caniuse-lite": { - "version": "1.0.30001378", + "version": "1.0.30001792", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001378.tgz", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz", - "integrity": "sha512-JVQnfoO7FK7WvU4ZkBRbPjaot4+YqxogSDosHv0Hv5mWpUESmN+UubMU6L/hGz8QlQ2aY5U0vR6MOs6j/CXpNA==", + "integrity": "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==", "dev": true @@ -2388,11 +2798,11 @@ "chokidar": { - "version": "3.5.3", + "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, @@ -2432,11 +2842,11 @@ "cliui": { - "version": "7.0.4", + "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, @@ -2444,10 +2854,118 @@ "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", + "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" + }, + + "dependencies": { + + "ansi-regex": { + + "version": "5.0.1", + + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + + "dev": true + + }, + + "ansi-styles": { + + "version": "4.3.0", + + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + + "dev": true, + + "requires": { + + "color-convert": "^2.0.1" + + } + + }, + + "emoji-regex": { + + "version": "8.0.0", + + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + + "dev": true + + }, + + "string-width": { + + "version": "4.2.3", + + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + + "dev": true, + + "requires": { + + "emoji-regex": "^8.0.0", + + "is-fullwidth-code-point": "^3.0.0", + + "strip-ansi": "^6.0.1" + + } + + }, + + "strip-ansi": { + + "version": "6.0.1", + + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + + "dev": true, + + "requires": { + + "ansi-regex": "^5.0.1" + + } + + }, + + "wrap-ansi": { + + "version": "7.0.0", + + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + + "dev": true, + + "requires": { + + "ansi-styles": "^4.0.0", + + "string-width": "^4.1.0", + + "strip-ansi": "^6.0.0" + + } + + } + } }, @@ -2512,25 +3030,29 @@ }, - "electron-to-chromium": { + "dompurify": { - "version": "1.4.224", + "version": "3.4.3", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.224.tgz", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.3.tgz", - "integrity": "sha512-dOujC5Yzj0nOVE23iD5HKqrRSDj2SD7RazpZS/b/WX85MtO6/LzKDF4TlYZTBteB+7fvSg5JpWh0sN7fImNF8w==", + "integrity": "sha512-VVwJidIJcp1hpg2OMXML3ZVRPYSZiq4aX7qBh83BSIpOaRDqI+qxhXjjIWnpzkOXhmp0L81lnoME1mnCc9H48A==", - "dev": true + "requires": { + + "@types/trusted-types": "^2.0.7" + + } }, - "emoji-regex": { + "electron-to-chromium": { - "version": "8.0.0", + "version": "1.5.354", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.354.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "integrity": "sha512-JaBHwWcfIdmSAfWM5l3uwjGd431j8YEMikZ+K/2nXVuBqJKyZ0f+2h4n4JY5AyNiZmnY9qQr2RU3v9DxDmHMNg==", "dev": true @@ -2538,11 +3060,11 @@ "escalade": { - "version": "3.1.1", + "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true @@ -2550,11 +3072,11 @@ "fast-glob": { - "version": "3.2.11", + "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, @@ -2568,7 +3090,7 @@ "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" } @@ -2576,11 +3098,11 @@ "fastq": { - "version": "1.13.0", + "version": "1.20.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", "dev": true, @@ -2612,11 +3134,11 @@ "fraction.js": { - "version": "4.2.0", + "version": "5.3.4", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", - "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", "dev": true @@ -2624,11 +3146,11 @@ "fs-extra": { - "version": "10.1.0", + "version": "11.3.5", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.5.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "integrity": "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==", "dev": true, @@ -2646,11 +3168,11 @@ "fsevents": { - "version": "2.3.2", + "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, @@ -2702,11 +3224,11 @@ "globby": { - "version": "13.1.2", + "version": "13.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", - "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", "dev": true, @@ -2714,25 +3236,41 @@ "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", + "fast-glob": "^3.3.0", - "ignore": "^5.2.0", + "ignore": "^5.2.4", "merge2": "^1.4.1", "slash": "^4.0.0" + }, + + "dependencies": { + + "slash": { + + "version": "4.0.0", + + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + + "dev": true + + } + } }, "graceful-fs": { - "version": "4.2.10", + "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true @@ -2760,11 +3298,11 @@ "ignore": { - "version": "5.2.0", + "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true @@ -2854,11 +3392,11 @@ "jsonfile": { - "version": "6.1.0", + "version": "6.2.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", "dev": true, @@ -2874,16 +3412,26 @@ "lilconfig": { - "version": "2.0.6", + "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", "dev": true }, + "marked": { + + "version": "15.0.12", + + "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.12.tgz", + + "integrity": "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==" + + }, + "merge2": { "version": "1.4.1", @@ -2918,11 +3466,11 @@ "minipass": { - "version": "7.1.2", + "version": "7.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", "dev": true @@ -2948,11 +3496,11 @@ "nanoid": { - "version": "3.3.11", + "version": "3.3.12", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", "dev": true @@ -2960,11 +3508,11 @@ "node-releases": { - "version": "2.0.6", + "version": "2.0.44", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.44.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "integrity": "sha512-5WUyunoPMsvvEhS8AxHtRzP+oA8UCkJ7YRxatWKjngndhDGLiqEVAQKWjFAiAiuL8zMRGzGSJxFnLetoa43qGQ==", "dev": true @@ -2982,18 +3530,6 @@ }, - "normalize-range": { - - "version": "0.1.2", - - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", - - "dev": true - - }, - "path-type": { "version": "4.0.0", @@ -3020,11 +3556,11 @@ "picomatch": { - "version": "2.3.1", + "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true @@ -3044,11 +3580,11 @@ "postcss": { - "version": "8.5.6", + "version": "8.5.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.14.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "integrity": "sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==", "dev": true, @@ -3066,11 +3602,11 @@ "postcss-cli": { - "version": "10.0.0", + "version": "10.1.0", - "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-10.0.0.tgz", + "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-10.1.0.tgz", - "integrity": "sha512-Wjy/00wBBEgQqnSToznxLWDnATznokFGXsHtF/3G8glRZpz5KYlfHcBW/VMJmWAeF2x49zjgy4izjM3/Wx1dKA==", + "integrity": "sha512-Zu7PLORkE9YwNdvOeOVKPmWghprOtjFQU3srMUGbdz3pHJiFh7yZ4geiZFMkjMfB0mtTFR3h8RemR62rPkbOPA==", "dev": true, @@ -3080,7 +3616,7 @@ "dependency-graph": "^0.11.0", - "fs-extra": "^10.0.0", + "fs-extra": "^11.0.0", "get-stdin": "^9.0.0", @@ -3096,7 +3632,7 @@ "read-cache": "^1.0.0", - "slash": "^4.0.0", + "slash": "^5.0.0", "yargs": "^17.0.0" @@ -3106,19 +3642,19 @@ "postcss-load-config": { - "version": "4.0.1", + "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", - "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", "dev": true, "requires": { - "lilconfig": "^2.0.5", + "lilconfig": "^3.0.0", - "yaml": "^2.1.1" + "yaml": "^2.3.4" } @@ -3126,11 +3662,11 @@ "postcss-reporter": { - "version": "7.0.5", + "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.0.5.tgz", + "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.1.0.tgz", - "integrity": "sha512-glWg7VZBilooZGOFPhN9msJ3FQs19Hie7l5a/eE6WglzYqVeH3ong3ShFcp9kDWJT1g2Y/wd59cocf9XxBtkWA==", + "integrity": "sha512-/eoEylGWyy6/DOiMP5lmFRdmDKThqgn7D6hP2dXKJI/0rJSO1ADFNngZfDzxL0YAxFvws+Rtpuji1YIHj4mySA==", "dev": true, @@ -3230,11 +3766,11 @@ "reusify": { - "version": "1.0.4", + "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "dev": true @@ -3260,11 +3796,11 @@ "slash": { - "version": "4.0.0", + "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", "dev": true @@ -3282,46 +3818,6 @@ }, - "string-width": { - - "version": "4.2.3", - - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - - "dev": true, - - "requires": { - - "emoji-regex": "^8.0.0", - - "is-fullwidth-code-point": "^3.0.0", - - "strip-ansi": "^6.0.1" - - } - - }, - - "strip-ansi": { - - "version": "6.0.1", - - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - - "dev": true, - - "requires": { - - "ansi-regex": "^5.0.1" - - } - - }, - "tabpanel": { "version": "0.2.0", @@ -3334,11 +3830,11 @@ "tar": { - "version": "7.5.7", + "version": "7.5.15", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.7.tgz", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.15.tgz", - "integrity": "sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==", + "integrity": "sha512-dzGK0boVlC4W5QFuQN1EFSl3bIDYsk7Tj40U6eIBnK2k/8ml7TZ5agbI5j5+qnoVcAA+rNtBml8SEiLxZpNqRQ==", "dev": true, @@ -3360,11 +3856,11 @@ "thenby": { - "version": "1.3.4", + "version": "1.4.1", - "resolved": "https://registry.npmjs.org/thenby/-/thenby-1.3.4.tgz", + "resolved": "https://registry.npmjs.org/thenby/-/thenby-1.4.1.tgz", - "integrity": "sha512-89Gi5raiWA3QZ4b2ePcEwswC3me9JIg+ToSgtE0JWeCynLnLxNr/f9G+xfo9K+Oj4AFdom8YNJjibIARTJmapQ==", + "integrity": "sha512-D5a/bO0KdalOE3q8MlrRmSxjbKZHT3MQmXkJP+r97Vw8MMwOZKOwUSEyTtK7eSMj2y0kyAjpYMRMZmmLw1FtNQ==", "dev": true @@ -3390,11 +3886,11 @@ "universalify": { - "version": "2.0.0", + "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true @@ -3402,41 +3898,19 @@ "update-browserslist-db": { - "version": "1.0.5", - - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", - - "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", - - "dev": true, - - "requires": { - - "escalade": "^3.1.1", - - "picocolors": "^1.0.0" - - } - - }, - - "wrap-ansi": { - - "version": "7.0.0", + "version": "1.2.3", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "dev": true, "requires": { - "ansi-styles": "^4.0.0", - - "string-width": "^4.1.0", + "escalade": "^3.2.0", - "strip-ansi": "^6.0.0" + "picocolors": "^1.1.1" } @@ -3468,11 +3942,11 @@ "yaml": { - "version": "2.8.2", + "version": "2.9.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", - "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", "dev": true @@ -3480,17 +3954,17 @@ "yargs": { - "version": "17.5.1", + "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "requires": { - "cliui": "^7.0.2", + "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -3502,7 +3976,75 @@ "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" + "yargs-parser": "^21.1.1" + + }, + + "dependencies": { + + "ansi-regex": { + + "version": "5.0.1", + + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + + "dev": true + + }, + + "emoji-regex": { + + "version": "8.0.0", + + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + + "dev": true + + }, + + "string-width": { + + "version": "4.2.3", + + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + + "dev": true, + + "requires": { + + "emoji-regex": "^8.0.0", + + "is-fullwidth-code-point": "^3.0.0", + + "strip-ansi": "^6.0.1" + + } + + }, + + "strip-ansi": { + + "version": "6.0.1", + + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + + "dev": true, + + "requires": { + + "ansi-regex": "^5.0.1" + + } + + } } diff --git a/package.json b/package.json index 7acc342b..cd73ea02 100644 --- a/package.json +++ b/package.json @@ -14,8 +14,12 @@ "dependencies": { + "dompurify": "^3.3.1", + "jquery": "^3.7.1", + "marked": "^15.0.12", + "tabpanel": "^0.2.0" } diff --git a/tests/test_hugo_build.py b/tests/test_hugo_build.py index 55c22fee..2a98fd51 100644 --- a/tests/test_hugo_build.py +++ b/tests/test_hugo_build.py @@ -229,6 +229,141 @@ def test_no_sidebar_truncation_warning(self) -> None: ), "Sidebar entries were truncated — bibliography entries may be leaking into navigation" +class TestSearchModeToggle: + """The Standard / AI-assisted search controls must reach the built site. + + Regression test: ``layouts/_partials/search-input.html`` — the Docsy + override that renders the pre-search "Standard [switch] AI" picker below + the search box — was left untracked when the toggle feature was + committed. Its JavaScript (``assets/js/search.js``), styles + (``assets/scss/_styles_project.scss``) and results-page controls + (``layouts/search.html``) were all committed, so local ``hugo server`` + runs showed the picker while every build from a clean checkout fell back + to Docsy's ``search-input`` partial, which has none. The control was + thus missing from CI builds and the deployed site with its handlers and + styles still shipping. These tests assert on rendered markup, because + the JavaScript and CSS are inert without it. + """ + + @pytest.fixture(autouse=True) + def dual_mode(self, production_build): + self.build_result = production_build + + params_file = REPO_ROOT / "config" / "_default" / "params.yaml" + if not params_file.exists(): + pytest.skip("config/_default/params.yaml not found") + with open(params_file) as f: + params = yaml.safe_load(f) or {} + + # Both backends must be configured for either control to render. + if not (params.get("gcs_engine_id") and params.get("vertex_search_url")): + pytest.skip( + "dual search mode not configured — both gcs_engine_id and " + "vertex_search_url are required" + ) + + index = PROD_PUBLIC / "index.html" + search = PROD_PUBLIC / "search" / "index.html" + if not (index.exists() and search.exists()): + pytest.skip("index.html or search/index.html not built") + + self.index_html = index.read_text(encoding="utf-8", errors="ignore") + self.search_html = search.read_text(encoding="utf-8", errors="ignore") + + def test_presearch_picker_rendered(self) -> None: + """The "Standard [switch] AI" picker must render under the search box. + + Its presence proves the local ``search-input.html`` override is part + of the repository; without it Hugo silently falls back to Docsy's + version and the picker disappears. + """ + assert 'class="td-search-mode-switch"' in self.index_html, ( + "Pre-search mode picker missing from index.html — " + "layouts/_partials/search-input.html is not being used" + ) + for selector in ('data-search-mode="standard"', 'data-search-mode="ai"'): + assert selector in self.index_html, ( + f"Picker label {selector} missing from index.html" + ) + assert 'class="form-check-input td-search-mode"' in self.index_html, ( + "Picker switch input missing from index.html" + ) + + def test_picker_script_shipped(self) -> None: + """A bundled script must reference the picker selectors, so the + control is wired to localStorage and the ``?mode=ai`` redirect.""" + js_dir = PROD_PUBLIC / "js" + if not js_dir.is_dir(): + pytest.skip("public/js not built") + wired = any( + "td-search-mode-switch" in path.read_text(encoding="utf-8", errors="ignore") + for path in js_dir.rglob("*.js") + ) + assert wired, ( + "No bundled script references td-search-mode-switch — " + "assets/js/search.js was not built into the site" + ) + + def test_picker_defaults_to_standard(self) -> None: + """Both controls must be server-rendered in the Standard position. + + The user's selection is persisted in localStorage, so the markup is + the *initial* state a first-time visitor gets before any script runs; + assets/js/search.js only moves the pickers off Standard once a + selection has been stored. A pre-checked switch, an active "AI" + label, or a checked AI radio in the rendered markup would hand every + new visitor a non-default mode. + """ + assert ( + 'class="td-search-mode-label is-active" data-search-mode="standard"' + in self.index_html + ), "Standard is not the active picker label on index.html" + assert 'class="td-search-mode-label" data-search-mode="ai"' in self.index_html, ( + "AI picker label is not in its inactive state on index.html" + ) + switches = re.findall(r"]*td-search-mode[^>]*>", self.index_html) + assert switches, "picker switch input not found on index.html" + checked = [s for s in switches if re.search(r"\bchecked\b", s)] + assert not checked, ( + "picker switch renders checked; Standard must be the initial default:\n" + + "\n".join(checked) + ) + + # The results-page radios must agree: Standard selected, AI not. + radios = re.findall(r']*id="search-mode-[^"]*"[^>]*>', self.search_html) + assert len(radios) == 2, ( + f"expected 2 mode radios on search/index.html, found {len(radios)}" + ) + assert not any( + re.search(r'id="search-mode-ai"[^>]*\bchecked\b', r) for r in radios + ), "AI mode radio renders checked; Standard must be the initial default" + + def test_results_page_toggle_rendered(self) -> None: + """The results page must render both mode radios and the container + that assets/js/vertex-search.js binds to before doing anything.""" + for fragment in ( + 'id="search-mode-standard"', + 'id="search-mode-ai"', + 'id="vertex-search-container"', + ): + assert fragment in self.search_html, ( + f"{fragment} missing from search/index.html" + ) + + def test_results_page_toggle_has_one_radiogroup(self) -> None: + """The mode radios must sit in a single ``role="radiogroup"``. + + The toggle was originally wrapped in a radiogroup nested inside a + second one, which exposes the radios to assistive technology as a + group within a group. + """ + groups = self.search_html.count('role="radiogroup"') + assert groups == 1, ( + f"Expected exactly 1 role=\"radiogroup\" on search/index.html, " + f"found {groups} — the mode toggle radiogroups are nested" + ) + + class TestInternalLinks: """All internal href links in the built HTML must resolve to existing pages."""