From b41c65f56595d70b8594fc1e4ba51bb25e47c0bf Mon Sep 17 00:00:00 2001 From: Rae Sharp Date: Tue, 8 Sep 2026 13:23:32 -0400 Subject: [PATCH 1/4] Move the docs site out of this repo The Hugo project - config, layouts, the geekboot theme, and the CSS and JavaScript pipelines - now lives in modelplaneai/docs-site, along with the build, the Vercel project, and the preview tooling. This repo keeps the prose and knows nothing about Hugo. Everything crosses the boundary in one direction. That repo fetches content when it builds; this repo asks it to build, and .github/workflows/docs.yml is the whole interface: a pull request touching docs/ or apis/ a preview of that revision a merge to main or a release-* branch every version, into production The preview link is posted here the moment the pull request opens, because the hostname derives from the pull request number rather than from the deployment, so the site repo needs no write access to this one. A merge is what publishes: nothing there pins a content revision, so publishing is a rebuild that reads the tip of every branch. Previewing locally is one command from the root of this repo, and needs no checkout of the site: nix run github:modelplaneai/docs-site#preview Versions are this repo's release-X.Y branches - whatever is on release-0.2 is what the 0.2 docs say. Cutting that branch is this repo's whole part in publishing a version. What stays here is the content and the checks that belong with it: Vale on the prose and the Pydantic validation of the example manifests. The site build and htmltest move with the site, as does the DocSearch crawl, whose config lives with the theme it indexes. docs/data stays as well. apigroups.yaml and recipes.yaml are content, not theme: they group the generated API reference and fill the recipe tables, and docs/content/reference/_content.gotmpl reads the first of them as much as the theme does. Only versions.yaml goes, superseded by the site's own version list. Dropping them would not fail a build - it would silently empty the reference landing page's grouped cards, the sidebar's reference tree, and every recipe table row. Vale's style sync is also taught to find its styles on macOS, where it installs them under Application Support rather than the XDG data directory, so 'nix flake check' works on a maintainer's machine and not only in CI. Signed-off-by: Rae Sharp --- .github/workflows/docs.yml | 77 + .github/workflows/docsearch.yml | 44 - .gitignore | 12 - CONTRIBUTING.md | 70 +- RELEASING.md | 88 +- docs/api/mcp.js | 411 ---- docs/archetypes/default.md | 5 - docs/data/versions.yaml | 16 - docs/hugo.toml | 133 -- docs/layouts/robots.txt | 2 - docs/package-lock.json | 1310 ------------ docs/package.json | 9 - docs/postcss.config.js | 42 - docs/themes/geekboot/LICENSE-bootstrap | 22 - docs/themes/geekboot/LICENSE-geekdoc | 21 - .../assets/js/main-749dbd31.bundle.min.js | 3 - .../main-749dbd31.bundle.min.js.LICENSE.txt | 14 - .../assets/js/main-749dbd31.bundle.min.js.map | 1 - .../geekboot/assets/scss/_accordion.scss | 29 - docs/themes/geekboot/assets/scss/_anchor.scss | 30 - .../geekboot/assets/scss/_api-reference.scss | 348 ---- .../themes/geekboot/assets/scss/_buttons.scss | 8 - .../geekboot/assets/scss/_callouts.scss | 43 - .../assets/scss/_code-theme-base.scss | 113 -- .../assets/scss/_code-theme-dark.scss | 112 -- .../assets/scss/_code-theme-light.scss | 133 -- .../geekboot/assets/scss/_components.scss | 940 --------- .../themes/geekboot/assets/scss/_content.scss | 267 --- docs/themes/geekboot/assets/scss/_crds.scss | 321 --- .../geekboot/assets/scss/_dropdown.scss | 62 - docs/themes/geekboot/assets/scss/_fonts.scss | 51 - docs/themes/geekboot/assets/scss/_hints.scss | 49 - docs/themes/geekboot/assets/scss/_home.scss | 92 - docs/themes/geekboot/assets/scss/_layout.scss | 140 -- .../themes/geekboot/assets/scss/_mermaid.scss | 29 - .../geekboot/assets/scss/_modelplane.scss | 304 --- .../geekboot/assets/scss/_nav-tabs.scss | 41 - docs/themes/geekboot/assets/scss/_navbar.scss | 230 --- .../geekboot/assets/scss/_search-button.scss | 246 --- .../geekboot/assets/scss/_search-results.scss | 61 - .../themes/geekboot/assets/scss/_sidebar.scss | 282 --- docs/themes/geekboot/assets/scss/_skippy.scss | 5 - docs/themes/geekboot/assets/scss/_syntax.scss | 115 -- docs/themes/geekboot/assets/scss/_toc.scss | 155 -- .../geekboot/assets/scss/_variables.scss | 207 -- .../assets/scss/bootstrap/_accordion.scss | 158 -- .../assets/scss/bootstrap/_alert.scss | 68 - .../assets/scss/bootstrap/_badge.scss | 38 - .../assets/scss/bootstrap/_breadcrumb.scss | 40 - .../assets/scss/bootstrap/_button-group.scss | 142 -- .../assets/scss/bootstrap/_buttons.scss | 207 -- .../geekboot/assets/scss/bootstrap/_card.scss | 239 --- .../assets/scss/bootstrap/_carousel.scss | 244 --- .../assets/scss/bootstrap/_close.scss | 63 - .../assets/scss/bootstrap/_containers.scss | 41 - .../assets/scss/bootstrap/_dropdown.scss | 250 --- .../assets/scss/bootstrap/_forms.scss | 9 - .../assets/scss/bootstrap/_functions.scss | 302 --- .../geekboot/assets/scss/bootstrap/_grid.scss | 39 - .../assets/scss/bootstrap/_helpers.scss | 12 - .../assets/scss/bootstrap/_images.scss | 42 - .../assets/scss/bootstrap/_list-group.scss | 197 -- .../geekboot/assets/scss/bootstrap/_maps.scss | 174 -- .../assets/scss/bootstrap/_mixins.scss | 42 - .../assets/scss/bootstrap/_modal.scss | 237 --- .../geekboot/assets/scss/bootstrap/_nav.scss | 197 -- .../assets/scss/bootstrap/_navbar.scss | 289 --- .../assets/scss/bootstrap/_offcanvas.scss | 146 -- .../assets/scss/bootstrap/_pagination.scss | 109 - .../assets/scss/bootstrap/_placeholders.scss | 51 - .../assets/scss/bootstrap/_popover.scss | 196 -- .../assets/scss/bootstrap/_progress.scss | 68 - .../assets/scss/bootstrap/_reboot.scss | 611 ------ .../geekboot/assets/scss/bootstrap/_root.scss | 187 -- .../assets/scss/bootstrap/_spinners.scss | 85 - .../assets/scss/bootstrap/_tables.scss | 171 -- .../assets/scss/bootstrap/_toasts.scss | 73 - .../assets/scss/bootstrap/_tooltip.scss | 119 -- .../assets/scss/bootstrap/_transitions.scss | 27 - .../geekboot/assets/scss/bootstrap/_type.scss | 106 - .../assets/scss/bootstrap/_utilities.scss | 806 -------- .../scss/bootstrap/_variables-dark.scss | 87 - .../assets/scss/bootstrap/_variables.scss | 1747 ----------------- .../assets/scss/bootstrap/bootstrap-grid.scss | 62 - .../scss/bootstrap/bootstrap-reboot.scss | 10 - .../scss/bootstrap/bootstrap-utilities.scss | 19 - .../assets/scss/bootstrap/bootstrap.scss | 52 - .../bootstrap/forms/_floating-labels.scss | 95 - .../scss/bootstrap/forms/_form-check.scss | 189 -- .../scss/bootstrap/forms/_form-control.scss | 214 -- .../scss/bootstrap/forms/_form-range.scss | 91 - .../scss/bootstrap/forms/_form-select.scss | 80 - .../scss/bootstrap/forms/_form-text.scss | 11 - .../scss/bootstrap/forms/_input-group.scss | 132 -- .../assets/scss/bootstrap/forms/_labels.scss | 36 - .../scss/bootstrap/forms/_validation.scss | 12 - .../scss/bootstrap/helpers/_clearfix.scss | 3 - .../scss/bootstrap/helpers/_color-bg.scss | 7 - .../bootstrap/helpers/_colored-links.scss | 30 - .../scss/bootstrap/helpers/_focus-ring.scss | 5 - .../scss/bootstrap/helpers/_icon-link.scss | 25 - .../scss/bootstrap/helpers/_position.scss | 36 - .../assets/scss/bootstrap/helpers/_ratio.scss | 26 - .../scss/bootstrap/helpers/_stacks.scss | 15 - .../bootstrap/helpers/_stretched-link.scss | 15 - .../bootstrap/helpers/_text-truncation.scss | 7 - .../bootstrap/helpers/_visually-hidden.scss | 8 - .../assets/scss/bootstrap/helpers/_vr.scss | 8 - .../assets/scss/bootstrap/mixins/_alert.scss | 18 - .../scss/bootstrap/mixins/_backdrop.scss | 14 - .../assets/scss/bootstrap/mixins/_banner.scss | 7 - .../scss/bootstrap/mixins/_border-radius.scss | 78 - .../scss/bootstrap/mixins/_box-shadow.scss | 18 - .../scss/bootstrap/mixins/_breakpoints.scss | 127 -- .../scss/bootstrap/mixins/_buttons.scss | 70 - .../assets/scss/bootstrap/mixins/_caret.scss | 69 - .../scss/bootstrap/mixins/_clearfix.scss | 9 - .../scss/bootstrap/mixins/_color-mode.scss | 21 - .../scss/bootstrap/mixins/_color-scheme.scss | 7 - .../scss/bootstrap/mixins/_container.scss | 11 - .../scss/bootstrap/mixins/_deprecate.scss | 10 - .../assets/scss/bootstrap/mixins/_forms.scss | 153 -- .../scss/bootstrap/mixins/_gradients.scss | 47 - .../assets/scss/bootstrap/mixins/_grid.scss | 151 -- .../assets/scss/bootstrap/mixins/_image.scss | 16 - .../scss/bootstrap/mixins/_list-group.scss | 26 - .../assets/scss/bootstrap/mixins/_lists.scss | 7 - .../scss/bootstrap/mixins/_pagination.scss | 10 - .../scss/bootstrap/mixins/_reset-text.scss | 17 - .../assets/scss/bootstrap/mixins/_resize.scss | 6 - .../bootstrap/mixins/_table-variants.scss | 24 - .../scss/bootstrap/mixins/_text-truncate.scss | 8 - .../scss/bootstrap/mixins/_transition.scss | 26 - .../scss/bootstrap/mixins/_utilities.scss | 97 - .../bootstrap/mixins/_visually-hidden.scss | 33 - .../assets/scss/bootstrap/tests/jasmine.js | 16 - .../tests/mixins/_color-modes.test.scss | 69 - .../_media-query-color-mode-full.test.scss | 8 - .../tests/mixins/_utilities.test.scss | 393 ---- .../bootstrap/tests/sass-true/register.js | 14 - .../scss/bootstrap/tests/sass-true/runner.js | 17 - .../bootstrap/tests/utilities/_api.test.scss | 75 - .../assets/scss/bootstrap/utilities/_api.scss | 47 - .../assets/scss/bootstrap/vendor/_rfs.scss | 348 ---- .../geekboot/assets/scss/color-modes.scss | 55 - .../geekboot/assets/scss/dark-mode.scss | 179 -- docs/themes/geekboot/assets/scss/docs.scss | 58 - .../geekboot/assets/scss/light-mode.scss | 176 -- docs/themes/geekboot/data/assets.json | 8 - docs/themes/geekboot/layouts/404.html | 46 - .../_markup/render-codeblock-mermaid.html | 4 - .../_default/_markup/render-codeblock.html | 16 - .../_default/_markup/render-heading.html | 5 - .../_default/_markup/render-table.html | 31 - .../geekboot/layouts/_default/baseof.html | 15 - .../geekboot/layouts/_default/home.llms.txt | 15 - .../layouts/_default/home.llmsfull.txt | 13 - .../layouts/_default/home.llmsjson.json | 36 - .../geekboot/layouts/_default/list.html | 9 - docs/themes/geekboot/layouts/_default/list.md | 5 - .../geekboot/layouts/_default/redirect.html | 5 - .../geekboot/layouts/_default/section.rss.xml | 39 - .../geekboot/layouts/_default/single.html | 3 - .../geekboot/layouts/_default/single.md | 11 - .../geekboot/layouts/_default/sitemap.xml | 10 - .../geekboot/layouts/_default/term.html | 105 - docs/themes/geekboot/layouts/index.html | 10 - .../layouts/partials/ai-ext-arrow.html | 2 - .../layouts/partials/analytics-config.html | 23 - .../geekboot/layouts/partials/analytics.html | 1 - .../partials/apiBuilder/GKVHeader.html | 20 - .../partials/apiBuilder/backToTopButton.html | 7 - .../partials/apiBuilder/checkBigName.html | 3 - .../partials/apiBuilder/collectTypes.html | 32 - .../partials/apiBuilder/downloadLink.html | 16 - .../partials/apiBuilder/enumHandler.html | 22 - .../layouts/partials/apiBuilder/field.html | 82 - .../partials/apiBuilder/fieldList.html | 15 - .../partials/apiBuilder/getSpecFields.html | 36 - .../apiBuilder/getVersionAndSchema.html | 31 - .../layouts/partials/apiBuilder/isEnum.html | 36 - .../apiBuilder/parentDescription.html | 10 - .../partials/apiBuilder/printGKVExpander.html | 30 - .../partials/apiBuilder/promotedType.html | 17 - .../apiBuilder/specCollapseButtonEnd.html | 9 - .../apiBuilder/specCollapseButtonStart.html | 10 - .../partials/apiBuilder/tocFields.html | 20 - .../geekboot/layouts/partials/auto-index.html | 17 - .../geekboot/layouts/partials/brand-tile.html | 14 - .../geekboot/layouts/partials/brand.html | 10 - .../geekboot/layouts/partials/crd-index.html | 45 - .../layouts/partials/crd-markdown.txt | 45 - .../geekboot/layouts/partials/crd-single.html | 133 -- .../geekboot/layouts/partials/crd-toc.html | 58 - .../layouts/partials/docs-navbar.html | 76 - .../layouts/partials/docs-sidebar.html | 136 -- .../layouts/partials/docs-topbar.html | 15 - .../geekboot/layouts/partials/favicons.html | 9 - .../layouts/partials/feature-state-alert.html | 34 - .../geekboot/layouts/partials/footer.html | 40 - .../geekboot/layouts/partials/ga-tag.html | 3 - .../geekboot/layouts/partials/header.html | 21 - .../geekboot/layouts/partials/icons.html | 97 - .../partials/icons/bootstrap-logo-solid.svg | 1 - .../partials/icons/bootstrap-white-fill.svg | 1 - .../layouts/partials/icons/bootstrap.svg | 1 - .../layouts/partials/icons/circle-square.svg | 4 - .../layouts/partials/icons/cloud-fill.svg | 3 - .../geekboot/layouts/partials/icons/code.svg | 3 - .../layouts/partials/icons/collapse.svg | 4 - .../layouts/partials/icons/droplet-fill.svg | 3 - .../layouts/partials/icons/expand.svg | 4 - .../layouts/partials/icons/github.svg | 3 - .../layouts/partials/icons/hamburger.svg | 3 - .../layouts/partials/icons/homepage-hero.svg | 1 - .../geekboot/layouts/partials/icons/list.svg | 3 - .../geekboot/layouts/partials/icons/menu.svg | 1 - .../layouts/partials/icons/opencollective.svg | 1 - .../layouts/partials/icons/pencil-square.svg | 4 - .../layouts/partials/icons/popsicle-icon.svg | 157 -- .../geekboot/layouts/partials/icons/slack.svg | 3 - .../layouts/partials/icons/twitter.svg | 13 - .../geekboot/layouts/partials/left-nav.html | 6 - .../layouts/partials/markdown-body.txt | 12 - .../partials/master-version-alert.html | 15 - .../geekboot/layouts/partials/mermaid.html | 53 - .../layouts/partials/meta-common.html | 13 - .../layouts/partials/old-version-alert.html | 15 - .../layouts/partials/page-pagination.html | 83 - .../partials/preview-version-alert.html | 18 - .../layouts/partials/recipe-header.html | 26 - .../geekboot/layouts/partials/recipe-row.html | 27 - .../geekboot/layouts/partials/redirect.html | 11 - .../geekboot/layouts/partials/scripts.html | 104 - .../layouts/partials/search-button.html | 15 - .../partials/sidebar/contributing-guide.html | 7 - .../layouts/partials/sidebar/user-docs.html | 7 - .../layouts/partials/single-list.html | 206 -- .../geekboot/layouts/partials/skippy.html | 5 - .../geekboot/layouts/partials/social.html | 16 - .../layouts/partials/stylesheet-cached.html | 34 - .../layouts/partials/stylesheet-dynamic.html | 9 - .../layouts/partials/theme-switch.html | 12 - .../themes/geekboot/layouts/partials/toc.html | 28 - .../layouts/partials/utils/content.html | 6 - .../layouts/partials/utils/description.html | 14 - .../layouts/partials/utils/featured.html | 12 - .../partials/utils/sorted-versions.html | 34 - .../layouts/partials/utils/title.html | 11 - .../partials/version-dropdown-menu.html | 47 - .../geekboot/layouts/shortcodes/accel.html | 18 - .../layouts/shortcodes/asciinema.html | 53 - .../layouts/shortcodes/auto-index.html | 5 - .../geekboot/layouts/shortcodes/card.html | 35 - .../layouts/shortcodes/cardgroup.html | 20 - .../geekboot/layouts/shortcodes/check.html | 1 - .../geekboot/layouts/shortcodes/editCode.html | 56 - .../geekboot/layouts/shortcodes/expand.html | 18 - .../geekboot/layouts/shortcodes/hint.html | 18 - .../geekboot/layouts/shortcodes/hover.html | 8 - .../geekboot/layouts/shortcodes/img.html | 52 - .../geekboot/layouts/shortcodes/include.html | 23 - .../layouts/shortcodes/manifest-url.html | 21 - .../layouts/shortcodes/manifests.html | 68 - .../geekboot/layouts/shortcodes/markdown.html | 1 - .../geekboot/layouts/shortcodes/param.html | 14 - .../geekboot/layouts/shortcodes/partial.html | 1 - .../geekboot/layouts/shortcodes/persona.html | 6 - .../layouts/shortcodes/placeholder.html | 44 - .../layouts/shortcodes/propertylist.html | 49 - .../geekboot/layouts/shortcodes/qa.html | 16 - .../layouts/shortcodes/recipe-catalog.html | 60 - .../layouts/shortcodes/recipe-table.html | 60 - .../geekboot/layouts/shortcodes/repolink.html | 15 - .../geekboot/layouts/shortcodes/tab.html | 13 - .../geekboot/layouts/shortcodes/table.html | 7 - .../geekboot/layouts/shortcodes/tabs.html | 28 - .../geekboot/layouts/shortcodes/url.html | 2 - .../shortcodes/validated-deployments.html | 124 -- .../geekboot/layouts/shortcodes/year.html | 3 - .../static/android-chrome-192x192.png | Bin 14099 -> 0 bytes .../static/android-chrome-512x512.png | Bin 36668 -> 0 bytes .../geekboot/static/apple-touch-icon.png | Bin 12676 -> 0 bytes docs/themes/geekboot/static/favicon-16x16.png | Bin 665 -> 0 bytes docs/themes/geekboot/static/favicon-32x32.png | Bin 1450 -> 0 bytes docs/themes/geekboot/static/favicon.ico | Bin 15406 -> 0 bytes .../static/fonts/dm-mono-400-latin-ext.woff2 | Bin 5700 -> 0 bytes .../static/fonts/dm-mono-400-latin.woff2 | Bin 8688 -> 0 bytes .../static/fonts/dm-mono-500-latin-ext.woff2 | Bin 5700 -> 0 bytes .../static/fonts/dm-mono-500-latin.woff2 | Bin 8724 -> 0 bytes .../static/fonts/inter-cyrillic-ext.woff2 | Bin 25844 -> 0 bytes .../static/fonts/inter-cyrillic.woff2 | Bin 18744 -> 0 bytes .../static/fonts/inter-greek-ext.woff2 | Bin 11272 -> 0 bytes .../geekboot/static/fonts/inter-greek.woff2 | Bin 19044 -> 0 bytes .../static/fonts/inter-latin-ext.woff2 | Bin 85272 -> 0 bytes .../geekboot/static/fonts/inter-latin.woff2 | Bin 48432 -> 0 bytes .../static/fonts/inter-vietnamese.woff2 | Bin 10280 -> 0 bytes .../static/fonts/outfit-latin-ext.woff2 | Bin 14760 -> 0 bytes .../geekboot/static/fonts/outfit-latin.woff2 | Bin 32228 -> 0 bytes .../geekboot/static/img/arrow-up-white.svg | 9 - docs/themes/geekboot/static/img/automate.svg | 531 ----- .../geekboot/static/img/cncf-large.webp | Bin 13842 -> 0 bytes .../geekboot/static/img/cncf-large@2x.webp | Bin 26330 -> 0 bytes .../geekboot/static/img/cncf-large@3x.webp | Bin 40056 -> 0 bytes .../geekboot/static/img/cncf-white.webp | Bin 11876 -> 0 bytes docs/themes/geekboot/static/img/cncf.webp | Bin 4878 -> 0 bytes docs/themes/geekboot/static/img/cncf@2x.webp | Bin 9006 -> 0 bytes docs/themes/geekboot/static/img/cncf@3x.webp | Bin 13096 -> 0 bytes docs/themes/geekboot/static/img/download.svg | 9 - docs/themes/geekboot/static/img/lightbox.gif | Bin 43 -> 0 bytes docs/themes/geekboot/static/img/loading.gif | Bin 8476 -> 0 bytes .../geekboot/static/img/logos/amazonaws.svg | 1 - docs/themes/geekboot/static/img/logos/amd.svg | 1 - .../geekboot/static/img/logos/googlecloud.svg | 1 - .../geekboot/static/img/logos/nvidia.svg | 1 - .../geekboot/static/img/minus-black.svg | 10 - .../geekboot/static/img/minus-white.svg | 10 - .../static/img/modelplane-icon-color.svg | 18 - .../static/img/modelplane-icon-white.svg | 18 - .../static/img/modelplane-logo-inverted.svg | 1 - .../geekboot/static/img/modelplane-logo.svg | 1 - .../geekboot/static/img/multi-crane.svg | 363 ---- docs/themes/geekboot/static/img/plus-150.svg | 9 - .../themes/geekboot/static/img/plus-black.svg | 9 - .../themes/geekboot/static/img/plus-white.svg | 9 - .../geekboot/static/img/popsicle-icon.svg | 158 -- .../geekboot/static/img/sort-down-dark.svg | 9 - .../geekboot/static/img/sort-down-light.svg | 9 - .../geekboot/static/img/sort-up-dark.svg | 9 - .../geekboot/static/img/sort-up-light.svg | 9 - docs/themes/geekboot/static/img/truck.svg | 102 - docs/themes/geekboot/static/llms.txt | 81 - docs/themes/geekboot/static/site.webmanifest | 19 - docs/utils/docsearch/config.json | 26 - docs/utils/htmltest/.htmltest.yml | 10 - docs/utils/webpack/package-lock.json | 1499 -------------- docs/utils/webpack/package.json | 14 - docs/utils/webpack/src/LICENSE | 22 - .../webpack/src/js/bootstrap/src/alert.js | 87 - .../src/js/bootstrap/src/base-component.js | 85 - .../webpack/src/js/bootstrap/src/button.js | 72 - .../webpack/src/js/bootstrap/src/carousel.js | 475 ----- .../webpack/src/js/bootstrap/src/collapse.js | 302 --- .../webpack/src/js/bootstrap/src/dom/data.js | 55 - .../src/js/bootstrap/src/dom/event-handler.js | 320 --- .../src/js/bootstrap/src/dom/manipulator.js | 71 - .../js/bootstrap/src/dom/selector-engine.js | 83 - .../webpack/src/js/bootstrap/src/dropdown.js | 454 ----- .../webpack/src/js/bootstrap/src/modal.js | 377 ---- .../webpack/src/js/bootstrap/src/offcanvas.js | 283 --- .../webpack/src/js/bootstrap/src/popover.js | 97 - .../webpack/src/js/bootstrap/src/scrollspy.js | 294 --- .../utils/webpack/src/js/bootstrap/src/tab.js | 305 --- .../webpack/src/js/bootstrap/src/toast.js | 225 --- .../webpack/src/js/bootstrap/src/tooltip.js | 633 ------ .../src/js/bootstrap/src/util/backdrop.js | 149 -- .../bootstrap/src/util/component-functions.js | 34 - .../src/js/bootstrap/src/util/config.js | 66 - .../src/js/bootstrap/src/util/focustrap.js | 115 -- .../src/js/bootstrap/src/util/index.js | 336 ---- .../src/js/bootstrap/src/util/sanitizer.js | 118 -- .../src/js/bootstrap/src/util/scrollbar.js | 114 -- .../src/js/bootstrap/src/util/swipe.js | 146 -- .../js/bootstrap/src/util/template-factory.js | 160 -- docs/utils/webpack/src/js/colorMode.js | 93 - docs/utils/webpack/src/js/customClipboard.js | 163 -- docs/utils/webpack/src/js/globalScripts.js | 31 - docs/utils/webpack/src/js/hoverHighlight.js | 38 - docs/utils/webpack/src/js/slackNotify.js | 20 - docs/utils/webpack/src/js/tabDeepAnchor.js | 76 - docs/utils/webpack/webpack.config.js | 49 - docs/vercel-build.sh | 104 - docs/vercel.json | 9 - flake.lock | 6 +- flake.nix | 13 +- nix/apps.nix | 46 - nix/checks.nix | 11 +- nix/docs.nix | 142 +- 378 files changed, 156 insertions(+), 30563 deletions(-) create mode 100644 .github/workflows/docs.yml delete mode 100644 .github/workflows/docsearch.yml delete mode 100644 docs/api/mcp.js delete mode 100644 docs/archetypes/default.md delete mode 100644 docs/data/versions.yaml delete mode 100644 docs/hugo.toml delete mode 100644 docs/layouts/robots.txt delete mode 100644 docs/package-lock.json delete mode 100644 docs/package.json delete mode 100644 docs/postcss.config.js delete mode 100644 docs/themes/geekboot/LICENSE-bootstrap delete mode 100644 docs/themes/geekboot/LICENSE-geekdoc delete mode 100644 docs/themes/geekboot/assets/js/main-749dbd31.bundle.min.js delete mode 100644 docs/themes/geekboot/assets/js/main-749dbd31.bundle.min.js.LICENSE.txt delete mode 100644 docs/themes/geekboot/assets/js/main-749dbd31.bundle.min.js.map delete mode 100644 docs/themes/geekboot/assets/scss/_accordion.scss delete mode 100644 docs/themes/geekboot/assets/scss/_anchor.scss delete mode 100644 docs/themes/geekboot/assets/scss/_api-reference.scss delete mode 100644 docs/themes/geekboot/assets/scss/_buttons.scss delete mode 100644 docs/themes/geekboot/assets/scss/_callouts.scss delete mode 100644 docs/themes/geekboot/assets/scss/_code-theme-base.scss delete mode 100644 docs/themes/geekboot/assets/scss/_code-theme-dark.scss delete mode 100644 docs/themes/geekboot/assets/scss/_code-theme-light.scss delete mode 100644 docs/themes/geekboot/assets/scss/_components.scss delete mode 100644 docs/themes/geekboot/assets/scss/_content.scss delete mode 100644 docs/themes/geekboot/assets/scss/_crds.scss delete mode 100644 docs/themes/geekboot/assets/scss/_dropdown.scss delete mode 100644 docs/themes/geekboot/assets/scss/_fonts.scss delete mode 100644 docs/themes/geekboot/assets/scss/_hints.scss delete mode 100644 docs/themes/geekboot/assets/scss/_home.scss delete mode 100644 docs/themes/geekboot/assets/scss/_layout.scss delete mode 100644 docs/themes/geekboot/assets/scss/_mermaid.scss delete mode 100644 docs/themes/geekboot/assets/scss/_modelplane.scss delete mode 100644 docs/themes/geekboot/assets/scss/_nav-tabs.scss delete mode 100644 docs/themes/geekboot/assets/scss/_navbar.scss delete mode 100644 docs/themes/geekboot/assets/scss/_search-button.scss delete mode 100644 docs/themes/geekboot/assets/scss/_search-results.scss delete mode 100644 docs/themes/geekboot/assets/scss/_sidebar.scss delete mode 100644 docs/themes/geekboot/assets/scss/_skippy.scss delete mode 100644 docs/themes/geekboot/assets/scss/_syntax.scss delete mode 100644 docs/themes/geekboot/assets/scss/_toc.scss delete mode 100644 docs/themes/geekboot/assets/scss/_variables.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/_accordion.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/_alert.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/_badge.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/_breadcrumb.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/_button-group.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/_buttons.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/_card.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/_carousel.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/_close.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/_containers.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/_dropdown.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/_forms.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/_functions.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/_grid.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/_helpers.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/_images.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/_list-group.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/_maps.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/_mixins.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/_modal.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/_nav.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/_navbar.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/_offcanvas.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/_pagination.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/_placeholders.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/_popover.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/_progress.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/_reboot.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/_root.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/_spinners.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/_tables.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/_toasts.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/_tooltip.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/_transitions.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/_type.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/_utilities.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/_variables-dark.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/_variables.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/bootstrap-grid.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/bootstrap-reboot.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/bootstrap-utilities.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/bootstrap.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/forms/_floating-labels.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/forms/_form-check.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/forms/_form-control.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/forms/_form-range.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/forms/_form-select.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/forms/_form-text.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/forms/_input-group.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/forms/_labels.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/forms/_validation.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/helpers/_clearfix.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/helpers/_color-bg.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/helpers/_colored-links.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/helpers/_focus-ring.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/helpers/_icon-link.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/helpers/_position.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/helpers/_ratio.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/helpers/_stacks.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/helpers/_stretched-link.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/helpers/_text-truncation.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/helpers/_visually-hidden.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/helpers/_vr.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/mixins/_alert.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/mixins/_backdrop.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/mixins/_banner.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/mixins/_border-radius.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/mixins/_box-shadow.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/mixins/_breakpoints.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/mixins/_buttons.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/mixins/_caret.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/mixins/_clearfix.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/mixins/_color-mode.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/mixins/_color-scheme.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/mixins/_container.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/mixins/_deprecate.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/mixins/_forms.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/mixins/_gradients.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/mixins/_grid.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/mixins/_image.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/mixins/_list-group.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/mixins/_lists.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/mixins/_pagination.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/mixins/_reset-text.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/mixins/_resize.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/mixins/_table-variants.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/mixins/_text-truncate.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/mixins/_transition.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/mixins/_utilities.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/mixins/_visually-hidden.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/tests/jasmine.js delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/tests/mixins/_color-modes.test.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/tests/mixins/_media-query-color-mode-full.test.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/tests/mixins/_utilities.test.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/tests/sass-true/register.js delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/tests/sass-true/runner.js delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/tests/utilities/_api.test.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/utilities/_api.scss delete mode 100644 docs/themes/geekboot/assets/scss/bootstrap/vendor/_rfs.scss delete mode 100644 docs/themes/geekboot/assets/scss/color-modes.scss delete mode 100644 docs/themes/geekboot/assets/scss/dark-mode.scss delete mode 100644 docs/themes/geekboot/assets/scss/docs.scss delete mode 100644 docs/themes/geekboot/assets/scss/light-mode.scss delete mode 100644 docs/themes/geekboot/data/assets.json delete mode 100644 docs/themes/geekboot/layouts/404.html delete mode 100644 docs/themes/geekboot/layouts/_default/_markup/render-codeblock-mermaid.html delete mode 100644 docs/themes/geekboot/layouts/_default/_markup/render-codeblock.html delete mode 100644 docs/themes/geekboot/layouts/_default/_markup/render-heading.html delete mode 100644 docs/themes/geekboot/layouts/_default/_markup/render-table.html delete mode 100644 docs/themes/geekboot/layouts/_default/baseof.html delete mode 100644 docs/themes/geekboot/layouts/_default/home.llms.txt delete mode 100644 docs/themes/geekboot/layouts/_default/home.llmsfull.txt delete mode 100644 docs/themes/geekboot/layouts/_default/home.llmsjson.json delete mode 100644 docs/themes/geekboot/layouts/_default/list.html delete mode 100644 docs/themes/geekboot/layouts/_default/list.md delete mode 100644 docs/themes/geekboot/layouts/_default/redirect.html delete mode 100644 docs/themes/geekboot/layouts/_default/section.rss.xml delete mode 100644 docs/themes/geekboot/layouts/_default/single.html delete mode 100644 docs/themes/geekboot/layouts/_default/single.md delete mode 100644 docs/themes/geekboot/layouts/_default/sitemap.xml delete mode 100644 docs/themes/geekboot/layouts/_default/term.html delete mode 100644 docs/themes/geekboot/layouts/index.html delete mode 100644 docs/themes/geekboot/layouts/partials/ai-ext-arrow.html delete mode 100644 docs/themes/geekboot/layouts/partials/analytics-config.html delete mode 100644 docs/themes/geekboot/layouts/partials/analytics.html delete mode 100644 docs/themes/geekboot/layouts/partials/apiBuilder/GKVHeader.html delete mode 100644 docs/themes/geekboot/layouts/partials/apiBuilder/backToTopButton.html delete mode 100644 docs/themes/geekboot/layouts/partials/apiBuilder/checkBigName.html delete mode 100644 docs/themes/geekboot/layouts/partials/apiBuilder/collectTypes.html delete mode 100644 docs/themes/geekboot/layouts/partials/apiBuilder/downloadLink.html delete mode 100644 docs/themes/geekboot/layouts/partials/apiBuilder/enumHandler.html delete mode 100644 docs/themes/geekboot/layouts/partials/apiBuilder/field.html delete mode 100644 docs/themes/geekboot/layouts/partials/apiBuilder/fieldList.html delete mode 100644 docs/themes/geekboot/layouts/partials/apiBuilder/getSpecFields.html delete mode 100644 docs/themes/geekboot/layouts/partials/apiBuilder/getVersionAndSchema.html delete mode 100644 docs/themes/geekboot/layouts/partials/apiBuilder/isEnum.html delete mode 100644 docs/themes/geekboot/layouts/partials/apiBuilder/parentDescription.html delete mode 100644 docs/themes/geekboot/layouts/partials/apiBuilder/printGKVExpander.html delete mode 100644 docs/themes/geekboot/layouts/partials/apiBuilder/promotedType.html delete mode 100644 docs/themes/geekboot/layouts/partials/apiBuilder/specCollapseButtonEnd.html delete mode 100644 docs/themes/geekboot/layouts/partials/apiBuilder/specCollapseButtonStart.html delete mode 100644 docs/themes/geekboot/layouts/partials/apiBuilder/tocFields.html delete mode 100644 docs/themes/geekboot/layouts/partials/auto-index.html delete mode 100644 docs/themes/geekboot/layouts/partials/brand-tile.html delete mode 100644 docs/themes/geekboot/layouts/partials/brand.html delete mode 100644 docs/themes/geekboot/layouts/partials/crd-index.html delete mode 100644 docs/themes/geekboot/layouts/partials/crd-markdown.txt delete mode 100644 docs/themes/geekboot/layouts/partials/crd-single.html delete mode 100644 docs/themes/geekboot/layouts/partials/crd-toc.html delete mode 100644 docs/themes/geekboot/layouts/partials/docs-navbar.html delete mode 100644 docs/themes/geekboot/layouts/partials/docs-sidebar.html delete mode 100644 docs/themes/geekboot/layouts/partials/docs-topbar.html delete mode 100644 docs/themes/geekboot/layouts/partials/favicons.html delete mode 100644 docs/themes/geekboot/layouts/partials/feature-state-alert.html delete mode 100644 docs/themes/geekboot/layouts/partials/footer.html delete mode 100644 docs/themes/geekboot/layouts/partials/ga-tag.html delete mode 100644 docs/themes/geekboot/layouts/partials/header.html delete mode 100644 docs/themes/geekboot/layouts/partials/icons.html delete mode 100644 docs/themes/geekboot/layouts/partials/icons/bootstrap-logo-solid.svg delete mode 100644 docs/themes/geekboot/layouts/partials/icons/bootstrap-white-fill.svg delete mode 100644 docs/themes/geekboot/layouts/partials/icons/bootstrap.svg delete mode 100644 docs/themes/geekboot/layouts/partials/icons/circle-square.svg delete mode 100644 docs/themes/geekboot/layouts/partials/icons/cloud-fill.svg delete mode 100644 docs/themes/geekboot/layouts/partials/icons/code.svg delete mode 100644 docs/themes/geekboot/layouts/partials/icons/collapse.svg delete mode 100644 docs/themes/geekboot/layouts/partials/icons/droplet-fill.svg delete mode 100644 docs/themes/geekboot/layouts/partials/icons/expand.svg delete mode 100644 docs/themes/geekboot/layouts/partials/icons/github.svg delete mode 100644 docs/themes/geekboot/layouts/partials/icons/hamburger.svg delete mode 100644 docs/themes/geekboot/layouts/partials/icons/homepage-hero.svg delete mode 100644 docs/themes/geekboot/layouts/partials/icons/list.svg delete mode 100644 docs/themes/geekboot/layouts/partials/icons/menu.svg delete mode 100644 docs/themes/geekboot/layouts/partials/icons/opencollective.svg delete mode 100644 docs/themes/geekboot/layouts/partials/icons/pencil-square.svg delete mode 100644 docs/themes/geekboot/layouts/partials/icons/popsicle-icon.svg delete mode 100644 docs/themes/geekboot/layouts/partials/icons/slack.svg delete mode 100644 docs/themes/geekboot/layouts/partials/icons/twitter.svg delete mode 100644 docs/themes/geekboot/layouts/partials/left-nav.html delete mode 100644 docs/themes/geekboot/layouts/partials/markdown-body.txt delete mode 100644 docs/themes/geekboot/layouts/partials/master-version-alert.html delete mode 100644 docs/themes/geekboot/layouts/partials/mermaid.html delete mode 100644 docs/themes/geekboot/layouts/partials/meta-common.html delete mode 100644 docs/themes/geekboot/layouts/partials/old-version-alert.html delete mode 100644 docs/themes/geekboot/layouts/partials/page-pagination.html delete mode 100644 docs/themes/geekboot/layouts/partials/preview-version-alert.html delete mode 100644 docs/themes/geekboot/layouts/partials/recipe-header.html delete mode 100644 docs/themes/geekboot/layouts/partials/recipe-row.html delete mode 100644 docs/themes/geekboot/layouts/partials/redirect.html delete mode 100644 docs/themes/geekboot/layouts/partials/scripts.html delete mode 100644 docs/themes/geekboot/layouts/partials/search-button.html delete mode 100644 docs/themes/geekboot/layouts/partials/sidebar/contributing-guide.html delete mode 100644 docs/themes/geekboot/layouts/partials/sidebar/user-docs.html delete mode 100644 docs/themes/geekboot/layouts/partials/single-list.html delete mode 100644 docs/themes/geekboot/layouts/partials/skippy.html delete mode 100644 docs/themes/geekboot/layouts/partials/social.html delete mode 100644 docs/themes/geekboot/layouts/partials/stylesheet-cached.html delete mode 100644 docs/themes/geekboot/layouts/partials/stylesheet-dynamic.html delete mode 100644 docs/themes/geekboot/layouts/partials/theme-switch.html delete mode 100644 docs/themes/geekboot/layouts/partials/toc.html delete mode 100644 docs/themes/geekboot/layouts/partials/utils/content.html delete mode 100644 docs/themes/geekboot/layouts/partials/utils/description.html delete mode 100644 docs/themes/geekboot/layouts/partials/utils/featured.html delete mode 100644 docs/themes/geekboot/layouts/partials/utils/sorted-versions.html delete mode 100644 docs/themes/geekboot/layouts/partials/utils/title.html delete mode 100644 docs/themes/geekboot/layouts/partials/version-dropdown-menu.html delete mode 100644 docs/themes/geekboot/layouts/shortcodes/accel.html delete mode 100644 docs/themes/geekboot/layouts/shortcodes/asciinema.html delete mode 100644 docs/themes/geekboot/layouts/shortcodes/auto-index.html delete mode 100644 docs/themes/geekboot/layouts/shortcodes/card.html delete mode 100644 docs/themes/geekboot/layouts/shortcodes/cardgroup.html delete mode 100644 docs/themes/geekboot/layouts/shortcodes/check.html delete mode 100644 docs/themes/geekboot/layouts/shortcodes/editCode.html delete mode 100644 docs/themes/geekboot/layouts/shortcodes/expand.html delete mode 100644 docs/themes/geekboot/layouts/shortcodes/hint.html delete mode 100644 docs/themes/geekboot/layouts/shortcodes/hover.html delete mode 100644 docs/themes/geekboot/layouts/shortcodes/img.html delete mode 100644 docs/themes/geekboot/layouts/shortcodes/include.html delete mode 100644 docs/themes/geekboot/layouts/shortcodes/manifest-url.html delete mode 100644 docs/themes/geekboot/layouts/shortcodes/manifests.html delete mode 100644 docs/themes/geekboot/layouts/shortcodes/markdown.html delete mode 100644 docs/themes/geekboot/layouts/shortcodes/param.html delete mode 100644 docs/themes/geekboot/layouts/shortcodes/partial.html delete mode 100644 docs/themes/geekboot/layouts/shortcodes/persona.html delete mode 100644 docs/themes/geekboot/layouts/shortcodes/placeholder.html delete mode 100644 docs/themes/geekboot/layouts/shortcodes/propertylist.html delete mode 100644 docs/themes/geekboot/layouts/shortcodes/qa.html delete mode 100644 docs/themes/geekboot/layouts/shortcodes/recipe-catalog.html delete mode 100644 docs/themes/geekboot/layouts/shortcodes/recipe-table.html delete mode 100644 docs/themes/geekboot/layouts/shortcodes/repolink.html delete mode 100644 docs/themes/geekboot/layouts/shortcodes/tab.html delete mode 100644 docs/themes/geekboot/layouts/shortcodes/table.html delete mode 100644 docs/themes/geekboot/layouts/shortcodes/tabs.html delete mode 100644 docs/themes/geekboot/layouts/shortcodes/url.html delete mode 100644 docs/themes/geekboot/layouts/shortcodes/validated-deployments.html delete mode 100644 docs/themes/geekboot/layouts/shortcodes/year.html delete mode 100644 docs/themes/geekboot/static/android-chrome-192x192.png delete mode 100644 docs/themes/geekboot/static/android-chrome-512x512.png delete mode 100644 docs/themes/geekboot/static/apple-touch-icon.png delete mode 100644 docs/themes/geekboot/static/favicon-16x16.png delete mode 100644 docs/themes/geekboot/static/favicon-32x32.png delete mode 100644 docs/themes/geekboot/static/favicon.ico delete mode 100644 docs/themes/geekboot/static/fonts/dm-mono-400-latin-ext.woff2 delete mode 100644 docs/themes/geekboot/static/fonts/dm-mono-400-latin.woff2 delete mode 100644 docs/themes/geekboot/static/fonts/dm-mono-500-latin-ext.woff2 delete mode 100644 docs/themes/geekboot/static/fonts/dm-mono-500-latin.woff2 delete mode 100644 docs/themes/geekboot/static/fonts/inter-cyrillic-ext.woff2 delete mode 100644 docs/themes/geekboot/static/fonts/inter-cyrillic.woff2 delete mode 100644 docs/themes/geekboot/static/fonts/inter-greek-ext.woff2 delete mode 100644 docs/themes/geekboot/static/fonts/inter-greek.woff2 delete mode 100644 docs/themes/geekboot/static/fonts/inter-latin-ext.woff2 delete mode 100644 docs/themes/geekboot/static/fonts/inter-latin.woff2 delete mode 100644 docs/themes/geekboot/static/fonts/inter-vietnamese.woff2 delete mode 100644 docs/themes/geekboot/static/fonts/outfit-latin-ext.woff2 delete mode 100644 docs/themes/geekboot/static/fonts/outfit-latin.woff2 delete mode 100644 docs/themes/geekboot/static/img/arrow-up-white.svg delete mode 100644 docs/themes/geekboot/static/img/automate.svg delete mode 100644 docs/themes/geekboot/static/img/cncf-large.webp delete mode 100644 docs/themes/geekboot/static/img/cncf-large@2x.webp delete mode 100644 docs/themes/geekboot/static/img/cncf-large@3x.webp delete mode 100644 docs/themes/geekboot/static/img/cncf-white.webp delete mode 100644 docs/themes/geekboot/static/img/cncf.webp delete mode 100644 docs/themes/geekboot/static/img/cncf@2x.webp delete mode 100644 docs/themes/geekboot/static/img/cncf@3x.webp delete mode 100644 docs/themes/geekboot/static/img/download.svg delete mode 100644 docs/themes/geekboot/static/img/lightbox.gif delete mode 100644 docs/themes/geekboot/static/img/loading.gif delete mode 100644 docs/themes/geekboot/static/img/logos/amazonaws.svg delete mode 100644 docs/themes/geekboot/static/img/logos/amd.svg delete mode 100644 docs/themes/geekboot/static/img/logos/googlecloud.svg delete mode 100644 docs/themes/geekboot/static/img/logos/nvidia.svg delete mode 100644 docs/themes/geekboot/static/img/minus-black.svg delete mode 100644 docs/themes/geekboot/static/img/minus-white.svg delete mode 100644 docs/themes/geekboot/static/img/modelplane-icon-color.svg delete mode 100644 docs/themes/geekboot/static/img/modelplane-icon-white.svg delete mode 100644 docs/themes/geekboot/static/img/modelplane-logo-inverted.svg delete mode 100644 docs/themes/geekboot/static/img/modelplane-logo.svg delete mode 100644 docs/themes/geekboot/static/img/multi-crane.svg delete mode 100644 docs/themes/geekboot/static/img/plus-150.svg delete mode 100644 docs/themes/geekboot/static/img/plus-black.svg delete mode 100644 docs/themes/geekboot/static/img/plus-white.svg delete mode 100644 docs/themes/geekboot/static/img/popsicle-icon.svg delete mode 100644 docs/themes/geekboot/static/img/sort-down-dark.svg delete mode 100644 docs/themes/geekboot/static/img/sort-down-light.svg delete mode 100644 docs/themes/geekboot/static/img/sort-up-dark.svg delete mode 100644 docs/themes/geekboot/static/img/sort-up-light.svg delete mode 100644 docs/themes/geekboot/static/img/truck.svg delete mode 100644 docs/themes/geekboot/static/llms.txt delete mode 100644 docs/themes/geekboot/static/site.webmanifest delete mode 100644 docs/utils/docsearch/config.json delete mode 100644 docs/utils/htmltest/.htmltest.yml delete mode 100644 docs/utils/webpack/package-lock.json delete mode 100644 docs/utils/webpack/package.json delete mode 100644 docs/utils/webpack/src/LICENSE delete mode 100644 docs/utils/webpack/src/js/bootstrap/src/alert.js delete mode 100644 docs/utils/webpack/src/js/bootstrap/src/base-component.js delete mode 100644 docs/utils/webpack/src/js/bootstrap/src/button.js delete mode 100644 docs/utils/webpack/src/js/bootstrap/src/carousel.js delete mode 100644 docs/utils/webpack/src/js/bootstrap/src/collapse.js delete mode 100644 docs/utils/webpack/src/js/bootstrap/src/dom/data.js delete mode 100644 docs/utils/webpack/src/js/bootstrap/src/dom/event-handler.js delete mode 100644 docs/utils/webpack/src/js/bootstrap/src/dom/manipulator.js delete mode 100644 docs/utils/webpack/src/js/bootstrap/src/dom/selector-engine.js delete mode 100644 docs/utils/webpack/src/js/bootstrap/src/dropdown.js delete mode 100644 docs/utils/webpack/src/js/bootstrap/src/modal.js delete mode 100644 docs/utils/webpack/src/js/bootstrap/src/offcanvas.js delete mode 100644 docs/utils/webpack/src/js/bootstrap/src/popover.js delete mode 100644 docs/utils/webpack/src/js/bootstrap/src/scrollspy.js delete mode 100644 docs/utils/webpack/src/js/bootstrap/src/tab.js delete mode 100644 docs/utils/webpack/src/js/bootstrap/src/toast.js delete mode 100644 docs/utils/webpack/src/js/bootstrap/src/tooltip.js delete mode 100644 docs/utils/webpack/src/js/bootstrap/src/util/backdrop.js delete mode 100644 docs/utils/webpack/src/js/bootstrap/src/util/component-functions.js delete mode 100644 docs/utils/webpack/src/js/bootstrap/src/util/config.js delete mode 100644 docs/utils/webpack/src/js/bootstrap/src/util/focustrap.js delete mode 100644 docs/utils/webpack/src/js/bootstrap/src/util/index.js delete mode 100644 docs/utils/webpack/src/js/bootstrap/src/util/sanitizer.js delete mode 100644 docs/utils/webpack/src/js/bootstrap/src/util/scrollbar.js delete mode 100644 docs/utils/webpack/src/js/bootstrap/src/util/swipe.js delete mode 100644 docs/utils/webpack/src/js/bootstrap/src/util/template-factory.js delete mode 100644 docs/utils/webpack/src/js/colorMode.js delete mode 100644 docs/utils/webpack/src/js/customClipboard.js delete mode 100644 docs/utils/webpack/src/js/globalScripts.js delete mode 100644 docs/utils/webpack/src/js/hoverHighlight.js delete mode 100644 docs/utils/webpack/src/js/slackNotify.js delete mode 100644 docs/utils/webpack/src/js/tabDeepAnchor.js delete mode 100644 docs/utils/webpack/webpack.config.js delete mode 100755 docs/vercel-build.sh delete mode 100644 docs/vercel.json diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 000000000..28b78145e --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,77 @@ +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. +on: + pull_request: + 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 + + # A pull request from a fork gets no secrets and no write token, so it + # cannot dispatch or comment. Reviewers preview those locally, with + # `nix run github:modelplaneai/docs-site#preview`. + if: >- + github.event_name == 'push' + || github.event.pull_request.head.repo.full_name == github.repository + + env: + SITE_REPO: modelplaneai/docs-site + + steps: + # The head sha rather than the merge commit: it is what the reviewer is + # reading, and it exists in this repo for the site to fetch. + - name: Request a preview + if: github.event_name == 'pull_request' + env: + GH_TOKEN: ${{ secrets.DOCS_SITE_DISPATCH_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: ${{ secrets.DOCS_SITE_DISPATCH_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..56274c7e8 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,18 @@ 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. A +content change that breaks a link fails there, when the site repo's pin for this +repo moves. + 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 +495,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/data/versions.yaml b/docs/data/versions.yaml deleted file mode 100644 index 8aaf19202..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.1" - url: "https://v0-1.docs.modelplane.ai" - - version: "0.2" - url: "https://v0-2.docs.modelplane.ai" - - version: "0.3" - url: "https://v0-3.docs.modelplane.ai" diff --git a/docs/hugo.toml b/docs/hugo.toml deleted file mode 100644 index ad313cc1f..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.3" - [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