diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 000000000..404cc25bd --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,91 @@ +name: Docs + +# The docs site lives in modelplaneai/docs-site: the Hugo project, the theme, +# the build, and the Vercel project. This repo owns the prose and tells that +# repo when to render it. Nothing here builds the site, and nothing there +# writes back to this repo. +# +# On a pull request, the site deploys a preview of that revision and aliases it +# to a hostname derived from the pull request number - which is why the link +# can be posted here immediately, from this repo's own token, before that build +# finishes. +# +# On a merge, the site rebuilds every version from the tip of each branch it +# serves. That is what publishes a docs change: nothing pins a content +# revision, so publishing is a rebuild. +# +# The trigger is pull_request_target so that a fork's pull request is previewed +# too. That runs this workflow in the base repository's context, with secrets, +# so it must never execute anything from the pull request - and it doesn't: +# there is no checkout here, and no step reads a file from the branch. Never +# add one. +on: + pull_request_target: + paths: ['docs/**', 'apis/**'] + push: + branches: [main, 'release-*'] + paths: ['docs/**', 'apis/**'] + +permissions: + contents: read + pull-requests: write + +concurrency: + group: docs-${{ github.head_ref || github.ref }} + cancel-in-progress: true + +jobs: + render: + runs-on: ubuntu-24.04 + env: + SITE_REPO: modelplaneai/docs-site + + steps: + # Dispatching to another repository needs a credential this repo's own + # token cannot provide. A GitHub App installed on the site repo alone + # mints one that expires in an hour and belongs to no person, so it does + # not quietly die when someone leaves. Contents: read & write is the + # permission repository_dispatch requires. + - name: Mint a token for the site repo + id: token + uses: actions/create-github-app-token@v2 + with: + app-id: ${{ vars.DOCS_SITE_APP_ID }} + private-key: ${{ secrets.DOCS_SITE_APP_KEY }} + owner: modelplaneai + repositories: docs-site + + # The head sha rather than the merge commit: it is what the reviewer is + # reading. A fork's commits are reachable here through refs/pull//head, + # so the site can fetch that sha from this repo without knowing the fork + # exists. + - name: Request a preview + if: github.event_name == 'pull_request_target' + env: + GH_TOKEN: ${{ steps.token.outputs.token }} + REF: ${{ github.event.pull_request.head.sha }} + PR: ${{ github.event.number }} + run: | + gh api "repos/$SITE_REPO/dispatches" \ + -f event_type=content-preview \ + -f "client_payload[ref]=$REF" \ + -f "client_payload[pr]=$PR" + + # Once per pull request. The hostname follows from the number, so it + # stays correct as the branch is pushed to and rebuilt. + - name: Post the preview link + if: github.event.action == 'opened' || github.event.action == 'reopened' + env: + GH_TOKEN: ${{ github.token }} + PR: ${{ github.event.number }} + run: | + gh pr comment "$PR" --body \ + "Docs preview: https://modelplane-docs-pr-${PR}.vercel.app (ready once the site's Content workflow finishes)" + + - name: Publish + if: github.event_name == 'push' + env: + GH_TOKEN: ${{ steps.token.outputs.token }} + run: | + gh api "repos/$SITE_REPO/dispatches" \ + -f event_type=content-published diff --git a/.github/workflows/docsearch.yml b/.github/workflows/docsearch.yml deleted file mode 100644 index 2013bab27..000000000 --- a/.github/workflows/docsearch.yml +++ /dev/null @@ -1,44 +0,0 @@ -name: DocSearch index - -# Crawls the live docs site (docs.modelplane.ai) with Algolia's open-source -# DocSearch scraper and pushes the records into the `modelplane` index that the -# docs search box queries. Modelplane owns this Algolia app (it is not shared -# with Crossplane), so the only secret needed is the admin (write) API key. -# -# Runs on a daily schedule to pick up deployed content changes, and on demand -# (run it right after a docs deploy for an immediate refresh). The crawler reads -# the production site over HTTP, so it does not depend on the build here. -on: - workflow_dispatch: {} - schedule: - - cron: "0 7 * * *" - -permissions: - contents: read - -concurrency: - group: docsearch - cancel-in-progress: true - -jobs: - crawl: - runs-on: ubuntu-24.04 - # Secrets aren't available in if expressions (and the env context isn't - # available in job-level ones), so mirror the secret into the job env and - # gate the steps on it. Forks don't have the secret, so their scheduled - # runs skip the crawl instead of failing. - env: - ALGOLIA_ADMIN_KEY: ${{ secrets.ALGOLIA_ADMIN_KEY }} - steps: - - name: Checkout - if: env.ALGOLIA_ADMIN_KEY != '' - uses: actions/checkout@v4 - - - name: Crawl docs.modelplane.ai into Algolia - if: env.ALGOLIA_ADMIN_KEY != '' - run: | - docker run --rm \ - -e APPLICATION_ID=CQDMTRM1TJ \ - -e API_KEY="$ALGOLIA_ADMIN_KEY" \ - -e "CONFIG=$(jq -r tostring docs/utils/docsearch/config.json)" \ - algolia/docsearch-scraper diff --git a/.gitignore b/.gitignore index 664c18d61..79b3e08e0 100644 --- a/.gitignore +++ b/.gitignore @@ -6,18 +6,6 @@ result .direnv __pycache__/ -# Docs Resources # -###################### -docs/resources/* -docs/resources/_gen/assets/* -docs/public/* -docs/hugo -docs/hugo-* -docs/.hugo_build.lock -docs/hugo_stats.json -docs/node_modules -docs/utils/webpack/node_modules - # Local superpowers planning artifacts (specs/plans/notes) — not repo content docs/superpowers/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 84bc06535..0c27ee61e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -395,31 +395,27 @@ moves both. ## Working on the docs site -The documentation site under `docs/` is a [Hugo](https://gohugo.io/) project. -`nix flake check` builds it as one of its checks, so a broken site fails CI. +Docs prose lives here under `docs/content/`, with the example manifests it +embeds under `docs/manifests/` and the API reference's grouping in `docs/data/`. +The site that renders it — the [Hugo](https://gohugo.io/) project, its layouts, +theme, and asset pipelines — is the +[docs-site](https://github.com/modelplaneai/docs-site) repo. Edit prose here; +edit the site there. -Run the commands below from the repository root, not from `docs/`. They're flake -apps (`nix run .#...`), so they resolve against the flake at the root regardless -of which file you're editing. - -Preview it locally with live reload: +Preview what you are editing, with live reload, from the root of this repo: ```bash -nix run .#docs-serve # http://localhost:1313 +nix run github:modelplaneai/docs-site#preview # http://localhost:1313 ``` -`nix build .#docs` produces the production site in `result/`. The production -build compiles the theme's SCSS and runs it through PostCSS to strip unused -CSS, sort media queries, and minify. Those Node dependencies are pinned in -`docs/package-lock.json` and built reproducibly; the local preview skips them. +The site serves this working tree, so the pages you see are the files under +your cursor: no branch to push, no pin to move, and nothing about Hugo checked +in here. The version switcher lists every version and those links 404 locally, +since only this one is being served. -The site's JavaScript bundle is built by webpack and committed to git under the -theme's assets. Rebuild it after changing anything under -`docs/utils/webpack/src/` and commit the result: - -```bash -nix run .#docs-generate -``` +Versions are this repo's `release-X.Y` branches: whatever is on `release-0.2` is +what the 0.2 docs say. The site repo builds each of them, decides which release +is latest, and deploys; see [RELEASING.md](RELEASING.md). ### Manifest shortcodes @@ -474,14 +470,19 @@ validator is `docs/utils/validate/validate_manifests.py`. ### Linting and link checking -Docs prose is linted with [Vale](https://vale.sh) and internal links are checked -with [htmltest](https://github.com/wjdp/htmltest). Both run as flake checks, so -run them with the rest of CI: +Docs prose is linted with [Vale](https://vale.sh), which runs as a flake check, +so run it with the rest of CI: ```bash nix flake check ``` +Internal links are checked with [htmltest](https://github.com/wjdp/htmltest) +against the built site, which means it runs in the site repo, not here. Nothing +there pins a revision of this repo, so a content change that breaks a link +fails on the next build there: the preview of your pull request, or the +rebuild your merge triggers. + Custom Modelplane rules live in `docs/utils/vale/styles/Modelplane/`. Vale flags brand names, acronyms, API types, and technical terms it doesn't @@ -495,13 +496,25 @@ CI runs them on every pull request via the same check (see ### Deployment -The site deploys to [Vercel](https://vercel.com/). Vercel builds it with the -same `nix build .#docs` derivation that `nix flake check` verifies, so what -ships matches what CI checks. `vercel.json` points the build at -[`docs/vercel-build.sh`](docs/vercel-build.sh), which installs Nix into -Vercel's build image, runs the build, and writes the static site to `public/`. -Vercel's GitHub app drives deploys as usual: preview URLs on pull requests -(including from forks) and production on merge to `main`. +The site repo holds the only Vercel project. +[`.github/workflows/docs.yml`](.github/workflows/docs.yml) here asks it to +render, and never renders anything itself: + +| Here | There | +|---|---| +| a pull request touching `docs/` or `apis/` | deploys that revision as a preview | +| a merge to `main` or a `release-*` branch | rebuilds every version into production | + +A merge is what publishes: nothing there pins a content revision, so +publishing is a rebuild that reads the tip of every branch. + +The preview link is posted on the pull request as soon as it opens, because the +hostname follows from the pull request number rather than from the deployment — +so the site repo needs no write access here. It answers once that repo's +`Content` workflow finishes, a minute or so later. + +A pull request from a fork gets neither secrets nor a write token, so it gets +no preview; use the local command above. ## Releasing diff --git a/RELEASING.md b/RELEASING.md index bcf40506b..a543a9eaa 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -22,77 +22,17 @@ release from it and run the workflow against the new tag. ## Versioning the docs -Docs are versioned at the minor level, each version on its own subdomain. Two -Vercel projects serve them, and each domain serves its build's content directly — -nothing redirects: - -- **dev project** (`main` branch) — serves `main.docs.modelplane.ai`, the - unreleased docs, so work in progress stays browsable. -- **release project** (latest `release-X.Y` branch) — serves both - `docs.modelplane.ai` (the canonical apex, always the latest release) and that - release's permanent `vX-Y.docs.modelplane.ai` subdomain. - -Older releases keep their own project on their `vX-Y.docs.modelplane.ai` -subdomain. There is no apex redirect: `docs.modelplane.ai` *is* the latest -release's build, so a reader on the bare domain gets the latest docs with the URL -unchanged. What a build serves is decided entirely by its Vercel project and -baseURL, never by the home page (`docs/themes/geekboot/layouts/index.html`). - -Each project's baseURL: -- dev project → `HUGO_BASEURL = https://main.docs.modelplane.ai/` (scoped to `main`). -- release project → `docs.modelplane.ai` (leave `HUGO_BASEURL` unset in - production so the build uses the baked `https://docs.modelplane.ai/` from - `nix/docs.nix`). The `vX-Y` subdomain aliases the same build. -- PR previews → root-relative `HUGO_BASEURL = /`, so assets resolve against the - preview host. -- local (`hugo server`) → `localhost` from hugo.toml's `baseURL = "/"`. - -`docs/data/versions.yaml` is the single list of every version and its URL. It -drives the version dropdown and must be identical on every branch — `main` and all -release branches — so each build offers the same switcher. - -One-time DNS setup (already done): a wildcard CNAME `*.docs.modelplane.ai → -cname.vercel-dns.com` covers `main.docs` and every release subdomain. No new DNS -record is needed per release. - -To publish docs for a new minor release (e.g. `v0.1.0`): - -1. On `release-0.1`, set `version = "0.1"` in `docs/hugo.toml`. - -2. Add the release to `docs/data/versions.yaml`, newest first, on both `main` and - `release-0.1` (keep the file identical across branches): - ```yaml - versions: - - version: "main" - url: "https://main.docs.modelplane.ai" - - version: "0.1" - url: "https://v0-1.docs.modelplane.ai" - ``` - On `main`, also set `latest = "0.1"` in `docs/hugo.toml` so the version - dropdown and the "not the latest release" banners point at the new release. - -3. In the Vercel dashboard, create the release project for `release-0.1` (or - reuse the existing one) and, under Settings → Domains, assign it both - `docs.modelplane.ai` (the apex) and `v0-1.docs.modelplane.ai`. Leave - `HUGO_BASEURL` unset in Production so the build bakes `https://docs.modelplane.ai/`. - Trigger a redeployment and confirm both domains serve. - -4. Merge the changes. The apex now serves the new release directly, and the - version dropdown on every build links to it. - -The dev project's `main.docs.modelplane.ai` domain and its -`HUGO_BASEURL = https://main.docs.modelplane.ai/` env var (scoped to `main`) are a -one-time setup, done when the first release ships. - -To fix a typo or update content in an archived version, push to the release branch. -The versioned deployment rebuilds automatically. - -When a new minor ships (e.g. `v0.2.0`): - -1. Repeat steps 1–4 for `release-0.2`, adding the `v0.2` entry above `v0.1` in - `versions.yaml` on every branch and bumping `latest` to `0.2` on `main`. -2. Move `docs.modelplane.ai` to the `release-0.2` project so the apex tracks the - new latest. -3. On the old `release-0.1` project, set `HUGO_BASEURL = https://v0-1.docs.modelplane.ai/` - so it stays self-canonical at its permanent subdomain now that it no longer - owns the apex. +Docs are versioned at the minor level, and the versions are this repo's own +`release-X.Y` branches: whatever is on `release-0.2` is what the 0.2 docs say. +Cutting that branch in step 1 above is this repo's whole part in publishing a +version. + +The rest happens in the docs site repo, +[docs-site](https://github.com/modelplaneai/docs-site). It builds every version +from its own `main` into one deployment — the latest release at the root, older +releases under `/vX.Y/`, and this repo's `main` under `/main/` — and it is the +one place that decides which release is latest. Publishing a new version is one +entry added to its version list; see that repo's README. + +To fix a typo in a released version, push the fix to that `release-X.Y` branch +here. diff --git a/docs/api/mcp.js b/docs/api/mcp.js deleted file mode 100644 index 9c7e949b9..000000000 --- a/docs/api/mcp.js +++ /dev/null @@ -1,411 +0,0 @@ -// Modelplane docs MCP server. -// -// A zero-dependency Model Context Protocol server that lets AI assistants -// search and read the Modelplane documentation. It implements the Streamable -// HTTP transport (JSON-RPC 2.0 over POST) by hand so it ships as a single -// Vercel function with no npm install: the docs site builds in a sandboxed Nix -// derivation with `installCommand: true`, which skips dependency installation. -// -// The corpus is the llms.json the Hugo build publishes. We fetch it once per -// cold start, chunk every page by heading, and rank chunks with BM25. The -// search is lexical, not semantic: the corpus is small and the calling model -// does the semantic reasoning over the candidates we return. See -// content/ai-tools.md for the user-facing connection guide. - -const CORPUS_URL = - process.env.DOCS_LLMS_JSON_URL || "https://docs.modelplane.ai/llms.json"; -const PROTOCOL_VERSION = "2025-06-18"; -const SERVER_INFO = { name: "modelplane-docs", version: "0.1.0" }; - -// ── Corpus loading and indexing ────────────────────────────────────────────── - -let indexPromise = null; - -// Cache the built index for the lifetime of the warm function instance. -function loadIndex() { - if (!indexPromise) { - indexPromise = buildIndex().catch((err) => { - // Don't cache a failed load: let the next request retry. - indexPromise = null; - throw err; - }); - } - return indexPromise; -} - -async function buildIndex() { - const res = await fetch(CORPUS_URL, { headers: { accept: "application/json" } }); - if (!res.ok) { - throw new Error(`Failed to fetch corpus ${CORPUS_URL}: ${res.status}`); - } - const corpus = await res.json(); - const pages = Array.isArray(corpus.pages) ? corpus.pages : []; - - const chunks = []; - for (const page of pages) { - for (const chunk of chunkPage(page)) { - chunks.push(chunk); - } - } - - // BM25 statistics. - const df = new Map(); // term -> number of chunks containing it - let totalLen = 0; - for (const chunk of chunks) { - chunk.tokens = tokenize(chunk.text); - chunk.len = chunk.tokens.length; - totalLen += chunk.len; - chunk.tf = termFreqs(chunk.tokens); - for (const term of chunk.tf.keys()) { - df.set(term, (df.get(term) || 0) + 1); - } - } - const avgLen = chunks.length ? totalLen / chunks.length : 0; - - return { pages, chunks, df, avgLen }; -} - -// Strip HTML comments (e.g. Vale `` directives) that are -// tooling noise, not documentation. -function stripComments(text) { - return String(text).replace(//g, ""); -} - -// Split a page into chunks at Markdown headings so search ranks at section -// granularity. The page intro (text before the first heading) is its own chunk. -function chunkPage(page) { - const content = stripComments(page.content || ""); - const lines = content.split("\n"); - const chunks = []; - let heading = page.title || ""; - let buf = []; - - const flush = () => { - const text = buf.join("\n").trim(); - if (text || chunks.length === 0) { - const anchor = chunks.length === 0 ? "" : "#" + slugify(heading); - chunks.push({ - pageTitle: page.title || "", - heading, - url: (page.url || "") + anchor, - description: page.description || "", - text: (heading ? heading + "\n" : "") + text, - }); - } - buf = []; - }; - - for (const line of lines) { - const m = /^(#{1,6})\s+(.*)$/.exec(line); - if (m) { - flush(); - heading = m[2].trim(); - } else { - buf.push(line); - } - } - flush(); - return chunks.filter((c) => c.text.trim().length > 0); -} - -const STOPWORDS = new Set( - ("a an and are as at be by for from has have in into is it its of on or that the to " + - "with you your this these those").split(" ") -); - -function tokenize(text) { - const out = []; - for (const raw of String(text).toLowerCase().split(/[^a-z0-9]+/)) { - if (!raw || raw.length < 2 || STOPWORDS.has(raw)) continue; - out.push(stem(raw)); - } - return out; -} - -// Deliberately light stemming: fold common English suffixes so "deployments", -// "deploying", and "deployed" rank together without a full stemmer dependency. -function stem(t) { - if (t.length > 4) { - if (t.endsWith("ing")) return t.slice(0, -3); - if (t.endsWith("ed")) return t.slice(0, -2); - if (t.endsWith("ies")) return t.slice(0, -3) + "y"; - if (t.endsWith("es")) return t.slice(0, -2); - if (t.endsWith("s")) return t.slice(0, -1); - } - return t; -} - -function termFreqs(tokens) { - const tf = new Map(); - for (const t of tokens) tf.set(t, (tf.get(t) || 0) + 1); - return tf; -} - -function slugify(s) { - return String(s) - .toLowerCase() - .replace(/[^a-z0-9]+/g, "-") - .replace(/^-+|-+$/g, ""); -} - -// ── Search ─────────────────────────────────────────────────────────────────── - -function search(index, query, limit) { - const { chunks, df, avgLen } = index; - const k1 = 1.5; - const b = 0.75; - const N = chunks.length; - const qTerms = [...new Set(tokenize(query))]; - if (qTerms.length === 0) return []; - - const scored = []; - for (const chunk of chunks) { - let score = 0; - for (const term of qTerms) { - const tf = chunk.tf.get(term); - if (!tf) continue; - const n = df.get(term) || 0; - const idf = Math.log(1 + (N - n + 0.5) / (n + 0.5)); - const denom = tf + k1 * (1 - b + (b * chunk.len) / (avgLen || 1)); - score += idf * ((tf * (k1 + 1)) / denom); - } - if (score > 0) scored.push({ chunk, score }); - } - - scored.sort((a, b) => b.score - a.score); - return scored.slice(0, limit).map(({ chunk, score }) => ({ - title: chunk.pageTitle, - heading: chunk.heading, - url: chunk.url, - score: Number(score.toFixed(3)), - snippet: snippet(chunk.text), - })); -} - -function snippet(text, max = 360) { - const clean = text.replace(/\s+/g, " ").trim(); - return clean.length > max ? clean.slice(0, max).trimEnd() + "..." : clean; -} - -// ── Tools ──────────────────────────────────────────────────────────────────-- - -const TOOLS = [ - { - name: "search_modelplane_docs", - description: - "Search the Modelplane documentation and return the most relevant sections " + - "with their titles, canonical URLs, and snippets. Modelplane is the open " + - "source control plane for AI model serving across a fleet of GPU clusters. " + - "Use this to ground answers about Modelplane's CRDs (ModelDeployment, " + - "InferenceCluster, InferenceClass, ModelService, and others), scheduling, " + - "and setup in the current docs.", - inputSchema: { - type: "object", - properties: { - query: { type: "string", description: "Search query." }, - limit: { - type: "integer", - description: "Maximum number of results (default 5, max 20).", - default: 5, - }, - }, - required: ["query"], - }, - }, - { - name: "get_modelplane_doc", - description: - "Return the full Markdown of a single Modelplane documentation page by its " + - "URL or path (for example /models/model-deployment/), as returned by " + - "search_modelplane_docs.", - inputSchema: { - type: "object", - properties: { - path: { - type: "string", - description: "Page URL or path, e.g. /models/model-deployment/.", - }, - }, - required: ["path"], - }, - }, -]; - -function normalizePath(p) { - let s = String(p || "").trim(); - s = s.replace(/^https?:\/\/[^/]+/, ""); // strip origin if a full URL - s = s.replace(/#.*$/, ""); // strip anchor - s = s.replace(/index\.md$/, "").replace(/\.md$/, ""); - if (!s.startsWith("/")) s = "/" + s; - if (!s.endsWith("/")) s += "/"; - return s; -} - -async function callTool(name, args) { - const index = await loadIndex(); - - if (name === "search_modelplane_docs") { - const query = String((args && args.query) || "").trim(); - if (!query) return toolError("query is required"); - let limit = Number((args && args.limit) || 5); - if (!Number.isFinite(limit) || limit < 1) limit = 5; - limit = Math.min(limit, 20); - - const results = search(index, query, limit); - if (results.length === 0) { - return toolText(`No results for "${query}".`); - } - const body = results - .map( - (r, i) => - `${i + 1}. ${r.title}${r.heading && r.heading !== r.title ? " — " + r.heading : ""}\n` + - ` ${r.url}\n ${r.snippet}` - ) - .join("\n\n"); - return toolText(`Top ${results.length} results for "${query}":\n\n${body}`); - } - - if (name === "get_modelplane_doc") { - const want = normalizePath(args && args.path); - const page = index.pages.find((p) => normalizePath(p.url || p.path) === want); - if (!page) { - return toolError( - `No page found for "${(args && args.path) || ""}". Use search_modelplane_docs to find a path.` - ); - } - const header = `# ${page.title}\n${page.url}\n\n`; - return toolText(header + stripComments(page.content || "").trim()); - } - - return toolError(`Unknown tool: ${name}`); -} - -function toolText(text) { - return { content: [{ type: "text", text }] }; -} - -function toolError(text) { - return { content: [{ type: "text", text }], isError: true }; -} - -// ── JSON-RPC dispatch ───────────────────────────────────────────────────────── - -const JSONRPC_VERSION = "2.0"; - -async function handleMessage(msg) { - // Notifications have no id and expect no response. - const isNotification = msg.id === undefined || msg.id === null; - const respond = (result) => ({ jsonrpc: JSONRPC_VERSION, id: msg.id, result }); - const fail = (code, message) => ({ - jsonrpc: JSONRPC_VERSION, - id: msg.id ?? null, - error: { code, message }, - }); - - try { - switch (msg.method) { - case "initialize": - return respond({ - protocolVersion: - (msg.params && msg.params.protocolVersion) || PROTOCOL_VERSION, - capabilities: { tools: { listChanged: false } }, - serverInfo: SERVER_INFO, - }); - case "notifications/initialized": - case "notifications/cancelled": - return null; // no response for notifications - case "ping": - return respond({}); - case "tools/list": - return respond({ tools: TOOLS }); - case "tools/call": { - const params = msg.params || {}; - const result = await callTool(params.name, params.arguments || {}); - return respond(result); - } - default: - if (isNotification) return null; - return fail(-32601, `Method not found: ${msg.method}`); - } - } catch (err) { - if (isNotification) return null; - return fail(-32603, `Internal error: ${err && err.message ? err.message : err}`); - } -} - -// ── HTTP transport ──────────────────────────────────────────────────────────── - -function setCors(res) { - res.setHeader("Access-Control-Allow-Origin", "*"); - res.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS"); - res.setHeader( - "Access-Control-Allow-Headers", - "Content-Type, Mcp-Session-Id, MCP-Protocol-Version, Authorization" - ); -} - -async function readBody(req) { - if (req.body !== undefined && req.body !== null && req.body !== "") { - return typeof req.body === "string" ? JSON.parse(req.body) : req.body; - } - const chunks = []; - for await (const chunk of req) chunks.push(chunk); - const raw = Buffer.concat(chunks).toString("utf8"); - return raw ? JSON.parse(raw) : null; -} - -module.exports = async function handler(req, res) { - setCors(res); - - if (req.method === "OPTIONS") { - res.statusCode = 204; - return res.end(); - } - - // No server-initiated streams: this server is stateless and request/response. - if (req.method === "GET") { - res.statusCode = 405; - res.setHeader("Allow", "POST, OPTIONS"); - return res.end("Method Not Allowed"); - } - - if (req.method !== "POST") { - res.statusCode = 405; - res.setHeader("Allow", "POST, OPTIONS"); - return res.end("Method Not Allowed"); - } - - let payload; - try { - payload = await readBody(req); - } catch (err) { - res.statusCode = 400; - res.setHeader("Content-Type", "application/json"); - return res.end( - JSON.stringify({ - jsonrpc: JSONRPC_VERSION, - id: null, - error: { code: -32700, message: "Parse error" }, - }) - ); - } - - const messages = Array.isArray(payload) ? payload : [payload]; - const responses = []; - for (const msg of messages) { - if (!msg || typeof msg !== "object") continue; - const r = await handleMessage(msg); - if (r !== null) responses.push(r); - } - - // All inputs were notifications: acknowledge with 202 and no body. - if (responses.length === 0) { - res.statusCode = 202; - return res.end(); - } - - res.statusCode = 200; - res.setHeader("Content-Type", "application/json"); - const out = Array.isArray(payload) ? responses : responses[0]; - res.end(JSON.stringify(out)); -}; diff --git a/docs/archetypes/default.md b/docs/archetypes/default.md deleted file mode 100644 index 25b67521d..000000000 --- a/docs/archetypes/default.md +++ /dev/null @@ -1,5 +0,0 @@ -+++ -date = '{{ .Date }}' -draft = true -title = '{{ replace .File.ContentBaseName "-" " " | title }}' -+++ diff --git a/docs/content/reference/_content.gotmpl b/docs/content/reference/_content.gotmpl index 41981eb8d..46981c540 100644 --- a/docs/content/reference/_content.gotmpl +++ b/docs/content/reference/_content.gotmpl @@ -1,8 +1,8 @@ {{/* Generates one reference page per CRD from the definition.yaml files mounted at - site.Data.apis.crds..definition. Each CRD's group is read from its own + hugo.Data.apis.crds..definition. Each CRD's group is read from its own spec.names.categories: the category matching a group id in - site.Data.apigroups (docs/data/apigroups.yaml) picks the section, which only + hugo.Data.apigroups (docs/data/apigroups.yaml) picks the section, which only supplies titles, descriptions, and section order. A CRD whose categories match no group still gets a page, sorted last under "Other". @@ -12,7 +12,7 @@ pages within a group list alphabetically. */}} {{ $seen := 0 }} -{{ range $plural, $dir := site.Data.apis.crds }} +{{ range $plural, $dir := hugo.Data.apis.crds }} {{ $crd := $dir.definition }} {{ if $crd }} {{ $kind := $crd.spec.names.kind }} @@ -36,7 +36,7 @@ {{ $groupTitle := "Other" }} {{ $weight := add 9900 $seen }} {{ $categories := $crd.spec.names.categories | default slice }} - {{ range $gi, $group := site.Data.apigroups.groups }} + {{ range $gi, $group := hugo.Data.apigroups.groups }} {{ if in $categories $group.id }} {{ $groupId = $group.id }} {{ $groupTitle = $group.title }} diff --git a/docs/data/versions.yaml b/docs/data/versions.yaml deleted file mode 100644 index 0f51f9b86..000000000 --- a/docs/data/versions.yaml +++ /dev/null @@ -1,16 +0,0 @@ -# Doc versions for the version dropdown, newest first. main is the dev build, -# browsable at its own subdomain; the canonical apex (docs.modelplane.ai) -# redirects to the latest release (params.latest in hugo.toml). See -# RELEASING.md § Versioning the docs. -# -# version: X.Y minor version string (e.g. "0.1"), or "main" for the dev build -# url: absolute base URL for that version's content -versions: - - version: "main" - url: "https://main.docs.modelplane.ai" - - version: "0.2" - url: "https://v0-2.docs.modelplane.ai" - - version: "0.3" - url: "https://v0-3.docs.modelplane.ai" - - version: "0.4" - url: "https://v0-4.docs.modelplane.ai" \ No newline at end of file diff --git a/docs/hugo.toml b/docs/hugo.toml deleted file mode 100644 index 398156c3a..000000000 --- a/docs/hugo.toml +++ /dev/null @@ -1,133 +0,0 @@ -baseURL = "/" -locale = "en-us" -title = "Modelplane Docs" -theme = "geekboot" -enableRobotsTXT = true -enableGitInfo = true - -# Term pages power the recipe catalog facets; taxonomy (index-of-terms) pages -# stay disabled — the catalog page on /recipes/ fills that role. -disableKinds = ["taxonomy"] -# Keep term titles exactly as written in front matter ("vLLM", not "VLLM"). -capitalizeListTitles = false -ignoreFiles = ["themes/geekboot/content/.*", "README.md"] - -# Only vendors and clouds are taxonomies — their term pages are the browse -# targets on /recipes/. GPU, engine, and technique facets are plain front -# matter rendered inline; they get no term pages until something links there. -[taxonomies] - vendor = "vendors" - cloud = "clouds" - -# Nest term pages under the Recipes section so facet URLs read as part of the -# catalog: /recipes/cloud/nebius/ lists every recipe that runs on Nebius. -[permalinks] - [permalinks.term] - vendors = "/recipes/vendor/:slug/" - clouds = "/recipes/cloud/:slug/" - -[outputs] - home = ["html", "llms", "llmsfull", "llmsjson"] - section = ["html", "rss", "markdown"] - page = ["html", "markdown"] - term = ["html"] - -# Machine-readable variants for AI agents and LLM tools. The markdown format -# emits a raw-Markdown sibling of every page (page/index.md); the home page also -# emits llms.txt (an index), llms-full.txt (every page concatenated), and -# llms.json (the corpus the docs MCP server searches). See content/ai-tools.md. -[outputFormats] - [outputFormats.markdown] - mediaType = "text/markdown" - isPlainText = true - isHTML = false - permalinkable = true - [outputFormats.llms] - mediaType = "text/plain" - baseName = "llms" - isPlainText = true - [outputFormats.llmsfull] - mediaType = "text/plain" - baseName = "llms-full" - isPlainText = true - [outputFormats.llmsjson] - mediaType = "application/json" - baseName = "llms" - isPlainText = true - - -[build] - # Emit hugo_stats.json listing the tags, classes, and IDs the site uses. - # PurgeCSS reads it to strip unused CSS rules. See postcss.config.js. - [build.buildStats] - enable = true - -[markup] - [markup.goldmark.renderer] - unsafe = true - [markup.tableOfContents] - startLevel = 1 - endLevel = 9 - [markup.highlight] - codeFences = true - noClasses = false - linenos = false - anchorLineNos = false - lineNumbersInTable = false - -[module] - [[module.mounts]] - source = "content" - target = "content" - [[module.mounts]] - source = "assets" - target = "assets" - [[module.mounts]] - source = "content" - target = "assets/content" - files = ["**/**.png", "**/**.jpg", "**/**.jpeg", "**/**.gif"] - # Defining any data mount below suppresses Hugo's default data mount, so mount - # the local data dir explicitly (holds apigroups.yaml, which groups the API - # reference). Accessible as hugo.Data.apigroups. - [[module.mounts]] - source = "data" - target = "data" - # Mount the APIs directory as Hugo data so the reference partials can read - # definition.yaml files without a separate generation step. - # Accessible as hugo.Data.apis.crds..definition - [[module.mounts]] - source = "../apis" - target = "data/apis/crds" - # Also mount it as assets so the Markdown output can emit the raw definition.yaml - # verbatim (comments preserved) via resources.Get "apis//definition.yaml". - [[module.mounts]] - source = "../apis" - target = "assets/apis" - # Mount the manifests directory as assets so the manifests shortcode can read - # raw YAML (preserving comments) via resources.Get "examples/.yaml". The - # files live under docs/manifests/
/, one subtree per docs section. - [[module.mounts]] - source = "manifests" - target = "assets/examples" - -[security] - [security.funcs] - getenv = ["^CONTEXT", "^REVIEW_ID", "^VERCEL_ENV"] - [security.node.permissions] - # Hugo runs Node tools under Node's permission model, which blocks - # native addons unless the tool is listed here. The PostCSS pipeline - # needs it: LightningCSS is a native addon. "tailwindcss" is Hugo's - # default; keep it when overriding the list. - allowAddons = ["postcss", "tailwindcss"] - -[params] - docs = true - description = "Modelplane documentation." - # "main" on the dev branch; "X.Y" (e.g. "0.1") on release branches. - version = "main" - # Latest stable release. Drives the version dropdown and the "not the latest - # release" banners; the apex (docs.modelplane.ai) is this release's own build. - latest = "0.4" - [params.anchors] - min = 2 - max = 5 diff --git a/docs/layouts/robots.txt b/docs/layouts/robots.txt deleted file mode 100644 index 234cdb89a..000000000 --- a/docs/layouts/robots.txt +++ /dev/null @@ -1,2 +0,0 @@ -# Algolia-Crawler-Verif: F69C38A910C2B294 -User-agent: * diff --git a/docs/package-lock.json b/docs/package-lock.json deleted file mode 100644 index 45060be55..000000000 --- a/docs/package-lock.json +++ /dev/null @@ -1,1310 +0,0 @@ -{ - "name": "docs", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "dependencies": { - "@fullhuman/postcss-purgecss": "^8.0.0", - "postcss": "^8.5.26", - "postcss-cli": "^11.0.1", - "postcss-lightningcss": "^1.1.0", - "postcss-sort-media-queries": "^6.6.2" - } - }, - "node_modules/@fullhuman/postcss-purgecss": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@fullhuman/postcss-purgecss/-/postcss-purgecss-8.0.0.tgz", - "integrity": "sha512-fSRaBGf6+DYdfQMxedWfnIW8FSYE1LBpgy16jpK1L2vNb1HgeBRRZ+UX4UokNmW7YEAwPdvwkKdYtlkYpH+Aqg==", - "license": "MIT", - "dependencies": { - "purgecss": "^8.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "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==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/baseline-browser-mapping": { - "version": "2.10.35", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.35.tgz", - "integrity": "sha512-honAfLBde0HAFLdNyBEfuuENkF6zR+ozxqxa/2zJKHBe1qzLqyTSeRKpdPEHAP03rlDGyQOPnCSxnVpVqQo9Mg==", - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.cjs" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.28.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", - "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "baseline-browser-mapping": "^2.10.12", - "caniuse-lite": "^1.0.30001782", - "electron-to-chromium": "^1.5.328", - "node-releases": "^2.0.36", - "update-browserslist-db": "^1.2.3" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001797", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001797.tgz", - "integrity": "sha512-l8xKG+gwAIExZGl9FrF7KUwuOmk6wbEPC9Xoy/RtnWv1XG0Q4LFlagaLpUv3Kiza3W/wm27zy0yWJEieYKAP6w==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, - "node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/dependency-graph": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-1.0.0.tgz", - "integrity": "sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.5.371", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.371.tgz", - "integrity": "sha512-e9htk9mAYL6AzmkEhSvVVw7IWGSBJ/Bqdn2eRyRLrj1g6sncN4WbFt5qnILYoCktktr45pyjIrOiRvBThQ808w==", - "license": "ISC" - }, - "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==", - "license": "MIT" - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fastq": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", - "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fs-extra": { - "version": "11.3.5", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.5.tgz", - "integrity": "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC" - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/jsonfile": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", - "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/lightningcss": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", - "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", - "license": "MPL-2.0", - "dependencies": { - "detect-libc": "^2.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-android-arm64": "1.32.0", - "lightningcss-darwin-arm64": "1.32.0", - "lightningcss-darwin-x64": "1.32.0", - "lightningcss-freebsd-x64": "1.32.0", - "lightningcss-linux-arm-gnueabihf": "1.32.0", - "lightningcss-linux-arm64-gnu": "1.32.0", - "lightningcss-linux-arm64-musl": "1.32.0", - "lightningcss-linux-x64-gnu": "1.32.0", - "lightningcss-linux-x64-musl": "1.32.0", - "lightningcss-win32-arm64-msvc": "1.32.0", - "lightningcss-win32-x64-msvc": "1.32.0" - } - }, - "node_modules/lightningcss-android-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", - "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", - "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", - "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", - "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", - "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", - "cpu": [ - "arm" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", - "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", - "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", - "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", - "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", - "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", - "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/nanoid": { - "version": "3.3.18", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", - "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/node-releases": { - "version": "2.0.47", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.47.tgz", - "integrity": "sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss": { - "version": "8.5.26", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", - "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.17", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-cli": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-11.0.1.tgz", - "integrity": "sha512-0UnkNPSayHKRe/tc2YGW6XnSqqOA9eqpiRMgRlV1S6HdGi16vwJBx7lviARzbV1HpQHqLLRH3o8vTcB0cLc+5g==", - "license": "MIT", - "dependencies": { - "chokidar": "^3.3.0", - "dependency-graph": "^1.0.0", - "fs-extra": "^11.0.0", - "picocolors": "^1.0.0", - "postcss-load-config": "^5.0.0", - "postcss-reporter": "^7.0.0", - "pretty-hrtime": "^1.0.3", - "read-cache": "^1.0.0", - "slash": "^5.0.0", - "tinyglobby": "^0.2.12", - "yargs": "^17.0.0" - }, - "bin": { - "postcss": "index.js" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-lightningcss": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-lightningcss/-/postcss-lightningcss-1.1.0.tgz", - "integrity": "sha512-DlxT3lLE4PK5v2JN0WV0r7wod8LGAuj20ZjJ9cnEwOWv9osgoajRqavaFoxinyZ8jeg4JYJi9M1qtkjHyqulKA==", - "license": "MIT", - "dependencies": { - "browserslist": "^4.19.1", - "lightningcss": "^1.32.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >= 24" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-load-config": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-5.1.0.tgz", - "integrity": "sha512-G5AJ+IX0aD0dygOE0yFZQ/huFFMSNneyfp0e3/bT05a8OfPC5FUoZRPfGijUdGOJNMewJiwzcHJXFafFzeKFVA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "lilconfig": "^3.1.1", - "yaml": "^2.4.2" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "jiti": ">=1.21.0", - "postcss": ">=8.0.9", - "tsx": "^4.8.1" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - }, - "postcss": { - "optional": true - }, - "tsx": { - "optional": true - } - } - }, - "node_modules/postcss-reporter": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.1.0.tgz", - "integrity": "sha512-/eoEylGWyy6/DOiMP5lmFRdmDKThqgn7D6hP2dXKJI/0rJSO1ADFNngZfDzxL0YAxFvws+Rtpuji1YIHj4mySA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "picocolors": "^1.0.0", - "thenby": "^1.3.4" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-selector-parser": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.2.tgz", - "integrity": "sha512-Wjvt4scRFouioIInHf51IFNP4ltJ2EngJM+cZPGiqbKetBfmP3vpdPV8ID2S6JS6/jdo74N8+aEYH9lQr2C6sA==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-sort-media-queries": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-6.6.2.tgz", - "integrity": "sha512-4whmLOUtFFX2V0w5JM7Wqp1Du+DiOsfgFhJuxdy1d5kBoNy/dfkq4He8eNDGI3ZEJlCk95yQhG75aVcEMKGaFQ==", - "license": "MIT", - "dependencies": { - "sort-css-media-queries": "^3.0.5" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "postcss": "^8.5.6" - } - }, - "node_modules/pretty-hrtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/purgecss": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/purgecss/-/purgecss-8.0.0.tgz", - "integrity": "sha512-QFJyps9y5oHeXnNA3Ql1EaAqWBivNwQn19Pw1lt9RxfB+4e+bIyqCyuombk79D6Fxe+lPXggVfI1WtRGEBwgbQ==", - "license": "MIT", - "dependencies": { - "commander": "^12.1.0", - "fast-glob": "^3.3.2", - "postcss": "^8.4.47", - "postcss-selector-parser": "^7.0.0" - }, - "bin": { - "purgecss": "bin/purgecss.js" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "license": "MIT", - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/slash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/sort-css-media-queries": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-3.0.5.tgz", - "integrity": "sha512-wRgTa9kOgx5nV+lp/uwT0XBlH/WN5dpsOxyIkbtQud65Ie66TYjHceWH/8d1C0siMjcdSjjXg4zV022QmvLsaw==", - "license": "MIT", - "engines": { - "node": ">= 16" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "license": "BSD-3-Clause", - "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==", - "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/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/thenby": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/thenby/-/thenby-1.4.1.tgz", - "integrity": "sha512-D5a/bO0KdalOE3q8MlrRmSxjbKZHT3MQmXkJP+r97Vw8MMwOZKOwUSEyTtK7eSMj2y0kyAjpYMRMZmmLw1FtNQ==", - "license": "Apache-2.0" - }, - "node_modules/tinyglobby": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", - "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.4" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, - "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==", - "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" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yaml": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", - "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", - "license": "ISC", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14.6" - }, - "funding": { - "url": "https://github.com/sponsors/eemeli" - } - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "license": "ISC", - "engines": { - "node": ">=12" - } - } - } -} diff --git a/docs/package.json b/docs/package.json deleted file mode 100644 index 79ae86513..000000000 --- a/docs/package.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "dependencies": { - "@fullhuman/postcss-purgecss": "^8.0.0", - "postcss": "^8.5.26", - "postcss-cli": "^11.0.1", - "postcss-lightningcss": "^1.1.0", - "postcss-sort-media-queries": "^6.6.2" - } -} diff --git a/docs/postcss.config.js b/docs/postcss.config.js deleted file mode 100644 index 85c4b0568..000000000 --- a/docs/postcss.config.js +++ /dev/null @@ -1,42 +0,0 @@ -// LightningCSS settings -// https://lightningcss.dev/ -// -// Support browsers with at least 0.25% usage from browserslist: -// https://browserslist.dev/?q=bGFzdCAyIHZlcnNpb25z -const postcssLightningcss = require("postcss-lightningcss")({ - browsers: ">= .25%", - lightningcssOptions: {}, -}); - -// PurgeCSS settings -// https://purgecss.com/ -// -// Load hugo_stats.json to know what elements are in use. -const purgecss = require("@fullhuman/postcss-purgecss")({ - content: ["./hugo_stats.json"], - variables: true, - defaultExtractor: (content) => { - const els = JSON.parse(content).htmlElements; - return [ - ...(els.tags || []), - ...(els.classes || []), - ...(els.ids || []), - ]; - }, - // Classes added/injected by JS at runtime never appear in hugo_stats.json, - // so keep their rules from being purged: the floating copy button we hide - // (bd-clipboard/btn-clipboard) and the code-card copy "copied" state. - safelist: ["bd-clipboard", "btn-clipboard", "copied", "mp-chip", "mp-card", "mp-card--link", "mp-pagination-next", "mp-pagination-prev"], -}); - -// PostCSS Media sort -// https://github.com/yunusga/postcss-sort-media-queries -// -// Sort CSS to prioritize desktop users. -const mediasort = require("postcss-sort-media-queries")({ - sort: "desktop-first", -}); - -module.exports = { - plugins: [purgecss, mediasort, postcssLightningcss], -}; diff --git a/docs/themes/geekboot/LICENSE-bootstrap b/docs/themes/geekboot/LICENSE-bootstrap deleted file mode 100644 index dda75ca9a..000000000 --- a/docs/themes/geekboot/LICENSE-bootstrap +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2011-2022 Twitter, Inc. -Copyright (c) 2011-2022 The Bootstrap Authors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/docs/themes/geekboot/LICENSE-geekdoc b/docs/themes/geekboot/LICENSE-geekdoc deleted file mode 100644 index 3812eb46b..000000000 --- a/docs/themes/geekboot/LICENSE-geekdoc +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2022 Robert Kaussow - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice (including the next -paragraph) shall be included in all copies or substantial portions of the -Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS -OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF -OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/docs/themes/geekboot/assets/js/main-749dbd31.bundle.min.js b/docs/themes/geekboot/assets/js/main-749dbd31.bundle.min.js deleted file mode 100644 index 3a37227e6..000000000 --- a/docs/themes/geekboot/assets/js/main-749dbd31.bundle.min.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! For license information please see main-749dbd31.bundle.min.js.LICENSE.txt */ -(()=>{var t={576(t){var e;e=function(){return function(){var t={686:function(t,e,n){"use strict";n.d(e,{default:function(){return y}});var i=n(279),o=n.n(i),r=n(370),s=n.n(r),a=n(817),c=n.n(a);function l(t){try{return document.execCommand(t)}catch(t){return!1}}var u=function(t){var e=c()(t);return l("cut"),e},f=function(t,e){var n=function(t){var e="rtl"===document.documentElement.getAttribute("dir"),n=document.createElement("textarea");n.style.fontSize="12pt",n.style.border="0",n.style.padding="0",n.style.margin="0",n.style.position="absolute",n.style[e?"right":"left"]="-9999px";var i=window.pageYOffset||document.documentElement.scrollTop;return n.style.top="".concat(i,"px"),n.setAttribute("readonly",""),n.value=t,n}(t);e.container.appendChild(n);var i=c()(n);return l("copy"),n.remove(),i},d=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{container:document.body},n="";return"string"==typeof t?n=f(t,e):t instanceof HTMLInputElement&&!["text","search","url","tel","password"].includes(null==t?void 0:t.type)?n=f(t.value,e):(n=c()(t),l("copy")),n};function h(t){return h="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},h(t)}function p(t){return p="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},p(t)}function g(t,e){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{};this.action="function"==typeof t.action?t.action:this.defaultAction,this.target="function"==typeof t.target?t.target:this.defaultTarget,this.text="function"==typeof t.text?t.text:this.defaultText,this.container="object"===p(t.container)?t.container:document.body}},{key:"listenClick",value:function(t){var e=this;this.listener=s()(t,"click",function(t){return e.onClick(t)})}},{key:"onClick",value:function(t){var e=t.delegateTarget||t.currentTarget,n=this.action(e)||"copy",i=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=t.action,n=void 0===e?"copy":e,i=t.container,o=t.target,r=t.text;if("copy"!==n&&"cut"!==n)throw new Error('Invalid "action" value, use either "copy" or "cut"');if(void 0!==o){if(!o||"object"!==h(o)||1!==o.nodeType)throw new Error('Invalid "target" value, use a valid Element');if("copy"===n&&o.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if("cut"===n&&(o.hasAttribute("readonly")||o.hasAttribute("disabled")))throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes')}return r?d(r,{container:i}):o?"cut"===n?u(o):d(o,{container:i}):void 0}({action:n,container:this.container,target:this.target(e),text:this.text(e)});this.emit(i?"success":"error",{action:n,text:i,trigger:e,clearSelection:function(){e&&e.focus(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(t){return v("action",t)}},{key:"defaultTarget",value:function(t){var e=v("target",t);if(e)return document.querySelector(e)}},{key:"defaultText",value:function(t){return v("text",t)}},{key:"destroy",value:function(){this.listener.destroy()}}],i=[{key:"copy",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{container:document.body};return d(t,e)}},{key:"cut",value:function(t){return u(t)}},{key:"isSupported",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:["copy","cut"],e="string"==typeof t?[t]:t,n=!!document.queryCommandSupported;return e.forEach(function(t){n=n&&!!document.queryCommandSupported(t)}),n}}],n&&g(e.prototype,n),i&&g(e,i),c}(o()),y=_},828:function(t){if("undefined"!=typeof Element&&!Element.prototype.matches){var e=Element.prototype;e.matches=e.matchesSelector||e.mozMatchesSelector||e.msMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector}t.exports=function(t,e){for(;t&&9!==t.nodeType;){if("function"==typeof t.matches&&t.matches(e))return t;t=t.parentNode}}},438:function(t,e,n){var i=n(828);function o(t,e,n,i,o){var s=r.apply(this,arguments);return t.addEventListener(n,s,o),{destroy:function(){t.removeEventListener(n,s,o)}}}function r(t,e,n,o){return function(n){n.delegateTarget=i(n.target,e),n.delegateTarget&&o.call(t,n)}}t.exports=function(t,e,n,i,r){return"function"==typeof t.addEventListener?o.apply(null,arguments):"function"==typeof n?o.bind(null,document).apply(null,arguments):("string"==typeof t&&(t=document.querySelectorAll(t)),Array.prototype.map.call(t,function(t){return o(t,e,n,i,r)}))}},879:function(t,e){e.node=function(t){return void 0!==t&&t instanceof HTMLElement&&1===t.nodeType},e.nodeList=function(t){var n=Object.prototype.toString.call(t);return void 0!==t&&("[object NodeList]"===n||"[object HTMLCollection]"===n)&&"length"in t&&(0===t.length||e.node(t[0]))},e.string=function(t){return"string"==typeof t||t instanceof String},e.fn=function(t){return"[object Function]"===Object.prototype.toString.call(t)}},370:function(t,e,n){var i=n(879),o=n(438);t.exports=function(t,e,n){if(!t&&!e&&!n)throw new Error("Missing required arguments");if(!i.string(e))throw new TypeError("Second argument must be a String");if(!i.fn(n))throw new TypeError("Third argument must be a Function");if(i.node(t))return function(t,e,n){return t.addEventListener(e,n),{destroy:function(){t.removeEventListener(e,n)}}}(t,e,n);if(i.nodeList(t))return function(t,e,n){return Array.prototype.forEach.call(t,function(t){t.addEventListener(e,n)}),{destroy:function(){Array.prototype.forEach.call(t,function(t){t.removeEventListener(e,n)})}}}(t,e,n);if(i.string(t))return function(t,e,n){return o(document.body,t,e,n)}(t,e,n);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}},817:function(t){t.exports=function(t){var e;if("SELECT"===t.nodeName)t.focus(),e=t.value;else if("INPUT"===t.nodeName||"TEXTAREA"===t.nodeName){var n=t.hasAttribute("readonly");n||t.setAttribute("readonly",""),t.select(),t.setSelectionRange(0,t.value.length),n||t.removeAttribute("readonly"),e=t.value}else{t.hasAttribute("contenteditable")&&t.focus();var i=window.getSelection(),o=document.createRange();o.selectNodeContents(t),i.removeAllRanges(),i.addRange(o),e=i.toString()}return e}},279:function(t){function e(){}e.prototype={on:function(t,e,n){var i=this.e||(this.e={});return(i[t]||(i[t]=[])).push({fn:e,ctx:n}),this},once:function(t,e,n){var i=this;function o(){i.off(t,o),e.apply(n,arguments)}return o._=e,this.on(t,o,n)},emit:function(t){for(var e=[].slice.call(arguments,1),n=((this.e||(this.e={}))[t]||[]).slice(),i=0,o=n.length;i{p(e.href,"high"),o=void 0},s))}function u(t){const e=t.target.closest("a");h(e)&&p(e.href,"high")}function f(t){t.relatedTarget&&t.target.closest("a")==t.relatedTarget.closest("a")||o&&(clearTimeout(o),o=void 0)}function d(t){if(performance.now()-i<1111)return;const e=t.target.closest("a");if(t.which>1||t.metaKey||t.ctrlKey)return;if(!e)return;e.addEventListener("click",function(t){1337!=t.detail&&t.preventDefault()},{capture:!0,passive:!1,once:!0});const n=new MouseEvent("click",{view:window,bubbles:!0,cancelable:!1,detail:1337});e.dispatchEvent(n)}function h(i){if(i&&i.href&&(!n||"instant"in i.dataset)){if(i.origin!=location.origin&&(!e&&!("instant"in i.dataset)||!r))return;if(["http:","https:"].includes(i.protocol)&&("http:"!=i.protocol||"https:"!=location.protocol)&&(t||!i.search||"instant"in i.dataset)&&!(i.hash&&i.pathname+i.search==location.pathname+location.search||"noInstant"in i.dataset))return!0}}function p(t,e="auto"){if(a.has(t))return;const n=document.createElement("link");n.rel="prefetch",n.href=t,n.fetchPriority=e,n.as="document",document.head.appendChild(n),a.add(t)}!function(){if(!document.createElement("link").relList.supports("prefetch"))return;const i="instantVaryAccept"in document.body.dataset||"Shopify"in window,o=navigator.userAgent.indexOf("Chrome/");if(o>-1&&(r=parseInt(navigator.userAgent.substring(o+7))),i&&r&&r<110)return;const a="instantMousedownShortcut"in document.body.dataset;t="instantAllowQueryString"in document.body.dataset,e="instantAllowExternalLinks"in document.body.dataset,n="instantWhitelist"in document.body.dataset;const f={capture:!0,passive:!0};let g=!1,m=!1,b=!1;if("instantIntensity"in document.body.dataset){const t=document.body.dataset.instantIntensity;if(t.startsWith("mousedown"))g=!0,"mousedown-only"==t&&(m=!0);else if(t.startsWith("viewport")){const e=navigator.connection&&navigator.connection.saveData,n=navigator.connection&&navigator.connection.effectiveType&&navigator.connection.effectiveType.includes("2g");e||n||("viewport"==t?document.documentElement.clientWidth*document.documentElement.clientHeight<45e4&&(b=!0):"viewport-all"==t&&(b=!0))}else{const e=parseInt(t);isNaN(e)||(s=e)}}if(m||document.addEventListener("touchstart",c,f),g?a||document.addEventListener("mousedown",u,f):document.addEventListener("mouseover",l,f),a&&document.addEventListener("mousedown",d,f),b){let t=window.requestIdleCallback;t||(t=t=>{t()}),t(function(){const t=new IntersectionObserver(e=>{e.forEach(e=>{if(e.isIntersecting){const n=e.target;t.unobserve(n),p(n.href)}})});document.querySelectorAll("a").forEach(e=>{h(e)&&t.observe(e)})},{timeout:1500})}}()},114(){var t;t=document.getElementById("darkSwitch"),window.addEventListener("load",function(){t&&(function(){var t=window.matchMedia("(prefers-color-scheme: dark)").matches,e=document.getElementById("darkSwitch"),n=null!==localStorage.getItem("darkSwitch")&&"dark"===localStorage.getItem("darkSwitch");null!==localStorage.getItem("darkSwitch")&&"light"===localStorage.getItem("darkSwitch")&&(t=!1),n||t?(document.documentElement.setAttribute("color-theme","dark"),e.checked=!0):(document.documentElement.setAttribute("color-theme","light"),e.checked=!1)}(),t.addEventListener("change",function(){document.getElementById("darkSwitch").checked?(document.documentElement.setAttribute("color-theme","dark"),localStorage.setItem("darkSwitch","dark")):(document.documentElement.setAttribute("color-theme","light"),localStorage.setItem("darkSwitch","light"))}))})},98(){function t(t,e){Element.prototype.matches||(Element.prototype.matches=Element.prototype.matchesSelector||Element.prototype.mozMatchesSelector||Element.prototype.msMatchesSelector||Element.prototype.oMatchesSelector||Element.prototype.webkitMatchesSelector||function(t){for(var e=(this.document||this.ownerDocument).querySelectorAll(t),n=e.length;--n>=0&&e.item(n)!==this;);return n>-1});for(var n=[];t&&t!==document;t=t.parentNode)e?t.matches(e)&&n.push(t):n.push(t);return n}function e(e){var n=document.getElementsByClassName(e);if(0!=n.length)for(let e=0;e{for(var i in e)n.o(e,i)&&!n.o(t,i)&&Object.defineProperty(t,i,{enumerable:!0,get:e[i]})},n.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),n.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},(()=>{"use strict";var t={};n.r(t),n.d(t,{afterMain:()=>kt,afterRead:()=>xt,afterWrite:()=>Nt,applyStyles:()=>Ht,arrow:()=>oe,auto:()=>ht,basePlacements:()=>pt,beforeMain:()=>Tt,beforeRead:()=>At,beforeWrite:()=>St,bottom:()=>ut,clippingParents:()=>bt,computeStyles:()=>ce,createPopper:()=>$e,createPopperBase:()=>Pe,createPopperLite:()=>He,detectOverflow:()=>Ae,end:()=>mt,eventListeners:()=>ue,flip:()=>Ce,hide:()=>Oe,left:()=>dt,main:()=>Ot,modifierPhases:()=>Dt,offset:()=>ke,placements:()=>Et,popper:()=>_t,popperGenerator:()=>Me,popperOffsets:()=>Se,preventOverflow:()=>Le,read:()=>Ct,reference:()=>yt,right:()=>ft,start:()=>gt,top:()=>lt,variationPlacements:()=>wt,viewport:()=>vt,write:()=>Lt}),n(114),n(789);const e=new Map,i={set(t,n,i){e.has(t)||e.set(t,new Map);const o=e.get(t);o.has(n)||0===o.size?o.set(n,i):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(o.keys())[0]}.`)},get:(t,n)=>e.has(t)&&e.get(t).get(n)||null,remove(t,n){if(!e.has(t))return;const i=e.get(t);i.delete(n),0===i.size&&e.delete(t)}},o="transitionend",r=t=>null==t?`${t}`:Object.prototype.toString.call(t).match(/\s([a-z]+)/i)[1].toLowerCase(),s=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let n=t.getAttribute("href");if(!n||!n.includes("#")&&!n.startsWith("."))return null;n.includes("#")&&!n.startsWith("#")&&(n=`#${n.split("#")[1]}`),e=n&&"#"!==n?n.trim():null}return e},a=t=>{const e=s(t);return e&&document.querySelector(e)?e:null},c=t=>{const e=s(t);return e?document.querySelector(e):null},l=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),u=t=>l(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(t):null,f=t=>{if(!l(t)||0===t.getClientRects().length)return!1;const e="visible"===getComputedStyle(t).getPropertyValue("visibility"),n=t.closest("details:not([open])");if(!n)return e;if(n!==t){const e=t.closest("summary");if(e&&e.parentNode!==n)return!1;if(null===e)return!1}return e},d=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),h=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?h(t.parentNode):null},p=()=>{},g=t=>{t.offsetHeight},m=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,b=[],v=()=>"rtl"===document.documentElement.dir,_=t=>{var e;e=()=>{const e=m();if(e){const n=t.NAME,i=e.fn[n];e.fn[n]=t.jQueryInterface,e.fn[n].Constructor=t,e.fn[n].noConflict=()=>(e.fn[n]=i,t.jQueryInterface)}},"loading"===document.readyState?(b.length||document.addEventListener("DOMContentLoaded",()=>{for(const t of b)t()}),b.push(e)):e()},y=t=>{"function"==typeof t&&t()},w=(t,e,n=!0)=>{if(!n)return void y(t);const i=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:n}=window.getComputedStyle(t);const i=Number.parseFloat(e),o=Number.parseFloat(n);return i||o?(e=e.split(",")[0],n=n.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(n))):0})(e)+5;let r=!1;const s=({target:n})=>{n===e&&(r=!0,e.removeEventListener(o,s),y(t))};e.addEventListener(o,s),setTimeout(()=>{r||e.dispatchEvent(new Event(o))},i)},E=(t,e,n,i)=>{const o=t.length;let r=t.indexOf(e);return-1===r?!n&&i?t[o-1]:t[0]:(r+=n?1:-1,i&&(r=(r+o)%o),t[Math.max(0,Math.min(r,o-1))])},A=/[^.]*(?=\..*)\.|.*/,C=/\..*/,x=/::\d+$/,T={};let O=1;const k={mouseenter:"mouseover",mouseleave:"mouseout"},S=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function L(t,e){return e&&`${e}::${O++}`||t.uidEvent||O++}function N(t){const e=L(t);return t.uidEvent=e,T[e]=T[e]||{},T[e]}function D(t,e,n=null){return Object.values(t).find(t=>t.callable===e&&t.delegationSelector===n)}function j(t,e,n){const i="string"==typeof e,o=i?n:e||n;let r=$(t);return S.has(r)||(r=t),[i,o,r]}function I(t,e,n,i,o){if("string"!=typeof e||!t)return;let[r,s,a]=j(e,n,i);if(e in k){const t=t=>function(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};s=t(s)}const c=N(t),l=c[a]||(c[a]={}),u=D(l,s,r?n:null);if(u)return void(u.oneOff=u.oneOff&&o);const f=L(s,e.replace(A,"")),d=r?function(t,e,n){return function i(o){const r=t.querySelectorAll(e);for(let{target:s}=o;s&&s!==this;s=s.parentNode)for(const a of r)if(a===s)return F(o,{delegateTarget:s}),i.oneOff&&H.off(t,o.type,e,n),n.apply(s,[o])}}(t,n,s):function(t,e){return function n(i){return F(i,{delegateTarget:t}),n.oneOff&&H.off(t,i.type,e),e.apply(t,[i])}}(t,s);d.delegationSelector=r?n:null,d.callable=s,d.oneOff=o,d.uidEvent=f,l[f]=d,t.addEventListener(a,d,r)}function M(t,e,n,i,o){const r=D(e[n],i,o);r&&(t.removeEventListener(n,r,Boolean(o)),delete e[n][r.uidEvent])}function P(t,e,n,i){const o=e[n]||{};for(const r of Object.keys(o))if(r.includes(i)){const i=o[r];M(t,e,n,i.callable,i.delegationSelector)}}function $(t){return t=t.replace(C,""),k[t]||t}const H={on(t,e,n,i){I(t,e,n,i,!1)},one(t,e,n,i){I(t,e,n,i,!0)},off(t,e,n,i){if("string"!=typeof e||!t)return;const[o,r,s]=j(e,n,i),a=s!==e,c=N(t),l=c[s]||{},u=e.startsWith(".");if(void 0===r){if(u)for(const n of Object.keys(c))P(t,c,n,e.slice(1));for(const n of Object.keys(l)){const i=n.replace(x,"");if(!a||e.includes(i)){const e=l[n];M(t,c,s,e.callable,e.delegationSelector)}}}else{if(!Object.keys(l).length)return;M(t,c,s,r,o?n:null)}},trigger(t,e,n){if("string"!=typeof e||!t)return null;const i=m();let o=null,r=!0,s=!0,a=!1;e!==$(e)&&i&&(o=i.Event(e,n),i(t).trigger(o),r=!o.isPropagationStopped(),s=!o.isImmediatePropagationStopped(),a=o.isDefaultPrevented());let c=new Event(e,{bubbles:r,cancelable:!0});return c=F(c,n),a&&c.preventDefault(),s&&t.dispatchEvent(c),c.defaultPrevented&&o&&o.preventDefault(),c}};function F(t,e){for(const[n,i]of Object.entries(e||{}))try{t[n]=i}catch{Object.defineProperty(t,n,{configurable:!0,get:()=>i})}return t}const W=H;function R(t){if("true"===t)return!0;if("false"===t)return!1;if(t===Number(t).toString())return Number(t);if(""===t||"null"===t)return null;if("string"!=typeof t)return t;try{return JSON.parse(decodeURIComponent(t))}catch{return t}}function B(t){return t.replace(/[A-Z]/g,t=>`-${t.toLowerCase()}`)}const q={setDataAttribute(t,e,n){t.setAttribute(`data-bs-${B(e)}`,n)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${B(e)}`)},getDataAttributes(t){if(!t)return{};const e={},n=Object.keys(t.dataset).filter(t=>t.startsWith("bs")&&!t.startsWith("bsConfig"));for(const i of n){let n=i.replace(/^bs/,"");n=n.charAt(0).toLowerCase()+n.slice(1,n.length),e[n]=R(t.dataset[i])}return e},getDataAttribute:(t,e)=>R(t.getAttribute(`data-bs-${B(e)}`))},z=class{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(t){return t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t}_mergeConfigObj(t,e){const n=l(e)?q.getDataAttribute(e,"config"):{};return{...this.constructor.Default,..."object"==typeof n?n:{},...l(e)?q.getDataAttributes(e):{},..."object"==typeof t?t:{}}}_typeCheckConfig(t,e=this.constructor.DefaultType){for(const n of Object.keys(e)){const i=e[n],o=t[n],s=l(o)?"element":r(o);if(!new RegExp(i).test(s))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${n}" provided type "${s}" but expected type "${i}".`)}}},V=class extends z{constructor(t,e){super(),(t=u(t))&&(this._element=t,this._config=this._getConfig(e),i.set(this._element,this.constructor.DATA_KEY,this))}dispose(){i.remove(this._element,this.constructor.DATA_KEY),W.off(this._element,this.constructor.EVENT_KEY);for(const t of Object.getOwnPropertyNames(this))this[t]=null}_queueCallback(t,e,n=!0){w(t,e,n)}_getConfig(t){return t=this._mergeConfigObj(t,this._element),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}static getInstance(t){return i.get(u(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.2.3"}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(t){return`${t}${this.EVENT_KEY}`}},K='[data-bs-toggle="button"]';class Y extends V{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each(function(){const e=Y.getOrCreateInstance(this);"toggle"===t&&e[t]()})}}W.on(document,"click.bs.button.data-api",K,t=>{t.preventDefault();const e=t.target.closest(K);Y.getOrCreateInstance(e).toggle()}),_(Y);const U={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter(t=>t.matches(e)),parents(t,e){const n=[];let i=t.parentNode.closest(e);for(;i;)n.push(i),i=i.parentNode.closest(e);return n},prev(t,e){let n=t.previousElementSibling;for(;n;){if(n.matches(e))return[n];n=n.previousElementSibling}return[]},next(t,e){let n=t.nextElementSibling;for(;n;){if(n.matches(e))return[n];n=n.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map(t=>`${t}:not([tabindex^="-"])`).join(",");return this.find(e,t).filter(t=>!d(t)&&f(t))}},Q=".bs.collapse",X=`show${Q}`,G=`shown${Q}`,J=`hide${Q}`,Z=`hidden${Q}`,tt=`click${Q}.data-api`,et="show",nt="collapse",it="collapsing",ot=`:scope .${nt} .${nt}`,rt='[data-bs-toggle="collapse"]',st={parent:null,toggle:!0},at={parent:"(null|element)",toggle:"boolean"};class ct extends V{constructor(t,e){super(t,e),this._isTransitioning=!1,this._triggerArray=[];const n=U.find(rt);for(const t of n){const e=a(t),n=U.find(e).filter(t=>t===this._element);null!==e&&n.length&&this._triggerArray.push(t)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return st}static get DefaultType(){return at}static get NAME(){return"collapse"}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t=[];if(this._config.parent&&(t=this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter(t=>t!==this._element).map(t=>ct.getOrCreateInstance(t,{toggle:!1}))),t.length&&t[0]._isTransitioning)return;if(W.trigger(this._element,X).defaultPrevented)return;for(const e of t)e.hide();const e=this._getDimension();this._element.classList.remove(nt),this._element.classList.add(it),this._element.style[e]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const n=`scroll${e[0].toUpperCase()+e.slice(1)}`;this._queueCallback(()=>{this._isTransitioning=!1,this._element.classList.remove(it),this._element.classList.add(nt,et),this._element.style[e]="",W.trigger(this._element,G)},this._element,!0),this._element.style[e]=`${this._element[n]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(W.trigger(this._element,J).defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,g(this._element),this._element.classList.add(it),this._element.classList.remove(nt,et);for(const t of this._triggerArray){const e=c(t);e&&!this._isShown(e)&&this._addAriaAndCollapsedClass([t],!1)}this._isTransitioning=!0,this._element.style[t]="",this._queueCallback(()=>{this._isTransitioning=!1,this._element.classList.remove(it),this._element.classList.add(nt),W.trigger(this._element,Z)},this._element,!0)}_isShown(t=this._element){return t.classList.contains(et)}_configAfterMerge(t){return t.toggle=Boolean(t.toggle),t.parent=u(t.parent),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=this._getFirstLevelChildren(rt);for(const e of t){const t=c(e);t&&this._addAriaAndCollapsedClass([e],this._isShown(t))}}_getFirstLevelChildren(t){const e=U.find(ot,this._config.parent);return U.find(t,this._config.parent).filter(t=>!e.includes(t))}_addAriaAndCollapsedClass(t,e){if(t.length)for(const n of t)n.classList.toggle("collapsed",!e),n.setAttribute("aria-expanded",e)}static jQueryInterface(t){const e={};return"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1),this.each(function(){const n=ct.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===n[t])throw new TypeError(`No method named "${t}"`);n[t]()}})}}W.on(document,tt,rt,function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();const e=a(this),n=U.find(e);for(const t of n)ct.getOrCreateInstance(t,{toggle:!1}).toggle()}),_(ct);var lt="top",ut="bottom",ft="right",dt="left",ht="auto",pt=[lt,ut,ft,dt],gt="start",mt="end",bt="clippingParents",vt="viewport",_t="popper",yt="reference",wt=pt.reduce(function(t,e){return t.concat([e+"-"+gt,e+"-"+mt])},[]),Et=[].concat(pt,[ht]).reduce(function(t,e){return t.concat([e,e+"-"+gt,e+"-"+mt])},[]),At="beforeRead",Ct="read",xt="afterRead",Tt="beforeMain",Ot="main",kt="afterMain",St="beforeWrite",Lt="write",Nt="afterWrite",Dt=[At,Ct,xt,Tt,Ot,kt,St,Lt,Nt];function jt(t){return t?(t.nodeName||"").toLowerCase():null}function It(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function Mt(t){return t instanceof It(t).Element||t instanceof Element}function Pt(t){return t instanceof It(t).HTMLElement||t instanceof HTMLElement}function $t(t){return"undefined"!=typeof ShadowRoot&&(t instanceof It(t).ShadowRoot||t instanceof ShadowRoot)}const Ht={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach(function(t){var n=e.styles[t]||{},i=e.attributes[t]||{},o=e.elements[t];Pt(o)&&jt(o)&&(Object.assign(o.style,n),Object.keys(i).forEach(function(t){var e=i[t];!1===e?o.removeAttribute(t):o.setAttribute(t,!0===e?"":e)}))})},effect:function(t){var e=t.state,n={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,n.popper),e.styles=n,e.elements.arrow&&Object.assign(e.elements.arrow.style,n.arrow),function(){Object.keys(e.elements).forEach(function(t){var i=e.elements[t],o=e.attributes[t]||{},r=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:n[t]).reduce(function(t,e){return t[e]="",t},{});Pt(i)&&jt(i)&&(Object.assign(i.style,r),Object.keys(o).forEach(function(t){i.removeAttribute(t)}))})}},requires:["computeStyles"]};function Ft(t){return t.split("-")[0]}var Wt=Math.max,Rt=Math.min,Bt=Math.round;function qt(){var t=navigator.userAgentData;return null!=t&&t.brands&&Array.isArray(t.brands)?t.brands.map(function(t){return t.brand+"/"+t.version}).join(" "):navigator.userAgent}function zt(){return!/^((?!chrome|android).)*safari/i.test(qt())}function Vt(t,e,n){void 0===e&&(e=!1),void 0===n&&(n=!1);var i=t.getBoundingClientRect(),o=1,r=1;e&&Pt(t)&&(o=t.offsetWidth>0&&Bt(i.width)/t.offsetWidth||1,r=t.offsetHeight>0&&Bt(i.height)/t.offsetHeight||1);var s=(Mt(t)?It(t):window).visualViewport,a=!zt()&&n,c=(i.left+(a&&s?s.offsetLeft:0))/o,l=(i.top+(a&&s?s.offsetTop:0))/r,u=i.width/o,f=i.height/r;return{width:u,height:f,top:l,right:c+u,bottom:l+f,left:c,x:c,y:l}}function Kt(t){var e=Vt(t),n=t.offsetWidth,i=t.offsetHeight;return Math.abs(e.width-n)<=1&&(n=e.width),Math.abs(e.height-i)<=1&&(i=e.height),{x:t.offsetLeft,y:t.offsetTop,width:n,height:i}}function Yt(t,e){var n=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(n&&$t(n)){var i=e;do{if(i&&t.isSameNode(i))return!0;i=i.parentNode||i.host}while(i)}return!1}function Ut(t){return It(t).getComputedStyle(t)}function Qt(t){return["table","td","th"].indexOf(jt(t))>=0}function Xt(t){return((Mt(t)?t.ownerDocument:t.document)||window.document).documentElement}function Gt(t){return"html"===jt(t)?t:t.assignedSlot||t.parentNode||($t(t)?t.host:null)||Xt(t)}function Jt(t){return Pt(t)&&"fixed"!==Ut(t).position?t.offsetParent:null}function Zt(t){for(var e=It(t),n=Jt(t);n&&Qt(n)&&"static"===Ut(n).position;)n=Jt(n);return n&&("html"===jt(n)||"body"===jt(n)&&"static"===Ut(n).position)?e:n||function(t){var e=/firefox/i.test(qt());if(/Trident/i.test(qt())&&Pt(t)&&"fixed"===Ut(t).position)return null;var n=Gt(t);for($t(n)&&(n=n.host);Pt(n)&&["html","body"].indexOf(jt(n))<0;){var i=Ut(n);if("none"!==i.transform||"none"!==i.perspective||"paint"===i.contain||-1!==["transform","perspective"].indexOf(i.willChange)||e&&"filter"===i.willChange||e&&i.filter&&"none"!==i.filter)return n;n=n.parentNode}return null}(t)||e}function te(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function ee(t,e,n){return Wt(t,Rt(e,n))}function ne(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function ie(t,e){return e.reduce(function(e,n){return e[n]=t,e},{})}const oe={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,n=t.state,i=t.name,o=t.options,r=n.elements.arrow,s=n.modifiersData.popperOffsets,a=Ft(n.placement),c=te(a),l=[dt,ft].indexOf(a)>=0?"height":"width";if(r&&s){var u=function(t,e){return ne("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:ie(t,pt))}(o.padding,n),f=Kt(r),d="y"===c?lt:dt,h="y"===c?ut:ft,p=n.rects.reference[l]+n.rects.reference[c]-s[c]-n.rects.popper[l],g=s[c]-n.rects.reference[c],m=Zt(r),b=m?"y"===c?m.clientHeight||0:m.clientWidth||0:0,v=p/2-g/2,_=u[d],y=b-f[l]-u[h],w=b/2-f[l]/2+v,E=ee(_,w,y),A=c;n.modifiersData[i]=((e={})[A]=E,e.centerOffset=E-w,e)}},effect:function(t){var e=t.state,n=t.options.element,i=void 0===n?"[data-popper-arrow]":n;null!=i&&("string"!=typeof i||(i=e.elements.popper.querySelector(i)))&&Yt(e.elements.popper,i)&&(e.elements.arrow=i)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function re(t){return t.split("-")[1]}var se={top:"auto",right:"auto",bottom:"auto",left:"auto"};function ae(t){var e,n=t.popper,i=t.popperRect,o=t.placement,r=t.variation,s=t.offsets,a=t.position,c=t.gpuAcceleration,l=t.adaptive,u=t.roundOffsets,f=t.isFixed,d=s.x,h=void 0===d?0:d,p=s.y,g=void 0===p?0:p,m="function"==typeof u?u({x:h,y:g}):{x:h,y:g};h=m.x,g=m.y;var b=s.hasOwnProperty("x"),v=s.hasOwnProperty("y"),_=dt,y=lt,w=window;if(l){var E=Zt(n),A="clientHeight",C="clientWidth";E===It(n)&&"static"!==Ut(E=Xt(n)).position&&"absolute"===a&&(A="scrollHeight",C="scrollWidth"),(o===lt||(o===dt||o===ft)&&r===mt)&&(y=ut,g-=(f&&E===w&&w.visualViewport?w.visualViewport.height:E[A])-i.height,g*=c?1:-1),o!==dt&&(o!==lt&&o!==ut||r!==mt)||(_=ft,h-=(f&&E===w&&w.visualViewport?w.visualViewport.width:E[C])-i.width,h*=c?1:-1)}var x,T=Object.assign({position:a},l&&se),O=!0===u?function(t,e){var n=t.x,i=t.y,o=e.devicePixelRatio||1;return{x:Bt(n*o)/o||0,y:Bt(i*o)/o||0}}({x:h,y:g},It(n)):{x:h,y:g};return h=O.x,g=O.y,c?Object.assign({},T,((x={})[y]=v?"0":"",x[_]=b?"0":"",x.transform=(w.devicePixelRatio||1)<=1?"translate("+h+"px, "+g+"px)":"translate3d("+h+"px, "+g+"px, 0)",x)):Object.assign({},T,((e={})[y]=v?g+"px":"",e[_]=b?h+"px":"",e.transform="",e))}const ce={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,n=t.options,i=n.gpuAcceleration,o=void 0===i||i,r=n.adaptive,s=void 0===r||r,a=n.roundOffsets,c=void 0===a||a,l={placement:Ft(e.placement),variation:re(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:o,isFixed:"fixed"===e.options.strategy};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,ae(Object.assign({},l,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:s,roundOffsets:c})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,ae(Object.assign({},l,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:c})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}};var le={passive:!0};const ue={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,n=t.instance,i=t.options,o=i.scroll,r=void 0===o||o,s=i.resize,a=void 0===s||s,c=It(e.elements.popper),l=[].concat(e.scrollParents.reference,e.scrollParents.popper);return r&&l.forEach(function(t){t.addEventListener("scroll",n.update,le)}),a&&c.addEventListener("resize",n.update,le),function(){r&&l.forEach(function(t){t.removeEventListener("scroll",n.update,le)}),a&&c.removeEventListener("resize",n.update,le)}},data:{}};var fe={left:"right",right:"left",bottom:"top",top:"bottom"};function de(t){return t.replace(/left|right|bottom|top/g,function(t){return fe[t]})}var he={start:"end",end:"start"};function pe(t){return t.replace(/start|end/g,function(t){return he[t]})}function ge(t){var e=It(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function me(t){return Vt(Xt(t)).left+ge(t).scrollLeft}function be(t){var e=Ut(t),n=e.overflow,i=e.overflowX,o=e.overflowY;return/auto|scroll|overlay|hidden/.test(n+o+i)}function ve(t){return["html","body","#document"].indexOf(jt(t))>=0?t.ownerDocument.body:Pt(t)&&be(t)?t:ve(Gt(t))}function _e(t,e){var n;void 0===e&&(e=[]);var i=ve(t),o=i===(null==(n=t.ownerDocument)?void 0:n.body),r=It(i),s=o?[r].concat(r.visualViewport||[],be(i)?i:[]):i,a=e.concat(s);return o?a:a.concat(_e(Gt(s)))}function ye(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function we(t,e,n){return e===vt?ye(function(t,e){var n=It(t),i=Xt(t),o=n.visualViewport,r=i.clientWidth,s=i.clientHeight,a=0,c=0;if(o){r=o.width,s=o.height;var l=zt();(l||!l&&"fixed"===e)&&(a=o.offsetLeft,c=o.offsetTop)}return{width:r,height:s,x:a+me(t),y:c}}(t,n)):Mt(e)?function(t,e){var n=Vt(t,!1,"fixed"===e);return n.top=n.top+t.clientTop,n.left=n.left+t.clientLeft,n.bottom=n.top+t.clientHeight,n.right=n.left+t.clientWidth,n.width=t.clientWidth,n.height=t.clientHeight,n.x=n.left,n.y=n.top,n}(e,n):ye(function(t){var e,n=Xt(t),i=ge(t),o=null==(e=t.ownerDocument)?void 0:e.body,r=Wt(n.scrollWidth,n.clientWidth,o?o.scrollWidth:0,o?o.clientWidth:0),s=Wt(n.scrollHeight,n.clientHeight,o?o.scrollHeight:0,o?o.clientHeight:0),a=-i.scrollLeft+me(t),c=-i.scrollTop;return"rtl"===Ut(o||n).direction&&(a+=Wt(n.clientWidth,o?o.clientWidth:0)-r),{width:r,height:s,x:a,y:c}}(Xt(t)))}function Ee(t){var e,n=t.reference,i=t.element,o=t.placement,r=o?Ft(o):null,s=o?re(o):null,a=n.x+n.width/2-i.width/2,c=n.y+n.height/2-i.height/2;switch(r){case lt:e={x:a,y:n.y-i.height};break;case ut:e={x:a,y:n.y+n.height};break;case ft:e={x:n.x+n.width,y:c};break;case dt:e={x:n.x-i.width,y:c};break;default:e={x:n.x,y:n.y}}var l=r?te(r):null;if(null!=l){var u="y"===l?"height":"width";switch(s){case gt:e[l]=e[l]-(n[u]/2-i[u]/2);break;case mt:e[l]=e[l]+(n[u]/2-i[u]/2)}}return e}function Ae(t,e){void 0===e&&(e={});var n=e,i=n.placement,o=void 0===i?t.placement:i,r=n.strategy,s=void 0===r?t.strategy:r,a=n.boundary,c=void 0===a?bt:a,l=n.rootBoundary,u=void 0===l?vt:l,f=n.elementContext,d=void 0===f?_t:f,h=n.altBoundary,p=void 0!==h&&h,g=n.padding,m=void 0===g?0:g,b=ne("number"!=typeof m?m:ie(m,pt)),v=d===_t?yt:_t,_=t.rects.popper,y=t.elements[p?v:d],w=function(t,e,n,i){var o="clippingParents"===e?function(t){var e=_e(Gt(t)),n=["absolute","fixed"].indexOf(Ut(t).position)>=0&&Pt(t)?Zt(t):t;return Mt(n)?e.filter(function(t){return Mt(t)&&Yt(t,n)&&"body"!==jt(t)}):[]}(t):[].concat(e),r=[].concat(o,[n]),s=r[0],a=r.reduce(function(e,n){var o=we(t,n,i);return e.top=Wt(o.top,e.top),e.right=Rt(o.right,e.right),e.bottom=Rt(o.bottom,e.bottom),e.left=Wt(o.left,e.left),e},we(t,s,i));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}(Mt(y)?y:y.contextElement||Xt(t.elements.popper),c,u,s),E=Vt(t.elements.reference),A=Ee({reference:E,element:_,strategy:"absolute",placement:o}),C=ye(Object.assign({},_,A)),x=d===_t?C:E,T={top:w.top-x.top+b.top,bottom:x.bottom-w.bottom+b.bottom,left:w.left-x.left+b.left,right:x.right-w.right+b.right},O=t.modifiersData.offset;if(d===_t&&O){var k=O[o];Object.keys(T).forEach(function(t){var e=[ft,ut].indexOf(t)>=0?1:-1,n=[lt,ut].indexOf(t)>=0?"y":"x";T[t]+=k[n]*e})}return T}const Ce={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,n=t.options,i=t.name;if(!e.modifiersData[i]._skip){for(var o=n.mainAxis,r=void 0===o||o,s=n.altAxis,a=void 0===s||s,c=n.fallbackPlacements,l=n.padding,u=n.boundary,f=n.rootBoundary,d=n.altBoundary,h=n.flipVariations,p=void 0===h||h,g=n.allowedAutoPlacements,m=e.options.placement,b=Ft(m),v=c||(b!==m&&p?function(t){if(Ft(t)===ht)return[];var e=de(t);return[pe(t),e,pe(e)]}(m):[de(m)]),_=[m].concat(v).reduce(function(t,n){return t.concat(Ft(n)===ht?function(t,e){void 0===e&&(e={});var n=e,i=n.placement,o=n.boundary,r=n.rootBoundary,s=n.padding,a=n.flipVariations,c=n.allowedAutoPlacements,l=void 0===c?Et:c,u=re(i),f=u?a?wt:wt.filter(function(t){return re(t)===u}):pt,d=f.filter(function(t){return l.indexOf(t)>=0});0===d.length&&(d=f);var h=d.reduce(function(e,n){return e[n]=Ae(t,{placement:n,boundary:o,rootBoundary:r,padding:s})[Ft(n)],e},{});return Object.keys(h).sort(function(t,e){return h[t]-h[e]})}(e,{placement:n,boundary:u,rootBoundary:f,padding:l,flipVariations:p,allowedAutoPlacements:g}):n)},[]),y=e.rects.reference,w=e.rects.popper,E=new Map,A=!0,C=_[0],x=0;x<_.length;x++){var T=_[x],O=Ft(T),k=re(T)===gt,S=[lt,ut].indexOf(O)>=0,L=S?"width":"height",N=Ae(e,{placement:T,boundary:u,rootBoundary:f,altBoundary:d,padding:l}),D=S?k?ft:dt:k?ut:lt;y[L]>w[L]&&(D=de(D));var j=de(D),I=[];if(r&&I.push(N[O]<=0),a&&I.push(N[D]<=0,N[j]<=0),I.every(function(t){return t})){C=T,A=!1;break}E.set(T,I)}if(A)for(var M=function(t){var e=_.find(function(e){var n=E.get(e);if(n)return n.slice(0,t).every(function(t){return t})});if(e)return C=e,"break"},P=p?3:1;P>0&&"break"!==M(P);P--);e.placement!==C&&(e.modifiersData[i]._skip=!0,e.placement=C,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function xe(t,e,n){return void 0===n&&(n={x:0,y:0}),{top:t.top-e.height-n.y,right:t.right-e.width+n.x,bottom:t.bottom-e.height+n.y,left:t.left-e.width-n.x}}function Te(t){return[lt,ft,ut,dt].some(function(e){return t[e]>=0})}const Oe={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,n=t.name,i=e.rects.reference,o=e.rects.popper,r=e.modifiersData.preventOverflow,s=Ae(e,{elementContext:"reference"}),a=Ae(e,{altBoundary:!0}),c=xe(s,i),l=xe(a,o,r),u=Te(c),f=Te(l);e.modifiersData[n]={referenceClippingOffsets:c,popperEscapeOffsets:l,isReferenceHidden:u,hasPopperEscaped:f},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":u,"data-popper-escaped":f})}},ke={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,n=t.options,i=t.name,o=n.offset,r=void 0===o?[0,0]:o,s=Et.reduce(function(t,n){return t[n]=function(t,e,n){var i=Ft(t),o=[dt,lt].indexOf(i)>=0?-1:1,r="function"==typeof n?n(Object.assign({},e,{placement:t})):n,s=r[0],a=r[1];return s=s||0,a=(a||0)*o,[dt,ft].indexOf(i)>=0?{x:a,y:s}:{x:s,y:a}}(n,e.rects,r),t},{}),a=s[e.placement],c=a.x,l=a.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=c,e.modifiersData.popperOffsets.y+=l),e.modifiersData[i]=s}},Se={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,n=t.name;e.modifiersData[n]=Ee({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}},Le={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,n=t.options,i=t.name,o=n.mainAxis,r=void 0===o||o,s=n.altAxis,a=void 0!==s&&s,c=n.boundary,l=n.rootBoundary,u=n.altBoundary,f=n.padding,d=n.tether,h=void 0===d||d,p=n.tetherOffset,g=void 0===p?0:p,m=Ae(e,{boundary:c,rootBoundary:l,padding:f,altBoundary:u}),b=Ft(e.placement),v=re(e.placement),_=!v,y=te(b),w="x"===y?"y":"x",E=e.modifiersData.popperOffsets,A=e.rects.reference,C=e.rects.popper,x="function"==typeof g?g(Object.assign({},e.rects,{placement:e.placement})):g,T="number"==typeof x?{mainAxis:x,altAxis:x}:Object.assign({mainAxis:0,altAxis:0},x),O=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,k={x:0,y:0};if(E){if(r){var S,L="y"===y?lt:dt,N="y"===y?ut:ft,D="y"===y?"height":"width",j=E[y],I=j+m[L],M=j-m[N],P=h?-C[D]/2:0,$=v===gt?A[D]:C[D],H=v===gt?-C[D]:-A[D],F=e.elements.arrow,W=h&&F?Kt(F):{width:0,height:0},R=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},B=R[L],q=R[N],z=ee(0,A[D],W[D]),V=_?A[D]/2-P-z-B-T.mainAxis:$-z-B-T.mainAxis,K=_?-A[D]/2+P+z+q+T.mainAxis:H+z+q+T.mainAxis,Y=e.elements.arrow&&Zt(e.elements.arrow),U=Y?"y"===y?Y.clientTop||0:Y.clientLeft||0:0,Q=null!=(S=null==O?void 0:O[y])?S:0,X=j+K-Q,G=ee(h?Rt(I,j+V-Q-U):I,j,h?Wt(M,X):M);E[y]=G,k[y]=G-j}if(a){var J,Z="x"===y?lt:dt,tt="x"===y?ut:ft,et=E[w],nt="y"===w?"height":"width",it=et+m[Z],ot=et-m[tt],rt=-1!==[lt,dt].indexOf(b),st=null!=(J=null==O?void 0:O[w])?J:0,at=rt?it:et-A[nt]-C[nt]-st+T.altAxis,ct=rt?et+A[nt]+C[nt]-st-T.altAxis:ot,ht=h&&rt?function(t,e,n){var i=ee(t,e,n);return i>n?n:i}(at,et,ct):ee(h?at:it,et,h?ct:ot);E[w]=ht,k[w]=ht-et}e.modifiersData[i]=k}},requiresIfExists:["offset"]};function Ne(t,e,n){void 0===n&&(n=!1);var i,o,r=Pt(e),s=Pt(e)&&function(t){var e=t.getBoundingClientRect(),n=Bt(e.width)/t.offsetWidth||1,i=Bt(e.height)/t.offsetHeight||1;return 1!==n||1!==i}(e),a=Xt(e),c=Vt(t,s,n),l={scrollLeft:0,scrollTop:0},u={x:0,y:0};return(r||!r&&!n)&&(("body"!==jt(e)||be(a))&&(l=(i=e)!==It(i)&&Pt(i)?{scrollLeft:(o=i).scrollLeft,scrollTop:o.scrollTop}:ge(i)),Pt(e)?((u=Vt(e,!0)).x+=e.clientLeft,u.y+=e.clientTop):a&&(u.x=me(a))),{x:c.left+l.scrollLeft-u.x,y:c.top+l.scrollTop-u.y,width:c.width,height:c.height}}function De(t){var e=new Map,n=new Set,i=[];function o(t){n.add(t.name),[].concat(t.requires||[],t.requiresIfExists||[]).forEach(function(t){if(!n.has(t)){var i=e.get(t);i&&o(i)}}),i.push(t)}return t.forEach(function(t){e.set(t.name,t)}),t.forEach(function(t){n.has(t.name)||o(t)}),i}var je={placement:"bottom",modifiers:[],strategy:"absolute"};function Ie(){for(var t=arguments.length,e=new Array(t),n=0;nNumber.parseInt(t,10)):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||"static"===this._config.display)&&(q.setDataAttribute(this._menu,"popper","static"),t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,..."function"==typeof this._config.popperConfig?this._config.popperConfig(t):this._config.popperConfig}}_selectMenuItem({key:t,target:e}){const n=U.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter(t=>f(t));n.length&&E(n,e,t===qe,!n.includes(e)).focus()}static jQueryInterface(t){return this.each(function(){const e=un.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}})}static clearMenus(t){if(2===t.button||"keyup"===t.type&&"Tab"!==t.key)return;const e=U.find(Ze);for(const n of e){const e=un.getInstance(n);if(!e||!1===e._config.autoClose)continue;const i=t.composedPath(),o=i.includes(e._menu);if(i.includes(e._element)||"inside"===e._config.autoClose&&!o||"outside"===e._config.autoClose&&o)continue;if(e._menu.contains(t.target)&&("keyup"===t.type&&"Tab"===t.key||/input|select|option|textarea|form/i.test(t.target.tagName)))continue;const r={relatedTarget:e._element};"click"===t.type&&(r.clickEvent=t),e._completeHide(r)}}static dataApiKeydownHandler(t){const e=/input|textarea/i.test(t.target.tagName),n="Escape"===t.key,i=[Be,qe].includes(t.key);if(!i&&!n)return;if(e&&!n)return;t.preventDefault();const o=this.matches(Je)?this:U.prev(this,Je)[0]||U.next(this,Je)[0]||U.findOne(Je,t.delegateTarget.parentNode),r=un.getOrCreateInstance(o);if(i)return t.stopPropagation(),r.show(),void r._selectMenuItem(t);r._isShown()&&(t.stopPropagation(),r.hide(),o.focus())}}W.on(document,Qe,Je,un.dataApiKeydownHandler),W.on(document,Qe,tn,un.dataApiKeydownHandler),W.on(document,Ue,un.clearMenus),W.on(document,Xe,un.clearMenus),W.on(document,Ue,Je,function(t){t.preventDefault(),un.getOrCreateInstance(this).toggle()}),_(un);const fn=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),dn=/^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i,hn=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i,pn=(t,e)=>{const n=t.nodeName.toLowerCase();return e.includes(n)?!fn.has(n)||Boolean(dn.test(t.nodeValue)||hn.test(t.nodeValue)):e.filter(t=>t instanceof RegExp).some(t=>t.test(n))},gn={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},mn={allowList:gn,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"
"},bn={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},vn={entry:"(string|element|function|null)",selector:"(string|element)"},_n=class extends z{constructor(t){super(),this._config=this._getConfig(t)}static get Default(){return mn}static get DefaultType(){return bn}static get NAME(){return"TemplateFactory"}getContent(){return Object.values(this._config.content).map(t=>this._resolvePossibleFunction(t)).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(t){return this._checkContent(t),this._config.content={...this._config.content,...t},this}toHtml(){const t=document.createElement("div");t.innerHTML=this._maybeSanitize(this._config.template);for(const[e,n]of Object.entries(this._config.content))this._setContent(t,n,e);const e=t.children[0],n=this._resolvePossibleFunction(this._config.extraClass);return n&&e.classList.add(...n.split(" ")),e}_typeCheckConfig(t){super._typeCheckConfig(t),this._checkContent(t.content)}_checkContent(t){for(const[e,n]of Object.entries(t))super._typeCheckConfig({selector:e,entry:n},vn)}_setContent(t,e,n){const i=U.findOne(n,t);i&&((e=this._resolvePossibleFunction(e))?l(e)?this._putElementInTemplate(u(e),i):this._config.html?i.innerHTML=this._maybeSanitize(e):i.textContent=e:i.remove())}_maybeSanitize(t){return this._config.sanitize?function(t,e,n){if(!t.length)return t;if(n&&"function"==typeof n)return n(t);const i=(new window.DOMParser).parseFromString(t,"text/html"),o=[].concat(...i.body.querySelectorAll("*"));for(const t of o){const n=t.nodeName.toLowerCase();if(!Object.keys(e).includes(n)){t.remove();continue}const i=[].concat(...t.attributes),o=[].concat(e["*"]||[],e[n]||[]);for(const e of i)pn(e,o)||t.removeAttribute(e.nodeName)}return i.body.innerHTML}(t,this._config.allowList,this._config.sanitizeFn):t}_resolvePossibleFunction(t){return"function"==typeof t?t(this):t}_putElementInTemplate(t,e){if(this._config.html)return e.innerHTML="",void e.append(t);e.textContent=t.textContent}},yn=new Set(["sanitize","allowList","sanitizeFn"]),wn="fade",En="show",An=".tooltip-inner",Cn=".modal",xn="hide.bs.modal",Tn="hover",On="focus",kn={AUTO:"auto",TOP:"top",RIGHT:v()?"left":"right",BOTTOM:"bottom",LEFT:v()?"right":"left"},Sn={allowList:gn,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,0],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'',title:"",trigger:"hover focus"},Ln={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"};class Nn extends V{constructor(t,e){super(t,e),this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners(),this._config.selector||this._fixTitle()}static get Default(){return Sn}static get DefaultType(){return Ln}static get NAME(){return"tooltip"}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){this._isEnabled&&(this._activeTrigger.click=!this._activeTrigger.click,this._isShown()?this._leave():this._enter())}dispose(){clearTimeout(this._timeout),W.off(this._element.closest(Cn),xn,this._hideModalHandler),this._element.getAttribute("data-bs-original-title")&&this._element.setAttribute("title",this._element.getAttribute("data-bs-original-title")),this._disposePopper(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this._isWithContent()||!this._isEnabled)return;const t=W.trigger(this._element,this.constructor.eventName("show")),e=(h(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(t.defaultPrevented||!e)return;this._disposePopper();const n=this._getTipElement();this._element.setAttribute("aria-describedby",n.getAttribute("id"));const{container:i}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(i.append(n),W.trigger(this._element,this.constructor.eventName("inserted"))),this._popper=this._createPopper(n),n.classList.add(En),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))W.on(t,"mouseover",p);this._queueCallback(()=>{W.trigger(this._element,this.constructor.eventName("shown")),!1===this._isHovered&&this._leave(),this._isHovered=!1},this.tip,this._isAnimated())}hide(){if(this._isShown()&&!W.trigger(this._element,this.constructor.eventName("hide")).defaultPrevented){if(this._getTipElement().classList.remove(En),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))W.off(t,"mouseover",p);this._activeTrigger.click=!1,this._activeTrigger[On]=!1,this._activeTrigger[Tn]=!1,this._isHovered=null,this._queueCallback(()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),W.trigger(this._element,this.constructor.eventName("hidden")))},this.tip,this._isAnimated())}}update(){this._popper&&this._popper.update()}_isWithContent(){return Boolean(this._getTitle())}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(t){const e=this._getTemplateFactory(t).toHtml();if(!e)return null;e.classList.remove(wn,En),e.classList.add(`bs-${this.constructor.NAME}-auto`);const n=(t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t})(this.constructor.NAME).toString();return e.setAttribute("id",n),this._isAnimated()&&e.classList.add(wn),e}setContent(t){this._newContent=t,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(t){return this._templateFactory?this._templateFactory.changeContent(t):this._templateFactory=new _n({...this._config,content:t,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{[An]:this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(t){return this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(wn)}_isShown(){return this.tip&&this.tip.classList.contains(En)}_createPopper(t){const e="function"==typeof this._config.placement?this._config.placement.call(this,t,this._element):this._config.placement,n=kn[e.toUpperCase()];return $e(this._element,t,this._getPopperConfig(n))}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map(t=>Number.parseInt(t,10)):"function"==typeof t?e=>t(e,this._element):t}_resolvePossibleFunction(t){return"function"==typeof t?t.call(this._element):t}_getPopperConfig(t){const e={placement:t,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:t=>{this._getTipElement().setAttribute("data-popper-placement",t.state.placement)}}]};return{...e,..."function"==typeof this._config.popperConfig?this._config.popperConfig(e):this._config.popperConfig}}_setListeners(){const t=this._config.trigger.split(" ");for(const e of t)if("click"===e)W.on(this._element,this.constructor.eventName("click"),this._config.selector,t=>{this._initializeOnDelegatedTarget(t).toggle()});else if("manual"!==e){const t=e===Tn?this.constructor.eventName("mouseenter"):this.constructor.eventName("focusin"),n=e===Tn?this.constructor.eventName("mouseleave"):this.constructor.eventName("focusout");W.on(this._element,t,this._config.selector,t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusin"===t.type?On:Tn]=!0,e._enter()}),W.on(this._element,n,this._config.selector,t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusout"===t.type?On:Tn]=e._element.contains(t.relatedTarget),e._leave()})}this._hideModalHandler=()=>{this._element&&this.hide()},W.on(this._element.closest(Cn),xn,this._hideModalHandler)}_fixTitle(){const t=this._element.getAttribute("title");t&&(this._element.getAttribute("aria-label")||this._element.textContent.trim()||this._element.setAttribute("aria-label",t),this._element.setAttribute("data-bs-original-title",t),this._element.removeAttribute("title"))}_enter(){this._isShown()||this._isHovered?this._isHovered=!0:(this._isHovered=!0,this._setTimeout(()=>{this._isHovered&&this.show()},this._config.delay.show))}_leave(){this._isWithActiveTrigger()||(this._isHovered=!1,this._setTimeout(()=>{this._isHovered||this.hide()},this._config.delay.hide))}_setTimeout(t,e){clearTimeout(this._timeout),this._timeout=setTimeout(t,e)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(t){const e=q.getDataAttributes(this._element);for(const t of Object.keys(e))yn.has(t)&&delete e[t];return t={...e,..."object"==typeof t&&t?t:{}},t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t.container=!1===t.container?document.body:u(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),t}_getDelegateConfig(){const t={};for(const e in this._config)this.constructor.Default[e]!==this._config[e]&&(t[e]=this._config[e]);return t.selector=!1,t.trigger="manual",t}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(t){return this.each(function(){const e=Nn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}})}}_(Nn);const Dn=Nn,jn=".popover-header",In=".popover-body",Mn={...Dn.Default,content:"",offset:[0,8],placement:"right",template:'',trigger:"click"},Pn={...Dn.DefaultType,content:"(null|string|element|function)"};class $n extends Dn{static get Default(){return Mn}static get DefaultType(){return Pn}static get NAME(){return"popover"}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{[jn]:this._getTitle(),[In]:this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(t){return this.each(function(){const e=$n.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}})}}_($n);const Hn=".bs.scrollspy",Fn=`activate${Hn}`,Wn=`click${Hn}`,Rn=`load${Hn}.data-api`,Bn="active",qn="[href]",zn=".nav-link",Vn=`${zn}, .nav-item > ${zn}, .list-group-item`,Kn={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},Yn={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class Un extends V{constructor(t,e){super(t,e),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement="visible"===getComputedStyle(this._element).overflowY?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return Kn}static get DefaultType(){return Yn}static get NAME(){return"scrollspy"}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(const t of this._observableSections.values())this._observer.observe(t)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(t){return t.target=u(t.target)||document.body,t.rootMargin=t.offset?`${t.offset}px 0px -30%`:t.rootMargin,"string"==typeof t.threshold&&(t.threshold=t.threshold.split(",").map(t=>Number.parseFloat(t))),t}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(W.off(this._config.target,Wn),W.on(this._config.target,Wn,qn,t=>{const e=this._observableSections.get(t.target.hash);if(e){t.preventDefault();const n=this._rootElement||window,i=e.offsetTop-this._element.offsetTop;if(n.scrollTo)return void n.scrollTo({top:i,behavior:"smooth"});n.scrollTop=i}}))}_getNewObserver(){const t={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver(t=>this._observerCallback(t),t)}_observerCallback(t){const e=t=>this._targetLinks.get(`#${t.target.id}`),n=t=>{this._previousScrollData.visibleEntryTop=t.target.offsetTop,this._process(e(t))},i=(this._rootElement||document.documentElement).scrollTop,o=i>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=i;for(const r of t){if(!r.isIntersecting){this._activeTarget=null,this._clearActiveClass(e(r));continue}const t=r.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(o&&t){if(n(r),!i)return}else o||t||n(r)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const t=U.find(qn,this._config.target);for(const e of t){if(!e.hash||d(e))continue;const t=U.findOne(e.hash,this._element);f(t)&&(this._targetLinks.set(e.hash,e),this._observableSections.set(e.hash,t))}}_process(t){this._activeTarget!==t&&(this._clearActiveClass(this._config.target),this._activeTarget=t,t.classList.add(Bn),this._activateParents(t),W.trigger(this._element,Fn,{relatedTarget:t}))}_activateParents(t){if(t.classList.contains("dropdown-item"))U.findOne(".dropdown-toggle",t.closest(".dropdown")).classList.add(Bn);else for(const e of U.parents(t,".nav, .list-group"))for(const t of U.prev(e,Vn))t.classList.add(Bn)}_clearActiveClass(t){t.classList.remove(Bn);const e=U.find(`${qn}.${Bn}`,t);for(const t of e)t.classList.remove(Bn)}static jQueryInterface(t){return this.each(function(){const e=Un.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}})}}W.on(window,Rn,()=>{for(const t of U.find('[data-bs-spy="scroll"]'))Un.getOrCreateInstance(t)}),_(Un);const Qn=".bs.tab",Xn=`hide${Qn}`,Gn=`hidden${Qn}`,Jn=`show${Qn}`,Zn=`shown${Qn}`,ti=`click${Qn}`,ei=`keydown${Qn}`,ni=`load${Qn}`,ii="ArrowLeft",oi="ArrowRight",ri="ArrowUp",si="ArrowDown",ai="active",ci="fade",li="show",ui=":not(.dropdown-toggle)",fi='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',di=`.nav-link${ui}, .list-group-item${ui}, [role="tab"]${ui}, ${fi}`,hi=`.${ai}[data-bs-toggle="tab"], .${ai}[data-bs-toggle="pill"], .${ai}[data-bs-toggle="list"]`;class pi extends V{constructor(t){super(t),this._parent=this._element.closest('.list-group, .nav, [role="tablist"]'),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),W.on(this._element,ei,t=>this._keydown(t)))}static get NAME(){return"tab"}show(){const t=this._element;if(this._elemIsActive(t))return;const e=this._getActiveElem(),n=e?W.trigger(e,Xn,{relatedTarget:t}):null;W.trigger(t,Jn,{relatedTarget:e}).defaultPrevented||n&&n.defaultPrevented||(this._deactivate(e,t),this._activate(t,e))}_activate(t,e){t&&(t.classList.add(ai),this._activate(c(t)),this._queueCallback(()=>{"tab"===t.getAttribute("role")?(t.removeAttribute("tabindex"),t.setAttribute("aria-selected",!0),this._toggleDropDown(t,!0),W.trigger(t,Zn,{relatedTarget:e})):t.classList.add(li)},t,t.classList.contains(ci)))}_deactivate(t,e){t&&(t.classList.remove(ai),t.blur(),this._deactivate(c(t)),this._queueCallback(()=>{"tab"===t.getAttribute("role")?(t.setAttribute("aria-selected",!1),t.setAttribute("tabindex","-1"),this._toggleDropDown(t,!1),W.trigger(t,Gn,{relatedTarget:e})):t.classList.remove(li)},t,t.classList.contains(ci)))}_keydown(t){if(![ii,oi,ri,si].includes(t.key))return;t.stopPropagation(),t.preventDefault();const e=[oi,si].includes(t.key),n=E(this._getChildren().filter(t=>!d(t)),t.target,e,!0);n&&(n.focus({preventScroll:!0}),pi.getOrCreateInstance(n).show())}_getChildren(){return U.find(di,this._parent)}_getActiveElem(){return this._getChildren().find(t=>this._elemIsActive(t))||null}_setInitialAttributes(t,e){this._setAttributeIfNotExists(t,"role","tablist");for(const t of e)this._setInitialAttributesOnChild(t)}_setInitialAttributesOnChild(t){t=this._getInnerElement(t);const e=this._elemIsActive(t),n=this._getOuterElement(t);t.setAttribute("aria-selected",e),n!==t&&this._setAttributeIfNotExists(n,"role","presentation"),e||t.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(t,"role","tab"),this._setInitialAttributesOnTargetPanel(t)}_setInitialAttributesOnTargetPanel(t){const e=c(t);e&&(this._setAttributeIfNotExists(e,"role","tabpanel"),t.id&&this._setAttributeIfNotExists(e,"aria-labelledby",`#${t.id}`))}_toggleDropDown(t,e){const n=this._getOuterElement(t);if(!n.classList.contains("dropdown"))return;const i=(t,i)=>{const o=U.findOne(t,n);o&&o.classList.toggle(i,e)};i(".dropdown-toggle",ai),i(".dropdown-menu",li),n.setAttribute("aria-expanded",e)}_setAttributeIfNotExists(t,e,n){t.hasAttribute(e)||t.setAttribute(e,n)}_elemIsActive(t){return t.classList.contains(ai)}_getInnerElement(t){return t.matches(di)?t:U.findOne(di,t)}_getOuterElement(t){return t.closest(".nav-item, .list-group-item")||t}static jQueryInterface(t){return this.each(function(){const e=pi.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}})}}W.on(document,ti,fi,function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),d(this)||pi.getOrCreateInstance(this).show()}),W.on(window,ni,()=>{for(const t of U.find(hi))pi.getOrCreateInstance(t)}),_(pi);const gi=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",mi=".sticky-top",bi="padding-right",vi="margin-right",_i=class{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,bi,e=>e+t),this._setElementAttributes(gi,bi,e=>e+t),this._setElementAttributes(mi,vi,e=>e-t)}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,bi),this._resetElementAttributes(gi,bi),this._resetElementAttributes(mi,vi)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,n){const i=this.getWidth();this._applyManipulationCallback(t,t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+i)return;this._saveInitialAttribute(t,e);const o=window.getComputedStyle(t).getPropertyValue(e);t.style.setProperty(e,`${n(Number.parseFloat(o))}px`)})}_saveInitialAttribute(t,e){const n=t.style.getPropertyValue(e);n&&q.setDataAttribute(t,e,n)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,t=>{const n=q.getDataAttribute(t,e);null!==n?(q.removeDataAttribute(t,e),t.style.setProperty(e,n)):t.style.removeProperty(e)})}_applyManipulationCallback(t,e){if(l(t))e(t);else for(const n of U.find(t,this._element))e(n)}},yi="backdrop",wi="show",Ei=`mousedown.bs.${yi}`,Ai={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},Ci={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"},xi=class extends z{constructor(t){super(),this._config=this._getConfig(t),this._isAppended=!1,this._element=null}static get Default(){return Ai}static get DefaultType(){return Ci}static get NAME(){return yi}show(t){if(!this._config.isVisible)return void y(t);this._append();const e=this._getElement();this._config.isAnimated&&g(e),e.classList.add(wi),this._emulateAnimation(()=>{y(t)})}hide(t){this._config.isVisible?(this._getElement().classList.remove(wi),this._emulateAnimation(()=>{this.dispose(),y(t)})):y(t)}dispose(){this._isAppended&&(W.off(this._element,Ei),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_configAfterMerge(t){return t.rootElement=u(t.rootElement),t}_append(){if(this._isAppended)return;const t=this._getElement();this._config.rootElement.append(t),W.on(t,Ei,()=>{y(this._config.clickCallback)}),this._isAppended=!0}_emulateAnimation(t){w(t,this._getElement(),this._config.isAnimated)}},Ti=".bs.focustrap",Oi=`focusin${Ti}`,ki=`keydown.tab${Ti}`,Si="backward",Li={autofocus:!0,trapElement:null},Ni={autofocus:"boolean",trapElement:"element"},Di=class extends z{constructor(t){super(),this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return Li}static get DefaultType(){return Ni}static get NAME(){return"focustrap"}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),W.off(document,Ti),W.on(document,Oi,t=>this._handleFocusin(t)),W.on(document,ki,t=>this._handleKeydown(t)),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,W.off(document,Ti))}_handleFocusin(t){const{trapElement:e}=this._config;if(t.target===document||t.target===e||e.contains(t.target))return;const n=U.focusableChildren(e);0===n.length?e.focus():this._lastTabNavDirection===Si?n[n.length-1].focus():n[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?Si:"forward")}},ji=".bs.offcanvas",Ii=".data-api",Mi=`load${ji}${Ii}`,Pi="show",$i="showing",Hi="hiding",Fi=".offcanvas.show",Wi=`show${ji}`,Ri=`shown${ji}`,Bi=`hide${ji}`,qi=`hidePrevented${ji}`,zi=`hidden${ji}`,Vi=`resize${ji}`,Ki=`click${ji}${Ii}`,Yi=`keydown.dismiss${ji}`,Ui={backdrop:!0,keyboard:!0,scroll:!1},Qi={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class Xi extends V{constructor(t,e){super(t,e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return Ui}static get DefaultType(){return Qi}static get NAME(){return"offcanvas"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||W.trigger(this._element,Wi,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._backdrop.show(),this._config.scroll||(new _i).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add($i),this._queueCallback(()=>{this._config.scroll&&!this._config.backdrop||this._focustrap.activate(),this._element.classList.add(Pi),this._element.classList.remove($i),W.trigger(this._element,Ri,{relatedTarget:t})},this._element,!0))}hide(){this._isShown&&(W.trigger(this._element,Bi).defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add(Hi),this._backdrop.hide(),this._queueCallback(()=>{this._element.classList.remove(Pi,Hi),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new _i).reset(),W.trigger(this._element,zi)},this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const t=Boolean(this._config.backdrop);return new xi({className:"offcanvas-backdrop",isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?()=>{"static"!==this._config.backdrop?this.hide():W.trigger(this._element,qi)}:null})}_initializeFocusTrap(){return new Di({trapElement:this._element})}_addEventListeners(){W.on(this._element,Yi,t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():W.trigger(this._element,qi))})}static jQueryInterface(t){return this.each(function(){const e=Xi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}})}}W.on(document,Ki,'[data-bs-toggle="offcanvas"]',function(t){const e=c(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),d(this))return;W.one(e,zi,()=>{f(this)&&this.focus()});const n=U.findOne(Fi);n&&n!==e&&Xi.getInstance(n).hide(),Xi.getOrCreateInstance(e).toggle(this)}),W.on(window,Mi,()=>{for(const t of U.find(Fi))Xi.getOrCreateInstance(t).show()}),W.on(window,Vi,()=>{for(const t of U.find("[aria-modal][class*=show][class*=offcanvas-]"))"fixed"!==getComputedStyle(t).position&&Xi.getOrCreateInstance(t).hide()}),((t,e="hide")=>{const n=`click.dismiss${t.EVENT_KEY}`,i=t.NAME;W.on(document,n,`[data-bs-dismiss="${i}"]`,function(n){if(["A","AREA"].includes(this.tagName)&&n.preventDefault(),d(this))return;const o=c(this)||this.closest(`.${i}`);t.getOrCreateInstance(o)[e]()})})(Xi),_(Xi),n(98);var Gi=n(576);new Gi(".kind-link");const Ji=['
',' ","
"].join("");for(var Zi=document.querySelectorAll(".highlight"),to=0;tot.parentNode.parentNode,text:t=>function(t){for(var e=t.getElementsByClassName("cl"),n=[],i=0;ie-1||isNaN(r))&&(r=e),[o,r]}function oo(t,e){for(var n=t.querySelectorAll(".line"),i=e[0]-1,o=e[1]-1,r=i;r<=o;r++)n[r].classList.add("copyHighlight")}function ro(t){for(var e=t.parentNode.getElementsByClassName("copyHighlight"),n=0;n{const e=t.trigger.querySelector(".bi").firstElementChild,n="http://www.w3.org/1999/xlink",i=e.getAttributeNS(n,"href"),o=t.trigger.title;t.clearSelection(),e.setAttributeNS(n,"href",i.replace("clipboard","check2")),setTimeout(()=>{e.setAttributeNS(n,"href",i),t.trigger.title=o},2e3)}),no.on("error",t=>{/mac/i.test(navigator.userAgent)}),window.onload=function(){for(var t=document.getElementsByClassName("bd-clipboard"),e=0;e 1 && arguments[1] !== undefined ? arguments[1] : {\n container: document.body\n };\n var selectedText = '';\n\n if (typeof target === 'string') {\n selectedText = fakeCopyAction(target, options);\n } else if (target instanceof HTMLInputElement && !['text', 'search', 'url', 'tel', 'password'].includes(target === null || target === void 0 ? void 0 : target.type)) {\n // If input type doesn't support `setSelectionRange`. Simulate it. https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange\n selectedText = fakeCopyAction(target.value, options);\n } else {\n selectedText = select_default()(target);\n command('copy');\n }\n\n return selectedText;\n};\n\n/* harmony default export */ var actions_copy = (ClipboardActionCopy);\n;// CONCATENATED MODULE: ./src/actions/default.js\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n\n\n/**\n * Inner function which performs selection from either `text` or `target`\n * properties and then executes copy or cut operations.\n * @param {Object} options\n */\n\nvar ClipboardActionDefault = function ClipboardActionDefault() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n // Defines base properties passed from constructor.\n var _options$action = options.action,\n action = _options$action === void 0 ? 'copy' : _options$action,\n container = options.container,\n target = options.target,\n text = options.text; // Sets the `action` to be performed which can be either 'copy' or 'cut'.\n\n if (action !== 'copy' && action !== 'cut') {\n throw new Error('Invalid \"action\" value, use either \"copy\" or \"cut\"');\n } // Sets the `target` property using an element that will be have its content copied.\n\n\n if (target !== undefined) {\n if (target && _typeof(target) === 'object' && target.nodeType === 1) {\n if (action === 'copy' && target.hasAttribute('disabled')) {\n throw new Error('Invalid \"target\" attribute. Please use \"readonly\" instead of \"disabled\" attribute');\n }\n\n if (action === 'cut' && (target.hasAttribute('readonly') || target.hasAttribute('disabled'))) {\n throw new Error('Invalid \"target\" attribute. You can\\'t cut text from elements with \"readonly\" or \"disabled\" attributes');\n }\n } else {\n throw new Error('Invalid \"target\" value, use a valid Element');\n }\n } // Define selection strategy based on `text` property.\n\n\n if (text) {\n return actions_copy(text, {\n container: container\n });\n } // Defines which selection strategy based on `target` property.\n\n\n if (target) {\n return action === 'cut' ? actions_cut(target) : actions_copy(target, {\n container: container\n });\n }\n};\n\n/* harmony default export */ var actions_default = (ClipboardActionDefault);\n;// CONCATENATED MODULE: ./src/clipboard.js\nfunction clipboard_typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { clipboard_typeof = function _typeof(obj) { return typeof obj; }; } else { clipboard_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return clipboard_typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (clipboard_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\n\n\n\n\n/**\n * Helper function to retrieve attribute value.\n * @param {String} suffix\n * @param {Element} element\n */\n\nfunction getAttributeValue(suffix, element) {\n var attribute = \"data-clipboard-\".concat(suffix);\n\n if (!element.hasAttribute(attribute)) {\n return;\n }\n\n return element.getAttribute(attribute);\n}\n/**\n * Base class which takes one or more elements, adds event listeners to them,\n * and instantiates a new `ClipboardAction` on each click.\n */\n\n\nvar Clipboard = /*#__PURE__*/function (_Emitter) {\n _inherits(Clipboard, _Emitter);\n\n var _super = _createSuper(Clipboard);\n\n /**\n * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n * @param {Object} options\n */\n function Clipboard(trigger, options) {\n var _this;\n\n _classCallCheck(this, Clipboard);\n\n _this = _super.call(this);\n\n _this.resolveOptions(options);\n\n _this.listenClick(trigger);\n\n return _this;\n }\n /**\n * Defines if attributes would be resolved using internal setter functions\n * or custom functions that were passed in the constructor.\n * @param {Object} options\n */\n\n\n _createClass(Clipboard, [{\n key: \"resolveOptions\",\n value: function resolveOptions() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n this.action = typeof options.action === 'function' ? options.action : this.defaultAction;\n this.target = typeof options.target === 'function' ? options.target : this.defaultTarget;\n this.text = typeof options.text === 'function' ? options.text : this.defaultText;\n this.container = clipboard_typeof(options.container) === 'object' ? options.container : document.body;\n }\n /**\n * Adds a click event listener to the passed trigger.\n * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n */\n\n }, {\n key: \"listenClick\",\n value: function listenClick(trigger) {\n var _this2 = this;\n\n this.listener = listen_default()(trigger, 'click', function (e) {\n return _this2.onClick(e);\n });\n }\n /**\n * Defines a new `ClipboardAction` on each click event.\n * @param {Event} e\n */\n\n }, {\n key: \"onClick\",\n value: function onClick(e) {\n var trigger = e.delegateTarget || e.currentTarget;\n var action = this.action(trigger) || 'copy';\n var text = actions_default({\n action: action,\n container: this.container,\n target: this.target(trigger),\n text: this.text(trigger)\n }); // Fires an event based on the copy operation result.\n\n this.emit(text ? 'success' : 'error', {\n action: action,\n text: text,\n trigger: trigger,\n clearSelection: function clearSelection() {\n if (trigger) {\n trigger.focus();\n }\n\n window.getSelection().removeAllRanges();\n }\n });\n }\n /**\n * Default `action` lookup function.\n * @param {Element} trigger\n */\n\n }, {\n key: \"defaultAction\",\n value: function defaultAction(trigger) {\n return getAttributeValue('action', trigger);\n }\n /**\n * Default `target` lookup function.\n * @param {Element} trigger\n */\n\n }, {\n key: \"defaultTarget\",\n value: function defaultTarget(trigger) {\n var selector = getAttributeValue('target', trigger);\n\n if (selector) {\n return document.querySelector(selector);\n }\n }\n /**\n * Allow fire programmatically a copy action\n * @param {String|HTMLElement} target\n * @param {Object} options\n * @returns Text copied.\n */\n\n }, {\n key: \"defaultText\",\n\n /**\n * Default `text` lookup function.\n * @param {Element} trigger\n */\n value: function defaultText(trigger) {\n return getAttributeValue('text', trigger);\n }\n /**\n * Destroy lifecycle.\n */\n\n }, {\n key: \"destroy\",\n value: function destroy() {\n this.listener.destroy();\n }\n }], [{\n key: \"copy\",\n value: function copy(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n container: document.body\n };\n return actions_copy(target, options);\n }\n /**\n * Allow fire programmatically a cut action\n * @param {String|HTMLElement} target\n * @returns Text cutted.\n */\n\n }, {\n key: \"cut\",\n value: function cut(target) {\n return actions_cut(target);\n }\n /**\n * Returns the support of the given action, or all actions if no action is\n * given.\n * @param {String} [action]\n */\n\n }, {\n key: \"isSupported\",\n value: function isSupported() {\n var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['copy', 'cut'];\n var actions = typeof action === 'string' ? [action] : action;\n var support = !!document.queryCommandSupported;\n actions.forEach(function (action) {\n support = support && !!document.queryCommandSupported(action);\n });\n return support;\n }\n }]);\n\n return Clipboard;\n}((tiny_emitter_default()));\n\n/* harmony default export */ var clipboard = (Clipboard);\n\n/***/ }),\n\n/***/ 828:\n/***/ (function(module) {\n\nvar DOCUMENT_NODE_TYPE = 9;\n\n/**\n * A polyfill for Element.matches()\n */\nif (typeof Element !== 'undefined' && !Element.prototype.matches) {\n var proto = Element.prototype;\n\n proto.matches = proto.matchesSelector ||\n proto.mozMatchesSelector ||\n proto.msMatchesSelector ||\n proto.oMatchesSelector ||\n proto.webkitMatchesSelector;\n}\n\n/**\n * Finds the closest parent that matches a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @return {Function}\n */\nfunction closest (element, selector) {\n while (element && element.nodeType !== DOCUMENT_NODE_TYPE) {\n if (typeof element.matches === 'function' &&\n element.matches(selector)) {\n return element;\n }\n element = element.parentNode;\n }\n}\n\nmodule.exports = closest;\n\n\n/***/ }),\n\n/***/ 438:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nvar closest = __webpack_require__(828);\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction _delegate(element, selector, type, callback, useCapture) {\n var listenerFn = listener.apply(this, arguments);\n\n element.addEventListener(type, listenerFn, useCapture);\n\n return {\n destroy: function() {\n element.removeEventListener(type, listenerFn, useCapture);\n }\n }\n}\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element|String|Array} [elements]\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction delegate(elements, selector, type, callback, useCapture) {\n // Handle the regular Element usage\n if (typeof elements.addEventListener === 'function') {\n return _delegate.apply(null, arguments);\n }\n\n // Handle Element-less usage, it defaults to global delegation\n if (typeof type === 'function') {\n // Use `document` as the first parameter, then apply arguments\n // This is a short way to .unshift `arguments` without running into deoptimizations\n return _delegate.bind(null, document).apply(null, arguments);\n }\n\n // Handle Selector-based usage\n if (typeof elements === 'string') {\n elements = document.querySelectorAll(elements);\n }\n\n // Handle Array-like based usage\n return Array.prototype.map.call(elements, function (element) {\n return _delegate(element, selector, type, callback, useCapture);\n });\n}\n\n/**\n * Finds closest match and invokes callback.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Function}\n */\nfunction listener(element, selector, type, callback) {\n return function(e) {\n e.delegateTarget = closest(e.target, selector);\n\n if (e.delegateTarget) {\n callback.call(element, e);\n }\n }\n}\n\nmodule.exports = delegate;\n\n\n/***/ }),\n\n/***/ 879:\n/***/ (function(__unused_webpack_module, exports) {\n\n/**\n * Check if argument is a HTML element.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.node = function(value) {\n return value !== undefined\n && value instanceof HTMLElement\n && value.nodeType === 1;\n};\n\n/**\n * Check if argument is a list of HTML elements.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.nodeList = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return value !== undefined\n && (type === '[object NodeList]' || type === '[object HTMLCollection]')\n && ('length' in value)\n && (value.length === 0 || exports.node(value[0]));\n};\n\n/**\n * Check if argument is a string.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.string = function(value) {\n return typeof value === 'string'\n || value instanceof String;\n};\n\n/**\n * Check if argument is a function.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.fn = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return type === '[object Function]';\n};\n\n\n/***/ }),\n\n/***/ 370:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nvar is = __webpack_require__(879);\nvar delegate = __webpack_require__(438);\n\n/**\n * Validates all params and calls the right\n * listener function based on its target type.\n *\n * @param {String|HTMLElement|HTMLCollection|NodeList} target\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listen(target, type, callback) {\n if (!target && !type && !callback) {\n throw new Error('Missing required arguments');\n }\n\n if (!is.string(type)) {\n throw new TypeError('Second argument must be a String');\n }\n\n if (!is.fn(callback)) {\n throw new TypeError('Third argument must be a Function');\n }\n\n if (is.node(target)) {\n return listenNode(target, type, callback);\n }\n else if (is.nodeList(target)) {\n return listenNodeList(target, type, callback);\n }\n else if (is.string(target)) {\n return listenSelector(target, type, callback);\n }\n else {\n throw new TypeError('First argument must be a String, HTMLElement, HTMLCollection, or NodeList');\n }\n}\n\n/**\n * Adds an event listener to a HTML element\n * and returns a remove listener function.\n *\n * @param {HTMLElement} node\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNode(node, type, callback) {\n node.addEventListener(type, callback);\n\n return {\n destroy: function() {\n node.removeEventListener(type, callback);\n }\n }\n}\n\n/**\n * Add an event listener to a list of HTML elements\n * and returns a remove listener function.\n *\n * @param {NodeList|HTMLCollection} nodeList\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNodeList(nodeList, type, callback) {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.addEventListener(type, callback);\n });\n\n return {\n destroy: function() {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.removeEventListener(type, callback);\n });\n }\n }\n}\n\n/**\n * Add an event listener to a selector\n * and returns a remove listener function.\n *\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenSelector(selector, type, callback) {\n return delegate(document.body, selector, type, callback);\n}\n\nmodule.exports = listen;\n\n\n/***/ }),\n\n/***/ 817:\n/***/ (function(module) {\n\nfunction select(element) {\n var selectedText;\n\n if (element.nodeName === 'SELECT') {\n element.focus();\n\n selectedText = element.value;\n }\n else if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {\n var isReadOnly = element.hasAttribute('readonly');\n\n if (!isReadOnly) {\n element.setAttribute('readonly', '');\n }\n\n element.select();\n element.setSelectionRange(0, element.value.length);\n\n if (!isReadOnly) {\n element.removeAttribute('readonly');\n }\n\n selectedText = element.value;\n }\n else {\n if (element.hasAttribute('contenteditable')) {\n element.focus();\n }\n\n var selection = window.getSelection();\n var range = document.createRange();\n\n range.selectNodeContents(element);\n selection.removeAllRanges();\n selection.addRange(range);\n\n selectedText = selection.toString();\n }\n\n return selectedText;\n}\n\nmodule.exports = select;\n\n\n/***/ }),\n\n/***/ 279:\n/***/ (function(module) {\n\nfunction E () {\n // Keep this empty so it's easier to inherit from\n // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)\n}\n\nE.prototype = {\n on: function (name, callback, ctx) {\n var e = this.e || (this.e = {});\n\n (e[name] || (e[name] = [])).push({\n fn: callback,\n ctx: ctx\n });\n\n return this;\n },\n\n once: function (name, callback, ctx) {\n var self = this;\n function listener () {\n self.off(name, listener);\n callback.apply(ctx, arguments);\n };\n\n listener._ = callback\n return this.on(name, listener, ctx);\n },\n\n emit: function (name) {\n var data = [].slice.call(arguments, 1);\n var evtArr = ((this.e || (this.e = {}))[name] || []).slice();\n var i = 0;\n var len = evtArr.length;\n\n for (i; i < len; i++) {\n evtArr[i].fn.apply(evtArr[i].ctx, data);\n }\n\n return this;\n },\n\n off: function (name, callback) {\n var e = this.e || (this.e = {});\n var evts = e[name];\n var liveEvents = [];\n\n if (evts && callback) {\n for (var i = 0, len = evts.length; i < len; i++) {\n if (evts[i].fn !== callback && evts[i].fn._ !== callback)\n liveEvents.push(evts[i]);\n }\n }\n\n // Remove event from queue to prevent memory leak\n // Suggested by https://github.com/lazd\n // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910\n\n (liveEvents.length)\n ? e[name] = liveEvents\n : delete e[name];\n\n return this;\n }\n};\n\nmodule.exports = E;\nmodule.exports.TinyEmitter = E;\n\n\n/***/ })\n\n/******/ \t});\n/************************************************************************/\n/******/ \t// The module cache\n/******/ \tvar __webpack_module_cache__ = {};\n/******/ \t\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(__webpack_module_cache__[moduleId]) {\n/******/ \t\t\treturn __webpack_module_cache__[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t\t// no module.id needed\n/******/ \t\t\t// no module.loaded needed\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/ \t\n/******/ \t\t// Execute the module function\n/******/ \t\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n/******/ \t\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/ \t\n/************************************************************************/\n/******/ \t/* webpack/runtime/compat get default export */\n/******/ \t!function() {\n/******/ \t\t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t\t__webpack_require__.n = function(module) {\n/******/ \t\t\tvar getter = module && module.__esModule ?\n/******/ \t\t\t\tfunction() { return module['default']; } :\n/******/ \t\t\t\tfunction() { return module; };\n/******/ \t\t\t__webpack_require__.d(getter, { a: getter });\n/******/ \t\t\treturn getter;\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/define property getters */\n/******/ \t!function() {\n/******/ \t\t// define getter functions for harmony exports\n/******/ \t\t__webpack_require__.d = function(exports, definition) {\n/******/ \t\t\tfor(var key in definition) {\n/******/ \t\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n/******/ \t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/hasOwnProperty shorthand */\n/******/ \t!function() {\n/******/ \t\t__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }\n/******/ \t}();\n/******/ \t\n/************************************************************************/\n/******/ \t// module exports must be returned from runtime so entry inlining is disabled\n/******/ \t// startup\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(686);\n/******/ })()\n.default;\n});","/*! instant.page v5.2.0 - (C) 2019-2023 Alexandre Dieulot - https://instant.page/license */\n\nlet _chromiumMajorVersionInUserAgent = null\n , _allowQueryString\n , _allowExternalLinks\n , _useWhitelist\n , _delayOnHover = 65\n , _lastTouchTimestamp\n , _mouseoverTimer\n , _preloadedList = new Set()\n\nconst DELAY_TO_NOT_BE_CONSIDERED_A_TOUCH_INITIATED_ACTION = 1111\n\ninit()\n\nfunction init() {\n const isSupported = document.createElement('link').relList.supports('prefetch')\n // instant.page is meant to be loaded with - -{{ else }} - {{ partial "single-list" . }} -{{ end }} -{{ end }} diff --git a/docs/themes/geekboot/layouts/_default/list.md b/docs/themes/geekboot/layouts/_default/list.md deleted file mode 100644 index 23be93b7e..000000000 --- a/docs/themes/geekboot/layouts/_default/list.md +++ /dev/null @@ -1,5 +0,0 @@ -{{- /* Raw-Markdown rendering of a section landing page, served at section/index.md. */ -}} -{{- printf "# %s\n\n" .Title -}} -{{- with .Description }}{{ printf "%s\n\n" . }}{{ end -}} -{{- with .OutputFormats.Get "html" }}{{ printf "Source: %s\n\n" .Permalink }}{{ end -}} -{{- .RawContent -}} diff --git a/docs/themes/geekboot/layouts/_default/redirect.html b/docs/themes/geekboot/layouts/_default/redirect.html deleted file mode 100644 index f98697ccb..000000000 --- a/docs/themes/geekboot/layouts/_default/redirect.html +++ /dev/null @@ -1,5 +0,0 @@ -{{ if .Params.docs_root }} -{{ partial "redirect" (dict "dest" (printf "/v%s/" (string .Site.Params.latest) ) ) }} -{{ else }} -{{ partial "redirect" (dict "dest" .Params.to) }} -{{ end }} diff --git a/docs/themes/geekboot/layouts/_default/section.rss.xml b/docs/themes/geekboot/layouts/_default/section.rss.xml deleted file mode 100644 index bfacd9384..000000000 --- a/docs/themes/geekboot/layouts/_default/section.rss.xml +++ /dev/null @@ -1,39 +0,0 @@ -{{/* Based on default Hugo RSS template. https://github.com/gohugoio/hugo/blob/master/tpl/tplimpl/embedded/templates/_default/rss.xml */}} - -{{- $pctx := . }} - -{{- $pages := slice }} -{{- if or $.IsHome $.IsSection }} - {{- $pages = $pctx.RegularPages }} -{{- else }} - {{- $pages = $pctx.Pages }} -{{- end }} - -{{- $limit := .Site.Config.Services.RSS.Limit }} -{{- if ge $limit 1 }} -{{- $pages = $pages | first $limit }} -{{- end }} - -{{- printf "" | safeHTML }} - - - {{ if eq .Title .Site.Title }}{{ .Site.Title }}{{ else }}{{ with .Title }}{{ . }} on {{ end }}{{ .Site.Title }}{{ end }} - {{ .Permalink }} - Recent content {{ if ne .Title .Site.Title }}{{ with .Title }}in {{ . }} {{ end }}{{ end }}on {{ .Site.Title }} - Hugo -- gohugo.io - {{ site.Language.Locale }} - {{ .Date.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }} - {{- with .OutputFormats.Get "RSS" }} - {{ printf "" .Permalink .MediaType | safeHTML }} - {{- end }} - {{- range $pages }} - - {{ .Title }} - {{ .Permalink }} - {{ .Page.Params.released | safeHTML }} - {{ .Permalink }} - {{ .Summary | transform.HTMLEscape | safeHTML }} - - {{- end }} - - \ No newline at end of file diff --git a/docs/themes/geekboot/layouts/_default/single.html b/docs/themes/geekboot/layouts/_default/single.html deleted file mode 100644 index 6bd4c7bfe..000000000 --- a/docs/themes/geekboot/layouts/_default/single.html +++ /dev/null @@ -1,3 +0,0 @@ -{{ define "main" }} -{{ partial "single-list" . }} -{{ end }} \ No newline at end of file diff --git a/docs/themes/geekboot/layouts/_default/single.md b/docs/themes/geekboot/layouts/_default/single.md deleted file mode 100644 index b38938453..000000000 --- a/docs/themes/geekboot/layouts/_default/single.md +++ /dev/null @@ -1,11 +0,0 @@ -{{- /* Raw-Markdown rendering of a docs page, served at page/index.md. - Powers the "View as Markdown" action and feeds the docs MCP server. - Normal pages use .RawContent (verbatim source); reference pages, generated - from the CRD schema, render via the markdown-body partial, which also emits - the lead description. */ -}} -{{- printf "# %s\n\n" .Title -}} -{{- if ne .Params.product "crd" }}{{ with .Description }}{{ printf "%s\n\n" . }}{{ end }}{{ end -}} -{{- with .OutputFormats.Get "html" }}{{ printf "Source: %s\n\n" .Permalink }}{{ end -}} -{{- /* Partials render through html/template, which escapes the body; htmlUnescape - recovers the verbatim Markdown for this plain-text output. */ -}} -{{- partial "markdown-body.txt" . | htmlUnescape -}} diff --git a/docs/themes/geekboot/layouts/_default/sitemap.xml b/docs/themes/geekboot/layouts/_default/sitemap.xml deleted file mode 100644 index a0020100f..000000000 --- a/docs/themes/geekboot/layouts/_default/sitemap.xml +++ /dev/null @@ -1,10 +0,0 @@ -{{ printf "" | safeHTML }} - - {{ range where .Site.Pages ".Params.searchExclude" "ne" "true" }} - - {{ .Permalink }}{{ if not .Lastmod.IsZero }} - {{ safeHTML ( .Lastmod.Format "2006-01-02T15:04:05-07:00" ) }}{{ end }} - - {{ end }} - \ No newline at end of file diff --git a/docs/themes/geekboot/layouts/_default/term.html b/docs/themes/geekboot/layouts/_default/term.html deleted file mode 100644 index eece0e477..000000000 --- a/docs/themes/geekboot/layouts/_default/term.html +++ /dev/null @@ -1,105 +0,0 @@ -{{/* - Taxonomy term pages (/recipes/vendor/qwen/, /recipes/cloud/nebius/): the - browse targets behind the catalog cards. The default list.html would - JS-redirect a contentless list to its first child, so terms need their own - template. Same chrome as single-list.html, minimal body: no toc, no - copy-page tools (term pages have no markdown output), one row per recipe. -*/}} -{{ define "main" }} -{{ $ref := .Site.GetPage "/reference" }} -{{ $rec := .Site.GetPage "/recipes" }} -{{ $guides := .Site.GetPage "/guides" }} -
- - -
- {{ $hasVersions := hugo.Data.versions.versions }} - {{ if or $ref $hasVersions }} -
- {{ if $ref }} - - {{ end }} - {{ if $hasVersions }} -
- {{ partial "version-dropdown-menu" . }} -
- {{ end }} -
- {{ end }} -
-
-
- {{/* Look up the term's brand entry (vendors match on name, clouds on - the term slug) so vendor and cloud pages get their logo tile; - other taxonomies fall back to a plain title. */}} - {{ $entry := dict "name" .Title }} - {{ $found := false }} - {{ if eq .Data.Plural "vendors" }} - {{ range hugo.Data.recipes.vendors }}{{ if eq .name $.Title }}{{ $entry = . }}{{ $found = true }}{{ end }}{{ end }} - {{ else if eq .Data.Plural "clouds" }} - {{ range hugo.Data.recipes.clouds }}{{ if eq .term $.Title }}{{ $entry = . }}{{ $found = true }}{{ end }}{{ end }} - {{ end }} - {{ $recipeCount := len .Pages }} -
- {{ if $found }}{{ partial "brand-tile" (dict "entry" $entry "class" "mp-brand-tile--lg") }}{{ end }} -
-

{{ $entry.name }}{{ if and $found (eq .Data.Plural "clouds") (ne $entry.name .Title) }} {{ .Title }}{{ end }}

-
- {{ with $entry.org }}{{ . }}·{{ end }} - {{ $recipeCount }} recipe{{ if ne $recipeCount 1 }}s{{ end }} - {{ with $entry.org }} - · - Hugging Face {{ partial "ai-ext-arrow.html" }} - {{ end }} -
-
-
-
-
-
-
-
- {{ range .Pages.ByWeight }} - {{ partial "recipe-row" . }} - {{ end }} -
-
-
-
- {{ partial "footer" . }} -
-
-{{ end }} diff --git a/docs/themes/geekboot/layouts/index.html b/docs/themes/geekboot/layouts/index.html deleted file mode 100644 index 8b3e9bb7a..000000000 --- a/docs/themes/geekboot/layouts/index.html +++ /dev/null @@ -1,10 +0,0 @@ -{{ define "main" }} -{{/* Every build serves its content directly. The canonical apex - (docs.modelplane.ai) is the latest release's own build, main.docs.modelplane.ai - is the dev build, and each vX-Y.docs.modelplane.ai is an archived release — - the Vercel project and baseURL decide which, so the home page never - redirects. See RELEASING.md § Versioning the docs. */}} -{{ with .Site.GetPage "/overview" }} -{{ partial "single-list" . }} -{{ end }} -{{ end }} diff --git a/docs/themes/geekboot/layouts/partials/ai-ext-arrow.html b/docs/themes/geekboot/layouts/partials/ai-ext-arrow.html deleted file mode 100644 index 8a96ae9f5..000000000 --- a/docs/themes/geekboot/layouts/partials/ai-ext-arrow.html +++ /dev/null @@ -1,2 +0,0 @@ -{{- /* Small up-right arrow marking a menu item that leaves the page. */ -}} - diff --git a/docs/themes/geekboot/layouts/partials/analytics-config.html b/docs/themes/geekboot/layouts/partials/analytics-config.html deleted file mode 100644 index 9c22507b0..000000000 --- a/docs/themes/geekboot/layouts/partials/analytics-config.html +++ /dev/null @@ -1,23 +0,0 @@ -{{ if strings.Contains site.BaseURL "docs.modelplane.ai" }} - - - - - -{{ end }} diff --git a/docs/themes/geekboot/layouts/partials/analytics.html b/docs/themes/geekboot/layouts/partials/analytics.html deleted file mode 100644 index fc476146a..000000000 --- a/docs/themes/geekboot/layouts/partials/analytics.html +++ /dev/null @@ -1 +0,0 @@ -{{ partialCached "analytics-config" . }} \ No newline at end of file diff --git a/docs/themes/geekboot/layouts/partials/apiBuilder/GKVHeader.html b/docs/themes/geekboot/layouts/partials/apiBuilder/GKVHeader.html deleted file mode 100644 index 1f4bc50aa..000000000 --- a/docs/themes/geekboot/layouts/partials/apiBuilder/GKVHeader.html +++ /dev/null @@ -1,20 +0,0 @@ -{{/* Print the page header with the sort buttons */}} - -
-
- Kind - - -
-
- Group/Version - - -
- - -
\ No newline at end of file diff --git a/docs/themes/geekboot/layouts/partials/apiBuilder/backToTopButton.html b/docs/themes/geekboot/layouts/partials/apiBuilder/backToTopButton.html deleted file mode 100644 index b3a7ea661..000000000 --- a/docs/themes/geekboot/layouts/partials/apiBuilder/backToTopButton.html +++ /dev/null @@ -1,7 +0,0 @@ -{{/* HTML to create a "back to top" link */}} - \ No newline at end of file diff --git a/docs/themes/geekboot/layouts/partials/apiBuilder/checkBigName.html b/docs/themes/geekboot/layouts/partials/apiBuilder/checkBigName.html deleted file mode 100644 index 31600f709..000000000 --- a/docs/themes/geekboot/layouts/partials/apiBuilder/checkBigName.html +++ /dev/null @@ -1,3 +0,0 @@ -{{/* Return True/False if the input is greater than 32 */}} -{{/* The value 32 is max length of a Kind before it overflows */}} -{{ return gt (len .) 32}} \ No newline at end of file diff --git a/docs/themes/geekboot/layouts/partials/apiBuilder/collectTypes.html b/docs/themes/geekboot/layouts/partials/apiBuilder/collectTypes.html deleted file mode 100644 index 1cc064628..000000000 --- a/docs/themes/geekboot/layouts/partials/apiBuilder/collectTypes.html +++ /dev/null @@ -1,32 +0,0 @@ -{{/* - Walks an object's properties (depth-first) and records every promoted type it - reaches into the passed-in scratch, deduped by name and kept in first-reference - order. crd-single uses this to know which named sections to render. - - Scratch keys: "order" (ordered, unique slice of type names) and "nodes" (map - name → {props, required, desc}). - - Parameters: props (properties map), path (dotted path), kind (CRD kind), - scratch (newScratch) -*/}} -{{ $s := .scratch }} -{{ $path := .path }} -{{ $kind := .kind }} -{{ range $k, $v := .props }} - {{ $childPath := printf "%s.%s" $path $k }} - {{ $f := partial "apiBuilder/getSpecFields" $v }} - {{ $props := $f.properties }} - {{ if $props }} - {{ $promoted := partial "apiBuilder/promotedType" (dict "path" $childPath "kind" $kind) }} - {{ if $promoted }} - {{ $name := $promoted.name }} - {{ if not (in ($s.Get "order") $name) }} - {{ $s.Add "order" (slice $name) }} - {{ $s.SetInMap "nodes" $name (dict - "props" $props "required" $f.required "path" $childPath - "desc" (or $f.description $promoted.description)) }} - {{ end }} - {{ end }} - {{ partial "apiBuilder/collectTypes" (dict "props" $props "path" $childPath "kind" $kind "scratch" $s) }} - {{ end }} -{{ end }} diff --git a/docs/themes/geekboot/layouts/partials/apiBuilder/downloadLink.html b/docs/themes/geekboot/layouts/partials/apiBuilder/downloadLink.html deleted file mode 100644 index 96a963b7c..000000000 --- a/docs/themes/geekboot/layouts/partials/apiBuilder/downloadLink.html +++ /dev/null @@ -1,16 +0,0 @@ -{{/* Generate the proper HTML for the link to download the YAML file of the CRD */}} -{{ $bigName := partial "apiBuilder/checkBigName" .kind }} - -{{ if $bigName }} - {{/* BigNames hide the group and version. This prints the group/version on the same row as the download link */}} -
- -
{{.group}}/{{.version}}
- - -
-{{ else }} - -{{ end }} -{{/* If it's mobile view we don't show the download link and instead only show the group/version */}} -
{{.group}}/{{.version}}
diff --git a/docs/themes/geekboot/layouts/partials/apiBuilder/enumHandler.html b/docs/themes/geekboot/layouts/partials/apiBuilder/enumHandler.html deleted file mode 100644 index 2717795fa..000000000 --- a/docs/themes/geekboot/layouts/partials/apiBuilder/enumHandler.html +++ /dev/null @@ -1,22 +0,0 @@ -{{/* - Renders an enum / type-union as a single pill, e.g. - enum: Standalone | Leader | Worker - one of: integer | string - Replaces the plain type badge in field.html when the field is an enum. -*/}} -{{ $label := "enum" }} -{{ $vals := slice }} -{{ if .enum }} - {{ $label = "enum" }} - {{ range .enum }}{{ $vals = $vals | append (printf "%v" .) }}{{ end }} -{{ else if .oneOf }} - {{ $label = "one of" }} - {{ range .oneOf }}{{ $vals = $vals | append .type }}{{ end }} -{{ else if .anyOf }} - {{ $label = "any of" }} - {{ range .anyOf }}{{ $vals = $vals | append .type }}{{ end }} -{{ else if .allOf }} - {{ $label = "all of" }} - {{ range .allOf }}{{ $vals = $vals | append .type }}{{ end }} -{{ end }} -{{ $label }}: {{ delimit $vals " | " }} diff --git a/docs/themes/geekboot/layouts/partials/apiBuilder/field.html b/docs/themes/geekboot/layouts/partials/apiBuilder/field.html deleted file mode 100644 index fe76995b2..000000000 --- a/docs/themes/geekboot/layouts/partials/apiBuilder/field.html +++ /dev/null @@ -1,82 +0,0 @@ -{{/* - Renders one schema field as an .api-field row: - - a promoted object (matchSuffix in promotedTypes) → a typed reference link - (`Name[] →` → `#Name`); its fields live in that named section, not here; - - any other object → its type badge plus its children inline, indented - (recursing — a nested object may itself be promoted and become a ref); - - scalars/maps/enums → a leaf row. - Numeric / item / length bounds render as range pills; default as a pill; - format / pattern in a small meta line. - - Parameters: key, contents, path (parent dotted path), kind (CRD kind), required (bool) -*/}} - -{{ $c := .contents }} -{{ $kind := .kind }} -{{ $items := index $c "items" }} -{{ $fieldPath := printf "%s.%s" .path .key }} -{{ $fields := partial "apiBuilder/getSpecFields" $c }} -{{ $isEnum := partial "apiBuilder/isEnum" $c }} -{{ $props := $fields.properties }} -{{ $desc := $fields.description }} -{{ $default := index $c "default" }} -{{ $isArray := eq (index $c "type") "array" }} -{{ $promoted := and $props (partial "apiBuilder/promotedType" (dict "path" $fieldPath "kind" $kind)) }} -{{/* Inline (and recurse) only non-promoted, non-enum objects. */}} -{{ $inline := and $props (not $promoted) (not $isEnum) }} - -{{/* Range bounds. Length bounds fall back to array items (e.g. []string). */}} -{{ $numMin := index $c "minimum" }}{{ $numMax := index $c "maximum" }} -{{ $itMin := index $c "minItems" }}{{ $itMax := index $c "maxItems" }} -{{ $lenMin := index $c "minLength" }}{{ $lenMax := index $c "maxLength" }} -{{ if $items }} - {{ if not $lenMin }}{{ $lenMin = index $items "minLength" }}{{ end }} - {{ if not $lenMax }}{{ $lenMax = index $items "maxLength" }}{{ end }} -{{ end }} - -{{/* format / pattern as a small meta line (rarely present). */}} -{{ $meta := slice }} -{{ range $node := (slice $c $items) }} - {{ with $node }} - {{ with index . "format" }}{{ $meta = $meta | append (printf "format: %v" .) }}{{ end }} - {{ with index . "pattern" }}{{ $meta = $meta | append (printf "pattern: %v" .) }}{{ end }} - {{ end }} -{{ end }} - -
-
- # - {{ .key }} - - {{/* required/optional, then type (enum / promoted-ref aware), then constraints, then default. */}} - {{ if .required }}required{{ else }}optional{{ end }} - {{ if $isEnum }} - {{ partial "apiBuilder/enumHandler" $c }} - {{ else if $promoted }} - {{ $promoted.name }}{{ if $isArray }}[]{{ end }} → - {{ else }} - {{ $fields.dataType }} - {{ end }} - {{ if or $numMin $numMax }}{{ if and $numMin $numMax }}{{ $numMin }}–{{ $numMax }}{{ else if $numMin }}≥ {{ $numMin }}{{ else }}≤ {{ $numMax }}{{ end }}{{ end }} - {{ if or $itMin $itMax }}{{ if and $itMin $itMax }}{{ $itMin }}–{{ $itMax }}{{ else if $itMin }}≥ {{ $itMin }}{{ else }}≤ {{ $itMax }}{{ end }} items{{ end }} - {{ if or $lenMin $lenMax }}{{ if and $lenMin $lenMax }}{{ $lenMin }}–{{ $lenMax }}{{ else if $lenMin }}≥ {{ $lenMin }}{{ else }}≤ {{ $lenMax }}{{ end }} chars{{ end }} - {{ with $default }}default: {{ . }}{{ end }} - -
- - {{ if or $desc $meta }} -
- {{ with $desc }}

{{ . | markdownify }}

{{ end }} - {{ with $meta }}

{{ delimit . " · " }}

{{ end }} -
- {{ end }} - - {{ if $inline }} -
- {{ $req := $fields.required }} - {{ range $k, $v := $props }} - {{ partial "apiBuilder/field" (dict "key" $k "contents" $v "path" $fieldPath "kind" $kind "required" (in $req $k)) }} - {{ end }} -
- {{ end }} -
diff --git a/docs/themes/geekboot/layouts/partials/apiBuilder/fieldList.html b/docs/themes/geekboot/layouts/partials/apiBuilder/fieldList.html deleted file mode 100644 index 167b332aa..000000000 --- a/docs/themes/geekboot/layouts/partials/apiBuilder/fieldList.html +++ /dev/null @@ -1,15 +0,0 @@ -{{/* - Renders an object's immediate fields as .api-field rows (apiBuilder/field). - Used for the Spec/Status sections and each promoted-type section. - - Parameters: props (properties map), required (list), path (dotted path root), - kind (CRD kind) -*/}} -
- {{ $req := .required }} - {{ $path := .path }} - {{ $kind := .kind }} - {{ range $key, $val := .props }} - {{ partial "apiBuilder/field" (dict "key" $key "contents" $val "path" $path "kind" $kind "required" (in $req $key)) }} - {{ end }} -
diff --git a/docs/themes/geekboot/layouts/partials/apiBuilder/getSpecFields.html b/docs/themes/geekboot/layouts/partials/apiBuilder/getSpecFields.html deleted file mode 100644 index b90dd3c4f..000000000 --- a/docs/themes/geekboot/layouts/partials/apiBuilder/getSpecFields.html +++ /dev/null @@ -1,36 +0,0 @@ -{{/* Process elements of a spec and pull out the important parts. */}} -{{/* Mainly handles the exception case for array items */}} - -{{ $dataTypeStyle := .type }} -{{ $dataType := .type }} -{{ $description := .description }} -{{ $properties := .properties }} -{{ $required := .required }} - -{{/* Special handling for arrays to check if it's a list of 'items' */}} -{{ if eq .type "array" }} - {{ if .items }} - {{ $dataType = (printf "%s[]" .items.type) }} - {{ $dataTypeStyle = .items.type }} - {{ $description = .items.description }} - {{ $properties = .items.properties }} - {{ $required = .items.required }} - {{ else }} - {{ $dataType = (printf "%s[]" .type) }} - {{ end }} -{{ end }} - -{{/* A map (object with additionalProperties and no fixed properties) is a leaf: - show it as map[string] rather than a bare "object". */}} -{{ if and (eq .type "object") (not .properties) .additionalProperties }} - {{ $valType := or (index .additionalProperties "type") "object" }} - {{ $dataType = (printf "map[string]%s" $valType) }} - {{ $dataTypeStyle = "object" }} -{{ end }} - -{{ return (dict - "dataTypeStyle" $dataTypeStyle - "dataType" $dataType - "description" $description - "properties" $properties - "required" $required) }} \ No newline at end of file diff --git a/docs/themes/geekboot/layouts/partials/apiBuilder/getVersionAndSchema.html b/docs/themes/geekboot/layouts/partials/apiBuilder/getVersionAndSchema.html deleted file mode 100644 index 502c592e6..000000000 --- a/docs/themes/geekboot/layouts/partials/apiBuilder/getVersionAndSchema.html +++ /dev/null @@ -1,31 +0,0 @@ -{{/* Pass a schema and find the currently active version and return a dict of (version: , schema: ) */}} -{{ $version := "" }} -{{ $schema := dict }} -{{ $deprecated := false }} - -{{ range .versions }} - {{ if and (index . "storage") (not .deprecated) }} - {{ $version = .name }} - {{ $schema = .schema }} - {{ $deprecated = .deprecated }} - {{ else if and (index . "served") (not .deprecated) (not $version) }} - {{ $version = .name }} - {{ $schema = .schema }} - {{ $deprecated = .deprecated }} - {{ else if and (index . "storage") (not $version) }} - {{ $version = .name }} - {{ $schema = .schema }} - {{ $deprecated = .deprecated }} - {{ else if and (index . "served") (not $version) }} - {{ $version = .name }} - {{ $schema = .schema }} - {{ $deprecated = .deprecated }} - {{ end }} -{{ end }} - -{{ return (dict "version" $version - "schema" $schema - "deprecated" $deprecated) -}} - - diff --git a/docs/themes/geekboot/layouts/partials/apiBuilder/isEnum.html b/docs/themes/geekboot/layouts/partials/apiBuilder/isEnum.html deleted file mode 100644 index 08d1f2a37..000000000 --- a/docs/themes/geekboot/layouts/partials/apiBuilder/isEnum.html +++ /dev/null @@ -1,36 +0,0 @@ -{{/* Hugo partials can't print outputs AND return a value /*}} -{{/* this partial only checks if the contents are an enum and returns true/false */}} -{{ $isEnum := false }} - - -{{/* There are two types of enums */}} -{{/* example: -divisor: - anyOf: - - type: integer - - type: string - description: Specifies the output format of the exposed - resources, defaults to "1" - -defaultCompositeDeletePolicy: -default: Background -description: DefaultCompositeDeletePolicy is the policy used when - deleting the Composite that is associated with the Claim if no policy - has been specified. -enum: -- Background -- Foreground -type: string -*/}} - -{{ if .oneOf }} - {{ $isEnum = true }} -{{ else if .anyOf }} - {{ $isEnum = true }} -{{ else if .allOf }} - {{ $isEnum = true }} -{{ else if .enum }} - {{ $isEnum = true }} -{{ end }} - -{{ return $isEnum }} \ No newline at end of file diff --git a/docs/themes/geekboot/layouts/partials/apiBuilder/parentDescription.html b/docs/themes/geekboot/layouts/partials/apiBuilder/parentDescription.html deleted file mode 100644 index 159616dfd..000000000 --- a/docs/themes/geekboot/layouts/partials/apiBuilder/parentDescription.html +++ /dev/null @@ -1,10 +0,0 @@ -{{/* Print the description for the top level CRD element. */}} -{{ $group := .spec.group }} -{{ $kind := .spec.names.kind }} -{{ $version := .version }} -{{ $bigName := partial "apiBuilder/checkBigName" $kind }} - -{{/* bigName-reset prevents the description from expanding into the x-scroll */}} -
- {{ .description | markdownify}}
- \ No newline at end of file diff --git a/docs/themes/geekboot/layouts/partials/apiBuilder/printGKVExpander.html b/docs/themes/geekboot/layouts/partials/apiBuilder/printGKVExpander.html deleted file mode 100644 index f53d30631..000000000 --- a/docs/themes/geekboot/layouts/partials/apiBuilder/printGKVExpander.html +++ /dev/null @@ -1,30 +0,0 @@ -{{/* Print the CRD top-level expandable row */}} -{{ $group := .group }} -{{ $kind := .kind }} -{{ $version := .version }} -{{ $deprecated := .deprecated }} -{{ $bigName := partial "apiBuilder/checkBigName" $kind }} - -{{/* Collapse/Expand Button and Kind name */}} -
- {{/* Plus/Minus Button */}} - - - {{/* CRD name text */}} - -
- -{{/* If the CRD name is longer than 24 characters hide the other fields, regardless of viewport size */}} -
- {{ $group }}/{{ $version }} -
- - - - diff --git a/docs/themes/geekboot/layouts/partials/apiBuilder/promotedType.html b/docs/themes/geekboot/layouts/partials/apiBuilder/promotedType.html deleted file mode 100644 index e85344a2e..000000000 --- a/docs/themes/geekboot/layouts/partials/apiBuilder/promotedType.html +++ /dev/null @@ -1,17 +0,0 @@ -{{/* - Returns the promoted type ({name, description?}) from - hugo.Data.apigroups.promotedTypes that applies to the current CRD and field - path, or false. An entry matches when the current `kind` is in its `kinds` - list (or it has no `kinds`, meaning any) AND the field's dotted `path` ends - with its `matchSuffix`. - - Parameters: path (dotted field path), kind (current CRD kind) -*/}} -{{ $match := false }} -{{ $kind := .kind }} -{{ $path := .path }} -{{ range hugo.Data.apigroups.promotedTypes }} - {{ $kindOK := or (not .kinds) (in .kinds $kind) }} - {{ if and $kindOK (hasSuffix $path .matchSuffix) }}{{ $match = . }}{{ end }} -{{ end }} -{{ return $match }} diff --git a/docs/themes/geekboot/layouts/partials/apiBuilder/specCollapseButtonEnd.html b/docs/themes/geekboot/layouts/partials/apiBuilder/specCollapseButtonEnd.html deleted file mode 100644 index 1162395ca..000000000 --- a/docs/themes/geekboot/layouts/partials/apiBuilder/specCollapseButtonEnd.html +++ /dev/null @@ -1,9 +0,0 @@ -{{/* Closing tags for specCollapseButtonStart and type anchor link */}} - - - - -{{/* Anchor link icon */}} - - - diff --git a/docs/themes/geekboot/layouts/partials/apiBuilder/specCollapseButtonStart.html b/docs/themes/geekboot/layouts/partials/apiBuilder/specCollapseButtonStart.html deleted file mode 100644 index 8767821a0..000000000 --- a/docs/themes/geekboot/layouts/partials/apiBuilder/specCollapseButtonStart.html +++ /dev/null @@ -1,10 +0,0 @@ -{{/* Print out the beginning part of a CRD spec element */}} - -
- {{/* Plus/Minus Button */}} - - - {{/* CRD name text */}} - -On this page -
-
- -
diff --git a/docs/themes/geekboot/layouts/partials/docs-navbar.html b/docs/themes/geekboot/layouts/partials/docs-navbar.html deleted file mode 100644 index 8ec2a6bd2..000000000 --- a/docs/themes/geekboot/layouts/partials/docs-navbar.html +++ /dev/null @@ -1,76 +0,0 @@ - - - diff --git a/docs/themes/geekboot/layouts/partials/docs-sidebar.html b/docs/themes/geekboot/layouts/partials/docs-sidebar.html deleted file mode 100644 index 6609b2e07..000000000 --- a/docs/themes/geekboot/layouts/partials/docs-sidebar.html +++ /dev/null @@ -1,136 +0,0 @@ -{{ $current := . }} -{{ $root := .Site.Home }} -{{ $rec := .Site.GetPage "/recipes" }} -{{ $guides := .Site.GetPage "/guides" }} -{{ $ref := .Site.GetPage "/reference" }} -{{ $isRef := and $ref (eq $current.Section "reference") }} -{{/* The Recipes tab also hosts the taxonomy term pages (facet listings) — a - term page's .Section is the taxonomy plural, not "recipes". */}} -{{ $isRecipes := and $rec (or (eq $current.Section "recipes") (eq $current.Kind "term")) }} -{{ $isGuides := and $guides (eq $current.Section "guides") }} - -{{/* Home + top-level regular pages + sections, ordered by weight. The home page - itself is excluded from the list (the sidebar brand links to it). */}} -{{ $allItems := (slice $root | append $root.RegularPages | append $root.Sections).ByWeight }} - - diff --git a/docs/themes/geekboot/layouts/partials/docs-topbar.html b/docs/themes/geekboot/layouts/partials/docs-topbar.html deleted file mode 100644 index 56122f635..000000000 --- a/docs/themes/geekboot/layouts/partials/docs-topbar.html +++ /dev/null @@ -1,15 +0,0 @@ -{{/* Compact top bar shown only on small screens (the sidebar is a drawer there). */}} -
- - {{ partial "brand" (dict "ctx" . "class" "docs-topbar-brand") }} -
- - {{ partial "theme-switch" (dict "withId" false) }} -
-
diff --git a/docs/themes/geekboot/layouts/partials/favicons.html b/docs/themes/geekboot/layouts/partials/favicons.html deleted file mode 100644 index 3d4ed1a82..000000000 --- a/docs/themes/geekboot/layouts/partials/favicons.html +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/docs/themes/geekboot/layouts/partials/feature-state-alert.html b/docs/themes/geekboot/layouts/partials/feature-state-alert.html deleted file mode 100644 index 6f2d47ac7..000000000 --- a/docs/themes/geekboot/layouts/partials/feature-state-alert.html +++ /dev/null @@ -1,34 +0,0 @@ -
-
-
- -
-
- {{ if eq .Page.Params.state "alpha"}} - {{- if not .Page.Params.alphaVersion -}} - {{- errorf "\n\nNo \"alphaVersion\" front matter in page %q\n\n\n" .Page.File.Path -}} - {{- end -}} - This is an alpha feature. - Modelplane may change or drop this feature at any time.
- {{ end }} - {{ if eq .Page.Params.state "beta" }} - {{- if not .Page.Params.alphaVersion -}} - {{- errorf "\n\nNo \"alphaVersion\" front matter in page %q\n\n\n" .Page.File.Path -}} - {{- end -}} - {{- if not .Page.Params.betaVersion -}} - {{- errorf "\n\nNo \"betaVersion\" front matter in page %q\n\n\n" .Page.File.Path -}} - {{- end -}} - This is a beta feature. - {{ end }} -
-
-
-

- This feature was introduced in v{{.Page.Params.alphaVersion}}. - {{ if eq .Page.Params.state "beta" }} -
- This feature graduated to beta status in v{{.Page.Params.betaVersion}}. - {{ end }} -

-
-
diff --git a/docs/themes/geekboot/layouts/partials/footer.html b/docs/themes/geekboot/layouts/partials/footer.html deleted file mode 100644 index 6d0e5eb4c..000000000 --- a/docs/themes/geekboot/layouts/partials/footer.html +++ /dev/null @@ -1,40 +0,0 @@ -{{/* - Site footer. Mirrors the footer on the marketing site (modelplane.ai): brand, - tagline, legal line on the left; Docs / Blog / Privacy links and social icons - on the right. The social glyphs are inlined (no external assets) and share the - marketing site's paths and URLs so the two footers stay in sync. -*/}} - diff --git a/docs/themes/geekboot/layouts/partials/ga-tag.html b/docs/themes/geekboot/layouts/partials/ga-tag.html deleted file mode 100644 index 526d2541d..000000000 --- a/docs/themes/geekboot/layouts/partials/ga-tag.html +++ /dev/null @@ -1,3 +0,0 @@ -
-GA release: {{.Page.Params.ga}} -
\ No newline at end of file diff --git a/docs/themes/geekboot/layouts/partials/header.html b/docs/themes/geekboot/layouts/partials/header.html deleted file mode 100644 index f6b63f6db..000000000 --- a/docs/themes/geekboot/layouts/partials/header.html +++ /dev/null @@ -1,21 +0,0 @@ -{{ partialCached "meta-common" . }} - - -{{if not .Page.IsHome }} - -{{ end }} - - {{- if .IsHome -}} - {{- .Site.Title | markdownify }} · {{ .Site.Params.subtitle | markdownify }} - {{- else -}} - {{- .Title | markdownify }} · {{ .Site.Title | markdownify }} - {{- end -}} - - -{{ partialCached "stylesheet-cached" . }} -{{ partial "stylesheet-dynamic" . }} -{{ partialCached "favicons" . }} -{{ partial "social" . }} -{{ with .OutputFormats.Get "rss" -}} - {{ printf `` .Rel .MediaType.Type .Permalink site.Title | safeHTML }} -{{ end }} diff --git a/docs/themes/geekboot/layouts/partials/icons.html b/docs/themes/geekboot/layouts/partials/icons.html deleted file mode 100644 index b0a346f03..000000000 --- a/docs/themes/geekboot/layouts/partials/icons.html +++ /dev/null @@ -1,97 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {{/* Brand marks for the recipe catalog (simple-icons, CC0). */}} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/themes/geekboot/layouts/partials/icons/bootstrap-logo-solid.svg b/docs/themes/geekboot/layouts/partials/icons/bootstrap-logo-solid.svg deleted file mode 100644 index 59bed369b..000000000 --- a/docs/themes/geekboot/layouts/partials/icons/bootstrap-logo-solid.svg +++ /dev/null @@ -1 +0,0 @@ -{{ with .title }}{{ . }}{{ else }}Bootstrap{{ end }} diff --git a/docs/themes/geekboot/layouts/partials/icons/bootstrap-white-fill.svg b/docs/themes/geekboot/layouts/partials/icons/bootstrap-white-fill.svg deleted file mode 100644 index af4bc7fcf..000000000 --- a/docs/themes/geekboot/layouts/partials/icons/bootstrap-white-fill.svg +++ /dev/null @@ -1 +0,0 @@ -{{ with .title }}{{ . }}{{ else }}Bootstrap{{ end }} \ No newline at end of file diff --git a/docs/themes/geekboot/layouts/partials/icons/bootstrap.svg b/docs/themes/geekboot/layouts/partials/icons/bootstrap.svg deleted file mode 100644 index 1b57d335e..000000000 --- a/docs/themes/geekboot/layouts/partials/icons/bootstrap.svg +++ /dev/null @@ -1 +0,0 @@ -{{ with .title }}{{ . }}{{ else }}Bootstrap{{ end }} \ No newline at end of file diff --git a/docs/themes/geekboot/layouts/partials/icons/circle-square.svg b/docs/themes/geekboot/layouts/partials/icons/circle-square.svg deleted file mode 100644 index edd05754d..000000000 --- a/docs/themes/geekboot/layouts/partials/icons/circle-square.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/docs/themes/geekboot/layouts/partials/icons/cloud-fill.svg b/docs/themes/geekboot/layouts/partials/icons/cloud-fill.svg deleted file mode 100644 index 4ca9276eb..000000000 --- a/docs/themes/geekboot/layouts/partials/icons/cloud-fill.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/docs/themes/geekboot/layouts/partials/icons/code.svg b/docs/themes/geekboot/layouts/partials/icons/code.svg deleted file mode 100644 index 73156851a..000000000 --- a/docs/themes/geekboot/layouts/partials/icons/code.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/docs/themes/geekboot/layouts/partials/icons/collapse.svg b/docs/themes/geekboot/layouts/partials/icons/collapse.svg deleted file mode 100644 index ede702d68..000000000 --- a/docs/themes/geekboot/layouts/partials/icons/collapse.svg +++ /dev/null @@ -1,4 +0,0 @@ - - {{ with .title }}{{ . }}{{ else }}Collapse{{ end }} - - diff --git a/docs/themes/geekboot/layouts/partials/icons/droplet-fill.svg b/docs/themes/geekboot/layouts/partials/icons/droplet-fill.svg deleted file mode 100644 index 228abfa8b..000000000 --- a/docs/themes/geekboot/layouts/partials/icons/droplet-fill.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/docs/themes/geekboot/layouts/partials/icons/expand.svg b/docs/themes/geekboot/layouts/partials/icons/expand.svg deleted file mode 100644 index d14315175..000000000 --- a/docs/themes/geekboot/layouts/partials/icons/expand.svg +++ /dev/null @@ -1,4 +0,0 @@ - - {{ with .title }}{{ . }}{{ else }}Expand{{ end }} - - diff --git a/docs/themes/geekboot/layouts/partials/icons/github.svg b/docs/themes/geekboot/layouts/partials/icons/github.svg deleted file mode 100644 index 525e5b2bd..000000000 --- a/docs/themes/geekboot/layouts/partials/icons/github.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/docs/themes/geekboot/layouts/partials/icons/hamburger.svg b/docs/themes/geekboot/layouts/partials/icons/hamburger.svg deleted file mode 100644 index 955d8a651..000000000 --- a/docs/themes/geekboot/layouts/partials/icons/hamburger.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/docs/themes/geekboot/layouts/partials/icons/homepage-hero.svg b/docs/themes/geekboot/layouts/partials/icons/homepage-hero.svg deleted file mode 100644 index 538045ad9..000000000 --- a/docs/themes/geekboot/layouts/partials/icons/homepage-hero.svg +++ /dev/null @@ -1 +0,0 @@ -{{ with .title }}{{ . }}{{ else }}Bootstrap{{ end }} \ No newline at end of file diff --git a/docs/themes/geekboot/layouts/partials/icons/list.svg b/docs/themes/geekboot/layouts/partials/icons/list.svg deleted file mode 100644 index a801c2262..000000000 --- a/docs/themes/geekboot/layouts/partials/icons/list.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/docs/themes/geekboot/layouts/partials/icons/menu.svg b/docs/themes/geekboot/layouts/partials/icons/menu.svg deleted file mode 100644 index 70eaccec7..000000000 --- a/docs/themes/geekboot/layouts/partials/icons/menu.svg +++ /dev/null @@ -1 +0,0 @@ -{{ with .title }}{{ . }}{{ else }}Menu{{ end }} \ No newline at end of file diff --git a/docs/themes/geekboot/layouts/partials/icons/opencollective.svg b/docs/themes/geekboot/layouts/partials/icons/opencollective.svg deleted file mode 100644 index 2896ba50c..000000000 --- a/docs/themes/geekboot/layouts/partials/icons/opencollective.svg +++ /dev/null @@ -1 +0,0 @@ -{{ with .title }}{{ . }}{{ else }}Open Collective{{ end }} \ No newline at end of file diff --git a/docs/themes/geekboot/layouts/partials/icons/pencil-square.svg b/docs/themes/geekboot/layouts/partials/icons/pencil-square.svg deleted file mode 100644 index b8c90d542..000000000 --- a/docs/themes/geekboot/layouts/partials/icons/pencil-square.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/docs/themes/geekboot/layouts/partials/icons/popsicle-icon.svg b/docs/themes/geekboot/layouts/partials/icons/popsicle-icon.svg deleted file mode 100644 index 1abd2e89b..000000000 --- a/docs/themes/geekboot/layouts/partials/icons/popsicle-icon.svg +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/themes/geekboot/layouts/partials/icons/slack.svg b/docs/themes/geekboot/layouts/partials/icons/slack.svg deleted file mode 100644 index 481a2e81e..000000000 --- a/docs/themes/geekboot/layouts/partials/icons/slack.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/docs/themes/geekboot/layouts/partials/icons/twitter.svg b/docs/themes/geekboot/layouts/partials/icons/twitter.svg deleted file mode 100644 index 005045bbd..000000000 --- a/docs/themes/geekboot/layouts/partials/icons/twitter.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - \ No newline at end of file diff --git a/docs/themes/geekboot/layouts/partials/left-nav.html b/docs/themes/geekboot/layouts/partials/left-nav.html deleted file mode 100644 index 5ec08f453..000000000 --- a/docs/themes/geekboot/layouts/partials/left-nav.html +++ /dev/null @@ -1,6 +0,0 @@ -
-
- {{ partialCached "search-button" . }} - {{ partial "docs-sidebar" . }} -
-
\ No newline at end of file diff --git a/docs/themes/geekboot/layouts/partials/markdown-body.txt b/docs/themes/geekboot/layouts/partials/markdown-body.txt deleted file mode 100644 index 0c83f0eb4..000000000 --- a/docs/themes/geekboot/layouts/partials/markdown-body.txt +++ /dev/null @@ -1,12 +0,0 @@ -{{- /* - The page body as Markdown, shared by the Markdown output (single.md) and the - Copy page button so the two never drift. A plain-text (.txt) partial: it must - not HTML-escape .RawContent. Reference pages (product: crd) are generated from - the CRD schema and have no .RawContent, so render them from the schema; every - other page uses its verbatim source Markdown. -*/ -}} -{{- if eq .Params.product "crd" -}} - {{- partial "crd-markdown.txt" . -}} -{{- else -}} - {{- .RawContent -}} -{{- end -}} diff --git a/docs/themes/geekboot/layouts/partials/master-version-alert.html b/docs/themes/geekboot/layouts/partials/master-version-alert.html deleted file mode 100644 index 293629fa5..000000000 --- a/docs/themes/geekboot/layouts/partials/master-version-alert.html +++ /dev/null @@ -1,15 +0,0 @@ -
-
-
- -
-
- This document is for an unreleased version of Modelplane. -
-
-
-

- This document applies to the Modelplane main branch and not to the latest release v{{.Site.Params.latest}}. -

-
-
\ No newline at end of file diff --git a/docs/themes/geekboot/layouts/partials/mermaid.html b/docs/themes/geekboot/layouts/partials/mermaid.html deleted file mode 100644 index b52847c95..000000000 --- a/docs/themes/geekboot/layouts/partials/mermaid.html +++ /dev/null @@ -1,53 +0,0 @@ -{{ if .Page.Store.Get "hasMermaid" }} - -{{ end }} diff --git a/docs/themes/geekboot/layouts/partials/meta-common.html b/docs/themes/geekboot/layouts/partials/meta-common.html deleted file mode 100644 index f752a0520..000000000 --- a/docs/themes/geekboot/layouts/partials/meta-common.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - -{{ hugo.Generator }} -{{- /* Page-invariant social tags only. The per-page og:image and og:title live in - social.html, because this partial is partialCached and would otherwise reuse - one page's card across the whole site. */ -}} - - - - diff --git a/docs/themes/geekboot/layouts/partials/old-version-alert.html b/docs/themes/geekboot/layouts/partials/old-version-alert.html deleted file mode 100644 index 0dfdc7a8b..000000000 --- a/docs/themes/geekboot/layouts/partials/old-version-alert.html +++ /dev/null @@ -1,15 +0,0 @@ -
-
-
- -
-
- This document is for an older version of Modelplane. -
-
-
-

- This document applies to Modelplane v{{ .Page.Params.version }} and not to the latest release v{{.Site.Params.latest}}. -

-
-
diff --git a/docs/themes/geekboot/layouts/partials/page-pagination.html b/docs/themes/geekboot/layouts/partials/page-pagination.html deleted file mode 100644 index 95b26e2eb..000000000 --- a/docs/themes/geekboot/layouts/partials/page-pagination.html +++ /dev/null @@ -1,83 +0,0 @@ -{{/* - Previous / next links at the foot of a content page. The order mirrors the - sidebar (see docs-sidebar.html): home's regular pages and sections by weight, - and within each section its landing (if it has one) followed by its pages by - weight. Flattening that tree here lets prev/next flow across section - boundaries, just like reading top to bottom in the sidebar. - - Pagination stays within a tab: Recipes flows through its own recipes, - Reference flows through its type pages, and Documentation excludes both. - - Opt a page out with `paginationHidden: true` in its front matter. -*/}} -{{ $current := . }} -{{ $root := .Site.Home }} -{{ $rec := .Site.GetPage "/recipes" }} -{{ $guides := .Site.GetPage "/guides" }} -{{ $ref := .Site.GetPage "/reference" }} -{{ $isRecipes := and $rec (eq $current.Section "recipes") }} -{{ $isGuides := and $guides (eq $current.Section "guides") }} -{{ $isRef := and $ref (eq $current.Section "reference") }} -{{ $ordered := slice }} -{{ if $isRef }} - {{ with $ref }} - {{ range .Pages.ByWeight }} - {{ if not .Params.tocHidden }}{{ $ordered = $ordered | append . }}{{ end }} - {{ end }} - {{ end }} -{{ else if $isRecipes }} - {{ with $rec }} - {{ if .Params.navLanding }}{{ $ordered = $ordered | append . }}{{ end }} - {{ range .Pages.ByWeight }} - {{ if not .Params.tocHidden }}{{ $ordered = $ordered | append . }}{{ end }} - {{ end }} - {{ end }} -{{ else if $isGuides }} - {{ with $guides }} - {{ range .Pages.ByWeight }} - {{ if not .Params.tocHidden }}{{ $ordered = $ordered | append . }}{{ end }} - {{ end }} - {{ end }} -{{ else }} - {{ range (slice $root | append $root.RegularPages | append $root.Sections).ByWeight }} - {{ $item := . }} - {{ if and (ne $item $root) (ne $item $ref) (ne $item $rec) (ne $item $guides) (not $item.Params.tocHidden) }} - {{ if $item.IsSection }} - {{ if $item.Params.navLanding }}{{ $ordered = $ordered | append $item }}{{ end }} - {{ range $item.Pages.ByWeight }} - {{ if not .Params.tocHidden }}{{ $ordered = $ordered | append . }}{{ end }} - {{ end }} - {{ else }} - {{ $ordered = $ordered | append $item }} - {{ end }} - {{ end }} - {{ end }} -{{ end }} - -{{ $idx := -1 }} -{{ range $i, $p := $ordered }} - {{ if eq $p $current }}{{ $idx = $i }}{{ end }} -{{ end }} - -{{ if and (ge $idx 0) (not $current.Params.paginationHidden) }} - {{ $prev := false }} - {{ $next := false }} - {{ if gt $idx 0 }}{{ $prev = index $ordered (sub $idx 1) }}{{ end }} - {{ if lt $idx (sub (len $ordered) 1) }}{{ $next = index $ordered (add $idx 1) }}{{ end }} - {{ if or $prev $next }} - - {{ end }} -{{ end }} diff --git a/docs/themes/geekboot/layouts/partials/preview-version-alert.html b/docs/themes/geekboot/layouts/partials/preview-version-alert.html deleted file mode 100644 index 2d79a5f8d..000000000 --- a/docs/themes/geekboot/layouts/partials/preview-version-alert.html +++ /dev/null @@ -1,18 +0,0 @@ -
-
-
- -
-
- This document is for a preview version of Modelplane. -
-
-
-

- This document applies to Modelplane v{{ .Page.Params.version }} and not to the latest release v{{.Site.Params.latest}}. -
-
- Don't use Modelplane v{{ .Page.Params.version }} in production. -

-
-
diff --git a/docs/themes/geekboot/layouts/partials/recipe-header.html b/docs/themes/geekboot/layouts/partials/recipe-header.html deleted file mode 100644 index 4a265b235..000000000 --- a/docs/themes/geekboot/layouts/partials/recipe-header.html +++ /dev/null @@ -1,26 +0,0 @@ -{{/* - Page header for a recipe: vendor logo tile, "Vendor/Model" title, the - description as a subtitle, and a Hugging Face link derived from the `model` - front matter (tag suffixes like :IQ4_XS are stripped for the URL). Replaces - the plain h1 in single-list.html for regular pages in the recipes section. -*/}} -{{ $vendorName := index (.Params.vendors | default slice) 0 | default "" }} -{{ $entry := dict "name" (or $vendorName .Title) }} -{{ range hugo.Data.recipes.vendors }}{{ if eq .name $vendorName }}{{ $entry = . }}{{ end }}{{ end }} -
- {{ partial "brand-tile" (dict "entry" $entry "class" "mp-brand-tile--lg") }} -
-

- {{- with $vendorName }}{{ . }}/{{ end -}} - {{ .Title }} -

- {{ with .Description }}

{{ . }}

{{ end }} - {{ with .Params.model }} - {{ $repo := index (split . ":") 0 }} - - - View on Hugging Face - - {{ end }} -
-
diff --git a/docs/themes/geekboot/layouts/partials/recipe-row.html b/docs/themes/geekboot/layouts/partials/recipe-row.html deleted file mode 100644 index 22cf1da3d..000000000 --- a/docs/themes/geekboot/layouts/partials/recipe-row.html +++ /dev/null @@ -1,27 +0,0 @@ -{{/* - One table-style row in a term-page listing (vendor and cloud pages). The - whole row links to the recipe: model name and size on the left, an - architecture chip, then GPU, engine, and cloud chips, context length and an - arrow on the right. -*/}} - - - {{ .Title }} - {{ with .Params.size }}{{ . }}{{ end }} - - {{ with .Params.arch }}{{ . }}{{ end }} - - {{ range .Params.accelerators }} - {{ $name := . }} - {{ $mem := "" }} - {{ range hugo.Data.recipes.gpus }}{{ if eq .name $name }}{{ $mem = .mem }}{{ end }}{{ end }} - {{ $name }}{{ with $mem }} {{ . }}{{ end }} - {{ end }} - {{ range .Params.engines }}{{ . }}{{ end }} - {{ range .Params.clouds }}{{ . }}{{ end }} - - - {{ with .Params.ctx }}{{ . }} ctx{{ end }} - - - diff --git a/docs/themes/geekboot/layouts/partials/redirect.html b/docs/themes/geekboot/layouts/partials/redirect.html deleted file mode 100644 index f36cb8c06..000000000 --- a/docs/themes/geekboot/layouts/partials/redirect.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - {{ . }} - - - - - diff --git a/docs/themes/geekboot/layouts/partials/scripts.html b/docs/themes/geekboot/layouts/partials/scripts.html deleted file mode 100644 index 2dcb67dce..000000000 --- a/docs/themes/geekboot/layouts/partials/scripts.html +++ /dev/null @@ -1,104 +0,0 @@ -{{ $js := resources.Get (index (index hugo.Data.assets "main.js") "src") }} - -{{- $jsmap := resources.Get (printf "%s.map" (index (index hugo.Data.assets "main.js") "src")) -}} -{{- $jsmap.Publish -}} - -{{ if eq hugo.Environment "production" -}} - {{ partialCached "analytics" . }} -{{ end }} - - - - - diff --git a/docs/themes/geekboot/layouts/partials/search-button.html b/docs/themes/geekboot/layouts/partials/search-button.html deleted file mode 100644 index 873d52e98..000000000 --- a/docs/themes/geekboot/layouts/partials/search-button.html +++ /dev/null @@ -1,15 +0,0 @@ - - - - - -
-
-
\ No newline at end of file diff --git a/docs/themes/geekboot/layouts/partials/sidebar/contributing-guide.html b/docs/themes/geekboot/layouts/partials/sidebar/contributing-guide.html deleted file mode 100644 index 680a46339..000000000 --- a/docs/themes/geekboot/layouts/partials/sidebar/contributing-guide.html +++ /dev/null @@ -1,7 +0,0 @@ - \ No newline at end of file diff --git a/docs/themes/geekboot/layouts/partials/sidebar/user-docs.html b/docs/themes/geekboot/layouts/partials/sidebar/user-docs.html deleted file mode 100644 index 4d00d3108..000000000 --- a/docs/themes/geekboot/layouts/partials/sidebar/user-docs.html +++ /dev/null @@ -1,7 +0,0 @@ - \ No newline at end of file diff --git a/docs/themes/geekboot/layouts/partials/single-list.html b/docs/themes/geekboot/layouts/partials/single-list.html deleted file mode 100644 index 5ae7d80e5..000000000 --- a/docs/themes/geekboot/layouts/partials/single-list.html +++ /dev/null @@ -1,206 +0,0 @@ -{{ $ref := .Site.GetPage "/reference" }} -{{ $rec := .Site.GetPage "/recipes" }} -{{ $guides := .Site.GetPage "/guides" }} -{{ $isRef := and $ref (eq .Section "reference") }} -{{ $isRecipes := and $rec (eq .Section "recipes") }} -{{ $isGuides := and $guides (eq .Section "guides") }} -{{ $isCrd := eq .Params.product "crd" }} -{{/* Whether this page shows an "On this page" rail (drives the centred no-toc layout). */}} -{{ $hasToc := or $isCrd (and (ne .Page.Params.toc false) (gt (len .TableOfContents) 40)) }} -
- - -
- {{ $hasVersions := hugo.Data.versions.versions }} - {{ if or $ref $hasVersions }} -
- {{ if $ref }} - - {{ end }} - {{ if $hasVersions }} -
- {{ partial "version-dropdown-menu" . }} -
- {{ end }} -
- {{ end }} -
-
-
-
-
- {{ $md := "" }}{{ with .OutputFormats.Get "markdown" }}{{ $md = .Permalink }}{{ end }} - {{ $mcp := "https://docs.modelplane.ai/mcp" }} - {{ $cursorURL := printf "cursor://anysphere.cursor-deeplink/mcp/install?name=modelplane-docs&config=%s" (printf "{\"url\":\"%s\"}" $mcp | base64Encode | urlquery) | safeURL }} - {{ $vscodeURL := printf "vscode:mcp/install?%s" (printf "{\"name\":\"modelplane-docs\",\"type\":\"http\",\"url\":\"%s\"}" $mcp | urlquery) | safeURL }} - - {{/* htmlUnescape undoes the partial's html/template escaping to recover - the verbatim Markdown; html/template then escapes it once on output, - so it survives inside the