diff --git a/.devcontainer/post-create.sh b/.devcontainer/post-create.sh index be07f0ff..b2942e38 100755 --- a/.devcontainer/post-create.sh +++ b/.devcontainer/post-create.sh @@ -6,8 +6,4 @@ if ! command -v jq >/dev/null 2>&1; then sudo apt-get install -y jq fi -if ! command -v nu >/dev/null 2>&1; then - npm install -g nushell -fi - npm ci diff --git a/.github/ISSUE_TEMPLATE/-send-your-theme.md b/.github/ISSUE_TEMPLATE/-send-your-theme.md deleted file mode 100644 index e9f988fe..00000000 --- a/.github/ISSUE_TEMPLATE/-send-your-theme.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -name: "❤ Send Your Theme" -about: An easy way to submit your theme if you don't know how to do it via pull request. -title: "[NEWTHEME] Name of your theme" -labels: new theme -assignees: Neikon, BeyondMagic - ---- - -############ DELETE FROM HERE BEFORE SENDING ######### -Replace the .......... with the corresponding information. Example: -``` -{ - "title": "the best dark theme", - "link": "https://github.com/myuser/myTheme", - "description": "a dark theme", - "image": "https://raw.githubusercontent.com/previewthemepicture.png", - "tags": [ "John", "dark", "minimal","oneline", "............." ], - "repository": "https://github.com/myuser/myTheme" - } -``` -################# DELETE UNTIL HERE ################# - -``` -{ - "title": "..........", - "link": "..........", - "description": "..........", - "image": "..........", - "tags": [ "your username/name", "theme type: dark", "theme type: light", "............." ], - "repository": ".........." -} -``` diff --git a/.github/ISSUE_TEMPLATE/theme-submission.yml b/.github/ISSUE_TEMPLATE/theme-submission.yml new file mode 100644 index 00000000..4848301e --- /dev/null +++ b/.github/ISSUE_TEMPLATE/theme-submission.yml @@ -0,0 +1,75 @@ +name: Submit a theme +description: Share a Firefox userChrome.css theme repository with the hub. +title: "[Theme]: " +labels: + - theme submission +body: + - type: markdown + attributes: + value: | + Thanks for sharing a Firefox CSS theme. This form opens a review issue; automation will turn it into a candidate pull request when possible. + - type: input + id: title + attributes: + label: Theme title + description: Use the public name of the theme. + placeholder: My Firefox Theme + validations: + required: true + - type: input + id: repository + attributes: + label: Original repository + description: Link to the source repository maintained by the author or project. + placeholder: https://github.com/owner/repository + validations: + required: true + - type: input + id: homepage + attributes: + label: Homepage + description: Optional project page, docs page, or website. + placeholder: https://example.com + validations: + required: false + - type: textarea + id: description + attributes: + label: Short description + description: Keep it concise. Mention the visual style, layout idea, or main browser customization. + placeholder: A compact dark Firefox theme with vertical tabs and rounded controls. + validations: + required: true + - type: textarea + id: screenshots + attributes: + label: Screenshot URLs + description: Attach images here or paste direct image URLs. Use one screenshot per line when pasting links. + placeholder: Drag screenshots into this field, or paste image URLs. + validations: + required: true + - type: input + id: tags + attributes: + label: Tags + description: Use lowercase tags separated by commas, such as dark, compact, sidebery, oneline. + placeholder: dark, compact, sidebery + validations: + required: true + - type: dropdown + id: submitter_role + attributes: + label: Your relationship to the theme + options: + - Author + - Maintainer + - User or recommender + validations: + required: true + - type: textarea + id: notes + attributes: + label: Notes for reviewers + description: Optional compatibility notes, install caveats, or context for maintainers. + validations: + required: false diff --git a/.github/dependabot.yml b/.github/dependabot.yml index f33a02cd..f9c7a197 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -10,3 +10,7 @@ updates: directory: "/" schedule: interval: weekly + - package-ecosystem: "npm" + directory: "/" + schedule: + interval: weekly diff --git a/.github/workflows/audit-theme-repositories.yml b/.github/workflows/audit-theme-repositories.yml new file mode 100644 index 00000000..6b783294 --- /dev/null +++ b/.github/workflows/audit-theme-repositories.yml @@ -0,0 +1,84 @@ +name: Audit Theme Repositories + +on: + schedule: + - cron: '17 3 1 * *' + workflow_dispatch: + +permissions: + contents: write + pull-requests: write + +concurrency: + group: audit-theme-repositories + cancel-in-progress: false + +jobs: + audit: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + + - uses: actions/setup-node@v6 + with: + node-version: 24 + cache: npm + + - run: npm ci + + - name: Audit published and archived theme repositories + env: + GITHUB_TOKEN: ${{ github.token }} + RETIREMENT_REPORT: theme-repository-audit.md + run: npm run audit:theme-repos + + - run: npm test + - run: npm run build + + - name: Open repository audit review PR + env: + GH_TOKEN: ${{ secrets.AUDIT_PR_TOKEN || github.token }} + shell: bash + run: | + if git diff --quiet -- src/content/themes; then + echo "No theme archive or removal changes proposed." + exit 0 + fi + + branch="automation/theme-repository-audit-$(date -u +%Y-%m)" + + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git checkout -B "$branch" + git add src/content/themes + git commit -m "chore: propose theme repository audit changes" + git fetch --no-tags --depth=1 origin "$branch:refs/remotes/origin/$branch" || true + git push --force-with-lease origin "$branch" + + manual_url="https://github.com/${GITHUB_REPOSITORY}/pull/new/${branch}" + title="Review archived or unavailable theme repositories" + + if pr_url="$(gh pr view "$branch" --json url --jq .url 2>/dev/null)"; then + gh pr edit "$branch" \ + --title "$title" \ + --body-file theme-repository-audit.md + echo "Updated repository audit PR: ${pr_url}" >> "$GITHUB_STEP_SUMMARY" + else + if pr_url="$(gh pr create \ + --base main \ + --head "$branch" \ + --title "$title" \ + --body-file theme-repository-audit.md 2>pr-create-error.txt)"; then + echo "Created repository audit PR: ${pr_url}" >> "$GITHUB_STEP_SUMMARY" + else + echo "::warning::The audit branch was pushed, but GitHub refused to create the PR automatically." + cat pr-create-error.txt + { + echo "Repository audit changes were pushed to \`${branch}\`, but the workflow token could not create the PR automatically." + echo "" + echo "Open it manually: ${manual_url}" + echo "" + echo "To allow automatic PR creation, enable **Settings > Actions > General > Workflow permissions > Allow GitHub Actions to create and approve pull requests**, or add an \`AUDIT_PR_TOKEN\` secret with permission to create pull requests." + } >> "$GITHUB_STEP_SUMMARY" + fi + fi diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6dfba5e5..6e11c98d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,28 +1,27 @@ -name: Build And Publish Docs +name: Build And Deploy on: push: branches: - main paths: - - 'dev/**' - - 'images/**' - - 'themes.json' - - 'gulpfile.js' - - 'gulpconfig.js' + - 'src/**' + - 'public/**' + - 'scripts/**' + - 'astro.config.mjs' + - 'tsconfig.json' - 'package.json' - 'package-lock.json' - - 'dev/config/**' + - '.github/workflows/**' workflow_dispatch: -env: - FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true" - permissions: - contents: write + contents: read + pages: write + id-token: write concurrency: - group: build-and-publish-${{ github.ref }} + group: pages-${{ github.ref }} cancel-in-progress: true jobs: @@ -42,16 +41,8 @@ jobs: - run: npm test - run: npm run build - - name: Commit generated docs - shell: bash - run: | - if git diff --quiet -- docs; then - echo "No generated docs changes to commit." - exit 0 - fi - - git config --local user.email "41898282+github-actions[bot]@users.noreply.github.com" - git config --local user.name "github-actions[bot]" - git add docs - git commit -m "ci(build): compile and deploy" - git push + - uses: actions/configure-pages@v6 + - uses: actions/upload-pages-artifact@v5 + with: + path: dist + - uses: actions/deploy-pages@v5 diff --git a/.github/workflows/check-themes.yml b/.github/workflows/check-themes.yml index 8dd86afe..fd78222d 100644 --- a/.github/workflows/check-themes.yml +++ b/.github/workflows/check-themes.yml @@ -4,19 +4,15 @@ on: pull_request: branches: [ main ] paths: - - 'dev/**' - - 'images/**' - - 'themes.json' - - 'gulpfile.js' - - 'gulpconfig.js' + - 'src/**' + - 'public/**' + - 'scripts/**' + - 'astro.config.mjs' + - 'tsconfig.json' - 'package.json' - 'package-lock.json' - - 'dev/config/**' - '.github/workflows/**' -env: - FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true" - jobs: validate_pull_requests: runs-on: ubuntu-latest diff --git a/.github/workflows/close-merged-theme-submission.yml b/.github/workflows/close-merged-theme-submission.yml new file mode 100644 index 00000000..c0b55624 --- /dev/null +++ b/.github/workflows/close-merged-theme-submission.yml @@ -0,0 +1,31 @@ +name: Close Merged Theme Submission Issue + +on: + pull_request: + types: [closed] + +permissions: + issues: write + pull-requests: read + +jobs: + close_issue: + if: ${{ github.event.pull_request.merged == true && startsWith(github.event.pull_request.head.ref, 'submissions/theme-') }} + runs-on: ubuntu-latest + steps: + - name: Close source issue + env: + GH_TOKEN: ${{ github.token }} + PR_BODY: ${{ github.event.pull_request.body }} + PR_NUMBER: ${{ github.event.pull_request.number }} + shell: bash + run: | + issue_number="$(printf '%s' "$PR_BODY" | sed -nE 's/^Generated from #([0-9]+)\.$/\1/p' | head -n 1)" + + if [ -z "$issue_number" ]; then + echo "No source issue number found in PR #${PR_NUMBER}." + exit 0 + fi + + gh issue close "$issue_number" \ + --comment "Theme submission was merged in #${PR_NUMBER}. Thanks for sharing it." diff --git a/.github/workflows/create-theme-submission.yml b/.github/workflows/create-theme-submission.yml new file mode 100644 index 00000000..1411b66f --- /dev/null +++ b/.github/workflows/create-theme-submission.yml @@ -0,0 +1,133 @@ +name: Create Theme Submission PR + +on: + issues: + types: [opened, edited, reopened] + workflow_dispatch: + inputs: + issue_number: + description: Issue number to process + required: true + type: number + +permissions: + contents: write + issues: write + pull-requests: write + +concurrency: + group: theme-submission-${{ github.event.issue.number || inputs.issue_number }} + cancel-in-progress: true + +jobs: + candidate_pull_request: + if: ${{ github.event_name == 'workflow_dispatch' || (!github.event.issue.pull_request && contains(github.event.issue.body, '### Theme title') && contains(github.event.issue.body, '### Original repository')) }} + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + + - uses: actions/setup-node@v6 + with: + node-version: 24 + cache: npm + + - run: npm ci + + - name: Load issue data + id: issue + env: + GH_TOKEN: ${{ github.token }} + EVENT_ISSUE_NUMBER: ${{ github.event.issue.number }} + INPUT_ISSUE_NUMBER: ${{ inputs.issue_number }} + shell: bash + run: | + issue_number="${EVENT_ISSUE_NUMBER:-$INPUT_ISSUE_NUMBER}" + + if [ -z "$issue_number" ]; then + echo "::error::No issue number was provided." + exit 1 + fi + + gh issue view "$issue_number" --json title,body,author --jq .title > issue-title.txt + gh issue view "$issue_number" --json title,body,author --jq .body > issue-body.md + gh issue view "$issue_number" --json title,body,author --jq .author.login > issue-author.txt + + { + echo "number=$issue_number" + echo "title<> "$GITHUB_OUTPUT" + + - name: Generate candidate entry + env: + ISSUE_NUMBER: ${{ steps.issue.outputs.number }} + ISSUE_TITLE: ${{ steps.issue.outputs.title }} + ISSUE_AUTHOR: ${{ steps.issue.outputs.author }} + ISSUE_BODY_FILE: issue-body.md + GITHUB_TOKEN: ${{ github.token }} + run: node scripts/create-theme-submission-from-issue.mjs + + - run: npm test + - run: npm run build + + - name: Open or update candidate PR + env: + GH_TOKEN: ${{ secrets.SUBMISSION_PR_TOKEN || github.token }} + ISSUE_NUMBER: ${{ steps.issue.outputs.number }} + ISSUE_AUTHOR: ${{ steps.issue.outputs.author }} + SUBMISSION_REVIEWERS: ${{ vars.SUBMISSION_REVIEWERS || 'Neikon' }} + shell: bash + run: | + branch="submissions/theme-${ISSUE_NUMBER}" + reviewers="${SUBMISSION_REVIEWERS:-Neikon}" + + if [ -z "$(git status --porcelain -- src/content/themes public/assets/img/themes)" ]; then + echo "No theme submission changes were generated." + exit 0 + fi + + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git checkout -B "$branch" + git add src/content/themes public/assets/img/themes + git commit -m "feat: add candidate theme from issue #${ISSUE_NUMBER}" + git fetch --no-tags --depth=1 origin "$branch:refs/remotes/origin/$branch" || true + git push --force-with-lease origin "$branch" + + manual_url="https://github.com/${GITHUB_REPOSITORY}/pull/new/${branch}" + title="Add candidate theme from issue #${ISSUE_NUMBER}" + + open_pr_url="$(gh pr list --head "$branch" --state open --json url --jq '.[0].url // empty')" + + if [ -n "$open_pr_url" ]; then + gh pr edit "$open_pr_url" \ + --title "$title" \ + --body-file theme-submission-pr.md + gh pr edit "$open_pr_url" --add-reviewer "$reviewers" || true + pr_url="$open_pr_url" + echo "Updated theme submission PR: ${pr_url}" >> "$GITHUB_STEP_SUMMARY" + else + if pr_url="$(gh pr create \ + --base main \ + --head "$branch" \ + --title "$title" \ + --body-file theme-submission-pr.md 2>pr-create-error.txt)"; then + gh pr edit "$branch" --add-reviewer "$reviewers" || true + echo "Created theme submission PR: ${pr_url}" >> "$GITHUB_STEP_SUMMARY" + else + echo "::warning::The submission branch was pushed, but GitHub refused to create the PR automatically." + cat pr-create-error.txt + { + echo "Theme submission changes were pushed to \`${branch}\`, but the workflow token could not create the PR automatically." + echo "" + echo "Open it manually: ${manual_url}" + echo "" + echo "To allow automatic PR creation, enable **Settings > Actions > General > Workflow permissions > Allow GitHub Actions to create and approve pull requests**, or add a \`SUBMISSION_PR_TOKEN\` secret with permission to create pull requests." + } >> "$GITHUB_STEP_SUMMARY" + pr_url="$manual_url" + fi + fi + + gh issue comment "$ISSUE_NUMBER" --body "Thanks @${ISSUE_AUTHOR}. I generated a candidate submission PR for review: ${pr_url}" diff --git a/.github/workflows/publish-approved-theme-submission.yml b/.github/workflows/publish-approved-theme-submission.yml new file mode 100644 index 00000000..2b97c968 --- /dev/null +++ b/.github/workflows/publish-approved-theme-submission.yml @@ -0,0 +1,66 @@ +name: Publish Approved Theme Submission + +on: + pull_request_review: + types: [submitted] + +permissions: + contents: write + pull-requests: write + +concurrency: + group: publish-theme-submission-${{ github.event.pull_request.number }} + cancel-in-progress: false + +jobs: + publish_candidate: + if: ${{ github.event.review.state == 'approved' && github.event.pull_request.head.repo.full_name == github.repository && startsWith(github.event.pull_request.head.ref, 'submissions/theme-') }} + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + with: + ref: ${{ github.event.pull_request.head.ref }} + fetch-depth: 0 + + - uses: actions/setup-node@v6 + with: + node-version: 24 + cache: npm + + - run: npm ci + + - name: Merge latest main + run: | + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git fetch --no-tags origin main + git merge --no-edit origin/main + + - name: Publish candidate theme + env: + PR_NUMBER: ${{ github.event.pull_request.number }} + GITHUB_TOKEN: ${{ github.token }} + run: node scripts/publish-approved-theme-submission.mjs + + - run: npm test + - run: npm run build + + - name: Commit publication update + env: + GH_TOKEN: ${{ secrets.SUBMISSION_PR_TOKEN || github.token }} + PR_NUMBER: ${{ github.event.pull_request.number }} + PR_BRANCH: ${{ github.event.pull_request.head.ref }} + shell: bash + run: | + if [ -z "$(git status --porcelain -- src/content/themes)" ]; then + echo "No publication changes were needed." + exit 0 + fi + + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git add src/content/themes + git commit -m "chore: publish approved theme submission #${PR_NUMBER}" + git push origin "HEAD:${PR_BRANCH}" + + gh pr comment "$PR_NUMBER" --body "Approved submission prepared for publishing. I switched the theme to \`published\` and assigned the next catalog index. You can merge this PR when the checks pass." diff --git a/.github/workflows/refresh-theme-stats.yml b/.github/workflows/refresh-theme-stats.yml new file mode 100644 index 00000000..1a0daa3b --- /dev/null +++ b/.github/workflows/refresh-theme-stats.yml @@ -0,0 +1,99 @@ +name: Refresh Theme Stats + +on: + schedule: + - cron: '43 4 8 * *' + workflow_dispatch: + +permissions: + contents: write + pull-requests: write + +concurrency: + group: refresh-theme-stats + cancel-in-progress: false + +jobs: + refresh: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + + - uses: actions/setup-node@v6 + with: + node-version: 24 + cache: npm + + - run: npm ci + + - name: Refresh repository metadata + env: + GITHUB_TOKEN: ${{ github.token }} + GITLAB_TOKEN: ${{ secrets.GITLAB_TOKEN }} + CODEBERG_TOKEN: ${{ secrets.CODEBERG_TOKEN }} + run: npm run refresh:themes + + - run: npm test + - run: npm run build + + - name: Open theme stats refresh PR + env: + GH_TOKEN: ${{ secrets.STATS_PR_TOKEN || github.token }} + shell: bash + run: | + if git diff --quiet -- src/content/themes; then + echo "No theme stats changes found." + exit 0 + fi + + branch="automation/theme-stats-refresh-$(date -u +%Y-%m)" + report="theme-stats-refresh.md" + + { + echo "## Theme stats refresh" + echo "" + echo "Updates repository metadata for existing catalog entries:" + echo "" + echo "- stars" + echo "- last update date" + echo "- owner avatar" + echo "- accessibility status" + echo "" + echo "This workflow does not discover new themes or change editorial fields." + } > "$report" + + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git checkout -B "$branch" + git add src/content/themes + git commit -m "chore: refresh theme repository stats" + git fetch --no-tags --depth=1 origin "$branch:refs/remotes/origin/$branch" || true + git push --force-with-lease origin "$branch" + + manual_url="https://github.com/${GITHUB_REPOSITORY}/pull/new/${branch}" + title="Refresh theme repository stats" + + if pr_url="$(gh pr view "$branch" --json url --jq .url 2>/dev/null)"; then + gh pr edit "$branch" \ + --title "$title" \ + --body-file "$report" + echo "Updated theme stats refresh PR: ${pr_url}" >> "$GITHUB_STEP_SUMMARY" + else + if pr_url="$(gh pr create \ + --base main \ + --head "$branch" \ + --title "$title" \ + --body-file "$report" 2>pr-create-error.txt)"; then + echo "Created theme stats refresh PR: ${pr_url}" >> "$GITHUB_STEP_SUMMARY" + else + echo "::warning::The stats refresh branch was pushed, but GitHub refused to create the PR automatically." + cat pr-create-error.txt + { + echo "Theme stats changes were pushed to \`${branch}\`, but the workflow token could not create the PR automatically." + echo "" + echo "Open it manually: ${manual_url}" + echo "" + echo "To allow automatic PR creation, enable **Settings > Actions > General > Workflow permissions > Allow GitHub Actions to create and approve pull requests**, or add a \`STATS_PR_TOKEN\` secret with permission to create pull requests." + } >> "$GITHUB_STEP_SUMMARY" + fi + fi diff --git a/.gitignore b/.gitignore index 68e106a7..6791d10a 100644 --- a/.gitignore +++ b/.gitignore @@ -47,15 +47,11 @@ Icon? # Build output /dist/ +/.astro/ /build/ -/docs/assets/css/ -/docs/assets/js/ -# Gulp cache -.cache/ - -# SASS cache -.sass-cache/ +# Generated workflow reports +/theme-repository-audit.md # Coverage directory used by tools like istanbul coverage/ diff --git a/MEMORY.md b/MEMORY.md index 19d29be8..cf7cec85 100644 --- a/MEMORY.md +++ b/MEMORY.md @@ -5,67 +5,80 @@ This file stores durable project context so future conversations can resume work ## Project Summary - Repository: `FirefoxCSS-Store.github.io` -- Purpose: static site that catalogs Firefox `userChrome.css` themes -- Main data source: `themes.json` -- Site source: `dev/` -- Generated site output: `docs/` +- Purpose: static community hub for discovering and sharing Firefox `userChrome.css` themes +- Product direction: user/author-submitted hub that links to original repositories; no scraping, crawling, or automatic theme discovery +- Main data source: one structured JSON entry per theme under `src/content/themes/` +- Site source: Astro app under `src/` +- Generated site output: `dist/` during build; generated files are not committed ## Tooling And Validation - Package manager: `npm` - Build command: `npm run build` - Test command: `npm test` -- Build system: `gulp` -- Theme validation script: `tests/themes.check.js` -- Theme metadata refresh script: `scripts/sort_themes.nu` +- Build system: Astro + TypeScript +- Theme validation script: `scripts/validate-themes.mjs` +- Repository metadata refresh script: `scripts/refresh-theme-stats.mjs`; it only enriches repositories already present in submitted theme entries +- Monthly repository audit script: `scripts/audit-theme-repositories.mjs`; it only checks repositories already present in submitted theme entries, including archived entries so deleted archived repositories can still be proposed for removal - Dev container config: `.devcontainer/devcontainer.json` - Devcontainer bootstrap script: `.devcontainer/post-create.sh` -- Devcontainer automation now runs `.devcontainer/post-create.sh` from `postCreateCommand` to ensure `jq`, `nu`, and project dependencies are installed after container creation/rebuild -- The build toolchain now runs cleanly on Node 24 with `gulp@5`, `gulp-sass@6`, `gulp-terser`, and a custom `sharp`-based WebP conversion step -- `npm audit` is currently clean after adding targeted `overrides` for `markdown-it` and `@parcel/watcher` transitive dependencies +- Devcontainer automation runs `.devcontainer/post-create.sh` from `postCreateCommand` to install project dependencies after container creation/rebuild +- The build toolchain runs on Node 24 with Astro 6 +- `npm audit` is currently clean after adding a targeted `yaml` override for the Astro check toolchain ## Automation Context -- Active working branch created for automation improvements: `improve-automation` +- Active upstream pull request for the community hub: FirefoxCSS-Store/FirefoxCSS-Store.github.io#330 (`Neikon:main` -> `FirefoxCSS-Store:main`) +- Stale fork helper branches merged into `origin/main` were deleted on 2026-05-02: `rebuild-astro-community-hub`, `codex/issue-submission-automation`, `automation/theme-repository-audit-2026-04`, `automation/theme-stats-refresh-2026-04`, and `submissions/theme-2` +- Deployment config now targets the upstream organization site: `https://firefoxcss-store.github.io` with no Astro `base` - Existing GitHub Actions: - `.github/workflows/build.yml` - `.github/workflows/check-themes.yml` -- CI now uses current `actions/checkout@v4` and `actions/setup-node@v4` on Node 24 +- `.github/workflows/create-theme-submission.yml` +- `.github/workflows/publish-approved-theme-submission.yml` +- `.github/workflows/close-merged-theme-submission.yml` +- `.github/workflows/refresh-theme-stats.yml` - CI workflows now opt into Node 24 for JavaScript actions explicitly and use `actions/checkout@v6` plus `actions/setup-node@v6` -- Build workflow now runs automatically on pushes to `main` that affect site/build inputs and commits regenerated `docs/` output back to the branch -- PR validation now runs `npm test` and `npm run build` for site-related changes instead of only checking `themes.json` +- Build workflow runs automatically on pushes to `main` that affect Astro site/build inputs and deploys `dist/` through GitHub Pages artifacts +- PR validation runs `npm test` and `npm run build` for site-related changes +- Theme submission automation uses GitHub Issue Forms plus `.github/workflows/create-theme-submission.yml`; it creates candidate PRs from complete submission issues without Decap or external auth hosting +- Approved submission PRs are finalized by `.github/workflows/publish-approved-theme-submission.yml`, which sets `status: "published"` and assigns the next available low `catalogIndex`; maintainers still merge the PR explicitly +- Merged submission PRs close their source issue through `.github/workflows/close-merged-theme-submission.yml`; new generated PR bodies also include `Closes #` +- `.github/workflows/refresh-theme-stats.yml` runs monthly and opens a PR for changed repository stars, update dates, owner avatars, or accessibility values - The build workflow syntax also requires `workflow_dispatch:` with a trailing colon; missing it makes GitHub mark the workflow file as invalid even if other checks still pass ## Repo Notes - Local `.codex` file is ignored in `.gitignore` -- Build workflow currently commits generated files back to the branch after `npm run build` -- Pull requests touching `themes.json` trigger validation via `npm test` -- Site pages are generated from Pug in `dev/pug/` -- Client behavior is implemented in `dev/js/main.js` -- Styles are authored in SCSS under `dev/scss/` -- Published site assets live in committed `docs/` -- Local containerized development is configured to install Node, npm, `jq`, and Nushell +- Build workflow now deploys the Astro `dist/` artifact to GitHub Pages and does not commit generated files back to the branch +- Upstream deployment values were restored on 2026-05-02: `astro.config.mjs` uses `site: https://firefoxcss-store.github.io` with no `base`; GitHub navigation and submission links point to `FirefoxCSS-Store/FirefoxCSS-Store.github.io` +- Project naming was kept as `FirefoxCSS-Store` on 2026-05-02; defer any visible rename to `FirefoxCSS Hub` until a later explicit decision +- Pull requests touching catalog or site files trigger validation via `npm test` and `npm run build` +- Site pages are authored as Astro routes in `src/pages/` +- Client behavior for catalog search/filter/sort is implemented in `src/scripts/hub.ts` +- Styles are authored in `src/styles/global.css` +- Public static assets live under `public/` +- Local containerized development is configured to install Node, npm, and `jq`; Nushell is no longer required for catalog refresh - The devcontainer also runs `npm ci` automatically, so rebuilds recreate `node_modules` without manual setup -- `gulpfile.js` now lazy-loads ESM-only Gulp plugins and skips optional directories like `dev/fonts/` when they are absent -- Hidden config generation now filters non-`.txt` files explicitly so builds do not create stray files like `docs/.robots` -- Theme entries that depended on fragile remote screenshots have been localized into `images/themes/remote-*` and now build into committed assets under `docs/assets/img/themes/` -- Binary copies for static images now use `fs.promises.copyFile` instead of `gulp.src().pipe(dest())` because the stream path was corrupting some `.webp` assets in `docs/` +- Optimized legacy screenshots were moved into `public/assets/img/themes/` - Project-facing text should be written in English by default; chat replies should mirror the user's language ## Architecture Snapshot -- `themes.json` is the single catalog source used by the client and copied to `docs/themes.json` during build -- The frontend is a mostly static site with a small client-side app that fetches `themes.json`, sorts, filters, and renders cards in the browser -- Gulp handles Pug compilation, SCSS compilation, Babel transpilation, JS minification with Terser, image conversion/copy with Sharp, and config file copying -- Images from `images/` are emitted to `docs/assets/img/`; many local screenshots are converted to WebP -- `scripts/sort_themes.nu` enriches theme entries with `pushed_at`, `stargazers_count`, and `avatar` using GitHub/GitLab/Codeberg APIs or git cloning fallback +- `src/content/themes/*.json` is the catalog source of truth; only `published` entries render publicly +- Astro content collections validate the theme schema during build +- The home page renders all published theme cards statically and uses small client-side TypeScript for search, tag filters, and sorting +- Each published theme gets a `/themes/[slug]/` detail page and the site also generates `/themes.json` +- Archived-but-existing repositories are preserved under `/archive/` with unsupported messaging; unavailable/deleted repositories are proposed for removal by PR +- New theme submissions come through the `Submit a theme` GitHub Issue Form; automation turns them into `candidate` PRs, and they become public only after human review +- Theme submission and approval automation populates basic repository stats for submitted repositories, reusing the same provider logic as `npm run refresh:themes` ## Known Technical Risks -- Theme rendering is intentionally throttled with `444ms` per card, which scales poorly for a catalog of 100+ entries -- Search/filter logic depends on client-side fetch and has no visible loading or error handling -- Test coverage is narrow: `tests/themes.check.js` validates only basic key order/types and not richer schema or link/image integrity +- Automatic submission PR creation depends on repository workflow permissions. If `GITHUB_TOKEN` cannot create PRs, the workflow still pushes `submissions/theme-` and reports a manual PR URL; add `SUBMISSION_PR_TOKEN` or enable GitHub Actions PR creation to make it fully automatic. +- `scripts/refresh-theme-stats.mjs` uses external APIs when run manually or through the monthly stats refresh workflow; it should never discover new repositories +- `.github/workflows/audit-theme-repositories.yml` runs monthly and creates a PR when repositories should be archived or removed; it audits both `published` and `archived` entries, but only `published` entries are moved into the archive. If an archived entry later becomes unavailable, it is proposed for removal. If `GITHUB_TOKEN` is blocked from creating PRs, it still pushes the audit branch and reports a manual PR URL. Automatic PR creation requires enabling the repository's "Allow GitHub Actions to create and approve pull requests" setting or adding an `AUDIT_PR_TOKEN` secret with PR creation permission. +- Existing legacy theme entries are marked with `submitterRole: "legacy"` because original submitter relationship is unknown ## Working Agreement For Future Sessions diff --git a/README.md b/README.md index 78b8a083..3894b265 100644 --- a/README.md +++ b/README.md @@ -1,110 +1,92 @@ -

FirefoxCSS-Store

-

-
-A collection site of Firefox userchrome themes, mostly from FirefoxCSS Reddit.
Preview here.

+# FirefoxCSS-Store ---- +FirefoxCSS-Store is a static community catalog for discovering and sharing Firefox `userChrome.css` themes. It does not scrape, crawl, or auto-discover themes. Every public entry points back to the original repository submitted by an author, maintainer, or community user. -## Generic Installation +## What This Project Publishes -+ Go to the wanted theme and click the download button. -+ You should now be on the Github page for that topic. -+ Below you should see a guide on how to install that particular theme and a few preview pictures. Anyway, here are some common steps for all themes. +- A searchable theme gallery built with Astro and TypeScript. +- One public detail page per published theme. +- A generated `/themes.json` endpoint for lightweight integrations. +- A GitHub Issue Form that collects theme submissions and opens candidate PRs through automation. +- Validation scripts that keep catalog entries structured, reviewable, and safe to publish. -1. Download the theme with the big green button: "Code" >> Download.zip -2. Open `about:config` page. -3. A dialog will warn you, but ignore it, ~~just do it~~ press the `I accept the risk!` button. -4. Search for these: +## Local Development - + **`toolkit.legacyUserProfileCustomizations.stylesheets`** - + **`layers.acceleration.force-enabled`** - + **`gfx.webrender.all`** - + **`gfx.webrender.enabled`** - + **`layout.css.backdrop-filter.enabled`** - + **`svg.context-properties.content.enabled`** +```sh +npm ci +npm test +npm run build +npm run dev +``` - Then make sure to **enable them all!** +## Theme Data -5. Go to your Firefox profile. +Theme entries live in `src/content/themes/*.json`. New submissions should start with: - + Linux - `$HOME/.mozilla/firefox/XXXXXXX.default-XXXXXX/`. - + Windows - `C:\Users\\AppData\Roaming\Mozilla\Firefox\Profiles\XXXXXXX.default-XXXXXX`. - + macOS - `Users//Library/Application Support/Firefox/Profiles/XXXXXXX.default-XXXXXXX`. +- `status: "candidate"` +- `submitterRole: "author"`, `"user"`, or `"maintainer"` +- the original `repository` URL +- at least one screenshot in `public/assets/img/themes/` +- normalized lowercase tags -6. Create a folder and name it **`chrome`**, then assuming that you already have cloned this repo, just copy the theme to `chrome` folder. -7. Restart Firefox. ---- +Only entries with `status: "published"` are rendered in the public catalog and exported through `/themes.json`. -## Installation with Firefox Theme Installer (Independent App from this repo) +Entries with `status: "archived"` are rendered in `/archive/` and remain available for historical discovery, but the UI marks them as unsupported. Archived entries must include `retirement` metadata with a reason, check date, and reviewer-facing details. -If you prefer a more automated way to install themes, you can use the Firefox Theme Installer app. Follow these steps: +## Theme Submissions -1. Download and install the [Firefox Theme Installer](https://github.com/Hakanbaban53/firefox-theme-installer) app from releases. -2. Open the app and select the theme you want to install. -3. Click the "Install Theme" button. -4. The app will automatically configure the necessary settings in `about:config` and copy the theme files to your Firefox profile. -5. Restart Firefox to apply the new theme. +Community submissions use the `Submit a theme` GitHub Issue Form. When a complete issue is opened or edited, `.github/workflows/create-theme-submission.yml` runs `scripts/create-theme-submission-from-issue.mjs` to: -This method simplifies the installation process and ensures that all required settings are correctly configured. ---- +- create a candidate JSON entry in `src/content/themes/`; +- download attached or linked screenshots into `public/assets/img/themes/`; +- populate basic repository metadata such as stars, last update date, and owner avatar; +- validate the catalog with `npm test` and `npm run build`; +- open or update a review pull request from a `submissions/theme-` branch. -## Contribution +The generated entry remains `status: "candidate"` until a maintainer approves the submission PR. Approval runs `.github/workflows/publish-approved-theme-submission.yml`, which switches the entry to `status: "published"` and assigns the next available `catalogIndex`. Maintainers still merge the PR explicitly after checks pass. Merged submission PRs close their source issue automatically. -### Add your theme <3 +## Metadata Refresh -+ If you have a Github account: - 1. Fork this repository - 2. Look for a file called `themes.json`, open and edit it - 3. Below the last `}` add `,` right after a copy the [code below](#code) and paste it in the file - 4. Add the properties of your theme: **title**, **link**, **description**, **image**, **tag** (cannot be left empty), and **repository**. - 5. **Avoid the use of escaped characters, and the order matters** - 6. Please, do not use a very big image, preferably (650x500) - 7. Image property: - - You can put an image URL - - Or an image file in `/images/themes/` (The file extension doesn't matter). And then reference it in your code with the following `assets/img/themes/YOUR_FILE_NAME_WITHOUT_EXTENSION.webp` - 8. Then send it as a pull request to this repository. +`npm run refresh:themes` updates only basic repository metadata for repositories already present in the catalog: -+ Or create an Issue: - 1. When creating an issue, you will find a template for submitting a theme. Use that one. It's easy. +- stars +- last update date +- owner avatar +- accessibility status -+ If you have a Twitter account: - 1. Send **at least** the following properties: **title**, **link**, **description**, **image**, **tags**, and **repository** to [@Neikon66](https://twitter.com/Neikon66). +It does not search for new themes, crawl topics, or change editorial fields such as title, description, tags, screenshots, or publication status. -``` - { - "title": "..........", - "link": "..........", - "description": "..........", - "image": "..........", - "tags": [ "your username/name", "theme type: dark", "theme type: light", "............." ], - "repository": ".........." - } -``` +The monthly `Refresh Theme Stats` workflow runs the same refresh command and opens a review PR when stars, update dates, avatars, or accessibility values change. ---- +## Repository Audit -### Contribution: themes information +`npm run audit:theme-repos` checks the repositories already listed in the catalog. It does not discover new repositories. -1. Install [nushell](https://www.nushell.sh/) in your machine. -2. Generate a [Github token API](https://github.com/settings/tokens) for your account and save it; -2. Clone the repository; -3. In your terminal, change directory into the `/scripts/` folder. -4. Run `nu`. -5. Run `use sort_themes.nu`; -6. Run `sort_themes --help` and read and understand the flags; -7. Run `sort_themes --github YOUR_GITHUB_TOKEN`; -8. Check if everything ran fine, if yes, replace the new generated `themes.json` file. -9. Commit your changes. -10. Open a pull request and send your contribution for us to review. -11. Thank you :) +The monthly GitHub Actions workflow runs this audit and opens a review PR when it finds changes: -**Why generate a token API for only Github?** +- repositories that still exist but are archived are moved to `status: "archived"` and shown in `/archive/`; +- repositories that return deleted, unavailable, or gone are removed from the catalog in the PR; +- repositories that cannot be checked due to transient API errors are listed in the PR report for manual follow-up. -Most themes' repositories are in Gitub, so it's pretty easy to hit the anonymous rate limit for API calls. With a token, that limit is higher, making it easier to contribute. +## Deployment + +GitHub Actions validates PRs with: + +```sh +npm test +npm run build +``` ---- +The production workflow builds Astro into `dist/` and deploys that artifact to GitHub Pages. Generated site files are not committed back to the repository. -

What do you think =?

+## Deployment Target -

Feel free to send me any feedback via issue or my twitter @Neikon66.

+This branch is configured to run from the original organization GitHub Pages domain: +- `astro.config.mjs` + - `site: "https://firefoxcss-store.github.io"` + - no `base`, because the site is served from the domain root +- `src/layouts/BaseLayout.astro` + - GitHub navigation link points to `https://github.com/FirefoxCSS-Store/FirefoxCSS-Store.github.io` +- `src/pages/submit.astro` + - submission issue link points to `https://github.com/FirefoxCSS-Store/FirefoxCSS-Store.github.io` diff --git a/astro.config.mjs b/astro.config.mjs new file mode 100644 index 00000000..7332102c --- /dev/null +++ b/astro.config.mjs @@ -0,0 +1,7 @@ +import { defineConfig } from 'astro/config' + +export default defineConfig({ + site: 'https://firefoxcss-store.github.io', + output: 'static', + trailingSlash: 'always' +}) diff --git a/dev/js/main.js b/dev/js/main.js deleted file mode 100644 index 08909f26..00000000 --- a/dev/js/main.js +++ /dev/null @@ -1,271 +0,0 @@ -function sanatise (unsanatisedInput) { - - const tempEl = document.createElement('div') - tempEl.innerText = unsanatisedInput - - const sanatisedOutput = tempEl.innerHTML - return sanatisedOutput - -} - - - -class Card { - - constructor (data, id) { - - this._id = id + 1 - this._title = sanatise(data.title) - this._description = sanatise(data.description) - this._link = sanatise(data.link) - this._image = sanatise(data.image) - - } - - - - render (outputContainer) { - - const template = ` -
-
-

${this._title}

- - - -
- -
- - Download -
-
- ` - - outputContainer.insertAdjacentHTML('beforeend', template) - - } -} - - -function removeLightbox () { - - const lightbox = document.getElementById('lightbox') - - if (lightbox) - lightbox.remove() - -} - -function createLightbox (id) { - - removeLightbox() - - const card = document.getElementById(`theme-${id}`) - const themeTitle = card.querySelector('h3') - const img = card.querySelector('img') - - const template = ` - - ` - - card.insertAdjacentHTML('afterend', template) - -} - - - -(() => { // IIFE to avoid globals - - /* SEARCH Parameter Handling - * ====================== - */ - - let running_sort = 0; - - const search = /** @type {HTMLInputElement} */ (document.getElementById('searchInput')) - - search.addEventListener('keydown', e => { - - if (e.key === "Enter") - sort(localStorage.sort, search.value) - - }) - - const search_button = /** @type {HTMLInputElement} */ (document.getElementById('searchButton')) - search_button.addEventListener('click', () => sort(localStorage.sort, search.value)) - - /* Load Content - * ============ - */ - - /* - * If sorting is not set yet in `localStorage`, - * then use as default `latest` kind. - */ - if (!localStorage.sort) - localStorage.sort = 'latest' - - /* - * Add event to sort when an option is chosen.. - */ - const sort_menu = /** @type {HTMLSelectElement} */ (document.getElementById('js-sort-menu')) - sort_menu.addEventListener('change', () => { - const name = /** @type {string} */ (sort_menu.selectedOptions[0].getAttribute('name')) - sort(name) - }) - - sort(localStorage.sort) - const current_option = sort_menu.options.namedItem(localStorage.sort) - if (current_option) - current_option.selected = true - - /** - * Toggle the sorting type of the themes. - * - * @param {string} kind How to sort the themes. - * @param {string=} filter Term to filter the themes. - **/ - function sort (kind, filter) { - - const my_run = ++running_sort - - localStorage.sort = kind - - // Remove all themes cards from the page. - const cards_container = document.getElementById('themes_container') - if (cards_container) - cards_container.innerHTML = '' - - fetch('themes.json') - .then(data => data.json()) - .then(async data => { - - data = Object.entries(data) - - if (filter) { - - /** - * Match any substring (partial) from a string (text). - * @param {string} text - * @param {string} partial - */ - function matches (text, partial) { - return text.toLowerCase().indexOf(partial.toLowerCase()) > -1 - } - - data = data.filter(element => matches(`${element[1].title}, ${element[1].tags}`, search.value)) - - } - - switch (localStorage.sort) { - - /* - * Sort from the most recent theme added. - */ - case 'latest': - data.reverse() - break - - /* - * Ascending sorting of stars from repositories. - */ - case 'updated': - // item1.attr.localeCompare(item2.attr); - data.sort((a, b) => b[1].pushed_at.localeCompare(a[1].pushed_at)) - break - - /* - * Ascending sorting of stars from repositories. - */ - case 'stars': - data.sort((a, b) => b[1].stargazers_count - a[1].stargazers_count) - break - - /* - * Randomly sorting of themes. - */ - case 'random': - for (let i = data.length - 1; i > 0; i--) { - const j = Math.floor(Math.random() * (i + 1)); - [data[i], data[j]] = [data[j], data[i]] - } - break - - /* - * Sort from the least recent theme added (oldest). - * Since it's sorted like this by default from the file, do nothing. - */ - default: - - } - - for (const [index, entry] of data) - { - if (running_sort !== my_run) - return - - const card = new Card(entry, index) - card.render(outputContainer) - await new Promise(r => setTimeout(r, 444)) - } - - } - ) - } - - // add themes - const outputContainer = document.getElementById('themes_container') - - /* Theme Handling - * ============== - */ - - const systemPref = window.matchMedia("(prefers-color-scheme: dark)").matches ? 'night' : 'day', - themeTrigger = document.getElementById('js-themeSwitcher'), - themeTriggerIcon = themeTrigger.querySelector('i') - - // when local storage is not populated set the system preferrence as value - if (!localStorage['theme']) localStorage['theme'] = systemPref === 'day' ? 'day' : 'night' - - // set nightmode when according to local storage - if (localStorage['theme'] === 'night') { - - themeTriggerIcon.classList.remove('fa-sun') - themeTriggerIcon.classList.add('fa-moon') - - document.documentElement.classList.add('nightmode') - - } else { document.documentElement.classList.add('daymode') } - - - function toggleTheme () { - - document.documentElement.classList.toggle('nightmode') - document.documentElement.classList.toggle('daymode') - - // update local storage - if (localStorage['theme'] === 'night') { - localStorage['theme'] = 'day'; - themeTriggerIcon.classList.add('fa-sun') - themeTriggerIcon.classList.remove('fa-moon') - } else { - localStorage['theme'] = 'night'; - themeTriggerIcon.classList.remove('fa-sun') - themeTriggerIcon.classList.add('fa-moon') - } - - } - - themeTrigger.addEventListener('click', toggleTheme) - -})() diff --git a/dev/pug/content/disclaimer.md b/dev/pug/content/disclaimer.md deleted file mode 100644 index 330299a1..00000000 --- a/dev/pug/content/disclaimer.md +++ /dev/null @@ -1,68 +0,0 @@ -# Disclaimer - -Last updated: **February 04, 2021** - - - -## Interpretation and Definitions - -### Interpretation -The words of which the initial letter is capitalized have meanings defined under the following conditions. The following definitions shall have the same meaning regardless of whether they appear in singular or in plural. - -### Definitions -For the purposes of this Disclaimer: - -+ **Team** (referred to as either »_the Team_«, »_We_«, »_Us_« or »_Our_« in this Disclaimer) refers to FirefoxCSS Store. -+ **Service** refers to the Website. -+ **You** means the individual accessing the Service, or the Team, or other legal entity on behalf of which such individual is accessing or using the Service, as applicable. -+ **Website** refers to FirefoxCSS Store, accessible from [firefoxcss-store.github.io](https://firefoxcss-store.github.io/) - - - -## Disclaimer -The information contained on the Service is for general information purposes only. -The Team assumes no responsibility for errors or omissions in the contents of the Service. -In no event shall the Team be liable for any special, direct, indirect, consequential, or incidental damages or any damages whatsoever, whether in an action of contract, negligence or other tort, arising out of or in connection with the use of the Service or the contents of the Service. The Team reserves the right to make additions, deletions, or modifications to the contents on the Service at any time without prior notice. -The Team does not warrant that the Service is free of viruses or other harmful components. - - - -## External Links -The Service may contain links to external websites that are not provided or maintained by or in any way affiliated with the Team. -Please note that the Team does not guarantee the accuracy, relevance, timeliness, or completeness of any information on these external websites. - - - -## Errors and Omissions -The information given by the Service is for general guidance on matters of interest only. Even if the Team takes every precaution to insure that the content of the Service is both current and accurate, errors can occur. Plus, given the changing nature of laws, rules and regulations, there may be delays, omissions or inaccuracies in the information contained on the Service. -The Team is not responsible for any errors or omissions, or for the results obtained from the use of this information. - - - -## Fair Use -The Team may use copyrighted material which has not always been specifically authorized by the copyright owner. The Team is making such material available for criticism, comment, news reporting, teaching, scholarship, or research. -The Team believes this constitutes a »_fair use_« of any such copyrighted material as provided for in section 107 of the United States Copyright law. -If You wish to use copyrighted material from the Service for your own purposes that go beyond fair use, You must obtain permission from the copyright owner. - - - -## Views Expressed -The Service may contain views and opinions which are those of the authors and do not necessarily reflect the official policy or position of any other author, agency, organization, employer or Team, including the Team. -Comments published by users are their sole responsibility and the users will take full responsibility, liability and blame for any libel or litigation that results from something written in or as a direct result of something written in a comment. The Team is not liable for any comment published by users and reserve the right to delete any comment for any reason whatsoever. - - - -## Responsibility -The information on the Service is provided with the understanding that the Team is not herein engaged in rendering legal, accounting, tax, or other professional advice and services. As such, it should not be used as a substitute for consultation with professional accounting, tax, legal or other competent advisers. -In no event shall the Team or its suppliers be liable for any special, incidental, indirect, or consequential damages whatsoever arising out of or in connection with your access or use or inability to access or use the Service. - - - -## »Use at Your Own Risk« -All information in the Service is provided »_as is_«, with no guarantee of completeness, accuracy, timeliness or of the results obtained from the use of this information, and without warranty of any kind, express or implied, including, but not limited to warranties of performance, merchantability and fitness for a particular purpose. -The Team will not be liable to You or anyone else for any decision made or action taken in reliance on the information given by the Service or for any consequential, special or similar damages, even if advised of the possibility of such damages. - - - -## Contact Us -If you have any questions about this Disclaimer, You can contact Us here: [Issue Tracker](https://github.com/FirefoxCSS-Store/FirefoxCSS-Store.github.io/issues) diff --git a/dev/pug/disclaimer.pug b/dev/pug/disclaimer.pug deleted file mode 100644 index aeb66e9b..00000000 --- a/dev/pug/disclaimer.pug +++ /dev/null @@ -1,17 +0,0 @@ -extends layout/default - -block header - header#main_header - h3.header-branding FirefoxCSS Store - - nav#main_nav - a(href='index.html') Theme List - a#js-themeSwitcher(href='#') - i.fas.fa-moon - -block content - - main#main_content - - .disclaimer - include:markdown-it content/disclaimer.md diff --git a/dev/pug/includes/footer.pug b/dev/pug/includes/footer.pug deleted file mode 100644 index 4dfaaafc..00000000 --- a/dev/pug/includes/footer.pug +++ /dev/null @@ -1,14 +0,0 @@ -footer#main_footer - .social_links - a.social_links-icon(href='https://www.reddit.com/r/firefoxcss') - i.fab.fa-reddit - a.social_links-icon(href='https://github.com/FirefoxCSS-Store/FirefoxCSS-Store.github.io') - i.fab.fa-github - p - strong FirefoxCSS Store - | is maintained by the community with  - i.fas.fa-heart - .linklist - a(href="disclaimer.html") Disclaimer - a(href='https://github.com/FirefoxCSS-Store/FirefoxCSS-Store.github.io/blob/main/README.md#generic-installation') Installation Guide - a(href='https://github.com/FirefoxCSS-Store/FirefoxCSS-Store.github.io/blob/main/README.md#add-your-theme-3') Submit your Theme diff --git a/dev/pug/includes/header.pug b/dev/pug/includes/header.pug deleted file mode 100644 index a4579c36..00000000 --- a/dev/pug/includes/header.pug +++ /dev/null @@ -1,18 +0,0 @@ -header#main_header - h3.header-branding FirefoxCSS Store - - nav#main_nav - a(href='index.html') Theme List - a#js-themeSwitcher(href='#') - i.fas.fa-moon - select#js-sort-menu - option(name='updated') Updated - option(name='stars') Stars - option(name='latest') Latest - option(name='oldest') Oldest - option(name='random') Random - div.searchform(method='get') - .inputgroup - input.searchinput#searchInput(type='text', placeholder='Search') - button.btn-submit.searchsubmit#searchButton(type='submit') - i.fas.fa-search diff --git a/dev/pug/index.pug b/dev/pug/index.pug deleted file mode 100644 index 4faf6d3f..00000000 --- a/dev/pug/index.pug +++ /dev/null @@ -1,7 +0,0 @@ -extends layout/default - - -block content - - main#main_content - #themes_container diff --git a/dev/pug/layout/default.pug b/dev/pug/layout/default.pug deleted file mode 100644 index dcc5f245..00000000 --- a/dev/pug/layout/default.pug +++ /dev/null @@ -1,28 +0,0 @@ -doctype -html - head - - meta(charset='UTF-8') - meta(name='viewport' content='width=device-width, initial-scale=1.0') - meta(http-equiv='X-UA-Compatible' content='ie=edge') - - title FirefoxCSS Store - meta(name='description', content='A curated list of Firefox userChrome.css Themes.') - - link(rel='shortcut icon', type='img/png', href='icon.png') - - link(rel='stylesheet', href='assets/css/main.min.css') - - - body - - block header - include ../includes/header - - block content - - block footer - include ../includes/footer - - script(src='assets/js/main.js') - script(src='https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.6.0/js/all.min.js' type="text/javascript") diff --git a/dev/scss/base/_reset.scss b/dev/scss/base/_reset.scss deleted file mode 100644 index 3f76a72b..00000000 --- a/dev/scss/base/_reset.scss +++ /dev/null @@ -1,69 +0,0 @@ -// Based on meyerweb.com/eric/tools/css/reset (v2.0 | 20110126 | License: public domain) - - html, body, div, span, applet, object, - iframe, h1, h2, h3, h4, h5, h6, p, blockquote, - pre, a, abbr, acronym, address, big, cite, - code, del, dfn, em, img, ins, kbd, q, s, samp, - small, strike, strong, sub, sup, tt, var, b, - u, i, center, dl, dt, dd, ol, ul, li, fieldset, - form, label, legend, table, caption, tbody, - tfoot, thead, tr, th, td, article, aside, - canvas, details, embed, figure, figcaption, - footer, header, hgroup, menu, nav, output, ruby, - section, summary, time, mark, audio, video { - margin: 0; - padding: 0; - border: 0; - font-size: 100%; - font: inherit; - vertical-align: baseline; - } - - article, aside, details, figcaption, figure, - footer, header, hgroup, menu, nav, section { - display: block; - } - - body { - line-height: 1; - } - - ol, ul { - list-style:none; - } - - blockquote, q { - quotes: none; - - &:before, - &:after { - content: ''; - content: none; - } - } - - table { - border-collapse: collapse; - border-spacing: 0; - } - - body { - -webkit-text-size-adjust: none; - } - - mark { - background-color: transparent; - color: inherit; - } - - input::-moz-focus-inner { - border: 0; - padding: 0; - } - - input, select, textarea { - -moz-appearance: none; - -webkit-appearance: none; - -ms-appearance: none; - appearance: none; - } diff --git a/dev/scss/base/_scaffholding.scss b/dev/scss/base/_scaffholding.scss deleted file mode 100644 index 267fcc85..00000000 --- a/dev/scss/base/_scaffholding.scss +++ /dev/null @@ -1,25 +0,0 @@ -@use '../utilities/variables' as *; - -body { - - margin: 0 auto; - max-width: 1920px; - - background: var(--body-background); -} - -html.nightmode { - --body-background: #{$dark}; - --body-background-lighter: #{$dark-l1}; - --body-background-darker: #{$dark-s1}; - --font-colour: #{$light}; - --card-shadow: #{$inverted-shadow}; -} - -html.daymode { - --body-background: #{$light}; - --body-background-lighter: #{$light-l1}; - --body-background-darker: #{$light-s1}; - --font-colour: #{$dark}; - --card-shadow: #{$shadow}; -} \ No newline at end of file diff --git a/dev/scss/base/_typography.scss b/dev/scss/base/_typography.scss deleted file mode 100644 index 2ea278c7..00000000 --- a/dev/scss/base/_typography.scss +++ /dev/null @@ -1,68 +0,0 @@ -@use '../utilities/variables' as v; - -:root { font-size: 62.5%; } - - - -body { - - font-family: v.$font-family, v.$font-stack; - font-size: v.$font-size; - font-weight: v.$font-weight-regular; - line-height: v.$line-height; - color: var(--font-colour); - -} - - -a { - - text-decoration: none; - color: var(--linkc); - - transition: color 300ms ease-in-out; - - - &:hover { color: var(--linkc-hover) } - &:focus { outline: var(--focus-thickness) solid var(--focus-colour); } - - -} - - - -h1, h2, h3, h4, -strong { font-weight: v.$font-weight-bold; } - -h1 { - - margin: 0 0 v.$space-l 0; - - font-size: v.$font-size-xl; - -} - -h2 { - - margin: v.$space-xl 0 v.$space-l 0; - - font-size: v.$font-size-l; - -} - -h3 { - - margin: v.$space-l 0 v.$space-m 0; - - font-size: v.$font-size; - -} - - - -em { font-style: italic; } - - -ul, ol { margin-left: v.$space-xl; } -ul { list-style-type: '— '; } -ol { list-style-type: upper-roman; } diff --git a/dev/scss/components/_buttons.scss b/dev/scss/components/_buttons.scss deleted file mode 100644 index 02797424..00000000 --- a/dev/scss/components/_buttons.scss +++ /dev/null @@ -1,21 +0,0 @@ -@use '../utilities/variables' as v; - -.btn { - - padding: v.$space-m v.$space-l; - - border-radius: v.$border-radius; - border: none; - background: var(--body-background); - box-shadow: v.$shadow; - - font-size: v.$font-size; - line-height: v.$line-height; - color: var(--font-colour); - - - &:hover, - &:focus { background: var(--body-background-darker); } - &:focus { outline: var(--focus-thickness) solid var(--focus-colour); } - -} diff --git a/dev/scss/components/_card.scss b/dev/scss/components/_card.scss deleted file mode 100644 index e0a7c424..00000000 --- a/dev/scss/components/_card.scss +++ /dev/null @@ -1,102 +0,0 @@ -@use '../utilities/variables' as v; - -.card { - - --linkc: var(--font-colour); - --linkc-hover: var(--font-colour); - - position: relative; - - display: flex; flex-direction: column; - - border-radius: v.$border-radius; - background: var(--body-background-lighter); - box-shadow: var(--card-shadow); - - overflow: hidden; - - - header { - - padding: 0 v.$space-m; - - display: flex; - align-items: center; justify-content: space-between; - - - h3 { margin: v.$space-m 0; padding: 0; } - - } - - - .meta { - - position: relative; - - width: 100%; - padding-top: 75%; - - border-radius: v.$border-radius; - background: var(--body-background-darker); - - overflow: hidden; - - } - - - .meta img { - - position: absolute; - top: 50%; left: 50%; - - width: 100%; height: 100%; - - object-fit: cover; - transform: translate( -50%, -50% ); - - transition: transform 300ms ease-in-out; - - } - - &:focus-within .meta img, - &:hover .meta img { transform: translate(-50%, -45%); } - - - .meta .description { - - position: absolute; - top: 0; left: 0; - - margin: 0; padding: 0 v.$space-m v.$space-m v.$space-m; - width: calc(100% - #{v.$space-m * 2}); - - border-radius: v.$border-radius; - background: var(--body-background-lighter); - - transform: translateY(-100%); - - transition: transform 300ms ease-in-out; - - } - - &:focus-within .meta .description, - &:hover .meta .description { transform: translateY(0); } - - - .button-wrapper { - - position: absolute; - right: 0; bottom: 0; - - padding: v.$space-m; - - opacity: 0; - - transition: opacity 300ms ease-in-out; - - } - - &:focus-within .button-wrapper, - &:hover .button-wrapper { opacity: 1; } - -} diff --git a/dev/scss/components/_disclaimer.scss b/dev/scss/components/_disclaimer.scss deleted file mode 100644 index 0cf16a4f..00000000 --- a/dev/scss/components/_disclaimer.scss +++ /dev/null @@ -1 +0,0 @@ -.disclaimer { max-width: 120ch; } diff --git a/dev/scss/components/_forms.scss b/dev/scss/components/_forms.scss deleted file mode 100644 index 94c9d339..00000000 --- a/dev/scss/components/_forms.scss +++ /dev/null @@ -1,29 +0,0 @@ -@use '../utilities/variables' as v; - -input, -.btn-submit { - - padding: v.$space-s v.$space-m; - - border-radius: v.$border-radius-small; - border: 1px solid var(--body-background-darker); - background: var(--body-background-lighter); - - font-family: inherit; - font-size: inherit; - color: var(--font-colour); - - - &:focus { outline: var(--focus-thickness) solid var(--focus-colour); } - -} - - - -.inputgroup { - - display: flex; - - height: 100%; - -} diff --git a/dev/scss/components/_lightbox.scss b/dev/scss/components/_lightbox.scss deleted file mode 100644 index eb7d89aa..00000000 --- a/dev/scss/components/_lightbox.scss +++ /dev/null @@ -1,37 +0,0 @@ -@use '../utilities/variables' as v; - -#lightbox { - - display: flex; flex-direction: column; - align-items: center; justify-content: center; - - position: fixed; - top: 0; left: 0; - z-index: 1; - - width: 100vw; height: 100vh; - - background: var(--body-background); - - - img { - - max-width: 90vw; max-height: 80vh; - - border-radius: v.$border-radius; - border: 1px solid var(--body-background-darker); - background: var(--body-background-darker); - - } - - - .btn-close-lightbox { - - position: absolute; - top: v.$space-l; right: v.$space-l; - - display: block; - - } - -} diff --git a/dev/scss/components/_main-nav.scss b/dev/scss/components/_main-nav.scss deleted file mode 100644 index fd4b42dc..00000000 --- a/dev/scss/components/_main-nav.scss +++ /dev/null @@ -1,10 +0,0 @@ -@use '../utilities/variables' as v; - -#main_nav { - - display: flex; gap: v.$space-l; - align-items: center; - - --linkc: var(--font-colour); - -} diff --git a/dev/scss/components/_search.scss b/dev/scss/components/_search.scss deleted file mode 100644 index 9adaedbe..00000000 --- a/dev/scss/components/_search.scss +++ /dev/null @@ -1,17 +0,0 @@ -.searchinput { - - // width: clamp(200px, 30vw, 600px); - - border-top-right-radius: 0; border-bottom-right-radius: 0; - border-right: none; - -} - - -.searchsubmit { - - border-top-left-radius: 0; border-bottom-left-radius: 0; - border-left: none; - background: var(--body-background-darker); - -} diff --git a/dev/scss/fonts.css b/dev/scss/fonts.css deleted file mode 100644 index c05960e2..00000000 --- a/dev/scss/fonts.css +++ /dev/null @@ -1,108 +0,0 @@ -/* cyrillic */ -@font-face { - font-family: 'Jost'; - font-style: italic; - font-weight: 400; - font-display: swap; - src: url(https://fonts.gstatic.com/s/jost/v18/92zUtBhPNqw73oHt5D4hTxM.woff2) format('woff2'); - unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -/* latin-ext */ -@font-face { - font-family: 'Jost'; - font-style: italic; - font-weight: 400; - font-display: swap; - src: url(https://fonts.gstatic.com/s/jost/v18/92zUtBhPNqw73oHt7j4hTxM.woff2) format('woff2'); - unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -/* latin */ -@font-face { - font-family: 'Jost'; - font-style: italic; - font-weight: 400; - font-display: swap; - src: url(https://fonts.gstatic.com/s/jost/v18/92zUtBhPNqw73oHt4D4h.woff2) format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} -/* cyrillic */ -@font-face { - font-family: 'Jost'; - font-style: italic; - font-weight: 600; - font-display: swap; - src: url(https://fonts.gstatic.com/s/jost/v18/92zUtBhPNqw73oHt5D4hTxM.woff2) format('woff2'); - unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -/* latin-ext */ -@font-face { - font-family: 'Jost'; - font-style: italic; - font-weight: 600; - font-display: swap; - src: url(https://fonts.gstatic.com/s/jost/v18/92zUtBhPNqw73oHt7j4hTxM.woff2) format('woff2'); - unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -/* latin */ -@font-face { - font-family: 'Jost'; - font-style: italic; - font-weight: 600; - font-display: swap; - src: url(https://fonts.gstatic.com/s/jost/v18/92zUtBhPNqw73oHt4D4h.woff2) format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} -/* cyrillic */ -@font-face { - font-family: 'Jost'; - font-style: normal; - font-weight: 400; - font-display: swap; - src: url(https://fonts.gstatic.com/s/jost/v18/92zatBhPNqw73oDd4iYl.woff2) format('woff2'); - unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -/* latin-ext */ -@font-face { - font-family: 'Jost'; - font-style: normal; - font-weight: 400; - font-display: swap; - src: url(https://fonts.gstatic.com/s/jost/v18/92zatBhPNqw73ord4iYl.woff2) format('woff2'); - unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -/* latin */ -@font-face { - font-family: 'Jost'; - font-style: normal; - font-weight: 400; - font-display: swap; - src: url(https://fonts.gstatic.com/s/jost/v18/92zatBhPNqw73oTd4g.woff2) format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} -/* cyrillic */ -@font-face { - font-family: 'Jost'; - font-style: normal; - font-weight: 600; - font-display: swap; - src: url(https://fonts.gstatic.com/s/jost/v18/92zatBhPNqw73oDd4iYl.woff2) format('woff2'); - unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -/* latin-ext */ -@font-face { - font-family: 'Jost'; - font-style: normal; - font-weight: 600; - font-display: swap; - src: url(https://fonts.gstatic.com/s/jost/v18/92zatBhPNqw73ord4iYl.woff2) format('woff2'); - unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -/* latin */ -@font-face { - font-family: 'Jost'; - font-style: normal; - font-weight: 600; - font-display: swap; - src: url(https://fonts.gstatic.com/s/jost/v18/92zatBhPNqw73oTd4g.woff2) format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} diff --git a/dev/scss/layout/_footer.scss b/dev/scss/layout/_footer.scss deleted file mode 100644 index cc34994d..00000000 --- a/dev/scss/layout/_footer.scss +++ /dev/null @@ -1,25 +0,0 @@ -@use '../utilities/variables' as v; - -#main_footer { - - display: flex; flex-direction: column; - align-items: center; justify-content: center; - - margin: v.$space-xxl 0; padding: 0 v.$space-xl; - - - .linklist a + a { margin-left: v.$space-l; } - -} - - - -.social_links-icon { - - --linkc: var(--font-colour); - - margin-right: 5px; - - font-size: v.$font-size-l; - -} diff --git a/dev/scss/layout/_header.scss b/dev/scss/layout/_header.scss deleted file mode 100644 index 589b31f5..00000000 --- a/dev/scss/layout/_header.scss +++ /dev/null @@ -1,22 +0,0 @@ -@use '../utilities/variables' as v; - -#main_header { - - display: flex; flex-direction: column; - align-items: center; justify-content: space-between; - - margin: v.$space-xxl 0; padding: 0 v.$space-xl; - - - @media (min-width: 792px) { flex-direction: row; } - -} - - - -.header-branding { - - font-size: v.$font-size-l; - font-weight: v.$font-weight-bold; - -} diff --git a/dev/scss/layout/_main.scss b/dev/scss/layout/_main.scss deleted file mode 100644 index 2ded3a40..00000000 --- a/dev/scss/layout/_main.scss +++ /dev/null @@ -1,16 +0,0 @@ -@use '../utilities/variables' as v; - -html { - scrollbar-width: thin; - scrollbar-color: var(--font-colour) var(--body-background); -} - -#main_content { margin: 0; padding: v.$space-xl; } - - -#themes_container { - - display: grid; gap: v.$space-xl; - grid-template: auto / repeat(auto-fit, minmax(360px, 1fr)); - -} diff --git a/dev/scss/main.scss b/dev/scss/main.scss deleted file mode 100644 index d50f227e..00000000 --- a/dev/scss/main.scss +++ /dev/null @@ -1,19 +0,0 @@ -@use 'fonts'; - -@use 'utilities/variables'; - -@use 'base/reset'; -@use 'base/scaffholding'; -@use 'base/typography'; - -@use 'layout/header'; -@use 'layout/main'; -@use 'layout/footer'; - -@use 'components/buttons'; -@use 'components/forms'; -@use 'components/main-nav'; -@use 'components/search'; -@use 'components/card'; -@use 'components/lightbox'; -@use 'components/disclaimer'; diff --git a/dev/scss/utilities/_variables.scss b/dev/scss/utilities/_variables.scss deleted file mode 100644 index c45e33dc..00000000 --- a/dev/scss/utilities/_variables.scss +++ /dev/null @@ -1,96 +0,0 @@ -// Colours -// ======= - -$light-l1: #FFFFFF; -$light: #F3F3F3; -$light-s1: #E1E1E1; - -$mid-l1: #909095; -$mid: #808085; -$mid-s1: #606065; - -$dark-l1: #334155; -$dark: #1E293B; -$dark-s1: #202025; - -$shadow: 0 .5rem 2rem 0 rgba(0, 0, 0, .2); -$inverted-shadow: 0 0 2rem 0 rgba(71, 85, 105, 0.5); - -$accents: #3498DB; $accents-s1: #2980B9; - - - -// Spacing -// ======= - -$base-size: .6rem; - -$space-s: $base-size; -$space-m: $base-size * 2; -$space-l: $base-size * 3; -$space-xl: $base-size * 5; -$space-xxl: $base-size * 8; - -$border-radius: 12px; -$border-radius-small: 3px; - - - -// Typography -// ========== - -$font-size-s: 80%; -$font-size: 1.5rem; -$font-size-l: 150%; -$font-size-xl: 200%; - -$font-family: 'Jost'; -$font-stack: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; - -$line-height: 1.6; -$font-weight-regular: 400; -$font-weight-bold: 600; - -$font-colour: $mid-s1; -$font-colour-highlight: $dark-l1; - - - -// Scaffholding -// ============ - -$background-l1: $light-l1; -$background: $light; -$background-s1: $light-s1; - - - -:root { - - --body-background: #{$light}; - --body-background-lighter: #{$light-l1}; - --body-background-darker: #{$light-s1}; - - --font-colour: #{$dark}; - --linkc: #{$accents}; - --linkc-hover: #{$accents-s1}; - - --focus-colour: #{$accents}; - --focus-thickness: 1px; - - --card-shadow: #{$shadow}; - - - @media (prefers-color-scheme: dark) { - - --body-background: #{$dark}; - --body-background-lighter: #{$dark-l1}; - --body-background-darker: #{$dark-s1}; - - --font-colour: #{$light}; - - --card-shadow: #{$inverted-shadow}; - - } - -} diff --git a/docs/assets/css/main.min.css b/docs/assets/css/main.min.css deleted file mode 100644 index 496c962b..00000000 --- a/docs/assets/css/main.min.css +++ /dev/null @@ -1,487 +0,0 @@ -@charset "UTF-8"; -/* cyrillic */ -@font-face { - font-family: "Jost"; - font-style: italic; - font-weight: 400; - font-display: swap; - src: url(https://fonts.gstatic.com/s/jost/v18/92zUtBhPNqw73oHt5D4hTxM.woff2) format("woff2"); - unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -/* latin-ext */ -@font-face { - font-family: "Jost"; - font-style: italic; - font-weight: 400; - font-display: swap; - src: url(https://fonts.gstatic.com/s/jost/v18/92zUtBhPNqw73oHt7j4hTxM.woff2) format("woff2"); - unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -/* latin */ -@font-face { - font-family: "Jost"; - font-style: italic; - font-weight: 400; - font-display: swap; - src: url(https://fonts.gstatic.com/s/jost/v18/92zUtBhPNqw73oHt4D4h.woff2) format("woff2"); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} -/* cyrillic */ -@font-face { - font-family: "Jost"; - font-style: italic; - font-weight: 600; - font-display: swap; - src: url(https://fonts.gstatic.com/s/jost/v18/92zUtBhPNqw73oHt5D4hTxM.woff2) format("woff2"); - unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -/* latin-ext */ -@font-face { - font-family: "Jost"; - font-style: italic; - font-weight: 600; - font-display: swap; - src: url(https://fonts.gstatic.com/s/jost/v18/92zUtBhPNqw73oHt7j4hTxM.woff2) format("woff2"); - unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -/* latin */ -@font-face { - font-family: "Jost"; - font-style: italic; - font-weight: 600; - font-display: swap; - src: url(https://fonts.gstatic.com/s/jost/v18/92zUtBhPNqw73oHt4D4h.woff2) format("woff2"); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} -/* cyrillic */ -@font-face { - font-family: "Jost"; - font-style: normal; - font-weight: 400; - font-display: swap; - src: url(https://fonts.gstatic.com/s/jost/v18/92zatBhPNqw73oDd4iYl.woff2) format("woff2"); - unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -/* latin-ext */ -@font-face { - font-family: "Jost"; - font-style: normal; - font-weight: 400; - font-display: swap; - src: url(https://fonts.gstatic.com/s/jost/v18/92zatBhPNqw73ord4iYl.woff2) format("woff2"); - unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -/* latin */ -@font-face { - font-family: "Jost"; - font-style: normal; - font-weight: 400; - font-display: swap; - src: url(https://fonts.gstatic.com/s/jost/v18/92zatBhPNqw73oTd4g.woff2) format("woff2"); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} -/* cyrillic */ -@font-face { - font-family: "Jost"; - font-style: normal; - font-weight: 600; - font-display: swap; - src: url(https://fonts.gstatic.com/s/jost/v18/92zatBhPNqw73oDd4iYl.woff2) format("woff2"); - unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -/* latin-ext */ -@font-face { - font-family: "Jost"; - font-style: normal; - font-weight: 600; - font-display: swap; - src: url(https://fonts.gstatic.com/s/jost/v18/92zatBhPNqw73ord4iYl.woff2) format("woff2"); - unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -/* latin */ -@font-face { - font-family: "Jost"; - font-style: normal; - font-weight: 600; - font-display: swap; - src: url(https://fonts.gstatic.com/s/jost/v18/92zatBhPNqw73oTd4g.woff2) format("woff2"); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} -:root { - --body-background: #F3F3F3; - --body-background-lighter: #FFFFFF; - --body-background-darker: #E1E1E1; - --font-colour: #1E293B; - --linkc: #3498DB; - --linkc-hover: #2980B9; - --focus-colour: #3498DB; - --focus-thickness: 1px; - --card-shadow: 0 0.5rem 2rem 0 rgba(0, 0, 0, 0.2); -} -@media (prefers-color-scheme: dark) { - :root { - --body-background: #1E293B; - --body-background-lighter: #334155; - --body-background-darker: #202025; - --font-colour: #F3F3F3; - --card-shadow: 0 0 2rem 0 rgba(71, 85, 105, 0.5); - } -} - -html, body, div, span, applet, object, -iframe, h1, h2, h3, h4, h5, h6, p, blockquote, -pre, a, abbr, acronym, address, big, cite, -code, del, dfn, em, img, ins, kbd, q, s, samp, -small, strike, strong, sub, sup, tt, var, b, -u, i, center, dl, dt, dd, ol, ul, li, fieldset, -form, label, legend, table, caption, tbody, -tfoot, thead, tr, th, td, article, aside, -canvas, details, embed, figure, figcaption, -footer, header, hgroup, menu, nav, output, ruby, -section, summary, time, mark, audio, video { - margin: 0; - padding: 0; - border: 0; - font-size: 100%; - font: inherit; - vertical-align: baseline; -} - -article, aside, details, figcaption, figure, -footer, header, hgroup, menu, nav, section { - display: block; -} - -body { - line-height: 1; -} - -ol, ul { - list-style: none; -} - -blockquote, q { - quotes: none; -} -blockquote:before, blockquote:after, q:before, q:after { - content: ""; - content: none; -} - -table { - border-collapse: collapse; - border-spacing: 0; -} - -body { - -webkit-text-size-adjust: none; -} - -mark { - background-color: transparent; - color: inherit; -} - -input::-moz-focus-inner { - border: 0; - padding: 0; -} - -input, select, textarea { - -moz-appearance: none; - -webkit-appearance: none; - appearance: none; -} - -body { - margin: 0 auto; - max-width: 1920px; - background: var(--body-background); -} - -html.nightmode { - --body-background: #1E293B; - --body-background-lighter: #334155; - --body-background-darker: #202025; - --font-colour: #F3F3F3; - --card-shadow: 0 0 2rem 0 rgba(71, 85, 105, 0.5); -} - -html.daymode { - --body-background: #F3F3F3; - --body-background-lighter: #FFFFFF; - --body-background-darker: #E1E1E1; - --font-colour: #1E293B; - --card-shadow: 0 0.5rem 2rem 0 rgba(0, 0, 0, 0.2); -} - -:root { - font-size: 62.5%; -} - -body { - font-family: "Jost", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; - font-size: 1.5rem; - font-weight: 400; - line-height: 1.6; - color: var(--font-colour); -} - -a { - text-decoration: none; - color: var(--linkc); - transition: color 300ms ease-in-out; -} -a:hover { - color: var(--linkc-hover); -} -a:focus { - outline: var(--focus-thickness) solid var(--focus-colour); -} - -h1, h2, h3, h4, -strong { - font-weight: 600; -} - -h1 { - margin: 0 0 1.8rem 0; - font-size: 200%; -} - -h2 { - margin: 3rem 0 1.8rem 0; - font-size: 150%; -} - -h3 { - margin: 1.8rem 0 1.2rem 0; - font-size: 1.5rem; -} - -em { - font-style: italic; -} - -ul, ol { - margin-left: 3rem; -} - -ul { - list-style-type: "— "; -} - -ol { - list-style-type: upper-roman; -} - -#main_header { - display: flex; - flex-direction: column; - align-items: center; - justify-content: space-between; - margin: 4.8rem 0; - padding: 0 3rem; -} -@media (min-width: 792px) { - #main_header { - flex-direction: row; - } -} - -.header-branding { - font-size: 150%; - font-weight: 600; -} - -html { - scrollbar-width: thin; - scrollbar-color: var(--font-colour) var(--body-background); -} - -#main_content { - margin: 0; - padding: 3rem; -} - -#themes_container { - display: grid; - gap: 3rem; - grid-template: auto/repeat(auto-fit, minmax(360px, 1fr)); -} - -#main_footer { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - margin: 4.8rem 0; - padding: 0 3rem; -} -#main_footer .linklist a + a { - margin-left: 1.8rem; -} - -.social_links-icon { - --linkc: var(--font-colour); - margin-right: 5px; - font-size: 150%; -} - -.btn { - padding: 1.2rem 1.8rem; - border-radius: 12px; - border: none; - background: var(--body-background); - box-shadow: 0 0.5rem 2rem 0 rgba(0, 0, 0, 0.2); - font-size: 1.5rem; - line-height: 1.6; - color: var(--font-colour); -} -.btn:hover, .btn:focus { - background: var(--body-background-darker); -} -.btn:focus { - outline: var(--focus-thickness) solid var(--focus-colour); -} - -input, -.btn-submit { - padding: 0.6rem 1.2rem; - border-radius: 3px; - border: 1px solid var(--body-background-darker); - background: var(--body-background-lighter); - font-family: inherit; - font-size: inherit; - color: var(--font-colour); -} -input:focus, -.btn-submit:focus { - outline: var(--focus-thickness) solid var(--focus-colour); -} - -.inputgroup { - display: flex; - height: 100%; -} - -#main_nav { - display: flex; - gap: 1.8rem; - align-items: center; - --linkc: var(--font-colour); -} - -.searchinput { - border-top-right-radius: 0; - border-bottom-right-radius: 0; - border-right: none; -} - -.searchsubmit { - border-top-left-radius: 0; - border-bottom-left-radius: 0; - border-left: none; - background: var(--body-background-darker); -} - -.card { - --linkc: var(--font-colour); - --linkc-hover: var(--font-colour); - position: relative; - display: flex; - flex-direction: column; - border-radius: 12px; - background: var(--body-background-lighter); - box-shadow: var(--card-shadow); - overflow: hidden; -} -.card header { - padding: 0 1.2rem; - display: flex; - align-items: center; - justify-content: space-between; -} -.card header h3 { - margin: 1.2rem 0; - padding: 0; -} -.card .meta { - position: relative; - width: 100%; - padding-top: 75%; - border-radius: 12px; - background: var(--body-background-darker); - overflow: hidden; -} -.card .meta img { - position: absolute; - top: 50%; - left: 50%; - width: 100%; - height: 100%; - -o-object-fit: cover; - object-fit: cover; - transform: translate(-50%, -50%); - transition: transform 300ms ease-in-out; -} -.card:focus-within .meta img, .card:hover .meta img { - transform: translate(-50%, -45%); -} -.card .meta .description { - position: absolute; - top: 0; - left: 0; - margin: 0; - padding: 0 1.2rem 1.2rem 1.2rem; - width: calc(100% - 2.4rem); - border-radius: 12px; - background: var(--body-background-lighter); - transform: translateY(-100%); - transition: transform 300ms ease-in-out; -} -.card:focus-within .meta .description, .card:hover .meta .description { - transform: translateY(0); -} -.card .button-wrapper { - position: absolute; - right: 0; - bottom: 0; - padding: 1.2rem; - opacity: 0; - transition: opacity 300ms ease-in-out; -} -.card:focus-within .button-wrapper, .card:hover .button-wrapper { - opacity: 1; -} - -#lightbox { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - position: fixed; - top: 0; - left: 0; - z-index: 1; - width: 100vw; - height: 100vh; - background: var(--body-background); -} -#lightbox img { - max-width: 90vw; - max-height: 80vh; - border-radius: 12px; - border: 1px solid var(--body-background-darker); - background: var(--body-background-darker); -} -#lightbox .btn-close-lightbox { - position: absolute; - top: 1.8rem; - right: 1.8rem; - display: block; -} - -.disclaimer { - max-width: 120ch; -} \ No newline at end of file diff --git a/docs/assets/js/main.js b/docs/assets/js/main.js deleted file mode 100644 index 4e628c73..00000000 --- a/docs/assets/js/main.js +++ /dev/null @@ -1,239 +0,0 @@ -"use strict"; - -function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); } -function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); } -function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } -function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } -function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } -function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; } -function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } -function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } -function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); } -function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; } -function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } -function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } -function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } -function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } -function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } -function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } -function sanatise(unsanatisedInput) { - var tempEl = document.createElement('div'); - tempEl.innerText = unsanatisedInput; - var sanatisedOutput = tempEl.innerHTML; - return sanatisedOutput; -} -var Card = /*#__PURE__*/function () { - function Card(data, id) { - _classCallCheck(this, Card); - this._id = id + 1; - this._title = sanatise(data.title); - this._description = sanatise(data.description); - this._link = sanatise(data.link); - this._image = sanatise(data.image); - } - return _createClass(Card, [{ - key: "render", - value: function render(outputContainer) { - var template = "\n
\n
\n

").concat(this._title, "

\n \n \n \n
\n \n
\n \n Download\n
\n
\n "); - outputContainer.insertAdjacentHTML('beforeend', template); - } - }]); -}(); -function removeLightbox() { - var lightbox = document.getElementById('lightbox'); - if (lightbox) lightbox.remove(); -} -function createLightbox(id) { - removeLightbox(); - var card = document.getElementById("theme-".concat(id)); - var themeTitle = card.querySelector('h3'); - var img = card.querySelector('img'); - var template = "\n
\n

".concat(themeTitle.innerText, "

\n \n \n
\n "); - card.insertAdjacentHTML('afterend', template); -} -(function () { - // IIFE to avoid globals - - /* SEARCH Parameter Handling - * ====================== - */ - - var running_sort = 0; - var search = /** @type {HTMLInputElement} */document.getElementById('searchInput'); - search.addEventListener('keydown', function (e) { - if (e.key === "Enter") sort(localStorage.sort, search.value); - }); - var search_button = /** @type {HTMLInputElement} */document.getElementById('searchButton'); - search_button.addEventListener('click', function () { - return sort(localStorage.sort, search.value); - }); - - /* Load Content - * ============ - */ - - /* - * If sorting is not set yet in `localStorage`, - * then use as default `latest` kind. - */ - if (!localStorage.sort) localStorage.sort = 'latest'; - - /* - * Add event to sort when an option is chosen.. - */ - var sort_menu = /** @type {HTMLSelectElement} */document.getElementById('js-sort-menu'); - sort_menu.addEventListener('change', function () { - var name = /** @type {string} */sort_menu.selectedOptions[0].getAttribute('name'); - sort(name); - }); - sort(localStorage.sort); - var current_option = sort_menu.options.namedItem(localStorage.sort); - if (current_option) current_option.selected = true; - - /** - * Toggle the sorting type of the themes. - * - * @param {string} kind How to sort the themes. - * @param {string=} filter Term to filter the themes. - **/ - function sort(kind, filter) { - var my_run = ++running_sort; - localStorage.sort = kind; - - // Remove all themes cards from the page. - var cards_container = document.getElementById('themes_container'); - if (cards_container) cards_container.innerHTML = ''; - fetch('themes.json').then(function (data) { - return data.json(); - }).then(/*#__PURE__*/function () { - var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(data) { - var matches, i, j, _ref2, _iterator, _step, _step$value, index, entry, card, _t, _t2; - return _regenerator().w(function (_context) { - while (1) switch (_context.p = _context.n) { - case 0: - data = Object.entries(data); - if (filter) { - /** - * Match any substring (partial) from a string (text). - * @param {string} text - * @param {string} partial - */ - matches = function matches(text, partial) { - return text.toLowerCase().indexOf(partial.toLowerCase()) > -1; - }; - data = data.filter(function (element) { - return matches("".concat(element[1].title, ", ").concat(element[1].tags), search.value); - }); - } - _t = localStorage.sort; - _context.n = _t === 'latest' ? 1 : _t === 'updated' ? 2 : _t === 'stars' ? 3 : _t === 'random' ? 4 : 5; - break; - case 1: - data.reverse(); - return _context.a(3, 5); - case 2: - // item1.attr.localeCompare(item2.attr); - data.sort(function (a, b) { - return b[1].pushed_at.localeCompare(a[1].pushed_at); - }); - return _context.a(3, 5); - case 3: - data.sort(function (a, b) { - return b[1].stargazers_count - a[1].stargazers_count; - }); - return _context.a(3, 5); - case 4: - for (i = data.length - 1; i > 0; i--) { - j = Math.floor(Math.random() * (i + 1)); - _ref2 = [data[j], data[i]]; - data[i] = _ref2[0]; - data[j] = _ref2[1]; - } - return _context.a(3, 5); - case 5: - _iterator = _createForOfIteratorHelper(data); - _context.p = 6; - _iterator.s(); - case 7: - if ((_step = _iterator.n()).done) { - _context.n = 10; - break; - } - _step$value = _slicedToArray(_step.value, 2), index = _step$value[0], entry = _step$value[1]; - if (!(running_sort !== my_run)) { - _context.n = 8; - break; - } - return _context.a(2); - case 8: - card = new Card(entry, index); - card.render(outputContainer); - _context.n = 9; - return new Promise(function (r) { - return setTimeout(r, 444); - }); - case 9: - _context.n = 7; - break; - case 10: - _context.n = 12; - break; - case 11: - _context.p = 11; - _t2 = _context.v; - _iterator.e(_t2); - case 12: - _context.p = 12; - _iterator.f(); - return _context.f(12); - case 13: - return _context.a(2); - } - }, _callee, null, [[6, 11, 12, 13]]); - })); - return function (_x) { - return _ref.apply(this, arguments); - }; - }()); - } - - // add themes - var outputContainer = document.getElementById('themes_container'); - - /* Theme Handling - * ============== - */ - - var systemPref = window.matchMedia("(prefers-color-scheme: dark)").matches ? 'night' : 'day', - themeTrigger = document.getElementById('js-themeSwitcher'), - themeTriggerIcon = themeTrigger.querySelector('i'); - - // when local storage is not populated set the system preferrence as value - if (!localStorage['theme']) localStorage['theme'] = systemPref === 'day' ? 'day' : 'night'; - - // set nightmode when according to local storage - if (localStorage['theme'] === 'night') { - themeTriggerIcon.classList.remove('fa-sun'); - themeTriggerIcon.classList.add('fa-moon'); - document.documentElement.classList.add('nightmode'); - } else { - document.documentElement.classList.add('daymode'); - } - function toggleTheme() { - document.documentElement.classList.toggle('nightmode'); - document.documentElement.classList.toggle('daymode'); - - // update local storage - if (localStorage['theme'] === 'night') { - localStorage['theme'] = 'day'; - themeTriggerIcon.classList.add('fa-sun'); - themeTriggerIcon.classList.remove('fa-moon'); - } else { - localStorage['theme'] = 'night'; - themeTriggerIcon.classList.remove('fa-sun'); - themeTriggerIcon.classList.add('fa-moon'); - } - } - themeTrigger.addEventListener('click', toggleTheme); -})(); \ No newline at end of file diff --git a/docs/assets/js/main.min.js b/docs/assets/js/main.min.js deleted file mode 100644 index e98bb40e..00000000 --- a/docs/assets/js/main.min.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";function _regenerator(){/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */var e,t,r="function"==typeof Symbol?Symbol:{},n=r.iterator||"@@iterator",o=r.toStringTag||"@@toStringTag";function a(r,n,o,a){var s=n&&n.prototype instanceof c?n:c,l=Object.create(s.prototype);return _regeneratorDefine2(l,"_invoke",function(r,n,o){var a,c,s,l=0,u=o||[],f=!1,d={p:0,n:0,v:e,a:y,f:y.bind(e,4),d:function(t,r){return a=t,c=0,s=e,d.n=r,i}};function y(r,n){for(c=r,s=n,t=0;!f&&l&&!o&&t3?(o=m===n)&&(s=a[(c=a[4])?5:(c=3,3)],a[4]=a[5]=e):a[0]<=y&&((o=r<2&&yn||n>m)&&(a[4]=r,a[5]=n,d.n=m,c=0))}if(o||r>1)return i;throw f=!0,n}return function(o,u,m){if(l>1)throw TypeError("Generator is already running");for(f&&1===u&&y(u,m),c=u,s=m;(t=c<2?e:s)||!f;){a||(c?c<3?(c>1&&(d.n=-1),y(c,s)):d.n=s:d.v=s);try{if(l=2,a){if(c||(o="next"),t=a[o]){if(!(t=t.call(a,s)))throw TypeError("iterator result is not an object");if(!t.done)return t;s=t.value,c<2&&(c=0)}else 1===c&&(t=a.return)&&t.call(a),c<2&&(s=TypeError("The iterator does not provide a '"+o+"' method"),c=1);a=e}else if((t=(f=d.n<0)?s:r.call(n,d))!==i)break}catch(t){a=e,c=1,s=t}finally{l=1}}return{value:t,done:f}}}(r,o,a),!0),l}var i={};function c(){}function s(){}function l(){}t=Object.getPrototypeOf;var u=[][n]?t(t([][n]())):(_regeneratorDefine2(t={},n,function(){return this}),t),f=l.prototype=c.prototype=Object.create(u);function d(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,l):(e.__proto__=l,_regeneratorDefine2(e,o,"GeneratorFunction")),e.prototype=Object.create(f),e}return s.prototype=l,_regeneratorDefine2(f,"constructor",l),_regeneratorDefine2(l,"constructor",s),s.displayName="GeneratorFunction",_regeneratorDefine2(l,o,"GeneratorFunction"),_regeneratorDefine2(f),_regeneratorDefine2(f,o,"Generator"),_regeneratorDefine2(f,n,function(){return this}),_regeneratorDefine2(f,"toString",function(){return"[object Generator]"}),(_regenerator=function(){return{w:a,m:d}})()}function _regeneratorDefine2(e,t,r,n){var o=Object.defineProperty;try{o({},"",{})}catch(e){o=0}_regeneratorDefine2=function(e,t,r,n){function a(t,r){_regeneratorDefine2(e,t,function(e){return this._invoke(t,r,e)})}t?o?o(e,t,{value:r,enumerable:!n,configurable:!n,writable:!n}):e[t]=r:(a("next",0),a("throw",1),a("return",2))},_regeneratorDefine2(e,t,r,n)}function _slicedToArray(e,t){return _arrayWithHoles(e)||_iterableToArrayLimit(e,t)||_unsupportedIterableToArray(e,t)||_nonIterableRest()}function _nonIterableRest(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _iterableToArrayLimit(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,o,a,i,c=[],s=!0,l=!1;try{if(a=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;s=!1}else for(;!(s=(n=a.call(r)).done)&&(c.push(n.value),c.length!==t);s=!0);}catch(e){l=!0,o=e}finally{try{if(!s&&null!=r.return&&(i=r.return(),Object(i)!==i))return}finally{if(l)throw o}}return c}}function _arrayWithHoles(e){if(Array.isArray(e))return e}function _createForOfIteratorHelper(e,t){var r="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!r){if(Array.isArray(e)||(r=_unsupportedIterableToArray(e))||t&&e&&"number"==typeof e.length){r&&(e=r);var n=0,o=function(){};return{s:o,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a,i=!0,c=!1;return{s:function(){r=r.call(e)},n:function(){var e=r.next();return i=e.done,e},e:function(e){c=!0,a=e},f:function(){try{i||null==r.return||r.return()}finally{if(c)throw a}}}}function _unsupportedIterableToArray(e,t){if(e){if("string"==typeof e)return _arrayLikeToArray(e,t);var r={}.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?_arrayLikeToArray(e,t):void 0}}function _arrayLikeToArray(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r\n
\n

').concat(this._title,'

\n \n \n \n
\n \n
\n \n Download\n
\n \n ');e.insertAdjacentHTML("beforeend",t)}}])}();function removeLightbox(){var e=document.getElementById("lightbox");e&&e.remove()}function createLightbox(e){removeLightbox();var t=document.getElementById("theme-".concat(e)),r=t.querySelector("h3"),n=t.querySelector("img"),o='\n \n ');t.insertAdjacentHTML("afterend",o)}!function(){var e=0,t=document.getElementById("searchInput");t.addEventListener("keydown",function(e){"Enter"===e.key&&o(localStorage.sort,t.value)}),document.getElementById("searchButton").addEventListener("click",function(){return o(localStorage.sort,t.value)}),localStorage.sort||(localStorage.sort="latest");var r=document.getElementById("js-sort-menu");r.addEventListener("change",function(){o(r.selectedOptions[0].getAttribute("name"))}),o(localStorage.sort);var n=r.options.namedItem(localStorage.sort);function o(r,n){var o=++e;localStorage.sort=r;var i=document.getElementById("themes_container");i&&(i.innerHTML=""),fetch("themes.json").then(function(e){return e.json()}).then(function(){var r=_asyncToGenerator(_regenerator().m(function r(i){var c,s,l,u,f,d,y,m,h,p,g;return _regenerator().w(function(r){for(;;)switch(r.p=r.n){case 0:i=Object.entries(i),n&&(c=function(e,t){return e.toLowerCase().indexOf(t.toLowerCase())>-1},i=i.filter(function(e){return c("".concat(e[1].title,", ").concat(e[1].tags),t.value)})),p=localStorage.sort,r.n="latest"===p?1:"updated"===p?2:"stars"===p?3:"random"===p?4:5;break;case 1:return i.reverse(),r.a(3,5);case 2:return i.sort(function(e,t){return t[1].pushed_at.localeCompare(e[1].pushed_at)}),r.a(3,5);case 3:return i.sort(function(e,t){return t[1].stargazers_count-e[1].stargazers_count}),r.a(3,5);case 4:for(s=i.length-1;s>0;s--)l=Math.floor(Math.random()*(s+1)),u=[i[l],i[s]],i[s]=u[0],i[l]=u[1];return r.a(3,5);case 5:f=_createForOfIteratorHelper(i),r.p=6,f.s();case 7:if((d=f.n()).done){r.n=10;break}if(y=_slicedToArray(d.value,2),m=y[0],h=y[1],e===o){r.n=8;break}return r.a(2);case 8:return new Card(h,m).render(a),r.n=9,new Promise(function(e){return setTimeout(e,444)});case 9:r.n=7;break;case 10:r.n=12;break;case 11:r.p=11,g=r.v,f.e(g);case 12:return r.p=12,f.f(),r.f(12);case 13:return r.a(2)}},r,null,[[6,11,12,13]])}));return function(e){return r.apply(this,arguments)}}())}n&&(n.selected=!0);var a=document.getElementById("themes_container"),i=window.matchMedia("(prefers-color-scheme: dark)").matches?"night":"day",c=document.getElementById("js-themeSwitcher"),s=c.querySelector("i");localStorage.theme||(localStorage.theme="day"===i?"day":"night"),"night"===localStorage.theme?(s.classList.remove("fa-sun"),s.classList.add("fa-moon"),document.documentElement.classList.add("nightmode")):document.documentElement.classList.add("daymode"),c.addEventListener("click",function(){document.documentElement.classList.toggle("nightmode"),document.documentElement.classList.toggle("daymode"),"night"===localStorage.theme?(localStorage.theme="day",s.classList.add("fa-sun"),s.classList.remove("fa-moon")):(localStorage.theme="night",s.classList.remove("fa-sun"),s.classList.add("fa-moon"))})}(); \ No newline at end of file diff --git a/docs/disclaimer.html b/docs/disclaimer.html deleted file mode 100644 index 803e7fa6..00000000 --- a/docs/disclaimer.html +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - - FirefoxCSS Store - - - - - -
-

FirefoxCSS Store

- -
-
-

Disclaimer

-

Last updated: February 04, 2021

-

Interpretation and Definitions

-

Interpretation

-

The words of which the initial letter is capitalized have meanings defined under the following conditions. The following definitions shall have the same meaning regardless of whether they appear in singular or in plural.

-

Definitions

-

For the purposes of this Disclaimer:

-
    -
  • Team (referred to as either »the Team«, »We«, »Us« or »Our« in this Disclaimer) refers to FirefoxCSS Store.
  • -
  • Service refers to the Website.
  • -
  • You means the individual accessing the Service, or the Team, or other legal entity on behalf of which such individual is accessing or using the Service, as applicable.
  • -
  • Website refers to FirefoxCSS Store, accessible from firefoxcss-store.github.io
  • -
-

Disclaimer

-

The information contained on the Service is for general information purposes only. -The Team assumes no responsibility for errors or omissions in the contents of the Service. -In no event shall the Team be liable for any special, direct, indirect, consequential, or incidental damages or any damages whatsoever, whether in an action of contract, negligence or other tort, arising out of or in connection with the use of the Service or the contents of the Service. The Team reserves the right to make additions, deletions, or modifications to the contents on the Service at any time without prior notice. -The Team does not warrant that the Service is free of viruses or other harmful components.

-

External Links

-

The Service may contain links to external websites that are not provided or maintained by or in any way affiliated with the Team. -Please note that the Team does not guarantee the accuracy, relevance, timeliness, or completeness of any information on these external websites.

-

Errors and Omissions

-

The information given by the Service is for general guidance on matters of interest only. Even if the Team takes every precaution to insure that the content of the Service is both current and accurate, errors can occur. Plus, given the changing nature of laws, rules and regulations, there may be delays, omissions or inaccuracies in the information contained on the Service. -The Team is not responsible for any errors or omissions, or for the results obtained from the use of this information.

-

Fair Use

-

The Team may use copyrighted material which has not always been specifically authorized by the copyright owner. The Team is making such material available for criticism, comment, news reporting, teaching, scholarship, or research. -The Team believes this constitutes a »fair use« of any such copyrighted material as provided for in section 107 of the United States Copyright law. -If You wish to use copyrighted material from the Service for your own purposes that go beyond fair use, You must obtain permission from the copyright owner.

-

Views Expressed

-

The Service may contain views and opinions which are those of the authors and do not necessarily reflect the official policy or position of any other author, agency, organization, employer or Team, including the Team. -Comments published by users are their sole responsibility and the users will take full responsibility, liability and blame for any libel or litigation that results from something written in or as a direct result of something written in a comment. The Team is not liable for any comment published by users and reserve the right to delete any comment for any reason whatsoever.

-

Responsibility

-

The information on the Service is provided with the understanding that the Team is not herein engaged in rendering legal, accounting, tax, or other professional advice and services. As such, it should not be used as a substitute for consultation with professional accounting, tax, legal or other competent advisers. -In no event shall the Team or its suppliers be liable for any special, incidental, indirect, or consequential damages whatsoever arising out of or in connection with your access or use or inability to access or use the Service.

-

»Use at Your Own Risk«

-

All information in the Service is provided »as is«, with no guarantee of completeness, accuracy, timeliness or of the results obtained from the use of this information, and without warranty of any kind, express or implied, including, but not limited to warranties of performance, merchantability and fitness for a particular purpose. -The Team will not be liable to You or anyone else for any decision made or action taken in reliance on the information given by the Service or for any consequential, special or similar damages, even if advised of the possibility of such damages.

-

Contact Us

-

If you have any questions about this Disclaimer, You can contact Us here: Issue Tracker

- -
-
- - - - - \ No newline at end of file diff --git a/docs/index.html b/docs/index.html deleted file mode 100644 index ced38d8a..00000000 --- a/docs/index.html +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - FirefoxCSS Store - - - - - -
-

FirefoxCSS Store

- -
-
-
-
- - - - - \ No newline at end of file diff --git a/docs/robots.txt b/docs/robots.txt deleted file mode 100644 index c2a49f4f..00000000 --- a/docs/robots.txt +++ /dev/null @@ -1,2 +0,0 @@ -User-agent: * -Allow: / diff --git a/docs/themes.json b/docs/themes.json deleted file mode 100644 index 41d5b911..00000000 --- a/docs/themes.json +++ /dev/null @@ -1,2319 +0,0 @@ -[ - { - "title": "arcadia", - "link": "https://github.com/tyrohellion/arcadia", - "description": "Minimal Firefox theme and user.js focused on speed and design", - "image": "assets/img/themes/arcadia.webp", - "tags": [ - "tyro", - "dark", - "minimal", - "clean", - "hovercards", - "simple", - "compact", - "minimalistic" - ], - "repository": "https://github.com/tyrohellion/arcadia", - "pushed_at": "2026-01-28T10:47:31Z", - "stargazers_count": 20, - "avatar": "https://avatars.githubusercontent.com/u/51808054?v=4" - }, - { - "title": "Titlebar-Button-Fix", - "link": "https://github.com/birbkeks/Firefox-Titlebar-Button-Fix", - "description": "This theme fixes titlebar min max close buttons for Firefox in linux. ", - "image": "assets/img/themes/titlebarfix.webp", - "tags": [ - "birbkeks", - "fix", - "titlebar" - ], - "repository": "https://github.com/birbkeks/Firefox-Titlebar-Button-Fix", - "pushed_at": "2024-05-12T18:57:05Z", - "stargazers_count": 6, - "avatar": "https://avatars.githubusercontent.com/u/67545942?v=4" - }, - { - "title": "Sweet_Pop!", - "link": "https://github.com/PROxZIMA/Sweet-Pop", - "description": "Sweet_Pop! Minimalist oneliner theme for Firefox perfectly matching Sweet Dark.", - "image": "assets/img/themes/sweetpop.webp", - "tags": [ - "dark", - "light", - "modern", - "blue", - "auto-hide", - "floating bar", - "PROxZIMA" - ], - "repository": "https://github.com/PROxZIMA/Sweet-Pop", - "pushed_at": "2023-03-25T10:54:34Z", - "stargazers_count": 264, - "avatar": "https://avatars.githubusercontent.com/u/43103163?v=4" - }, - { - "title": "minimalFOX", - "link": "https://github.com/marmmaz/FirefoxCSS", - "description": "A compact & minimal Firefox theme built for macOS.", - "image": "assets/img/themes/minimalfox.webp", - "tags": [ - "dark", - "macos", - "marmazz", - "auto-hide", - "floating bar", - "compact" - ], - "repository": "https://github.com/marmmaz/FirefoxCSS", - "pushed_at": "2021-10-13T19:11:07Z", - "stargazers_count": 77, - "avatar": "https://avatars.githubusercontent.com/u/71498246?v=4" - }, - { - "title": "FirefoxCss", - "link": "https://github.com/h4wwk3ye/firefoxCSS", - "description": "Custom userChrome.css for firefox based on Material Fox and Flying Fox with few small changes.", - "image": "assets/img/themes/firefoxcss.webp", - "tags": [ - "light", - "h4wwk3ye", - "Tree Style Tab", - "sidebar" - ], - "repository": "https://github.com/h4wwk3ye/firefoxCSS", - "pushed_at": "2021-01-25T11:22:25Z", - "stargazers_count": 24, - "avatar": "https://avatars.githubusercontent.com/u/24487030?v=4" - }, - { - "title": "Simplify Silver Peach for Firefox", - "link": "https://github.com/CristianDragos/FirefoxThemes/tree/master/Simplify%20Silver%20Peach", - "description": "A minimal Firefox Theme for those who would like to properly enjoy my Simplify 10 Silver Peach - Windows 10 Themes\n Compatibility: V89+", - "image": "assets/img/themes/simplify_silver_peach_for_firefox_preview.webp", - "tags": [ - "light", - "pastel", - "CristianDragos", - "rounded" - ], - "repository": "https://github.com/CristianDragos/FirefoxThemes", - "pushed_at": "2021-10-07T12:23:11Z", - "stargazers_count": 141, - "avatar": "https://avatars.githubusercontent.com/u/3705687?v=4" - }, - { - "title": "Simplify Darkish for Firefox", - "link": "https://github.com/CristianDragos/FirefoxThemes/tree/master/Simplify%20Darkish", - "description": "A minimal Firefox Theme for those who would like to properly enjoy my Simplify 10 Darkish - Windows 10 Themes\n Compatibility: V89+", - "image": "assets/img/themes/simplify_darkish_for_firefox_preview.webp", - "tags": [ - "dark", - "CristianDragos", - "windows 10" - ], - "repository": "https://github.com/CristianDragos/FirefoxThemes", - "pushed_at": "2021-10-07T12:23:11Z", - "stargazers_count": 141, - "avatar": "https://avatars.githubusercontent.com/u/3705687?v=4" - }, - { - "title": "SimpleFox", - "link": "https://github.com/migueravila/Simplefox", - "description": "🦊 A Userstyle theme for Firefox minimalist and Keyboard centered.", - "image": "assets/img/themes/simplefox.webp", - "tags": [ - "migueravila", - "dark", - "minimal", - "keyboard", - "compact", - "linux" - ], - "repository": "https://github.com/migueravila/Simplefox", - "pushed_at": "2022-04-24T18:56:19Z", - "stargazers_count": 1875, - "avatar": "https://avatars.githubusercontent.com/u/35583825?v=4" - }, - { - "title": "blurredfox", - "link": "https://github.com/manilarome/blurredfox", - "description": "A modern Firefox CSS Theme", - "image": "assets/img/themes/blurred.webp", - "tags": [ - "manilarome", - "dark", - "light", - "blur", - "linux" - ], - "repository": "https://github.com/manilarome/blurredfox", - "pushed_at": "2023-06-27T10:12:27Z", - "stargazers_count": 923, - "avatar": "https://avatars.githubusercontent.com/u/40349590?v=4" - }, - { - "title": "Firefox Review", - "link": "https://github.com/fellowish/firefox-review", - "description": "Firefox Review is a CSS redesign of the browser, changing the look of Firefox to match the color scheme and design language of Firefox Preview, the previous name of Mozilla's new mobile app.", - "image": "assets/img/themes/firefoxreview.webp", - "tags": [ - "dark", - "light", - "fellowish", - "archived", - "colorscheme" - ], - "repository": "https://github.com/fellowish/firefox-review", - "pushed_at": "2021-04-22T18:14:52Z", - "stargazers_count": 138, - "avatar": "https://avatars.githubusercontent.com/u/28973978?v=4" - }, - { - "title": "nord-firefox", - "link": "https://github.com/daaniiieel/nord-firefox", - "description": "Firefox userChrome.css theme, based on https://github.com/AnubisZ9/Global-Dark-Nordic-theme/.", - "image": "assets/img/themes/nord.webp", - "tags": [ - "nord", - "daaniiieel", - "colorscheme" - ], - "repository": "https://github.com/daaniiieel/nord-firefox", - "pushed_at": "2020-04-18T08:08:07Z", - "stargazers_count": 29, - "avatar": "https://avatars.githubusercontent.com/u/41679054?v=4" - }, - { - "title": "not-holar's theme", - "link": "https://github.com/not-holar/my_firefox_theme", - "description": "Welcome to the repo for my Firefox theme, a theme that aims to look nice and clean while not compromising functionality.\n Compatibility: V89+", - "image": "assets/img/themes/MyFirefoxThemenotholar.webp", - "tags": [ - "not-holar", - "stylus", - "Tree Style", - "dark" - ], - "repository": "https://github.com/not-holar/my_firefox_theme", - "pushed_at": "2022-10-17T13:05:29Z", - "stargazers_count": 85, - "avatar": "https://avatars.githubusercontent.com/u/58831297?v=4" - }, - { - "title": "Firefox-Mod-Blur", - "link": "https://github.com/datguypiko/Firefox-Mod-Blur", - "description": "Tested 84.0.1 Windows 10 / Default Dark Theme ", - "image": "assets/img/themes/firefoxmodblur.webp", - "tags": [ - "blur", - "datguypiko", - "dark", - "centre", - "rounded" - ], - "repository": "https://github.com/datguypiko/Firefox-Mod-Blur", - "pushed_at": "2026-04-01T18:09:51Z", - "stargazers_count": 1685, - "avatar": "https://avatars.githubusercontent.com/u/61329159?v=4" - }, - { - "title": "quietfox", - "link": "https://github.com/coekuss/quietfox", - "description": "This userChrome mod was created to make the Firefox UI cleaner and more modern without sacrificing any of its original features. You can still use themes, and you can still use Compact Mode and Touch Mode. You can pretty much forget that you have a mod installed, it works quietly in the background.", - "image": "assets/img/themes/quietfox.webp", - "tags": [ - "coekuss", - "toolkit", - "simple" - ], - "repository": "https://github.com/coekuss/quietfox", - "pushed_at": "2021-07-05T22:51:14Z", - "stargazers_count": 172, - "avatar": "https://avatars.githubusercontent.com/u/45906331?v=4" - }, - { - "title": "minimal-functional-fox", - "link": "https://github.com/mut-ex/minimal-functional-fox", - "description": "A minimal, yet functional configuration for Firefox!", - "image": "assets/img/themes/minimalfuntionalfox.webp", - "tags": [ - "centre", - "minimal", - "dark", - "animations" - ], - "repository": "https://github.com/mut-ex/minimal-functional-fox", - "pushed_at": "2023-05-19T00:16:56Z", - "stargazers_count": 725, - "avatar": "https://avatars.githubusercontent.com/u/21265981?v=4" - }, - { - "title": "MaterialFox", - "link": "https://github.com/muckSponge/MaterialFox", - "description": "A Material Design-inspired userChrome.css theme for Firefox", - "image": "assets/img/themes/materialfox.webp", - "tags": [ - "muckSponge", - "dark", - "light", - "colorscheme" - ], - "repository": "https://github.com/muckSponge/MaterialFox", - "pushed_at": "2024-09-23T08:58:42Z", - "stargazers_count": 1971, - "avatar": "https://avatars.githubusercontent.com/u/5405629?v=4" - }, - { - "title": "Firefox UWP Style", - "link": "https://github.com/Guerra24/Firefox-UWP-Style", - "description": "A theme that follows UWP styling. Featuring the original MDL2 design and Sun Valley refresh", - "image": "assets/img/themes/firefoxuwpstyle.webp", - "tags": [ - "Guerra24", - "dark", - "colorscheme" - ], - "repository": "https://github.com/Guerra24/Firefox-UWP-Style", - "pushed_at": "2026-03-25T16:22:15Z", - "stargazers_count": 452, - "avatar": "https://avatars.githubusercontent.com/u/9023392?v=4" - }, - { - "title": "Monochrome Tree", - "link": "https://github.com/MatejKafka/FirefoxTheme", - "description": "A custom minimalist theme for Firefox with Tree Style Tab support", - "image": "assets/img/themes/19.webp", - "tags": [ - "dark", - "light", - "MatejKafka", - "monochrome", - "Tree Style", - "one-line" - ], - "repository": "https://github.com/MatejKafka/FirefoxTheme", - "pushed_at": "2025-04-06T13:59:21Z", - "stargazers_count": 17, - "avatar": "https://avatars.githubusercontent.com/u/6414091?v=4" - }, - { - "title": "Flying Fox", - "link": "https://github.com/akshat46/FlyingFox", - "description": "An opinionated set of configurations for firefox with Material Fox, github-moonlight userstyle", - "image": "assets/img/themes/flying.webp", - "tags": [ - "material", - "moonlight", - "akshat46" - ], - "repository": "https://github.com/akshat46/FlyingFox", - "pushed_at": "2023-04-11T07:11:04Z", - "stargazers_count": 1602, - "avatar": "https://avatars.githubusercontent.com/u/7402043?v=4" - }, - { - "title": "FirefoxW10ContextMenus", - "link": "https://github.com/M1ch431/FirefoxW10ContextMenus", - "description": "Emulates the Windows 10 context menus in Firefox.", - "image": "assets/img/themes/20.webp", - "tags": [ - "toolkit", - "context", - "menu", - "windows" - ], - "repository": "https://github.com/M1ch431/FirefoxW10ContextMenus", - "pushed_at": "2021-09-20T04:21:08Z", - "stargazers_count": 113, - "avatar": "https://avatars.githubusercontent.com/u/46256998?v=4" - }, - { - "title": "EdgeFox", - "link": "https://github.com/23Bluemaster23/EdgeFox", - "description": "Is a userchrome that imitates (or attempts to imitate) the style of Microsoft's Edge Chromiun browser.", - "image": "assets/img/themes/edgefox.webp", - "tags": [ - "windows", - "edge" - ], - "repository": "https://github.com/23Bluemaster23/EdgeFox", - "pushed_at": "2021-09-26T14:59:13Z", - "stargazers_count": 33, - "avatar": "https://avatars.githubusercontent.com/u/49736771?v=4" - }, - { - "title": "Firefox i3wm theme", - "link": "https://github.com/aadilayub/firefox-i3wm-theme", - "description": "A theme for Firefox meant to emulate qutebrowser and integrate with the i3 window manager.", - "image": "assets/img/themes/ff-i3wm.webp", - "tags": [ - "qt", - "qute", - "qutebrowser", - "i3" - ], - "repository": "https://github.com/aadilayub/firefox-i3wm-theme", - "pushed_at": "2023-07-27T09:02:57Z", - "stargazers_count": 162, - "avatar": "https://avatars.githubusercontent.com/u/31581044?v=4" - }, - { - "title": "Edge-Frfox", - "link": "https://github.com/bmFtZQ/Edge-FrFox", - "description": "A Firefox userChrome.css theme that aims to recreate the look and feel of Microsoft Edge.", - "image": "assets/img/themes/Edge-Frfox.webp", - "tags": [ - "light", - "dark", - "fluent", - "microsoft", - "bmFtZQ", - "windows", - "mac", - "linux" - ], - "repository": "https://github.com/bmFtZQ/Edge-FrFox", - "pushed_at": "2026-04-03T12:59:23Z", - "stargazers_count": 761, - "avatar": "https://avatars.githubusercontent.com/u/62812711?v=4" - }, - { - "title": "NicoFox", - "link": "https://github.com/SlowNicoFish/NicoFox", - "description": "A simple rounded theme", - "image": "assets/img/themes/22381112138598-fe8cd400-8bd1-11eb-8eed-edcca2c689d8.webp", - "tags": [ - "rounded", - "minimal" - ], - "repository": "https://github.com/SlowNicoFish/NicoFox", - "pushed_at": "2021-03-23T00:04:37Z", - "stargazers_count": 6, - "avatar": "https://avatars.githubusercontent.com/u/19305293?v=4" - }, - { - "title": "Elegant Nord Theme", - "link": "https://github.com/rafamadriz/Firefox-Elegant-NordTheme", - "description": "Elegant Nord Theme with material design", - "image": "assets/img/themes/Elegant-Nord-Theme.webp", - "tags": [ - "nord", - "material" - ], - "repository": "https://github.com/rafamadriz/Firefox-Elegant-NordTheme", - "pushed_at": "2023-04-28T01:47:55Z", - "stargazers_count": 24, - "avatar": "https://avatars.githubusercontent.com/u/67771985?v=4" - }, - { - "title": "Moonlight 🌌", - "link": "https://github.com/eduardhojbota/moonlight-userChrome", - "description": "A dark userstyle for Firefox inspired by moonlight-vscode-theme and github-moonlight", - "image": "assets/img/themes/moonlight.webp", - "tags": [ - "dark" - ], - "repository": "https://github.com/eduardhojbota/moonlight-userChrome", - "pushed_at": "2023-11-25T14:46:00Z", - "stargazers_count": 144, - "avatar": "https://avatars.githubusercontent.com/u/2820538?v=4" - }, - { - "title": "Firefox Halo", - "link": "https://github.com/seirin-blu/Firefox-Halo", - "description": "A mininmalist Firefox theme with a lot of about: pages edited to act as resources. Updates about every month.", - "image": "assets/img/themes/firefoxhalo.webp", - "tags": [ - "toolkit" - ], - "repository": "https://github.com/seirin-blu/Firefox-Halo", - "pushed_at": "2023-11-27T19:29:22Z", - "stargazers_count": 47, - "avatar": "https://avatars.githubusercontent.com/u/61664123?v=4" - }, - { - "title": "Pseudo-fullscreen Firefox", - "link": "https://github.com/ongots/pseudo-fullscreen-firefox", - "description": "Hides and improves interface Firefox and YouTube, giving maximum space for content and aiding concentration", - "image": "assets/img/themes/always-fullscreen-firefox.webp", - "tags": [ - "toolkit", - "sidebar" - ], - "repository": "https://github.com/ongots/pseudo-fullscreen-firefox", - "pushed_at": "2026-02-28T16:48:31Z", - "stargazers_count": 69, - "avatar": "https://avatars.githubusercontent.com/u/43604031?v=4" - }, - { - "title": "WhiteSur Safari style for Firefox", - "link": "https://github.com/adamxweb/WhiteSurFirefoxThemeMacOS", - "description": "Make your Firefox look like Safari. MacOS Big Sur inspired theme for Firefox on MacOS & Windows.\n Compatibility: V89+", - "image": "assets/img/themes/whitesur.webp", - "tags": [ - "apple", - "mac", - "safari" - ], - "repository": "https://github.com/adamxweb/WhiteSurFirefoxThemeMacOS", - "pushed_at": "2025-07-26T05:43:43Z", - "stargazers_count": 611, - "avatar": "https://avatars.githubusercontent.com/u/6800453?v=4" - }, - { - "title": "Alpen Blue to Firefox CSS", - "link": "https://github.com/Godiesc/AlpenBlue", - "description": "Theme to Blue and Alpenglow lovers\n Compatibility: V89+", - "image": "assets/img/themes/alpenblue.webp", - "tags": [ - "aplenblue", - "alpenglow", - "Godiesc" - ], - "repository": "https://github.com/Godiesc/AlpenBlue", - "pushed_at": "2022-06-19T19:00:45Z", - "stargazers_count": 67, - "avatar": "https://avatars.githubusercontent.com/u/22057609?v=4" - }, - { - "title": "duskFox", - "link": "https://github.com/aminomancer/uc.css.js", - "description": "A dark indigo theme integrated with extensive functional and visual scripts.\n Compatibility: V89+", - "image": "assets/img/themes/duskfox.webp", - "tags": [ - "dark", - "dusk" - ], - "repository": "https://github.com/aminomancer/uc.css.js", - "pushed_at": "2026-01-06T17:30:39Z", - "stargazers_count": 379, - "avatar": "https://avatars.githubusercontent.com/u/33384265?v=4" - }, - { - "title": "Compact Mode to Firefox Css", - "link": "https://github.com/Godiesc/compactmodefirefoxcss", - "description": "Theme to Make Firefox Compact and keep it's Beauty\n Compatibility: V89+", - "image": "assets/img/themes/splashcompact.webp", - "tags": [ - "toolkit", - "Godiesc" - ], - "repository": "https://github.com/Godiesc/compactmodefirefoxcss", - "pushed_at": "2021-08-27T17:47:51Z", - "stargazers_count": 18, - "avatar": "https://avatars.githubusercontent.com/u/22057609?v=4" - }, - { - "title": "DiamondFucsia Theme to Firefox Css", - "link": "https://github.com/Godiesc/DiamondFucsia", - "description": "Dark Theme to Firefox with Fuchsia Colors\n Compatibility: V89+", - "image": "assets/img/themes/diamondfucsia.webp", - "tags": [ - "Godiesc" - ], - "repository": "https://github.com/Godiesc/DiamondFucsia", - "pushed_at": "2023-11-25T12:46:57Z", - "stargazers_count": 6, - "avatar": "https://avatars.githubusercontent.com/u/22057609?v=4" - }, - { - "title": "Australis like tabs in Proton UI", - "link": "https://github.com/sagars007/Australis-like-tabs-FF-ProtonUI-changes", - "description": "Changes to make the new proton UI redesign in Firefox better; including changes to tabs, more compact-compact mode, proton gradient accents in elements and much more\n Compatibility: V89+", - "image": "assets/img/themes/custom_australistabs_protonUI.webp", - "tags": [ - "compact" - ], - "repository": "https://github.com/sagars007/Australis-like-tabs-FF-ProtonUI-changes", - "pushed_at": "2021-06-10T07:37:39Z", - "stargazers_count": 11, - "avatar": "https://avatars.githubusercontent.com/u/56472130?v=4" - }, - { - "title": "Firefox vertical tabs (TST) UI", - "link": "https://github.com/sagars007/Firefox-vertical-tabs-customUI", - "description": "Vertical tabs in Firefox using tree style tabs. Vibrant tab selectors, full dark mode, titlebar text in nav-bar and much more.\n Compatibility: V89+", - "image": "assets/img/themes/compact_verticaltabs_view.webp", - "tags": [ - "sidebar", - "sidetab", - "tree" - ], - "repository": "https://github.com/sagars007/Firefox-vertical-tabs-customUI", - "pushed_at": "2021-09-04T19:49:09Z", - "stargazers_count": 32, - "avatar": "https://avatars.githubusercontent.com/u/56472130?v=4" - }, - { - "title": "Lepton(Proton Fix) in Proton UI", - "link": "https://github.com/black7375/Firefox-UI-Fix", - "description": "🦊 I respect proton UI and aim to fix it. Icons, Padding, Tab Design...\n Compatibility: V89+", - "image": "assets/img/themes/Lepton.webp", - "tags": [ - "" - ], - "repository": "https://github.com/black7375/Firefox-UI-Fix", - "pushed_at": "2026-02-06T00:06:12Z", - "stargazers_count": 5805, - "avatar": "https://avatars.githubusercontent.com/u/25581533?v=4" - }, - { - "title": "Lepton's Photon-Styled in Proton UI", - "link": "https://github.com/black7375/Firefox-UI-Fix/tree/photon-style", - "description": "🦊 I tried to preserve Proton’s feeling while preserving Photon’s strengths. Icons, Padding, Tab Design...\n Compatibility: V89+", - "image": "assets/img/themes/Lepton-PhotonStyle.webp", - "tags": [ - "" - ], - "repository": "https://github.com/black7375/Firefox-UI-Fix/tree/photon-style", - "pushed_at": "2026-02-06T00:06:12Z", - "stargazers_count": 5805, - "avatar": "https://avatars.githubusercontent.com/u/25581533?v=4" - }, - { - "title": "[Firefox 90+] RainFox", - "link": "https://github.com/1280px/rainfox", - "description": "Restores Photon's look and feel but keeps Proton's clarity with some improvements and new features. \n Compatibility: V89+", - "image": "assets/img/themes/rainfox.webp", - "tags": [ - "" - ], - "repository": "https://github.com/1280px/rainfox", - "pushed_at": "2022-02-04T15:28:44Z", - "stargazers_count": 73, - "avatar": "https://avatars.githubusercontent.com/u/71165491?v=4" - }, - { - "title": "Gradient rounded tabs redesign and ultra compact mode [Proton UI]", - "link": "https://github.com/sagars007/Proton-UI-connected-rounded-tabs-firefox-css", - "description": "Firefox Proton UI minimal changes with nav-bar-connected rounded tabs, reduced compact mode, nightly color gradient accents etc.. \n Compatibility: V89+", - "image": "assets/img/themes/proton-ui-gradient-rounded-tabs-display.webp", - "tags": [ - "" - ], - "repository": "https://github.com/sagars007/Proton-UI-connected-rounded-tabs-firefox-css", - "pushed_at": "2023-05-14T06:24:23Z", - "stargazers_count": 35, - "avatar": "https://avatars.githubusercontent.com/u/56472130?v=4" - }, - { - "title": "Technetium", - "link": "https://github.com/edo0/Technetium", - "description": "A focused approach to taming the new Firefox Proton interface, restituting some of the beloved elements retired alongside the old Photon UI - menu icons and much more \n Compatibility: V89+", - "image": "assets/img/themes/Technetium.webp", - "tags": [ - "edo0", - "light", - "dark", - "rounded", - "squared", - "compact", - "v89" - ], - "repository": "https://github.com/edo0/Technetium", - "pushed_at": "2022-02-13T15:22:08Z", - "stargazers_count": 89, - "avatar": "https://avatars.githubusercontent.com/u/16632292?v=4" - }, - { - "title": "Chameleons-Beauty to Firefox CSS", - "link": "https://github.com/Godiesc/Chameleons-Beauty", - "description": "Adaptive Theme to Firefox Themes \n Compatibility: V89+", - "image": "assets/img/themes/Chameleons-Beauty.webp", - "tags": [ - "dark", - "Godiesc", - "colourful", - "dark", - "light", - "v89" - ], - "repository": "https://github.com/Godiesc/Chameleons-Beauty", - "pushed_at": "2025-10-09T23:05:40Z", - "stargazers_count": 116, - "avatar": "https://avatars.githubusercontent.com/u/22057609?v=4" - }, - { - "title": "pro-fox: enhanced firefox proton", - "link": "https://github.com/xmansyx/Pro-Fox", - "description": "a proton based theme to make it even better \n Compatibility: V89+", - "image": "assets/img/themes/pro-fox.webp", - "tags": [ - "xmansyx", - "centered", - "rounded", - "dark", - "light", - "bigger", - "v89" - ], - "repository": "https://github.com/xmansyx/Pro-Fox", - "pushed_at": "2021-06-16T17:19:03Z", - "stargazers_count": 27, - "avatar": "https://avatars.githubusercontent.com/u/23141127?v=4" - }, - { - "title": "MartinFox", - "link": "https://github.com/arp242/MartinFox", - "description": "Really simple userChrome.css to make the active tab stand out more; 61 lines. \n Compatibility: V89+", - "image": "assets/img/themes/martinfox.webp", - "tags": [ - "arp242", - "pure", - "compact", - "v91" - ], - "repository": "https://github.com/arp242/MartinFox", - "pushed_at": "2023-01-15T13:01:04Z", - "stargazers_count": 12, - "avatar": "https://avatars.githubusercontent.com/u/1032692?v=4" - }, - { - "title": "ProtoVibrant", - "link": "https://github.com/bpwned/protovibrant", - "description": "Add macOS vibrancy to the Proton titlebar. Supports dark and light mode. \n Compatibility: V89+", - "image": "assets/img/themes/protovibrant.webp", - "tags": [ - "vibrancy", - "macos", - "pure", - "transparency", - "bpwned", - "v89" - ], - "repository": "https://github.com/bpwned/protovibrant", - "pushed_at": "2021-11-21T18:25:54Z", - "stargazers_count": 23, - "avatar": "https://avatars.githubusercontent.com/u/446744?v=4" - }, - { - "title": "OnelineProton", - "link": "https://github.com/lr-tech/OnelineProton", - "description": "An oneline userChrome.css theme for Firefox, which aims to keep the Proton experience \n Compatibility: V89+", - "image": "assets/img/themes/onelineproton.webp", - "tags": [ - "one-line", - "proton", - "v89", - "minimal", - "dark", - "light", - "lr-tech", - "v89" - ], - "repository": "https://github.com/lr-tech/OnelineProton", - "pushed_at": "2024-06-27T04:03:42Z", - "stargazers_count": 135, - "avatar": "https://avatars.githubusercontent.com/u/75286649?v=4" - }, - { - "title": "Firefox Compact Mode", - "link": "https://github.com/dannycolin/fx-compact-mode", - "description": "A compact mode that follows Firefox 89 (known as Proton) design system while using the same vertical space as the compact mode in Firefox 88 (known as Photon). \n Compatibility: V91+", - "image": "assets/img/themes/fx-compact-mode.webp", - "tags": [ - "dannycolin", - "compact", - "proton", - "photon", - "v91", - "pure" - ], - "repository": "https://github.com/dannycolin/fx-compact-mode", - "pushed_at": "2021-12-11T08:15:44Z", - "stargazers_count": 127, - "avatar": "https://avatars.githubusercontent.com/u/7339076?v=4" - }, - { - "title": "GruvFox by Alfarex2019", - "link": "https://github.com/FirefoxCSSThemers/GruvFox", - "description": "GruvFox is a remix of dpcdpc11's theme, featuring the gruvbox color palette.\n Compatibility: V91+", - "image": "assets/img/themes/20930130265614-a7559ea7-70fd-44f9-a790-34c5c0e31493.webp", - "tags": [ - "alfarexguy2019", - "gruv", - "dark", - "pure", - "v91" - ], - "repository": "https://github.com/FirefoxCSSThemers/GruvFox", - "pushed_at": "2021-08-31T02:33:56Z", - "stargazers_count": 22, - "avatar": "https://avatars.githubusercontent.com/u/84518514?v=4" - }, - { - "title": "Proton Square", - "link": "https://github.com/leadweedy/Firefox-Proton-Square", - "description": "Recreates the feel of Quantum with its squared tabs and menus. No rounded corners to be seen.\n Compatibility: V91+", - "image": "assets/img/themes//24535ff_protonbutquantum.webp", - "tags": [ - "squared", - "v91", - "pure", - "quantum", - "leadweedy" - ], - "repository": "https://github.com/leadweedy/Firefox-Proton-Square", - "pushed_at": "2025-03-12T09:23:50Z", - "stargazers_count": 135, - "avatar": "https://avatars.githubusercontent.com/u/72583854?v=4" - }, - { - "title": "Natura for Firefox", - "link": "https://github.com/firefoxcssthemers/natura-for-firefox", - "description": "Nature theme for Firefox \n Compatibility: V91+", - "image": "assets/img/themes/natura.webp", - "tags": [ - "green", - "yellow", - "firefoxcssthemers", - "alfarexguy2019", - "v91", - "pure" - ], - "repository": "https://github.com/firefoxcssthemers/natura-for-firefox", - "pushed_at": "2021-09-01T06:34:05Z", - "stargazers_count": 4, - "avatar": "https://avatars.githubusercontent.com/u/84518514?v=4" - }, - { - "title": "MacOSVibrant", - "link": "https://github.com/Tnings/MacosVibrant", - "description": "A theme that uses MacOS Vibrancy and is styled after other Apple Apps \n Compatibility: V91+", - "image": "assets/img/themes/MacOSVibrant.webp", - "tags": [ - "Tnings", - "transparency", - "dark", - "rounded", - "v91" - ], - "repository": "https://github.com/Tnings/MacosVibrant", - "pushed_at": "2023-09-16T17:32:42Z", - "stargazers_count": 47, - "avatar": "https://avatars.githubusercontent.com/u/55812511?v=4" - }, - { - "title": "Cascade", - "link": "https://github.com/andreasgrafen/cascade", - "description": "A responsive \"One-Line\" theme based on SimpleFox for the new ProtonUI. \n Compatibility: V91+", - "image": "assets/img/themes/cascade.webp", - "tags": [ - "andreasgrafen", - "minial", - "oneline", - "responsive", - "one-line", - "proton", - "light", - "dark", - "v91" - ], - "repository": "https://github.com/andreasgrafen/cascade", - "pushed_at": "2025-10-02T01:05:43Z", - "stargazers_count": 1591, - "avatar": "https://avatars.githubusercontent.com/u/159644623?v=4" - }, - { - "title": "Firefox GNOME theme", - "link": "https://github.com/rafaelmardojai/firefox-gnome-theme", - "description": "A bunch of CSS code to make Firefox look closer to GNOME's native apps. \n Compatibility: V91+", - "image": "assets/img/themes/firefox-gnome-theme.webp", - "tags": [ - "rafaelmardojai", - "gnome", - "v91", - "rounded", - "light", - "dark", - "v91" - ], - "repository": "https://github.com/rafaelmardojai/firefox-gnome-theme", - "pushed_at": "2026-04-07T18:03:41Z", - "stargazers_count": 3855, - "avatar": "https://avatars.githubusercontent.com/u/6210397?v=4" - }, - { - "title": "PretoFox", - "link": "https://github.com/alfarexguy2019/pretofox", - "description": "A Black n White AMOLED theme for Firefox, inspired by the Preto color scheme. \n Compatibility: V91+", - "image": "assets/img/themes/PretoFox.webp", - "tags": [ - "alfarexguy2019", - "black", - "white", - "dark", - "light", - "v91" - ], - "repository": "https://github.com/alfarexguy2019/pretofox", - "pushed_at": "2025-12-05T10:28:59Z", - "stargazers_count": 12, - "avatar": "https://avatars.githubusercontent.com/u/78948152?v=4" - }, - { - "title": "Elementary OS Odin Firefox theme", - "link": "https://github.com/Zonnev/elementaryos-firefox-theme", - "description": "This theme supports all the window buttons layouts from Tweaks and it blends into the elementary OS Odin user interface. \n Compatibility: V91+", - "image": "assets/img/themes/firefox-eos6-theme.webp", - "tags": [ - "Zonnev", - "elementary-OS", - "OS", - "dark", - "light" - ], - "repository": "https://github.com/Zonnev/elementaryos-firefox-theme", - "pushed_at": "2026-03-04T18:57:14Z", - "stargazers_count": 443, - "avatar": "https://avatars.githubusercontent.com/u/32688765?v=4" - }, - { - "title": "Oneliner Deluxe", - "link": "https://github.com/Doosty/Oneliner-Deluxe", - "description": "Minimal, customizable and theme compatible \n Compatibility: V91+", - "image": "assets/img/themes/Oneliner_Deluxe.webp", - "tags": [ - "one-line", - "Doosty", - "v91" - ], - "repository": "https://github.com/Doosty/Oneliner-Deluxe", - "pushed_at": "2022-01-18T22:09:39Z", - "stargazers_count": 17, - "avatar": "https://avatars.githubusercontent.com/u/747588?v=4" - }, - { - "title": "Simple Oneliner", - "link": "https://github.com/hakan-demirli/Firefox_Custom_CSS", - "description": "A simple theme to maximize the vertical space of your monitor \n Compatibility: V91+", - "image": "assets/img/themes/Simple_Oneliner.webp", - "tags": [ - "Sidebery", - "dark", - "light", - "pdf", - "one-line", - "hakan-demirli", - "v91" - ], - "repository": "https://github.com/hakan-demirli/Firefox_Custom_CSS", - "pushed_at": "2024-02-12T15:16:03Z", - "stargazers_count": 87, - "avatar": "https://avatars.githubusercontent.com/u/78746991?v=4" - }, - { - "title": "GentleFox", - "link": "https://github.com/alfarexguy2019/gentlefox", - "description": "A Firefox theme, which features gentle curves, transparency and a minimal interface. \n Compatibility: V91+", - "image": "assets/img/themes/GentleFox.webp", - "tags": [ - "alfarexguy2019", - "blur", - "transparency", - "rounded", - "dark", - "light" - ], - "repository": "https://github.com/alfarexguy2019/gentlefox", - "pushed_at": "2025-12-05T10:26:40Z", - "stargazers_count": 61, - "avatar": "https://avatars.githubusercontent.com/u/78948152?v=4" - }, - { - "title": "Clean and Transparent", - "link": "https://github.com/Filip-Sutkowy/blurclean-firefox-theme", - "description": "Clean theme with as much transparency as Firefox lets you do \n Compatibility: V91+", - "image": "assets/img/themes/Clean_and_Transparent.webp", - "tags": [ - "Filip-Sutkowy", - "blur", - "pure", - "dark", - "light", - "transparency", - "v91" - ], - "repository": "https://github.com/Filip-Sutkowy/blurclean-firefox-theme", - "pushed_at": "2021-09-29T21:49:09Z", - "stargazers_count": 111, - "avatar": "https://avatars.githubusercontent.com/u/24491499?v=4" - }, - { - "title": "Waterfall", - "link": "https://github.com/crambaud/waterfall", - "description": "A minimalist one line theme", - "image": "assets/img/themes/waterfall.webp", - "tags": [ - "crambaud", - "minimal", - "one-line", - "mouse" - ], - "repository": "https://github.com/crambaud/waterfall", - "pushed_at": "2022-08-02T06:38:14Z", - "stargazers_count": 274, - "avatar": "https://avatars.githubusercontent.com/u/58910562?v=4" - }, - { - "title": "Brave-Fox: The Reimagined Browser, Reimagined", - "link": "https://github.com/Soft-Bred/Brave-Fox", - "description": "Brave-Fox is a Firefox Theme that brings Brave's design elements into Firefox.", - "image": "assets/img/themes//184007ilia7199au71.webp", - "tags": [ - "brave", - "pure", - "js", - "javascript", - "Soft-Bred" - ], - "repository": "https://github.com/Soft-Bred/Brave-Fox", - "pushed_at": "2022-11-22T08:47:02Z", - "stargazers_count": 145, - "avatar": "https://avatars.githubusercontent.com/u/60551230?v=4" - }, - { - "title": "KeyFox- A minimal, keyboard centered OneLiner CSS.", - "link": "https://github.com/alfarexguy2019/KeyFox", - "description": "KeyFox is A simple, minimal OneLiner Keyboard-centered CSS for Firefox.", - "image": "assets/img/themes//13268136501706-accca691-b9c3-4841-acd7-6bb843d2f422.webp", - "tags": [ - "black", - "dark", - "white", - "one-line", - "alfarexguy2019" - ], - "repository": "https://github.com/alfarexguy2019/KeyFox", - "pushed_at": "2025-12-05T10:13:27Z", - "stargazers_count": 126, - "avatar": "https://avatars.githubusercontent.com/u/78948152?v=4" - }, - { - "title": "CompactFox", - "link": "https://github.com/Tnings/CompactFox", - "description": "A simple theme that compacts a lot of the UI elements", - "image": "assets/img/themes/CompactFoxPreview.webp", - "tags": [ - "compact", - "dark", - "light", - "Tnings", - "pure" - ], - "repository": "https://github.com/Tnings/CompactFox", - "pushed_at": "2021-10-23T05:25:10Z", - "stargazers_count": 53, - "avatar": "https://avatars.githubusercontent.com/u/55812511?v=4" - }, - { - "title": "AuroraFox- Auroral Firefox", - "link": "https://github.com/alfarexguy2019/aurora-fox", - "description": "AuroraFox is a clean rounded Firefox theme, made using CSS, to match with the trendy 'Aurora' Colour Palette.", - "image": "assets/img/themes//18328141609919-befbc7f3-5199-4672-9ba1-8551d2a4e5a1.webp", - "tags": [ - "dark", - "minimal", - "purple", - "alfarexguy2019" - ], - "repository": "https://github.com/alfarexguy2019/aurora-fox", - "pushed_at": "2025-12-05T10:27:07Z", - "stargazers_count": 25, - "avatar": "https://avatars.githubusercontent.com/u/78948152?v=4" - }, - { - "title": "starry-fox", - "link": "https://github.com/sagars007/starry-fox", - "description": "Firefox CSS stylesheets for the Dark Space Theme. Matching more UI elements with the theme.", - "image": "assets/img/themes/starry-fox-resize.webp", - "tags": [ - "sagars007", - "dark", - "compact", - "darkspace", - "stars", - "nightsky", - "gradient", - "windows11" - ], - "repository": "https://github.com/sagars007/starry-fox", - "pushed_at": "2024-05-18T15:17:34Z", - "stargazers_count": 159, - "avatar": "https://avatars.githubusercontent.com/u/56472130?v=4" - }, - { - "title": "Firefox-GX", - "link": "https://github.com/Godiesc/firefox-gx", - "description": "Firefox Theme to Opera-GX skin Lovers.", - "image": "assets/img/themes/firefox-gx.webp", - "tags": [ - "Godiesc", - "dark", - "opera", - "gx", - "theme", - "adapted", - "light", - "fuchsia" - ], - "repository": "https://github.com/Godiesc/firefox-gx", - "pushed_at": "2026-04-10T00:53:43Z", - "stargazers_count": 1051, - "avatar": "https://avatars.githubusercontent.com/u/22057609?v=4" - }, - { - "title": "Elegant Fox", - "link": "https://github.com/ayushhroyy/elegantfox", - "description": "A firefox context menu theme and background wallpaper support with linux desktops being the main focus", - "image": "assets/img/themes/elegantfox.webp ", - "tags": [ - "ayushhroyy", - "nord", - "dark", - "light", - "adaptive" - ], - "repository": "https://github.com/ayushhroyy/elegantfox", - "pushed_at": "2025-01-31T15:10:20Z", - "stargazers_count": 35, - "avatar": "https://avatars.githubusercontent.com/u/77523847?v=4" - }, - { - "title": "TYH Fox", - "link": "https://github.com/tyuhao/TYHfox", - "description": "A firefox Theme CSS", - "image": "assets/img/themes/TYHFox.webp ", - "tags": [ - "TYHFox", - "dark", - "light", - "adaptive" - ], - "repository": "https://github.com/tyuhao/TYHfox", - "pushed_at": "2025-09-21T07:44:01Z", - "stargazers_count": 13, - "avatar": "https://avatars.githubusercontent.com/u/47909858?v=4" - }, - { - "title": "SimpleFox Feather Edition", - "link": "https://github.com/BlueFalconHD/SimpleFox-Feather/", - "description": "A fork of SimpleFox that uses feather icons!", - "image": "assets/img/themes/simplefox-feather.webp", - "tags": [ - "Simplefox", - "Fork", - "Icons", - "BlueFalconHD" - ], - "repository": "https://github.com/BlueFalconHD/SimpleFox-Feather/", - "pushed_at": "2022-10-31T04:33:20Z", - "stargazers_count": 78, - "avatar": "https://avatars.githubusercontent.com/u/72631767?v=4" - }, - { - "title": "gale for Firefox", - "link": "https://github.com/mgastonportillo/gale-for-ff", - "description": "My CSS files to use with Firefox and Sidebery", - "image": "assets/img/themes//8988rjy7uTd.webp", - "tags": [ - "gale", - "dark", - "minimalistic", - "adaptive", - "compact", - "autohide", - "sidebar" - ], - "repository": "https://github.com/mgastonportillo/gale-for-ff", - "pushed_at": "2024-09-22T14:15:06Z", - "stargazers_count": 122, - "avatar": "https://avatars.githubusercontent.com/u/106234166?v=4" - }, - { - "title": "Firefox-UWP-Style-Theme-Omars-Edit", - "link": "https://github.com/omarb737/Firefox-UWP-Style-Theme-Omars-Edit", - "description": "A minimalistic-retro theme based off the UWP interface", - "image": "assets/img/themes//321608U0N6E.webp", - "tags": [ - "omarb737", - "dark", - "retro", - "minimalist", - "UWP" - ], - "repository": "https://github.com/omarb737/Firefox-UWP-Style-Theme-Omars-Edit", - "pushed_at": "2022-07-31T05:44:56Z", - "stargazers_count": 4, - "avatar": "https://avatars.githubusercontent.com/u/41845164?v=4" - }, - { - "title": "Modoki Firefox", - "link": "https://github.com/soup-bowl/Modoki-Firefox", - "description": "Bringing the classic Modern Modoki Netscape theme back", - "image": "assets/img/themes/soupbowlmodoki.webp", - "tags": [ - "soup-bowl", - "classic", - "netscape", - "skeuomorphic", - "light", - "retro" - ], - "repository": "https://github.com/soup-bowl/Modoki-Firefox", - "pushed_at": "2026-01-24T20:06:16Z", - "stargazers_count": 94, - "avatar": "https://avatars.githubusercontent.com/u/11209477?v=4" - }, - { - "title": "TileFox", - "link": "https://github.com/davquar/tilefox", - "description": "A minimalistic Firefox userChrome.css that integrates well with tiling window managers like i3", - "image": "assets/img/themes/tilefox.webp", - "tags": [ - "davquar", - "light", - "dark", - "tile", - "tilefox", - "minimal", - "minimalistic", - "brutalist", - "compact", - "tiling", - "dwm", - "sway", - "i3", - "keyboard", - "linux" - ], - "repository": "https://github.com/davquar/tilefox", - "pushed_at": "2022-10-21T20:00:50Z", - "stargazers_count": 24, - "avatar": "https://avatars.githubusercontent.com/u/30431538?v=4" - }, - { - "title": "AestheticFox", - "link": "https://github.com/AidanMercer/AestheticFox", - "description": "A minamist and aesthetic userstyle theme for Firefox", - "image": "assets/img/themes/AestheticFox.webp", - "tags": [ - "clean", - "compact", - "aestheticfox", - "minimal", - "minimalistic", - "aesthetic" - ], - "repository": "https://github.com/AidanMercer/AestheticFox", - "pushed_at": "2023-05-22T18:16:55Z", - "stargazers_count": 30, - "avatar": "https://avatars.githubusercontent.com/u/96552673?v=4" - }, - { - "title": "Firefox Onebar", - "link": "https://git.gay/freeplay/Firefox-Onebar", - "description": "A single bar for Firefox's UI.", - "image": "assets/img/themes/onebar.webp", - "tags": [ - "Freeplay", - "oneline", - "onebar", - "compact", - "minimal" - ], - "repository": "https://git.gay/freeplay/Firefox-Onebar", - "pushed_at": "2026-03-25T20:23:19Z", - "stargazers_count": 8, - "avatar": "https://git.gay/avatars/25ef717d14080c74d7a215792ff28c5ba2590585985036074bf9c0723fd9c582?size=512" - }, - { - "title": "Dracula", - "link": "https://github.com/jannikbuscha/firefox-dracula", - "description": "A Firefox CSS Theme that aims to recreate the look and feel of the Chromium version of Microsoft Edge in the style of Dracula.", - "image": "assets/img/themes/dracula.webp", - "tags": [ - "edge", - "dark", - "microsoft", - "dracula" - ], - "repository": "https://github.com/jannikbuscha/firefox-dracula", - "pushed_at": "2024-07-10T07:08:42Z", - "stargazers_count": 20, - "avatar": "https://avatars.githubusercontent.com/u/74017697?v=4" - }, - { - "title": "rounded-fox", - "link": "https://github.com/Etesam913/rounded-fox", - "description": "A minimalist theme that uses animation to hide visual clutter.", - "image": "assets/img/themes/rounded_fox.webp", - "tags": [ - "clean", - "compact", - "minimalist", - "dark", - "light", - "animation" - ], - "repository": "https://github.com/Etesam913/rounded-fox", - "pushed_at": "2023-09-02T19:29:12Z", - "stargazers_count": 95, - "avatar": "https://avatars.githubusercontent.com/u/55665282?v=4" - }, - { - "title": "Three Rows Simple Compact Clean CSS", - "link": "https://github.com/hornster02/Firefox-Three-Rows-Simple-Compact-Clean-CSS", - "description": "A compact theme based on use multiple rows", - "image": "assets/img/themes/Three_Rows.webp", - "tags": [ - "simple", - "compact", - "minimalist", - "rows" - ], - "repository": "https://github.com/hornster02/Firefox-Three-Rows-Simple-Compact-Clean-CSS", - "pushed_at": "2026-02-01T16:39:27Z", - "stargazers_count": 24, - "avatar": "https://avatars.githubusercontent.com/u/127822397?v=4" - }, - { - "title": "Bali10050's theme", - "link": "https://github.com/Bali10050/FirefoxCSS", - "description": "A minimal looking oneliner, with modular code for easy editing", - "image": "assets/img/themes/Bali10050sPreview.webp", - "tags": [ - "Bali10050", - "oneline", - "light", - "dark", - "linux", - "windows", - "rounded", - "proton", - "responsive", - "minimalistic" - ], - "repository": "https://github.com/Bali10050/FirefoxCSS", - "pushed_at": "2026-01-22T13:30:49Z", - "stargazers_count": 380, - "avatar": "https://avatars.githubusercontent.com/u/110120798?v=4" - }, - { - "title": "ViceFox", - "link": "https://vicefox.vercel.app", - "description": "Don't ask why it's called 'ViceFox'", - "image": "assets/img/themes/ViceFox.webp", - "tags": [ - "clean", - "compact", - "safari", - "minimal", - "macos" - ], - "repository": "https://github.com/jtlw99/vicefox", - "pushed_at": "2026-03-15T08:16:51Z", - "stargazers_count": 47, - "avatar": "https://avatars.githubusercontent.com/u/93564256?v=4" - }, - { - "title": "DarkMatter", - "link": "https://github.com/BloodyHell619/Firefox-Theme-DarkMatter", - "description": "An intensively worked on, and highly customized dark theme made for Firefox Proton, stretching darkness into every corner of the browser and perfecting even the tiniest details ", - "image": "assets/img/themes/darkmatter.webp", - "tags": [ - "dark", - "Vertical", - "squared", - "proton" - ], - "repository": "https://github.com/BloodyHell619/Firefox-Theme-DarkMatter", - "pushed_at": "2024-10-13T06:44:57Z", - "stargazers_count": 75, - "avatar": "https://avatars.githubusercontent.com/u/65298540?v=4" - }, - { - "title": "zap's cool photon theme", - "link": "https://github.com/zapSNH/zapsCoolPhotonTheme", - "description": "Party like it's Firefox 57-88!", - "image": "assets/img/themes/zaps-photon.webp", - "tags": [ - "photon", - "compact", - "squared", - "quantum" - ], - "repository": "https://github.com/zapSNH/zapsCoolPhotonTheme", - "pushed_at": "2026-03-20T01:02:26Z", - "stargazers_count": 138, - "avatar": "https://avatars.githubusercontent.com/u/134786889?v=4" - }, - { - "title": "Firefox-ONE", - "link": "https://github.com/Godiesc/firefox-one", - "description": "Dress Firefox with the Opera One skin", - "image": "assets/img/themes/firefox-one.webp", - "tags": [ - "Godiesc", - "opera", - "one", - "opera-one", - "firefox", - "firefox-one", - "theme", - "adaptive", - "tree", - "tabs" - ], - "repository": "https://github.com/Godiesc/firefox-one", - "pushed_at": "2025-10-09T23:00:16Z", - "stargazers_count": 415, - "avatar": "https://avatars.githubusercontent.com/u/22057609?v=4" - }, - { - "title": "Essence", - "link": "https://github.com/JarnotMaciej/Essence", - "description": "Compact, beautiful and minimalistic theme for the Firefox web browser.", - "image": "assets/img/themes/essence.webp", - "tags": [ - "compact", - "minimal", - "light", - "modern", - "oneline", - "rounded", - "clean" - ], - "repository": "https://github.com/JarnotMaciej/Essence", - "pushed_at": "2024-07-08T10:58:01Z", - "stargazers_count": 42, - "avatar": "https://avatars.githubusercontent.com/u/92025751?v=4" - }, - { - "title": "minimal-one-line-firefox", - "link": "https://github.com/ttntm/minimal-one-line-firefox", - "description": "A minimal oneliner, to minimizing the space used for url and tab bar", - "image": "assets/img/themes/molff.webp", - "tags": [ - "oneline", - "light", - "dark", - "squared", - "compact", - "minimalistic" - ], - "repository": "https://github.com/ttntm/minimal-one-line-firefox", - "pushed_at": "2024-06-15T16:07:30Z", - "stargazers_count": 46, - "avatar": "https://avatars.githubusercontent.com/u/41571384?v=4" - }, - { - "title": "RealFire", - "link": "https://github.com/Hakanbaban53/RealFire", - "description": "A minimalist animated oneliner theme for Firefox perfectly matching Real Dark", - "image": "assets/img/themes/RealFire-main.webp", - "tags": [ - "oneline", - "responsive", - "light", - "dark", - "animation", - "rounded", - "compact", - "minimalistic", - "black" - ], - "repository": "https://github.com/Hakanbaban53/RealFire", - "pushed_at": "2025-03-06T06:27:34Z", - "stargazers_count": 31, - "avatar": "https://avatars.githubusercontent.com/u/93117749?v=4" - }, - { - "title": "Firefox-Alpha", - "link": "https://github.com/Tagggar/Firefox-Alpha", - "description": "Super clear desktop browser with zero buttons and gesture controls", - "image": "assets/img/themes/Firefox-Alpha.webp", - "tags": [ - "Tagggar", - "alpha", - "responsive", - "light", - "dark", - "animation", - "rounded", - "compact", - "clear", - "clean", - "minimalistic", - "minimal", - "simple", - "gestures" - ], - "repository": "https://github.com/Tagggar/Firefox-Alpha", - "pushed_at": "2024-05-26T06:03:23Z", - "stargazers_count": 268, - "avatar": "https://avatars.githubusercontent.com/u/81634877?v=4" - }, - { - "title": "Dark Star", - "link": "https://gitlab.com/ivelieu/dark-star-firefox-skin", - "description": "A color-customizable, zero navbar padding skin, modified from Starry Fox", - "image": "assets/img/themes//11608darkstar_3.webp", - "tags": [ - "Ivelieu", - "dark", - "minimal", - "zeropadding", - "customizable" - ], - "repository": "https://gitlab.com/ivelieu/dark-star-firefox-skin", - "pushed_at": "2023-11-19T00:38:22.034Z", - "stargazers_count": 3, - "avatar": "/uploads/-/system/user/avatar/18385334/avatar.png" - }, - { - "title": "ImpossibleFox", - "link": "https://github.com/Naezr/ImpossibleFox", - "description": "A simple and fast one-line theme for Firefox inspired by Safari's compact layout. ", - "image": "assets/img/themes/ImpossibleFox.webp", - "tags": [ - "Naezr", - "dark", - "light", - "oneline" - ], - "repository": "https://github.com/Naezr/ImpossibleFox", - "pushed_at": "2024-05-24T15:24:49Z", - "stargazers_count": 25, - "avatar": "https://avatars.githubusercontent.com/u/95460152?v=4" - }, - { - "title": "SideFox", - "link": "https://github.com/rainbowflesh/Me-Personal-Firefox-Settup", - "description": "MS Edge style, sidebar, blur, and more.", - "image": "assets/img/themes/sidefox.webp", - "tags": [ - "sidebar", - "animated", - "simple", - "responsive", - "linux", - "windows", - "macos" - ], - "repository": "https://github.com/rainbowflesh/Me-Personal-Firefox-Settup", - "pushed_at": "2025-04-04T15:38:29Z", - "stargazers_count": 23, - "avatar": "https://avatars.githubusercontent.com/u/20819692?v=4" - }, - { - "title": "Firefox Plus", - "link": "https://github.com/amnweb/firefox-plus", - "description": "Firefox Plus, CSS tweaks for Firefox ", - "image": "assets/img/themes//6299firefox-26-11-2023.webp", - "tags": [ - "firefox", - "firefox-customization", - "minimal", - "firefox-theme", - "dark" - ], - "repository": "https://github.com/amnweb/firefox-plus", - "pushed_at": "2025-12-29T13:06:49Z", - "stargazers_count": 296, - "avatar": "https://avatars.githubusercontent.com/u/16545063?v=4" - }, - { - "title": "Shina Fox", - "link": "https://github.com/Shina-SG/Shina-Fox", - "description": "A Minimal, Cozy, Vertical Optimized Firefox Theme", - "image": "assets/img/themes/Shina.webp", - "tags": [ - "Shina", - "Vertical", - "Sidebery", - "Minimal", - "Dark", - "Light", - "Adaptive" - ], - "repository": "https://github.com/Shina-SG/Shina-Fox", - "pushed_at": "2024-05-24T23:41:47Z", - "stargazers_count": 480, - "avatar": "https://avatars.githubusercontent.com/u/135497382?v=4" - }, - { - "title": "ArnimFox", - "link": "https://github.com/SecondMikasa/ArnimFox", - "description": "A Minimalist Dark Themed Firefox enabling vertical tabs support and modern URL Bar", - "image": "assets/img/themes/ArnimFox.webp", - "tags": [ - "Minimalistic", - "Vertical", - "Sidebery", - "Dark", - "Sidebar" - ], - "repository": "https://github.com/SecondMikasa/ArnimFox", - "pushed_at": "2024-01-28T10:20:05Z", - "stargazers_count": 6, - "avatar": "https://avatars.githubusercontent.com/u/129872339?v=4" - }, - { - "title": "ShyFox", - "link": "https://github.com/Naezr/ShyFox", - "description": "A very shy little theme that hides the entire browser interface in the window border", - "image": "assets/img/themes/shyfox.webp", - "tags": [ - "Naezr", - "minimal" - ], - "repository": "https://github.com/Naezr/ShyFox", - "pushed_at": "2025-01-21T07:39:15Z", - "stargazers_count": 2117, - "avatar": "https://avatars.githubusercontent.com/u/95460152?v=4" - }, - { - "title": "greenyfox", - "link": "https://github.com/alan-ar1/greenyfox", - "description": "A modern dark theme with macos title bar buttons and Iosevka font", - "image": "assets/img/themes//9037DGTAHYA.webp", - "tags": [ - "alan-ar1", - "Dark", - "title-bar", - "minimal", - "Iosevka" - ], - "repository": "https://github.com/alan-ar1/greenyfox", - "pushed_at": "2025-01-02T18:59:22Z", - "stargazers_count": 5, - "avatar": "https://avatars.githubusercontent.com/u/110337684?v=4" - }, - { - "title": "98/95fox", - "link": "https://github.com/osem598/Firefox-98", - "description": "Chicago 95 & Windows95/98-like theme for firefox", - "image": "assets/img/themes/ff95.webp", - "tags": [ - "osem598", - "Light", - "Retro", - "Chicago", - "98", - "95" - ], - "repository": "https://github.com/osem598/Firefox-98", - "pushed_at": "2026-04-04T18:10:09Z", - "stargazers_count": 43, - "avatar": "https://avatars.githubusercontent.com/u/67332812?v=4" - }, - { - "title": "ArcWTF", - "link": "https://github.com/KiKaraage/ArcWTF/", - "description": "UserChrome.css theme to bring Arc Browser look from Windows to Firefox! ", - "image": "assets/img/themes/arcwtf.webp", - "tags": [ - "KiKaraage", - "dark", - "light", - "Arc Browser", - "Sidebery", - "vertical tabs", - "autohide", - "minimal" - ], - "repository": "https://github.com/KiKaraage/ArcWTF/", - "pushed_at": "2025-11-14T07:18:17Z", - "stargazers_count": 1730, - "avatar": "https://avatars.githubusercontent.com/u/10529881?v=4" - }, - { - "title": "FrameUI for Firefox", - "link": "https://github.com/FineFuturity/FrameUIForFirefox/", - "description": "A new way to view your web content. Like looking at photos printed from an old Polaroid camera.", - "image": "assets/img/themes/FrameUIScreenshot.webp", - "tags": [ - "FineFuturity", - "one line", - "vertical tabs", - "Sidebery", - "Tab Center Reborn", - "toolbars on bottom", - "immersive", - "minimal" - ], - "repository": "https://github.com/FineFuturity/FrameUIForFirefox/", - "pushed_at": "2024-12-03T23:57:05Z", - "stargazers_count": 67, - "avatar": "https://avatars.githubusercontent.com/u/19298107?v=4" - }, - { - "title": "arcfox", - "link": "https://github.com/betterbrowser/arcfox", - "description": "make firefox flow like arc", - "image": "assets/img/themes/arcfox.webp", - "tags": [ - "nikollesan", - "dark", - "light", - "luanderfarias", - "bettterbrowser" - ], - "repository": "https://github.com/betterbrowser/arcfox", - "pushed_at": "2025-06-01T21:38:03Z", - "stargazers_count": 1245, - "avatar": "https://avatars.githubusercontent.com/u/126220586?v=4" - }, - { - "title": "WhiteSur", - "link": "https://github.com/vinceliuice/WhiteSur-firefox-theme", - "description": "A MacOSX Safari theme for Firefox 80+", - "image": "assets/img/themes/whitesur_vinceliuice.webp", - "tags": [ - "vinceliuice", - "dark", - "light", - "MacOSX ", - "Monterey", - "safari", - "mac", - "oneline" - ], - "repository": "https://github.com/vinceliuice/WhiteSur-firefox-theme", - "pushed_at": "2026-01-05T05:56:11Z", - "stargazers_count": 538, - "avatar": "https://avatars.githubusercontent.com/u/7604295?v=4" - }, - { - "title": "Another Oneline", - "link": "https://github.com/mimipile/firefoxCSS", - "description": "Another simple, oneline, minimal, keyboard-centered Firefox CSS theme.", - "image": "assets/img/themes/screenshot-site.webp", - "tags": [ - "mimipile", - "dark", - "light", - "adaptative", - "onebar", - "oneline", - "minimal", - "keyboard", - "keyboard centered" - ], - "repository": "https://github.com/mimipile/firefoxCSS", - "pushed_at": "2024-08-26T09:06:51Z", - "stargazers_count": 135, - "avatar": "https://avatars.githubusercontent.com/u/74282993?v=4" - }, - { - "title": "MacFox-Theme", - "link": "https://github.com/d0sse/macFox-theme", - "description": "Safari-like minimalistic theme with system accent color", - "image": "assets/img/themes/d0sse_mac_fox_screen.webp", - "tags": [ - "dark", - "light", - "accent", - "minimal", - "macos", - "safari", - "mac", - "autocolor" - ], - "repository": "https://github.com/d0sse/macFox-theme", - "pushed_at": "2026-04-01T15:13:26Z", - "stargazers_count": 38, - "avatar": "https://avatars.githubusercontent.com/u/16508608?v=4" - }, - { - "title": "EdgyArc Fr", - "link": "https://github.com/artsyfriedchicken/EdgyArc-fr/", - "description": "Combining the sleekness of Microsoft Edge and the aesthetics of the Arc browser", - "image": "assets/img/themes/edgyarc-fr.webp", - "tags": [ - "artsyFriedChicken", - "dark", - "light", - "macOS", - "mac", - "arc", - "edge", - "translucent", - "blur", - "sidebery", - "Vertical Tabs" - ], - "repository": "https://github.com/artsyfriedchicken/EdgyArc-fr/", - "pushed_at": "2024-06-29T17:41:05Z", - "stargazers_count": 703, - "avatar": "https://avatars.githubusercontent.com/u/100123017?v=4" - }, - { - "title": "FF Ultima", - "link": "https://github.com/soulhotel/FF-ULTIMA", - "description": "The Firefox theme with too many options", - "image": "assets/img/themes/remote-102-ff-ultima.gif", - "tags": [ - "modern", - "adaptive", - "customizable", - "multiple layouts" - ], - "repository": "https://github.com/soulhotel/FF-ULTIMA", - "pushed_at": "2026-02-16T22:41:35Z", - "stargazers_count": 1160, - "avatar": "https://avatars.githubusercontent.com/u/155501797?v=4" - }, - { - "title": "Firefox Xtra Compact", - "link": "https://github.com/CarterSnich/firefox-xtra-compact", - "description": "Aims to make Firefox more compact and give a tiny bit more web view area for low-screen devices.", - "image": "assets/img/themes/xtracompact.webp", - "tags": [ - "CarterSnich", - "compact", - "themeless" - ], - "repository": "https://github.com/CarterSnich/firefox-xtra-compact", - "pushed_at": "2025-09-21T00:00:31Z", - "stargazers_count": 25, - "avatar": "https://avatars.githubusercontent.com/u/52433531?v=4" - }, - { - "title": "Aero Firefox", - "link": "https://github.com/SandTechStuff/AeroFirefox", - "description": "Brings the Windows 7 titlebar buttons to modern versions of Firefox", - "image": "assets/img/themes/aeroFirefox.webp", - "tags": [ - "aero", - "dark", - "light", - "lightweight", - "windows7", - "minimal" - ], - "repository": "https://github.com/SandTechStuff/AeroFirefox", - "pushed_at": "2025-10-03T04:53:38Z", - "stargazers_count": 31, - "avatar": "https://avatars.githubusercontent.com/u/164842290?v=4" - }, - { - "title": "PotatoFox", - "link": "https://codeberg.org/awwpotato/PotatoFox", - "description": "A compact and minimal firefox theme using Sidebery", - "image": "assets/img/themes/PotatoFox.webp", - "tags": [ - "minimal", - "compact", - "vertical tabs", - "Sidebery", - "arc" - ], - "repository": "https://codeberg.org/awwpotato/PotatoFox", - "pushed_at": "2025-12-09T18:34:10+01:00", - "stargazers_count": 41, - "avatar": "https://codeberg.org/avatars/bd252d906010a016f1fd29e68e873ea983c8491eb70820d838ef2fa255d8a703" - }, - { - "title": "Minimal-Arc", - "link": "https://github.com/zayihu/Minimal-Arc", - "description": "Minimal light Firefox theme with Arc like design with vertical tabs", - "image": "assets/img/themes/minimal_arc.webp", - "tags": [ - "minimal", - "compact", - "vertical-tabs", - "Sidebery", - "light", - "Arc Browser" - ], - "repository": "https://github.com/zayihu/Minimal-Arc", - "pushed_at": "2024-09-07T06:13:59Z", - "stargazers_count": 63, - "avatar": "https://avatars.githubusercontent.com/u/167391787?v=4" - }, - { - "title": "SnowFox", - "link": "https://github.com/naveensagar765/SnowFox", - "description": "Modern blue glass theme with side bookmark bar", - "image": "assets/img/themes/snowfox.webp", - "tags": [ - "moder", - "blue", - "side-bookmark-bar", - "home page" - ], - "repository": "https://github.com/naveensagar765/SnowFox", - "pushed_at": "2025-02-09T13:37:31Z", - "stargazers_count": 12, - "avatar": "https://avatars.githubusercontent.com/u/155926112?v=4" - }, - { - "title": "AnimatedFox", - "link": "https://github.com/RemyIsCool/AnimatedFox", - "description": "A minimal Firefox/LibreWolf theme with satisfying animations and a hidden URL bar.", - "image": "assets/img/themes/animatedfox.webp", - "tags": [ - "RemyIsCool", - "dark", - "minimal", - "hidden url bar", - "animations" - ], - "repository": "https://github.com/RemyIsCool/AnimatedFox", - "pushed_at": "2024-07-16T13:55:19Z", - "stargazers_count": 195, - "avatar": "https://avatars.githubusercontent.com/u/97812130?v=4" - }, - { - "title": "Quietfox Reborn", - "link": "https://github.com/TheGITofTeo997/quietfoxReborn", - "description": "Resurrecting a very Clean Firefox userChrome Mod ", - "image": "assets/img/themes/20053home.webp", - "tags": [ - "Teo", - "sleek", - "minimal", - "quiet" - ], - "repository": "https://github.com/TheGITofTeo997/quietfoxReborn", - "pushed_at": "2026-04-04T14:38:07Z", - "stargazers_count": 90, - "avatar": "https://avatars.githubusercontent.com/u/26879664?v=4" - }, - { - "title": "GlassyFox", - "link": "https://github.com/AnhNguyenlost13/GlassyFox", - "description": "Keeps the original new tab page layout while making it look as glassy as possible.", - "image": "assets/img/themes/glassyfox.webp", - "tags": [ - "blur", - "AnhNguyenlost13" - ], - "repository": "https://github.com/AnhNguyenlost13/GlassyFox", - "pushed_at": "2024-10-04T03:38:39Z", - "stargazers_count": 12, - "avatar": "https://avatars.githubusercontent.com/u/94160753?v=4" - }, - { - "title": "98/95fox Xtra Compact", - "link": "https://github.com/vintnarni/Firefox-98-Xtra-Compact", - "description": "The mix of nostalgia and compact.", - "image": "assets/img/themes/ff95xtracompact.webp", - "tags": [ - "Programneer", - "Light", - "Retro", - "Chicago", - "98", - "95", - "compact", - "xtra" - ], - "repository": "https://github.com/vintnarni/Firefox-98-Xtra-Compact", - "pushed_at": "2024-11-02T17:56:51Z", - "stargazers_count": 13, - "avatar": "https://avatars.githubusercontent.com/u/132811907?v=4" - }, - { - "title": "FireFox OneLine Navbar", - "link": "https://github.com/FawazBinSaleem/FireFoxOneLinerCSS", - "description": "A compact oneliner navbar css theme.", - "image": "assets/img/themes/fireFoxOneLinerCSS.webp", - "tags": [ - "oneline", - "black color", - "amoled", - "oneliner", - "navbar", - "One Line", - "compact" - ], - "repository": "https://github.com/FawazBinSaleem/FireFoxOneLinerCSS", - "pushed_at": "2024-12-20T21:01:20Z", - "stargazers_count": 33, - "avatar": "https://avatars.githubusercontent.com/u/48177454?v=4" - }, - { - "title": "Monochrome Neubrutalism Firefox Simple", - "link": "https://github.com/Kaskapa/Monochrome-Neubrutalism-Firefox-Theme", - "description": "A simple light theme I made to explore the world of Firefox theming.", - "image": "assets/img/themes/monochromeNeubrutalism.webp", - "tags": [ - "light", - "neubrutalislm", - "monochrome", - "simple", - "Kaskapa" - ], - "repository": "https://github.com/Kaskapa/Monochrome-Neubrutalism-Firefox-Theme", - "pushed_at": "2024-06-02T13:53:52Z", - "stargazers_count": 24, - "avatar": "https://avatars.githubusercontent.com/u/100031511?v=4" - }, - { - "title": "minimalistest oneliner", - "link": "https://github.com/yari-dog/minimalistest-oneliner-librewolf", - "description": "buttons are for nerds.", - "image": "assets/img/themes/minimalist-oneliner.webp", - "tags": [ - "simple", - "oneliner", - "oneline", - "compact" - ], - "repository": "https://github.com/yari-dog/minimalistest-oneliner-librewolf", - "pushed_at": "2024-08-28T10:11:56Z", - "stargazers_count": 8, - "avatar": "https://avatars.githubusercontent.com/u/75224849?v=4" - }, - { - "title": "Arc UI", - "link": "https://github.com/dxdotdev/arc-ui", - "description": "Make your Firefox like the Arc Browser.", - "image": "assets/img/themes/29957ui.webp", - "tags": [ - "dxdotdev", - "arc browser", - "compact", - "modern" - ], - "repository": "https://github.com/dxdotdev/arc-ui", - "pushed_at": "2025-01-05T13:34:56Z", - "stargazers_count": 74, - "avatar": "https://avatars.githubusercontent.com/u/157044645?v=4" - }, - { - "title": "Minimalist-DarkGreen", - "link": "https://github.com/andev0x/Minimalist-DarkGreen", - "description": "A theme for firefox with dark green colors.", - "image": "assets/img/themes/Minimalist-DarkGreen.gif", - "tags": [ - "andev0x", - "dark", - "green", - "minimalist" - ], - "repository": "https://github.com/andev0x/Minimalist-DarkGreen", - "pushed_at": "2025-08-13T05:32:28Z", - "stargazers_count": 3, - "avatar": "https://avatars.githubusercontent.com/u/152575252?v=4" - }, - { - "title": "Material Fox Updated", - "link": "https://github.com/edelvarden/material-fox-updated", - "description": "🦊 Firefox user CSS theme looks similar to Chrome.", - "image": "assets/img/themes/material-fox-updated-preview.webp", - "tags": [ - "dark", - "light", - "rtl", - "customizable", - "material", - "material-design", - "refresh", - "modern", - "updated" - ], - "repository": "https://github.com/edelvarden/material-fox-updated", - "pushed_at": "2025-08-29T18:54:12Z", - "stargazers_count": 652, - "avatar": "https://avatars.githubusercontent.com/u/42596339?v=4" - }, - { - "title": "MiniSthetic_Firefox", - "link": "https://github.com/ashish-kus/MiniSthetic_Firefox", - "description": "Minimal Aesthetic Firefox CSS", - "image": "assets/img/themes/remote-118-ministhetic-firefox.gif", - "tags": [ - "Minimal Aesthetic Firefox CSS", - "theme type: dark", - "Minimal", - "Aesthetic" - ], - "repository": "https://github.com/ashish-kus/MiniSthetic_Firefox", - "pushed_at": "2025-01-12T05:02:51Z", - "stargazers_count": 18, - "avatar": "https://avatars.githubusercontent.com/u/78788195?v=4" - }, - { - "title": "VP-NightSky", - "link": "https://github.com/VertexProximity/VP_NightSky", - "description": "Firefox reimagined", - "image": "assets/img/themes/NightSky.webp", - "tags": [ - "VertexProximity", - "theme type: dark", - "theme type: Purple" - ], - "repository": "https://github.com/VertexProximity/VP_NightSky", - "pushed_at": "2025-10-22T05:03:17Z", - "stargazers_count": 2, - "avatar": "https://avatars.githubusercontent.com/u/121351756?v=4" - }, - { - "title": "cyanmatrx", - "link": "https://github.com/Barnacl437/cyanmatrx", - "description": "a simple, cool-esque, cyan monospace theme.", - "image": "assets/img/themes/cyanmatrx.webp", - "tags": [ - "cyanmatrx", - "theme type: dark", - "theme type: cyan", - "minimal" - ], - "repository": "https://github.com/Barnacl437/cyanmatrx", - "pushed_at": "2025-06-13T15:42:36Z", - "stargazers_count": 1, - "avatar": "https://avatars.githubusercontent.com/u/87983017?v=4" - }, - { - "title": "DownToneUI", - "link": "https://github.com/oviung/DownToneUI-Firefox", - "description": "A modular UI customization for Firefox, using Sidebery for vertical tabs.", - "image": "assets/img/themes/remote-121-downtoneui.gif", - "tags": [ - "theme type: dark", - "vertical", - "sidebery" - ], - "repository": "https://github.com/oviung/DownToneUI-Firefox", - "pushed_at": "2026-03-09T16:39:58Z", - "stargazers_count": 63, - "avatar": "https://avatars.githubusercontent.com/u/8101674?v=4" - }, - { - "title": "Firefox Moonlight Theme", - "link": "https://github.com/sinazadeh/Firefox-Moonlight-Theme", - "description": "A sleek and modern dark blue Firefox theme with smooth, rounded elements for a refined browsing experience.", - "image": "assets/img/themes/remote-122-firefox-moonlight-theme.webp", - "tags": [ - "Sina", - "dark", - "blue", - "round", - "cerulean" - ], - "repository": "https://github.com/sinazadeh/Firefox-Moonlight-Theme", - "pushed_at": "2025-02-13T22:08:42Z", - "stargazers_count": 4, - "avatar": "https://avatars.githubusercontent.com/u/63080674?v=4" - }, - { - "title": "Elegant Floorp", - "link": "https://github.com/Mingo-coder/Elegant-Floorp/releases/download/v1.0/Elegant_Floorp.zip", - "description": "Default Floorp Fluential UI modded", - "image": "assets/img/themes/elegant_floorp.webp", - "tags": [ - "Mingo-coder", - "theme type: dark", - "theme type: light", - "Floorp" - ], - "repository": "https://github.com/Mingo-coder/Elegant-Floorp", - "pushed_at": "2025-04-06T03:53:06Z", - "stargazers_count": 0, - "avatar": "https://avatars.githubusercontent.com/u/177513443?v=4" - }, - { - "title": "Sakuras Simple Sidebar", - "link": "https://github.com/SakuraMeadows/Sakuras-Simple-Sidebar", - "description": "A simple Firefox theme using Sidebery sidebar.", - "image": "assets/img/themes/remote-124-sakuras-simple-sidebar.gif", - "tags": [ - "SakuraMeadows", - "theme type: dark", - "theme type: light", - "vertical", - "sidebery", - "catppuccin", - "simple", - "sidebar" - ], - "repository": "https://github.com/SakuraMeadows/Sakuras-Simple-Sidebar", - "pushed_at": "2025-12-28T03:03:45Z", - "stargazers_count": 22, - "avatar": "https://avatars.githubusercontent.com/u/93335748?v=4" - }, - { - "title": "LittleFox", - "link": "https://github.com/biglavis/LittleFox", - "description": "A minimalistic, mouse centered CSS theme for FireFox.", - "image": "assets/img/themes/remote-125-littlefox.webp", - "tags": [ - "simple", - "compact", - "minimal", - "oneline" - ], - "repository": "https://github.com/biglavis/LittleFox", - "pushed_at": "2026-04-04T02:42:51Z", - "stargazers_count": 31, - "avatar": "https://avatars.githubusercontent.com/u/105270868?v=4" - }, - { - "title": "FlexFox", - "link": "https://github.com/yuuqilin/FlexFox", - "description": "A lightweight Firefox theme focused on usability, flexibility, and smooth performance.", - "image": "assets/img/themes/remote-126-flexfox.webp", - "tags": [ - "lightweight", - "minimal", - "Sidebery", - "Mica", - "flexible" - ], - "repository": "https://github.com/yuuqilin/FlexFox", - "pushed_at": "2026-03-22T09:21:39Z", - "stargazers_count": 240, - "avatar": "https://avatars.githubusercontent.com/u/154042945?v=4" - }, - { - "title": "git userChrome", - "link": "https://github.com/soulhotel/git-userChrome", - "description": "An automation tool for installing userChrome Themes", - "image": "assets/img/themes/remote-127-git-userchrome.gif", - "tags": [ - "git", - "tool", - "firefox", - "userChrome", - "automation" - ], - "repository": "https://github.com/soulhotel/git-userChrome", - "pushed_at": "2025-08-27T21:28:32Z", - "stargazers_count": 51, - "avatar": "https://avatars.githubusercontent.com/u/155501797?v=4" - }, - { - "title": "Gruvbox GNOMEish", - "link": "https://github.com/xslhub/gruvbox-gnomeish-firefox-theme", - "description": "A minimal Firefox theme inspired by the aesthetics of Gruvbox and GNOME. ", - "image": "assets/img/themes/remote-128-gruvbox-gnomeish.webp", - "tags": [ - "xslhub", - "theme type: dark", - "gruvbox", - "GNOME" - ], - "repository": "https://github.com/xslhub/gruvbox-gnomeish-firefox-theme", - "pushed_at": "2025-10-14T20:58:43Z", - "stargazers_count": 6, - "avatar": "https://avatars.githubusercontent.com/u/158527507?v=4" - }, - { - "title": "Parfait", - "link": "https://github.com/reizumii/parfait", - "description": "A tasty theme modification for Firefox 🦊", - "image": "assets/img/themes/parfait.webp", - "tags": [ - "reizumii", - "sidebar", - "vertical tabs", - "minimal", - "lightweight", - "compact" - ], - "repository": "https://github.com/reizumii/parfait", - "pushed_at": "2026-04-08T10:34:11Z", - "stargazers_count": 106, - "avatar": "https://avatars.githubusercontent.com/u/204603744?v=4" - }, - { - "title": "NewFox", - "link": "https://github.com/Mr-the-beginner/NewFox", - "description": "A minimal medieval animated theme for Firefox", - "image": "assets/img/themes/remote-130-newfox.webp", - "tags": [ - "Mr-the-beginner", - "theme type: Auto", - "minimal", - "medieval", - "animated", - "lightweight" - ], - "repository": "https://github.com/Mr-the-beginner/NewFox", - "pushed_at": "2026-04-08T19:55:52Z", - "stargazers_count": 83, - "avatar": "https://avatars.githubusercontent.com/u/134204793?v=4" - }, - { - "title": "TransparentFox", - "link": "https://github.com/ScanuNicco/TransperentFox", - "description": "Simple transparent title bar theme for Firefox and Thunderbird", - "image": "assets/img/themes/remote-131-transparentfox.webp", - "tags": [ - "ScanuRag", - "theme type: dark", - "transparent", - "firefox", - "thunderbird" - ], - "repository": "https://github.com/ScanuNicco/TransperentFox", - "avatar": "https://avatars.githubusercontent.com/u/30136040?v=4", - "pushed_at": "2026-01-22T04:35:52Z", - "stargazers_count": 4 - }, - { - "title": "wmfox", - "link": "https://github.com/cankurttekin/wmfox", - "description": "Minimalist keyboard oriented theme with tab numbering for easier navigation.", - "image": "assets/img/themes/remote-132-wmfox.webp", - "tags": [ - "cankurttekin/wmfox", - "theme type: dark", - "theme type: light", - "sway", - "i3", - "tab numbers", - "wm", - "keyboard" - ], - "repository": "https://github.com/cankurttekin/wmfox", - "pushed_at": "2026-03-11T16:19:30Z", - "stargazers_count": 2, - "avatar": "https://avatars.githubusercontent.com/u/29798399?v=4" - }, - { - "title": "Fennec", - "link": "https://github.com/tompassarelli/fennec", - "description": "Minimal, customizable Firefox/LibreWolf setup with Zen-style sidebar workflow — no fork, no build.", - "image": "assets/img/themes/remote-133-fennec.webp", - "tags": [ - "tompassarelli", - "dark", - "light", - "minimal", - "sidebar", - "Sidebery", - "vertical tabs", - "keyboard", - "LibreWolf", - "lightweight" - ], - "repository": "https://github.com/tompassarelli/fennec", - "pushed_at": "2026-04-10T17:22:48Z", - "stargazers_count": 53, - "avatar": "https://avatars.githubusercontent.com/u/6378995?v=4" - }, - { - "title": "Dynamic Color", - "link": "https://github.com/zachvlat/Dynamic-Color-Firefox-Theme", - "description": "Dark, dynamic (based on the system's accent color), theme for Firefox ", - "image": "assets/img/themes/remote-134-dynamic-color.webp", - "tags": [ - "zachvlat", - "dark", - "lightweight", - "dynamic", - "accent" - ], - "repository": "https://github.com/zachvlat/Dynamic-Color-Firefox-Theme", - "pushed_at": "2026-04-10T13:47:54Z", - "stargazers_count": 7, - "avatar": "https://avatars.githubusercontent.com/u/28532979?v=4" - } -] diff --git a/gulpconfig.js b/gulpconfig.js deleted file mode 100644 index c6a9caf5..00000000 --- a/gulpconfig.js +++ /dev/null @@ -1,79 +0,0 @@ -const pathSource = './dev' -const pathBuild = './docs' -const pathAssets = `${pathBuild}/assets` - -const pathImages = './images' -const favicon = './images/icon.png' - - - -module.exports = { - - watchSource: pathSource, - - config: { - text: { - src: `${pathSource}/config/*.txt`, - dest: `${pathBuild}/` - }, - hidden: { - src: `${pathSource}/config/*`, - dest: `${pathBuild}/` - } - }, - - themes: { - src: `./themes.json`, - dest: `${pathBuild}/` - }, - - pug: { - src: `${pathSource}/pug/*.pug`, - dest: `${pathBuild}/`, - opts: { - pug: { - pretty: true - } - } - }, - - sass: { - src: `${pathSource}/scss/**/*.{scss,sass}`, - dest: `${pathAssets}/css`, - ext: '.min.css', - opts: { - sass: { - outputStyle: 'compressed' - }, - autoprefixer: { - cascade: false - } - } - }, - - js: { - src: `${pathSource}/js/**/*.js`, - dest: `${pathAssets}/js/`, - ext: '.min.js', - opts: { - babel: { - presets: ['@babel/preset-env'] - } - } - }, - - images: { - source: pathImages, - favicon: favicon, - faviconDest: `${pathBuild}/`, - toConvert: [`./images/**/*.{jpg,JPG,jpeg,JPEG,png,PNG}`, `!${favicon}`], - copyExtensions: ['.gif', '.svg', '.webp'], - dest: `${pathAssets}/img/`, - }, - - fonts: { - src: `${pathSource}/fonts/**/*.*`, - dest: `${pathAssets}/fonts/`, - } - -} diff --git a/gulpfile.js b/gulpfile.js deleted file mode 100644 index 4b4d01c8..00000000 --- a/gulpfile.js +++ /dev/null @@ -1,241 +0,0 @@ -const fs = require('fs') -const path = require('path') -const sharp = require('sharp') -const { Transform } = require('stream') -const { finished } = require('stream/promises') -const {task, src, dest, parallel, series, watch} = require('gulp') - - -// general -const config = require('./gulpconfig.js') - -// html -const pug = require('gulp-pug') - -// css -const sass = require('gulp-sass')(require('sass')) - -// js -const babel = require('gulp-babel') -const terser = require('gulp-terser') - -let autoprefixerPromise - -function loadAutoprefixer () { - if (!autoprefixerPromise) { - autoprefixerPromise = import('gulp-autoprefixer').then(module => module.default) - } - - return autoprefixerPromise -} - -function renameFiles (transformPath) { - return new Transform({ - objectMode: true, - transform (file, enc, callback) { - file.path = transformPath(file.path) - callback(null, file) - } - }) -} - -function filterFiles (predicate) { - return new Transform({ - objectMode: true, - transform (file, enc, callback) { - if (predicate(file)) { - callback(null, file) - return - } - - callback() - } - }) -} - -function setExtension (filePath, extension) { - const parsed = path.parse(filePath) - return path.join(parsed.dir, `${parsed.name}${extension}`) -} - -function toHiddenConfig (filePath) { - const parsed = path.parse(filePath) - return path.join(parsed.dir, `.${parsed.name}`) -} - -function convertToWebp () { - return new Transform({ - objectMode: true, - transform (file, enc, callback) { - if (file.isNull()) { - callback(null, file) - return - } - - if (file.isStream()) { - callback(new Error('Streaming image conversion is not supported')) - return - } - - sharp(file.path) - .webp() - .toBuffer() - .then(buffer => { - file.contents = buffer - file.path = setExtension(file.path, '.webp') - callback(null, file) - }) - .catch(error => { - callback(new Error(`${file.path}: ${error.message}`)) - }) - } - }) -} - -async function walkFiles (directory) { - const entries = await fs.promises.readdir(directory, { withFileTypes: true }) - const files = await Promise.all(entries.map(async entry => { - const entryPath = path.join(directory, entry.name) - - if (entry.isDirectory()) { - return walkFiles(entryPath) - } - - return entryPath - })) - - return files.flat() -} - -async function copyFiles (files, sourceRoot, destinationRoot) { - await Promise.all(files.map(async file => { - const relativePath = path.relative(sourceRoot, file) - const destinationPath = path.join(destinationRoot, relativePath) - - await fs.promises.mkdir(path.dirname(destinationPath), { recursive: true }) - await fs.promises.copyFile(file, destinationPath) - })) -} - - - - - -task('configText', () => { - return src(config.config.text.src) - .pipe(dest(config.config.text.dest)) -}) - -task('configHidden', () => { - return src(config.config.hidden.src, { allowEmpty: true }) - .pipe(filterFiles(file => path.extname(file.path) !== '.txt')) - .pipe(renameFiles(toHiddenConfig)) - .pipe(dest(config.config.hidden.dest)) -}) - -task('config', parallel('configText', 'configHidden')) - - -task('themes', () => { - return src(config.themes.src) - .pipe(dest(config.themes.dest)) -}) - - - -task('pug', () => { - return src(config.pug.src) - .pipe(pug(config.pug.opts.pug)) - .pipe(dest(config.pug.dest)) -}) - - - -task('sass', async () => { - const autoprefixer = await loadAutoprefixer() - - const stream = src(config.sass.src) - .pipe(sass(config.sass.opts.sass).on('error', sass.logError)) - .pipe(autoprefixer(config.sass.opts.autoprefixer)) - .pipe(renameFiles(filePath => setExtension(filePath, config.sass.ext))) - .pipe(dest(config.sass.dest)) - - await finished(stream) -}) - - - -task('js', () => { - return src(config.js.src) - .pipe(babel(config.js.opts.babel)) - .pipe(dest(config.js.dest)) - .pipe(terser()) - .pipe(renameFiles(filePath => setExtension(filePath, config.js.ext))) - .pipe(dest(config.js.dest)) -}) - - - -task('convertImages', () => { - return src(config.images.toConvert) - .pipe(convertToWebp()) - .pipe(dest(config.images.dest)) -}) - -task('copyImages', () => { - return walkFiles(config.images.source) - .then(files => files.filter(file => { - const extension = path.extname(file).toLowerCase() - return config.images.copyExtensions.includes(extension) - })) - .then(files => copyFiles(files, config.images.source, config.images.dest)) -}) - -task('copyFavicon', () => { - const destinationPath = path.join(config.images.faviconDest, path.basename(config.images.favicon)) - - return fs.promises.mkdir(path.dirname(destinationPath), { recursive: true }) - .then(() => fs.promises.copyFile(config.images.favicon, destinationPath)) -}) - -task('images', parallel('convertImages', 'copyImages', 'copyFavicon')) - - - -task('fonts', () => { - const fontsPath = path.join(config.watchSource, 'fonts') - - if (!fs.existsSync(fontsPath)) { - return Promise.resolve() - } - - return src(config.fonts.src) - .pipe(dest(config.fonts.dest)) -}) - - - - - -task('default', parallel( - 'config', - 'pug', - 'sass', - 'js', - 'images', - 'fonts', - 'themes' -)) - - - -task('watchPug', () => { watch(`${config.watchSource}/pug/**/*`, series('pug')) }) -task('watchSass', () => { watch(`${config.watchSource}/scss/**/*`, series('sass')) }) -task('watchJS', () => { watch(`${config.watchSource}/js/**/*`, series('js')) }) - - -task('watch', parallel( - 'watchPug', - 'watchSass', - 'watchJS' -)) diff --git a/images/icon.png b/images/icon.png deleted file mode 100644 index 39604a62..00000000 Binary files a/images/icon.png and /dev/null differ diff --git a/images/themes/11608darkstar_3.png b/images/themes/11608darkstar_3.png deleted file mode 100644 index 5a63d226..00000000 Binary files a/images/themes/11608darkstar_3.png and /dev/null differ diff --git a/images/themes/13268136501706-accca691-b9c3-4841-acd7-6bb843d2f422.png b/images/themes/13268136501706-accca691-b9c3-4841-acd7-6bb843d2f422.png deleted file mode 100644 index 67c74959..00000000 Binary files a/images/themes/13268136501706-accca691-b9c3-4841-acd7-6bb843d2f422.png and /dev/null differ diff --git a/images/themes/18217146305253-e257fbc0-993b-4e79-a0b4-0c0e6c95228b.png b/images/themes/18217146305253-e257fbc0-993b-4e79-a0b4-0c0e6c95228b.png deleted file mode 100644 index b5cc23bd..00000000 Binary files a/images/themes/18217146305253-e257fbc0-993b-4e79-a0b4-0c0e6c95228b.png and /dev/null differ diff --git a/images/themes/18328141609919-befbc7f3-5199-4672-9ba1-8551d2a4e5a1.png b/images/themes/18328141609919-befbc7f3-5199-4672-9ba1-8551d2a4e5a1.png deleted file mode 100644 index c296e0f6..00000000 Binary files a/images/themes/18328141609919-befbc7f3-5199-4672-9ba1-8551d2a4e5a1.png and /dev/null differ diff --git a/images/themes/184007ilia7199au71.png b/images/themes/184007ilia7199au71.png deleted file mode 100644 index 7e8465ef..00000000 Binary files a/images/themes/184007ilia7199au71.png and /dev/null differ diff --git a/images/themes/19.webp b/images/themes/19.webp deleted file mode 100644 index ed7fd2bd..00000000 Binary files a/images/themes/19.webp and /dev/null differ diff --git a/images/themes/20.webp b/images/themes/20.webp deleted file mode 100644 index 1af47fae..00000000 Binary files a/images/themes/20.webp and /dev/null differ diff --git a/images/themes/20053home.jpg b/images/themes/20053home.jpg deleted file mode 100644 index 4dde3dc1..00000000 Binary files a/images/themes/20053home.jpg and /dev/null differ diff --git a/images/themes/20930130265614-a7559ea7-70fd-44f9-a790-34c5c0e31493.png b/images/themes/20930130265614-a7559ea7-70fd-44f9-a790-34c5c0e31493.png deleted file mode 100644 index 1e4d22e7..00000000 Binary files a/images/themes/20930130265614-a7559ea7-70fd-44f9-a790-34c5c0e31493.png and /dev/null differ diff --git a/images/themes/22381112138598-fe8cd400-8bd1-11eb-8eed-edcca2c689d8.png b/images/themes/22381112138598-fe8cd400-8bd1-11eb-8eed-edcca2c689d8.png deleted file mode 100644 index f5d74290..00000000 Binary files a/images/themes/22381112138598-fe8cd400-8bd1-11eb-8eed-edcca2c689d8.png and /dev/null differ diff --git a/images/themes/24535ff_protonbutquantum.png b/images/themes/24535ff_protonbutquantum.png deleted file mode 100644 index 3c3ac746..00000000 Binary files a/images/themes/24535ff_protonbutquantum.png and /dev/null differ diff --git a/images/themes/2507221055856-8690c288-d236-4905-a58e-78e11b8238e3.gif b/images/themes/2507221055856-8690c288-d236-4905-a58e-78e11b8238e3.gif deleted file mode 100644 index ec1a90ae..00000000 Binary files a/images/themes/2507221055856-8690c288-d236-4905-a58e-78e11b8238e3.gif and /dev/null differ diff --git a/images/themes/25940safari2.png b/images/themes/25940safari2.png deleted file mode 100644 index 55b1d0ca..00000000 Binary files a/images/themes/25940safari2.png and /dev/null differ diff --git a/images/themes/29957ui.png b/images/themes/29957ui.png deleted file mode 100644 index aae4e74d..00000000 Binary files a/images/themes/29957ui.png and /dev/null differ diff --git a/images/themes/321608U0N6E.png b/images/themes/321608U0N6E.png deleted file mode 100644 index 608dfe22..00000000 Binary files a/images/themes/321608U0N6E.png and /dev/null differ diff --git a/images/themes/6299firefox-26-11-2023.jpg b/images/themes/6299firefox-26-11-2023.jpg deleted file mode 100644 index 921728ea..00000000 Binary files a/images/themes/6299firefox-26-11-2023.jpg and /dev/null differ diff --git a/images/themes/8988rjy7uTd.png b/images/themes/8988rjy7uTd.png deleted file mode 100644 index ddd1046e..00000000 Binary files a/images/themes/8988rjy7uTd.png and /dev/null differ diff --git a/images/themes/9037DGTAHYA.png b/images/themes/9037DGTAHYA.png deleted file mode 100644 index 56a56671..00000000 Binary files a/images/themes/9037DGTAHYA.png and /dev/null differ diff --git a/images/themes/AestheticFox.png b/images/themes/AestheticFox.png deleted file mode 100644 index 2cce2db9..00000000 Binary files a/images/themes/AestheticFox.png and /dev/null differ diff --git a/images/themes/ArnimFox.webp b/images/themes/ArnimFox.webp deleted file mode 100644 index f1012cd9..00000000 Binary files a/images/themes/ArnimFox.webp and /dev/null differ diff --git a/images/themes/AutoColor-Minimal-Proton.png b/images/themes/AutoColor-Minimal-Proton.png deleted file mode 100644 index 107d95e4..00000000 Binary files a/images/themes/AutoColor-Minimal-Proton.png and /dev/null differ diff --git a/images/themes/Bali10050sPreview.webp b/images/themes/Bali10050sPreview.webp deleted file mode 100644 index 01ec875e..00000000 Binary files a/images/themes/Bali10050sPreview.webp and /dev/null differ diff --git a/images/themes/Chameleons-Beauty.jpeg b/images/themes/Chameleons-Beauty.jpeg deleted file mode 100644 index 2b871489..00000000 Binary files a/images/themes/Chameleons-Beauty.jpeg and /dev/null differ diff --git a/images/themes/Clean_and_Transparent.webp b/images/themes/Clean_and_Transparent.webp deleted file mode 100644 index 40d48f92..00000000 Binary files a/images/themes/Clean_and_Transparent.webp and /dev/null differ diff --git a/images/themes/CompactFoxPreview.png b/images/themes/CompactFoxPreview.png deleted file mode 100644 index 59b81ff6..00000000 Binary files a/images/themes/CompactFoxPreview.png and /dev/null differ diff --git a/images/themes/Edge-Frfox.png b/images/themes/Edge-Frfox.png deleted file mode 100644 index 4ba29b73..00000000 Binary files a/images/themes/Edge-Frfox.png and /dev/null differ diff --git a/images/themes/Elegant-Nord-Theme.png b/images/themes/Elegant-Nord-Theme.png deleted file mode 100644 index b9e5f93f..00000000 Binary files a/images/themes/Elegant-Nord-Theme.png and /dev/null differ diff --git a/images/themes/Firefox-Alpha.webp b/images/themes/Firefox-Alpha.webp deleted file mode 100644 index d5ab5b34..00000000 Binary files a/images/themes/Firefox-Alpha.webp and /dev/null differ diff --git a/images/themes/FrameUIScreenshot.png b/images/themes/FrameUIScreenshot.png deleted file mode 100644 index 53dc3327..00000000 Binary files a/images/themes/FrameUIScreenshot.png and /dev/null differ diff --git a/images/themes/GentleFox.png b/images/themes/GentleFox.png deleted file mode 100644 index e62e3c69..00000000 Binary files a/images/themes/GentleFox.png and /dev/null differ diff --git a/images/themes/ImpossibleFox.png b/images/themes/ImpossibleFox.png deleted file mode 100644 index abf206cd..00000000 Binary files a/images/themes/ImpossibleFox.png and /dev/null differ diff --git a/images/themes/Khalyl.png b/images/themes/Khalyl.png deleted file mode 100644 index 382bd6b9..00000000 Binary files a/images/themes/Khalyl.png and /dev/null differ diff --git a/images/themes/Lepton-PhotonStyle.webp b/images/themes/Lepton-PhotonStyle.webp deleted file mode 100644 index db860498..00000000 Binary files a/images/themes/Lepton-PhotonStyle.webp and /dev/null differ diff --git a/images/themes/Lepton.webp b/images/themes/Lepton.webp deleted file mode 100644 index ad54af4a..00000000 Binary files a/images/themes/Lepton.webp and /dev/null differ diff --git a/images/themes/MacOSVibrant.png b/images/themes/MacOSVibrant.png deleted file mode 100644 index 54c22e67..00000000 Binary files a/images/themes/MacOSVibrant.png and /dev/null differ diff --git a/images/themes/Minimalist-DarkGreen.gif b/images/themes/Minimalist-DarkGreen.gif deleted file mode 100644 index f16c1d0c..00000000 Binary files a/images/themes/Minimalist-DarkGreen.gif and /dev/null differ diff --git a/images/themes/Monterey-Fox.png b/images/themes/Monterey-Fox.png deleted file mode 100644 index 2d7b6da0..00000000 Binary files a/images/themes/Monterey-Fox.png and /dev/null differ diff --git a/images/themes/MyFirefoxThemenotholar.webp b/images/themes/MyFirefoxThemenotholar.webp deleted file mode 100644 index ca383446..00000000 Binary files a/images/themes/MyFirefoxThemenotholar.webp and /dev/null differ diff --git a/images/themes/My_Firefox_theme_-_uFffDtark.webp b/images/themes/My_Firefox_theme_-_uFffDtark.webp deleted file mode 100644 index 4627769d..00000000 Binary files a/images/themes/My_Firefox_theme_-_uFffDtark.webp and /dev/null differ diff --git a/images/themes/NightSky.jpeg b/images/themes/NightSky.jpeg deleted file mode 100644 index 15ef381b..00000000 Binary files a/images/themes/NightSky.jpeg and /dev/null differ diff --git a/images/themes/Oneliner_Deluxe.png b/images/themes/Oneliner_Deluxe.png deleted file mode 100644 index e4e93b77..00000000 Binary files a/images/themes/Oneliner_Deluxe.png and /dev/null differ diff --git a/images/themes/PotatoFox.webp b/images/themes/PotatoFox.webp deleted file mode 100644 index 926c8980..00000000 Binary files a/images/themes/PotatoFox.webp and /dev/null differ diff --git a/images/themes/PretoFox.png b/images/themes/PretoFox.png deleted file mode 100644 index 225ae78f..00000000 Binary files a/images/themes/PretoFox.png and /dev/null differ diff --git a/images/themes/Proton Square.png b/images/themes/Proton Square.png deleted file mode 100644 index 47537808..00000000 Binary files a/images/themes/Proton Square.png and /dev/null differ diff --git a/images/themes/RealFire-main.png b/images/themes/RealFire-main.png deleted file mode 100644 index aaa18137..00000000 Binary files a/images/themes/RealFire-main.png and /dev/null differ diff --git a/images/themes/Shina.webp b/images/themes/Shina.webp deleted file mode 100644 index 2df2d04b..00000000 Binary files a/images/themes/Shina.webp and /dev/null differ diff --git a/images/themes/Simple_Oneliner.webp b/images/themes/Simple_Oneliner.webp deleted file mode 100644 index 164dfe75..00000000 Binary files a/images/themes/Simple_Oneliner.webp and /dev/null differ diff --git a/images/themes/TYHFox.png b/images/themes/TYHFox.png deleted file mode 100644 index 030fe69b..00000000 Binary files a/images/themes/TYHFox.png and /dev/null differ diff --git a/images/themes/TYHFox.webp b/images/themes/TYHFox.webp deleted file mode 100644 index 97df7504..00000000 Binary files a/images/themes/TYHFox.webp and /dev/null differ diff --git a/images/themes/Technetium.png b/images/themes/Technetium.png deleted file mode 100644 index 495458ec..00000000 Binary files a/images/themes/Technetium.png and /dev/null differ diff --git a/images/themes/Three_Rows.webp b/images/themes/Three_Rows.webp deleted file mode 100644 index ab3c43a0..00000000 Binary files a/images/themes/Three_Rows.webp and /dev/null differ diff --git a/images/themes/ViceFox.png b/images/themes/ViceFox.png deleted file mode 100644 index 7af98f0a..00000000 Binary files a/images/themes/ViceFox.png and /dev/null differ diff --git a/images/themes/aeroFirefox.webp b/images/themes/aeroFirefox.webp deleted file mode 100644 index 7c583729..00000000 Binary files a/images/themes/aeroFirefox.webp and /dev/null differ diff --git a/images/themes/almostdarkproton.webp b/images/themes/almostdarkproton.webp deleted file mode 100644 index d748c791..00000000 Binary files a/images/themes/almostdarkproton.webp and /dev/null differ diff --git a/images/themes/alpenblue.png b/images/themes/alpenblue.png deleted file mode 100644 index 816825a9..00000000 Binary files a/images/themes/alpenblue.png and /dev/null differ diff --git a/images/themes/always-fullscreen-firefox.jpg b/images/themes/always-fullscreen-firefox.jpg deleted file mode 100644 index 6a7e8875..00000000 Binary files a/images/themes/always-fullscreen-firefox.jpg and /dev/null differ diff --git a/images/themes/animatedfox.png b/images/themes/animatedfox.png deleted file mode 100644 index 8248a7d4..00000000 Binary files a/images/themes/animatedfox.png and /dev/null differ diff --git a/images/themes/anotheroneline.webp b/images/themes/anotheroneline.webp deleted file mode 100644 index 257124c0..00000000 Binary files a/images/themes/anotheroneline.webp and /dev/null differ diff --git a/images/themes/arcadia.webp b/images/themes/arcadia.webp deleted file mode 100644 index 93efd1be..00000000 Binary files a/images/themes/arcadia.webp and /dev/null differ diff --git a/images/themes/arcadiapreview.gif b/images/themes/arcadiapreview.gif deleted file mode 100644 index d3f5a12f..00000000 --- a/images/themes/arcadiapreview.gif +++ /dev/null @@ -1 +0,0 @@ - diff --git a/images/themes/arcfox.png b/images/themes/arcfox.png deleted file mode 100644 index b7fc0506..00000000 Binary files a/images/themes/arcfox.png and /dev/null differ diff --git a/images/themes/arcwtf.png b/images/themes/arcwtf.png deleted file mode 100644 index 272b51a8..00000000 Binary files a/images/themes/arcwtf.png and /dev/null differ diff --git a/images/themes/blurfox.png b/images/themes/blurfox.png deleted file mode 100644 index af7e5f80..00000000 Binary files a/images/themes/blurfox.png and /dev/null differ diff --git a/images/themes/blurred.webp b/images/themes/blurred.webp deleted file mode 100644 index 7d026584..00000000 Binary files a/images/themes/blurred.webp and /dev/null differ diff --git a/images/themes/cascade.jpg b/images/themes/cascade.jpg deleted file mode 100644 index a335bff4..00000000 Binary files a/images/themes/cascade.jpg and /dev/null differ diff --git a/images/themes/compact_verticaltabs_view.png b/images/themes/compact_verticaltabs_view.png deleted file mode 100644 index 68336b32..00000000 Binary files a/images/themes/compact_verticaltabs_view.png and /dev/null differ diff --git a/images/themes/custom_australistabs_protonUI.png b/images/themes/custom_australistabs_protonUI.png deleted file mode 100644 index 98ab3482..00000000 Binary files a/images/themes/custom_australistabs_protonUI.png and /dev/null differ diff --git a/images/themes/cyanmatrx.png b/images/themes/cyanmatrx.png deleted file mode 100644 index 918e2702..00000000 Binary files a/images/themes/cyanmatrx.png and /dev/null differ diff --git a/images/themes/d0sse_mac_fox_screen.webp b/images/themes/d0sse_mac_fox_screen.webp deleted file mode 100644 index c06b52bc..00000000 Binary files a/images/themes/d0sse_mac_fox_screen.webp and /dev/null differ diff --git a/images/themes/darkmatter.png b/images/themes/darkmatter.png deleted file mode 100644 index 6ba5ef17..00000000 Binary files a/images/themes/darkmatter.png and /dev/null differ diff --git a/images/themes/diamondfucsia.webp b/images/themes/diamondfucsia.webp deleted file mode 100644 index 3d0907d1..00000000 Binary files a/images/themes/diamondfucsia.webp and /dev/null differ diff --git a/images/themes/dracula.webp b/images/themes/dracula.webp deleted file mode 100644 index 1e5ea4e2..00000000 Binary files a/images/themes/dracula.webp and /dev/null differ diff --git a/images/themes/duskfox.webp b/images/themes/duskfox.webp deleted file mode 100644 index 58bd9c36..00000000 Binary files a/images/themes/duskfox.webp and /dev/null differ diff --git a/images/themes/edgefox.png b/images/themes/edgefox.png deleted file mode 100644 index 25a8eaf9..00000000 Binary files a/images/themes/edgefox.png and /dev/null differ diff --git a/images/themes/edgyarc-fr.png b/images/themes/edgyarc-fr.png deleted file mode 100644 index 987f9a34..00000000 Binary files a/images/themes/edgyarc-fr.png and /dev/null differ diff --git a/images/themes/elegant_floorp.png b/images/themes/elegant_floorp.png deleted file mode 100644 index 7bb628d3..00000000 Binary files a/images/themes/elegant_floorp.png and /dev/null differ diff --git a/images/themes/elegantfox.webp b/images/themes/elegantfox.webp deleted file mode 100644 index d3cd6ebf..00000000 Binary files a/images/themes/elegantfox.webp and /dev/null differ diff --git a/images/themes/essence.png b/images/themes/essence.png deleted file mode 100644 index 4b0b3d56..00000000 Binary files a/images/themes/essence.png and /dev/null differ diff --git a/images/themes/ff-i3wm.png b/images/themes/ff-i3wm.png deleted file mode 100644 index d62060b1..00000000 Binary files a/images/themes/ff-i3wm.png and /dev/null differ diff --git a/images/themes/ff95.png b/images/themes/ff95.png deleted file mode 100644 index d7477d52..00000000 Binary files a/images/themes/ff95.png and /dev/null differ diff --git a/images/themes/ff95xtracompact.webp b/images/themes/ff95xtracompact.webp deleted file mode 100644 index 7deac9e8..00000000 Binary files a/images/themes/ff95xtracompact.webp and /dev/null differ diff --git a/images/themes/fireFoxOneLinerCSS.webp b/images/themes/fireFoxOneLinerCSS.webp deleted file mode 100644 index 09c0c1b2..00000000 Binary files a/images/themes/fireFoxOneLinerCSS.webp and /dev/null differ diff --git a/images/themes/firefox-eos6-theme.png b/images/themes/firefox-eos6-theme.png deleted file mode 100644 index 11f38c4e..00000000 Binary files a/images/themes/firefox-eos6-theme.png and /dev/null differ diff --git a/images/themes/firefox-gnome-theme.png b/images/themes/firefox-gnome-theme.png deleted file mode 100644 index 30f487cd..00000000 Binary files a/images/themes/firefox-gnome-theme.png and /dev/null differ diff --git a/images/themes/firefox-gx.png b/images/themes/firefox-gx.png deleted file mode 100644 index 6f54aa3c..00000000 Binary files a/images/themes/firefox-gx.png and /dev/null differ diff --git a/images/themes/firefox-one.png b/images/themes/firefox-one.png deleted file mode 100644 index 49cec9f7..00000000 Binary files a/images/themes/firefox-one.png and /dev/null differ diff --git a/images/themes/firefoxcss.webp b/images/themes/firefoxcss.webp deleted file mode 100644 index 5bedede1..00000000 Binary files a/images/themes/firefoxcss.webp and /dev/null differ diff --git a/images/themes/firefoxcssplus.webp b/images/themes/firefoxcssplus.webp deleted file mode 100644 index 93cb3a98..00000000 Binary files a/images/themes/firefoxcssplus.webp and /dev/null differ diff --git a/images/themes/firefoxhalo.webp b/images/themes/firefoxhalo.webp deleted file mode 100644 index 5ba3b4c3..00000000 Binary files a/images/themes/firefoxhalo.webp and /dev/null differ diff --git a/images/themes/firefoxmodblur.webp b/images/themes/firefoxmodblur.webp deleted file mode 100644 index f777b744..00000000 Binary files a/images/themes/firefoxmodblur.webp and /dev/null differ diff --git a/images/themes/firefoxoneline.png b/images/themes/firefoxoneline.png deleted file mode 100644 index c8e1534d..00000000 Binary files a/images/themes/firefoxoneline.png and /dev/null differ diff --git a/images/themes/firefoxreview.webp b/images/themes/firefoxreview.webp deleted file mode 100644 index 4be16b8d..00000000 Binary files a/images/themes/firefoxreview.webp and /dev/null differ diff --git a/images/themes/firefoxuwpstyle.webp b/images/themes/firefoxuwpstyle.webp deleted file mode 100644 index 870552b0..00000000 Binary files a/images/themes/firefoxuwpstyle.webp and /dev/null differ diff --git a/images/themes/flying.webp b/images/themes/flying.webp deleted file mode 100644 index 83bacffb..00000000 Binary files a/images/themes/flying.webp and /dev/null differ diff --git a/images/themes/fox11.png b/images/themes/fox11.png deleted file mode 100644 index 0c0e1d65..00000000 Binary files a/images/themes/fox11.png and /dev/null differ diff --git a/images/themes/fx-compact-mode.png b/images/themes/fx-compact-mode.png deleted file mode 100644 index 8b7f47d5..00000000 Binary files a/images/themes/fx-compact-mode.png and /dev/null differ diff --git a/images/themes/glassyfox.png b/images/themes/glassyfox.png deleted file mode 100644 index 9e41e8c2..00000000 Binary files a/images/themes/glassyfox.png and /dev/null differ diff --git a/images/themes/martinfox.png b/images/themes/martinfox.png deleted file mode 100644 index dca7898d..00000000 Binary files a/images/themes/martinfox.png and /dev/null differ diff --git a/images/themes/materialfox.webp b/images/themes/materialfox.webp deleted file mode 100644 index fb65e95f..00000000 Binary files a/images/themes/materialfox.webp and /dev/null differ diff --git a/images/themes/minimal_arc.webp b/images/themes/minimal_arc.webp deleted file mode 100644 index b8fd15df..00000000 Binary files a/images/themes/minimal_arc.webp and /dev/null differ diff --git a/images/themes/minimalfox.webp b/images/themes/minimalfox.webp deleted file mode 100644 index 9659728d..00000000 Binary files a/images/themes/minimalfox.webp and /dev/null differ diff --git a/images/themes/minimalfuntionalfox.webp b/images/themes/minimalfuntionalfox.webp deleted file mode 100644 index e10474be..00000000 Binary files a/images/themes/minimalfuntionalfox.webp and /dev/null differ diff --git a/images/themes/minimalist-oneliner.png b/images/themes/minimalist-oneliner.png deleted file mode 100644 index 91b5dd4a..00000000 Binary files a/images/themes/minimalist-oneliner.png and /dev/null differ diff --git a/images/themes/molff.webp b/images/themes/molff.webp deleted file mode 100644 index 641fbe61..00000000 Binary files a/images/themes/molff.webp and /dev/null differ diff --git a/images/themes/monochromeNeubrutalism.png b/images/themes/monochromeNeubrutalism.png deleted file mode 100644 index 90d339ec..00000000 Binary files a/images/themes/monochromeNeubrutalism.png and /dev/null differ diff --git a/images/themes/moonlight.webp b/images/themes/moonlight.webp deleted file mode 100644 index 88b32fb3..00000000 Binary files a/images/themes/moonlight.webp and /dev/null differ diff --git a/images/themes/natura.png b/images/themes/natura.png deleted file mode 100644 index f6d205e2..00000000 Binary files a/images/themes/natura.png and /dev/null differ diff --git a/images/themes/nord.webp b/images/themes/nord.webp deleted file mode 100644 index 7b2c37db..00000000 Binary files a/images/themes/nord.webp and /dev/null differ diff --git a/images/themes/onebar.webp b/images/themes/onebar.webp deleted file mode 100644 index 83b5bb65..00000000 Binary files a/images/themes/onebar.webp and /dev/null differ diff --git a/images/themes/onelineproton.png b/images/themes/onelineproton.png deleted file mode 100644 index 732b3f94..00000000 Binary files a/images/themes/onelineproton.png and /dev/null differ diff --git a/images/themes/parfait.webp b/images/themes/parfait.webp deleted file mode 100644 index 4368cdc3..00000000 Binary files a/images/themes/parfait.webp and /dev/null differ diff --git a/images/themes/pro-fox.png b/images/themes/pro-fox.png deleted file mode 100644 index 333a84ed..00000000 Binary files a/images/themes/pro-fox.png and /dev/null differ diff --git a/images/themes/proton-ui-gradient-rounded-tabs-display.png b/images/themes/proton-ui-gradient-rounded-tabs-display.png deleted file mode 100644 index bc5c8a86..00000000 Binary files a/images/themes/proton-ui-gradient-rounded-tabs-display.png and /dev/null differ diff --git a/images/themes/protovibrant.webp b/images/themes/protovibrant.webp deleted file mode 100644 index d1d2de13..00000000 Binary files a/images/themes/protovibrant.webp and /dev/null differ diff --git a/images/themes/quietfox.webp b/images/themes/quietfox.webp deleted file mode 100644 index 4d7c6d98..00000000 Binary files a/images/themes/quietfox.webp and /dev/null differ diff --git a/images/themes/rainfox.webp b/images/themes/rainfox.webp deleted file mode 100644 index 55168e0a..00000000 Binary files a/images/themes/rainfox.webp and /dev/null differ diff --git a/images/themes/remote-102-ff-ultima.gif b/images/themes/remote-102-ff-ultima.gif deleted file mode 100644 index 6a309706..00000000 Binary files a/images/themes/remote-102-ff-ultima.gif and /dev/null differ diff --git a/images/themes/remote-118-ministhetic-firefox.gif b/images/themes/remote-118-ministhetic-firefox.gif deleted file mode 100644 index 0f7c315a..00000000 Binary files a/images/themes/remote-118-ministhetic-firefox.gif and /dev/null differ diff --git a/images/themes/remote-121-downtoneui.gif b/images/themes/remote-121-downtoneui.gif deleted file mode 100644 index b5d8f8bc..00000000 Binary files a/images/themes/remote-121-downtoneui.gif and /dev/null differ diff --git a/images/themes/remote-122-firefox-moonlight-theme.jpg b/images/themes/remote-122-firefox-moonlight-theme.jpg deleted file mode 100644 index 0404188a..00000000 Binary files a/images/themes/remote-122-firefox-moonlight-theme.jpg and /dev/null differ diff --git a/images/themes/remote-124-sakuras-simple-sidebar.gif b/images/themes/remote-124-sakuras-simple-sidebar.gif deleted file mode 100644 index efeb4de9..00000000 Binary files a/images/themes/remote-124-sakuras-simple-sidebar.gif and /dev/null differ diff --git a/images/themes/remote-125-littlefox.webp b/images/themes/remote-125-littlefox.webp deleted file mode 100644 index 2db81af8..00000000 Binary files a/images/themes/remote-125-littlefox.webp and /dev/null differ diff --git a/images/themes/remote-126-flexfox.webp b/images/themes/remote-126-flexfox.webp deleted file mode 100644 index 6c6264c2..00000000 Binary files a/images/themes/remote-126-flexfox.webp and /dev/null differ diff --git a/images/themes/remote-127-git-userchrome.gif b/images/themes/remote-127-git-userchrome.gif deleted file mode 100644 index 84536759..00000000 Binary files a/images/themes/remote-127-git-userchrome.gif and /dev/null differ diff --git a/images/themes/remote-128-gruvbox-gnomeish.png b/images/themes/remote-128-gruvbox-gnomeish.png deleted file mode 100644 index f36d7071..00000000 Binary files a/images/themes/remote-128-gruvbox-gnomeish.png and /dev/null differ diff --git a/images/themes/remote-130-newfox.png b/images/themes/remote-130-newfox.png deleted file mode 100644 index d25af707..00000000 Binary files a/images/themes/remote-130-newfox.png and /dev/null differ diff --git a/images/themes/remote-131-transparentfox.png b/images/themes/remote-131-transparentfox.png deleted file mode 100644 index 95997e1a..00000000 Binary files a/images/themes/remote-131-transparentfox.png and /dev/null differ diff --git a/images/themes/remote-132-wmfox.png b/images/themes/remote-132-wmfox.png deleted file mode 100644 index e8a20cb6..00000000 Binary files a/images/themes/remote-132-wmfox.png and /dev/null differ diff --git a/images/themes/remote-133-fennec.webp b/images/themes/remote-133-fennec.webp deleted file mode 100644 index 3beb0443..00000000 Binary files a/images/themes/remote-133-fennec.webp and /dev/null differ diff --git a/images/themes/remote-134-dynamic-color.png b/images/themes/remote-134-dynamic-color.png deleted file mode 100644 index b362bc23..00000000 Binary files a/images/themes/remote-134-dynamic-color.png and /dev/null differ diff --git a/images/themes/rounded_fox.webp b/images/themes/rounded_fox.webp deleted file mode 100644 index 4d94f70a..00000000 Binary files a/images/themes/rounded_fox.webp and /dev/null differ diff --git a/images/themes/screenshot-site.png b/images/themes/screenshot-site.png deleted file mode 100644 index 1c1bb0be..00000000 Binary files a/images/themes/screenshot-site.png and /dev/null differ diff --git a/images/themes/shyfox.webp b/images/themes/shyfox.webp deleted file mode 100644 index c352c258..00000000 Binary files a/images/themes/shyfox.webp and /dev/null differ diff --git a/images/themes/sidefox.webp b/images/themes/sidefox.webp deleted file mode 100644 index efbfa71f..00000000 Binary files a/images/themes/sidefox.webp and /dev/null differ diff --git a/images/themes/silentfox.png b/images/themes/silentfox.png deleted file mode 100644 index 1d798c19..00000000 Binary files a/images/themes/silentfox.png and /dev/null differ diff --git a/images/themes/simplefox-feather.png b/images/themes/simplefox-feather.png deleted file mode 100644 index 927b1a1e..00000000 Binary files a/images/themes/simplefox-feather.png and /dev/null differ diff --git a/images/themes/simplefox.png b/images/themes/simplefox.png deleted file mode 100644 index ed0e15b0..00000000 Binary files a/images/themes/simplefox.png and /dev/null differ diff --git a/images/themes/simplify_darkish_for_firefox_preview.webp b/images/themes/simplify_darkish_for_firefox_preview.webp deleted file mode 100644 index e31c0220..00000000 Binary files a/images/themes/simplify_darkish_for_firefox_preview.webp and /dev/null differ diff --git a/images/themes/simplify_silver_peach_for_firefox_preview.webp b/images/themes/simplify_silver_peach_for_firefox_preview.webp deleted file mode 100644 index d29e0e3e..00000000 Binary files a/images/themes/simplify_silver_peach_for_firefox_preview.webp and /dev/null differ diff --git a/images/themes/snowfox.webp b/images/themes/snowfox.webp deleted file mode 100644 index 53d0ba45..00000000 Binary files a/images/themes/snowfox.webp and /dev/null differ diff --git a/images/themes/soupbowlmodoki.webp b/images/themes/soupbowlmodoki.webp deleted file mode 100644 index 492bbce2..00000000 Binary files a/images/themes/soupbowlmodoki.webp and /dev/null differ diff --git a/images/themes/splashcompact.webp b/images/themes/splashcompact.webp deleted file mode 100644 index e29b42a8..00000000 Binary files a/images/themes/splashcompact.webp and /dev/null differ diff --git a/images/themes/starry-fox-resize.png b/images/themes/starry-fox-resize.png deleted file mode 100644 index a184c092..00000000 Binary files a/images/themes/starry-fox-resize.png and /dev/null differ diff --git a/images/themes/sweetpop.webp b/images/themes/sweetpop.webp deleted file mode 100644 index 5abcfaab..00000000 Binary files a/images/themes/sweetpop.webp and /dev/null differ diff --git a/images/themes/tilefox.png b/images/themes/tilefox.png deleted file mode 100644 index 1915f283..00000000 Binary files a/images/themes/tilefox.png and /dev/null differ diff --git a/images/themes/titlebarfix.webp b/images/themes/titlebarfix.webp deleted file mode 100644 index dffefb41..00000000 Binary files a/images/themes/titlebarfix.webp and /dev/null differ diff --git a/images/themes/waterfall.png b/images/themes/waterfall.png deleted file mode 100644 index 61e378fa..00000000 Binary files a/images/themes/waterfall.png and /dev/null differ diff --git a/images/themes/whitesur.webp b/images/themes/whitesur.webp deleted file mode 100644 index 0cb742e4..00000000 Binary files a/images/themes/whitesur.webp and /dev/null differ diff --git a/images/themes/whitesur_vinceliuice.webp b/images/themes/whitesur_vinceliuice.webp deleted file mode 100644 index ddd12ab0..00000000 Binary files a/images/themes/whitesur_vinceliuice.webp and /dev/null differ diff --git a/images/themes/xtracompact.png b/images/themes/xtracompact.png deleted file mode 100644 index 98b07793..00000000 Binary files a/images/themes/xtracompact.png and /dev/null differ diff --git a/images/themes/zaps-photon.webp b/images/themes/zaps-photon.webp deleted file mode 100644 index ea46f3a1..00000000 Binary files a/images/themes/zaps-photon.webp and /dev/null differ diff --git a/package-lock.json b/package-lock.json index fb9a2068..69758b40 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,296 +1,240 @@ { - "name": "FirefoxCSSStore", + "name": "firefoxcss-store", "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "FirefoxCSSStore", + "name": "firefoxcss-store", "version": "1.0.0", "devDependencies": { - "@babel/core": "^7.29.0", - "@babel/preset-env": "^7.29.2", - "gulp": "^5.0.1", - "gulp-autoprefixer": "^10.0.0", - "gulp-babel": "^8.0.0", - "gulp-pug": "^5.0.0", - "gulp-sass": "^6.0.1", - "gulp-terser": "^2.1.0", - "jstransformer-markdown-it": "^3.0.0", - "sass": "^1.99.0", - "sharp": "^0.34.5" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", - "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.28.5", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", - "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", - "dev": true, - "engines": { - "node": ">=6.9.0" + "@astrojs/check": "^0.9.8", + "astro": "^6.1.9", + "typescript": "^5.9.3", + "zod": "^4.3.6" } }, - "node_modules/@babel/core": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", - "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "node_modules/@astrojs/check": { + "version": "0.9.8", + "resolved": "https://registry.npmjs.org/@astrojs/check/-/check-0.9.8.tgz", + "integrity": "sha512-LDng8446QLS5ToKjRHd3bgUdirvemVVExV7nRyJfW2wV36xuv7vDxwy5NWN9zqeSEDgg0Tv84sP+T3yEq+Zlkw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helpers": "^7.28.6", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/traverse": "^7.29.0", - "@babel/types": "^7.29.0", - "@jridgewell/remapping": "^2.3.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" + "@astrojs/language-server": "^2.16.5", + "chokidar": "^4.0.3", + "kleur": "^4.1.5", + "yargs": "^17.7.2" }, - "engines": { - "node": ">=6.9.0" + "bin": { + "astro-check": "bin/astro-check.js" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" + "peerDependencies": { + "typescript": "^5.0.0" } }, - "node_modules/@babel/generator": { - "version": "7.29.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", - "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "node_modules/@astrojs/check/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.0", - "@babel/types": "^7.29.0", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" + "readdirp": "^4.0.1" }, "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", - "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.27.3" + "node": ">= 14.16.0" }, - "engines": { - "node": ">=6.9.0" + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", - "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "node_modules/@astrojs/check/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==", "dev": true, + "license": "ISC", "dependencies": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=12" } }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.6.tgz", - "integrity": "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==", + "node_modules/@astrojs/check/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-member-expression-to-functions": "^7.28.5", - "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/helper-replace-supers": "^7.28.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/traverse": "^7.28.6", - "semver": "^6.3.1" - }, + "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": ">= 14.18.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz", - "integrity": "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==", + "node_modules/@astrojs/check/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "regexpu-core": "^6.3.1", - "semver": "^6.3.1" + "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": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.7.tgz", - "integrity": "sha512-6Fqi8MtQ/PweQ9xvux65emkLQ83uB+qAVtfHkC9UodyHMIZdxNI01HjLCLUtybElp2KY2XNE0nOgyP1E1vXw9w==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "debug": "^4.4.3", - "lodash.debounce": "^4.0.8", - "resolve": "^1.22.11" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + "node": ">=12" } }, - "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "node_modules/@astrojs/check/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==", "dev": true, + "license": "ISC", "engines": { - "node": ">=6.9.0" + "node": ">=12" } }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", - "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", + "node_modules/@astrojs/compiler": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-2.13.1.tgz", + "integrity": "sha512-f3FN83d2G/v32ipNClRKgYv30onQlMZX1vCeZMjPsMMPl1mDpmbl0+N5BYo4S/ofzqJyS5hvwacEo0CCVDn/Qg==", "dev": true, - "dependencies": { - "@babel/traverse": "^7.28.5", - "@babel/types": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - } + "license": "MIT" }, - "node_modules/@babel/helper-module-imports": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", - "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "node_modules/@astrojs/internal-helpers": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.9.0.tgz", + "integrity": "sha512-GdYkzR26re8izmyYlBqf4z2s7zNngmWLFuxw0UKiPNqHraZGS6GKWIwSHgS22RDlu2ePFJ8bzmpBcUszut/SDg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" + "picomatch": "^4.0.4" } }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", - "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "node_modules/@astrojs/language-server": { + "version": "2.16.6", + "resolved": "https://registry.npmjs.org/@astrojs/language-server/-/language-server-2.16.6.tgz", + "integrity": "sha512-N990lu+HSFiG57owR0XBkr02BYMgiLCshLf+4QG4v6jjSWkBeQGnzqi+E1L08xFPPJ7eEeXnxPXGLaVv5pa4Ug==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.28.6" + "@astrojs/compiler": "^2.13.1", + "@astrojs/yaml2ts": "^0.2.3", + "@jridgewell/sourcemap-codec": "^1.5.5", + "@volar/kit": "~2.4.28", + "@volar/language-core": "~2.4.28", + "@volar/language-server": "~2.4.28", + "@volar/language-service": "~2.4.28", + "muggle-string": "^0.4.1", + "tinyglobby": "^0.2.15", + "volar-service-css": "0.0.70", + "volar-service-emmet": "0.0.70", + "volar-service-html": "0.0.70", + "volar-service-prettier": "0.0.70", + "volar-service-typescript": "0.0.70", + "volar-service-typescript-twoslash-queries": "0.0.70", + "volar-service-yaml": "0.0.70", + "vscode-html-languageservice": "^5.6.2", + "vscode-uri": "^3.1.0" }, - "engines": { - "node": ">=6.9.0" + "bin": { + "astro-ls": "bin/nodeServer.js" }, "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", - "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.27.1" + "prettier": "^3.0.0", + "prettier-plugin-astro": ">=0.11.0" }, - "engines": { - "node": ">=6.9.0" + "peerDependenciesMeta": { + "prettier": { + "optional": true + }, + "prettier-plugin-astro": { + "optional": true + } } }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", - "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "node_modules/@astrojs/markdown-remark": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-7.1.1.tgz", + "integrity": "sha512-C6e9BnLGlbdv6bV8MYGeHpHxsUHrCrB4OuRLqi5LI7oiBVcBcqfUN06zpwFQdHgV48QCCrMmLpyqBr7VqC+swA==", "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", - "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", + "license": "MIT", + "dependencies": { + "@astrojs/internal-helpers": "0.9.0", + "@astrojs/prism": "4.0.1", + "github-slugger": "^2.0.0", + "hast-util-from-html": "^2.0.3", + "hast-util-to-text": "^4.0.2", + "js-yaml": "^4.1.1", + "mdast-util-definitions": "^6.0.0", + "rehype-raw": "^7.0.0", + "rehype-stringify": "^10.0.1", + "remark-gfm": "^4.0.1", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.1.2", + "remark-smartypants": "^3.0.2", + "retext-smartypants": "^6.2.0", + "shiki": "^4.0.0", + "smol-toml": "^1.6.0", + "unified": "^11.0.5", + "unist-util-remove-position": "^5.0.0", + "unist-util-visit": "^5.1.0", + "unist-util-visit-parents": "^6.0.2", + "vfile": "^6.0.3" + } + }, + "node_modules/@astrojs/prism": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-4.0.1.tgz", + "integrity": "sha512-nksZQVjlferuWzhPsBpQ1JE5XuKAf1id1/9Hj4a9KG4+ofrlzxUUwX4YGQF/SuDiuiGKEnzopGOt38F3AnVWsQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-wrap-function": "^7.27.1", - "@babel/traverse": "^7.27.1" + "prismjs": "^1.30.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">=22.12.0" } }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz", - "integrity": "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==", + "node_modules/@astrojs/telemetry": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.3.1.tgz", + "integrity": "sha512-7fcIxXS9J4ls5tr8b3ww9rbAIz2+HrhNJYZdkAhhB4za/I5IZ/60g+Bs8q7zwG0tOIZfNB4JWhVJ1Qkl/OrNCw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.28.5", - "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/traverse": "^7.28.6" + "ci-info": "^4.4.0", + "dlv": "^1.1.3", + "dset": "^3.1.4", + "is-docker": "^4.0.0", + "is-wsl": "^3.1.1", + "which-pm-runs": "^1.1.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": "18.20.8 || ^20.3.0 || >=22.0.0" } }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", - "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "node_modules/@astrojs/yaml2ts": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@astrojs/yaml2ts/-/yaml2ts-0.2.3.tgz", + "integrity": "sha512-PJzRmgQzUxI2uwpdX2lXSHtP4G8ocp24/t+bZyf5Fy0SZLSF9f9KXZoMlFM/XCGue+B0nH/2IZ7FpBYQATBsCg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" + "yaml": "^2.8.2" } }, "node_modules/@babel/helper-string-parser": { @@ -311,42 +255,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.6.tgz", - "integrity": "sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==", - "dev": true, - "dependencies": { - "@babel/template": "^7.28.6", - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", - "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/parser": { "version": "7.29.0", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", @@ -362,1124 +270,569 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz", - "integrity": "sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==", + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.5" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", - "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", + "node_modules/@capsizecss/unpack": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@capsizecss/unpack/-/unpack-4.0.0.tgz", + "integrity": "sha512-VERIM64vtTP1C4mxQ5thVT9fK0apjPFobqybMtA1UdUujWka24ERHbRHFGmpbbhp73MhV+KSsHQH9C6uOTdEQA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "fontkitten": "^1.0.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">=18" } }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", - "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", + "node_modules/@clack/core": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@clack/core/-/core-1.2.0.tgz", + "integrity": "sha512-qfxof/3T3t9DPU/Rj3OmcFyZInceqj/NVtO9rwIuJqCUgh32gwPjpFQQp/ben07qKlhpwq7GzfWpST4qdJ5Drg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "fast-wrap-ansi": "^0.1.3", + "sisteransi": "^1.0.5" } }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", - "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", + "node_modules/@clack/prompts": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-1.2.0.tgz", + "integrity": "sha512-4jmztR9fMqPMjz6H/UZXj0zEmE43ha1euENwkckKKel4XpSfokExPo5AiVStdHSAlHekz4d0CA/r45Ok1E4D3w==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/plugin-transform-optional-chaining": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" + "@clack/core": "1.2.0", + "fast-string-width": "^1.1.0", + "fast-wrap-ansi": "^0.1.3", + "sisteransi": "^1.0.5" } }, - "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.6.tgz", - "integrity": "sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g==", + "node_modules/@emmetio/abbreviation": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@emmetio/abbreviation/-/abbreviation-2.3.3.tgz", + "integrity": "sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/traverse": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "@emmetio/scanner": "^1.0.4" } }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "node_modules/@emmetio/css-abbreviation": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@emmetio/css-abbreviation/-/css-abbreviation-2.1.8.tgz", + "integrity": "sha512-s9yjhJ6saOO/uk1V74eifykk2CBYi01STTK3WlXWGOepyKa23ymJ053+DNQjpFcy1ingpaO7AxCcwLvHFY9tuw==", "dev": true, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "license": "MIT", + "dependencies": { + "@emmetio/scanner": "^1.0.4" } }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.28.6.tgz", - "integrity": "sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==", + "node_modules/@emmetio/css-parser": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@emmetio/css-parser/-/css-parser-0.4.1.tgz", + "integrity": "sha512-2bC6m0MV/voF4CTZiAbG5MWKbq5EBmDPKu9Sb7s7nVcEzNQlrZP6mFFFlIaISM8X6514H9shWMme1fCm8cWAfQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@emmetio/stream-reader": "^2.2.0", + "@emmetio/stream-reader-utils": "^0.1.0" } }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", - "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", + "node_modules/@emmetio/html-matcher": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@emmetio/html-matcher/-/html-matcher-1.3.0.tgz", + "integrity": "sha512-NTbsvppE5eVyBMuyGfVu2CRrLvo7J4YHb6t9sBFLyY03WYhXET37qA4zOYUjBWFCRHO7pS1B9khERtY0f5JXPQ==", "dev": true, + "license": "ISC", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@emmetio/scanner": "^1.0.0" } }, - "node_modules/@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "node_modules/@emmetio/scanner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@emmetio/scanner/-/scanner-1.0.4.tgz", + "integrity": "sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA==", "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } + "license": "MIT" }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", - "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", + "node_modules/@emmetio/stream-reader": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@emmetio/stream-reader/-/stream-reader-2.2.0.tgz", + "integrity": "sha512-fXVXEyFA5Yv3M3n8sUGT7+fvecGrZP4k6FnWWMSZVQf69kAq0LLpaBQLGcPR30m3zMmKYhECP4k/ZkzvhEW5kw==", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } + "license": "MIT" }, - "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.0.tgz", - "integrity": "sha512-va0VdWro4zlBr2JsXC+ofCPB2iG12wPtVGTWFx2WLDOM3nYQZZIGP82qku2eW/JR83sD+k2k+CsNtyEbUqhU6w==", + "node_modules/@emmetio/stream-reader-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@emmetio/stream-reader-utils/-/stream-reader-utils-0.1.0.tgz", + "integrity": "sha512-ZsZ2I9Vzso3Ho/pjZFsmmZ++FWeEd/txqybHTm4OgaZzdS8V9V/YYWQwg5TC38Z7uLWUV1vavpLLbjJtKubR1A==", "dev": true, + "license": "MIT" + }, + "node_modules/@emnapi/runtime": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.2.tgz", + "integrity": "sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==", + "dev": true, + "license": "MIT", + "optional": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-remap-async-to-generator": "^7.27.1", - "@babel/traverse": "^7.29.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "tslib": "^2.4.0" } }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.28.6.tgz", - "integrity": "sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g==", + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz", + "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==", + "cpu": [ + "ppc64" + ], "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-remap-async-to-generator": "^7.27.1" - }, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", - "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", + "node_modules/@esbuild/android-arm": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz", + "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.6.tgz", - "integrity": "sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.28.6.tgz", - "integrity": "sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.6.tgz", - "integrity": "sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.6.tgz", - "integrity": "sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-globals": "^7.28.0", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-replace-supers": "^7.28.6", - "@babel/traverse": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.28.6.tgz", - "integrity": "sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/template": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz", - "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.28.6.tgz", - "integrity": "sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", - "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.0.tgz", - "integrity": "sha512-zBPcW2lFGxdiD8PUnPwJjag2J9otbcLQzvbiOzDxpYXyCuYX9agOwMPGn1prVH0a4qzhCKu24rlH4c1f7yA8rw==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", - "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-explicit-resource-management": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.6.tgz", - "integrity": "sha512-Iao5Konzx2b6g7EPqTy40UZbcdXE126tTxVFr/nAIj+WItNxjKSYTEw3RC+A2/ZetmdJsgueL1KhaMCQHkLPIg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/plugin-transform-destructuring": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.6.tgz", - "integrity": "sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", - "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", - "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", - "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.28.6.tgz", - "integrity": "sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", - "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.6.tgz", - "integrity": "sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", - "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", - "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.28.6.tgz", - "integrity": "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.0.tgz", - "integrity": "sha512-PrujnVFbOdUpw4UHiVwKvKRLMMic8+eC0CuNlxjsyZUiBjhFdPsewdXCkveh2KqBA9/waD0W1b4hXSOBQJezpQ==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.29.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", - "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.0.tgz", - "integrity": "sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", - "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.28.6.tgz", - "integrity": "sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.28.6.tgz", - "integrity": "sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.6.tgz", - "integrity": "sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/plugin-transform-destructuring": "^7.28.5", - "@babel/plugin-transform-parameters": "^7.27.7", - "@babel/traverse": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", - "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.28.6.tgz", - "integrity": "sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.6.tgz", - "integrity": "sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==", + "node_modules/@esbuild/android-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz", + "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" - }, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", - "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", + "node_modules/@esbuild/android-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz", + "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.28.6.tgz", - "integrity": "sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==", + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz", + "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" - }, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.28.6.tgz", - "integrity": "sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==", + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz", + "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-create-class-features-plugin": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" - }, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", - "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz", + "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.0.tgz", - "integrity": "sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog==", + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz", + "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-regexp-modifiers": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.28.6.tgz", - "integrity": "sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg==", + "node_modules/@esbuild/linux-arm": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz", + "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", - "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz", + "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", - "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz", + "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==", + "cpu": [ + "ia32" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.28.6.tgz", - "integrity": "sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==", + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz", + "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==", + "cpu": [ + "loong64" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", - "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz", + "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==", + "cpu": [ + "mips64el" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", - "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz", + "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==", + "cpu": [ + "ppc64" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", - "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz", + "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==", + "cpu": [ + "riscv64" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", - "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz", + "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==", + "cpu": [ + "s390x" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.28.6.tgz", - "integrity": "sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A==", + "node_modules/@esbuild/linux-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz", + "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", - "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz", + "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.28.6.tgz", - "integrity": "sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q==", + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz", + "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.29.2.tgz", - "integrity": "sha512-DYD23veRYGvBFhcTY1iUvJnDNpuqNd/BzBwCvzOTKUnJjKg5kpUBh3/u9585Agdkgj+QuygG7jLfOPWMa2KVNw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.29.0", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.6", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-import-assertions": "^7.28.6", - "@babel/plugin-syntax-import-attributes": "^7.28.6", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.27.1", - "@babel/plugin-transform-async-generator-functions": "^7.29.0", - "@babel/plugin-transform-async-to-generator": "^7.28.6", - "@babel/plugin-transform-block-scoped-functions": "^7.27.1", - "@babel/plugin-transform-block-scoping": "^7.28.6", - "@babel/plugin-transform-class-properties": "^7.28.6", - "@babel/plugin-transform-class-static-block": "^7.28.6", - "@babel/plugin-transform-classes": "^7.28.6", - "@babel/plugin-transform-computed-properties": "^7.28.6", - "@babel/plugin-transform-destructuring": "^7.28.5", - "@babel/plugin-transform-dotall-regex": "^7.28.6", - "@babel/plugin-transform-duplicate-keys": "^7.27.1", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.29.0", - "@babel/plugin-transform-dynamic-import": "^7.27.1", - "@babel/plugin-transform-explicit-resource-management": "^7.28.6", - "@babel/plugin-transform-exponentiation-operator": "^7.28.6", - "@babel/plugin-transform-export-namespace-from": "^7.27.1", - "@babel/plugin-transform-for-of": "^7.27.1", - "@babel/plugin-transform-function-name": "^7.27.1", - "@babel/plugin-transform-json-strings": "^7.28.6", - "@babel/plugin-transform-literals": "^7.27.1", - "@babel/plugin-transform-logical-assignment-operators": "^7.28.6", - "@babel/plugin-transform-member-expression-literals": "^7.27.1", - "@babel/plugin-transform-modules-amd": "^7.27.1", - "@babel/plugin-transform-modules-commonjs": "^7.28.6", - "@babel/plugin-transform-modules-systemjs": "^7.29.0", - "@babel/plugin-transform-modules-umd": "^7.27.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.29.0", - "@babel/plugin-transform-new-target": "^7.27.1", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.28.6", - "@babel/plugin-transform-numeric-separator": "^7.28.6", - "@babel/plugin-transform-object-rest-spread": "^7.28.6", - "@babel/plugin-transform-object-super": "^7.27.1", - "@babel/plugin-transform-optional-catch-binding": "^7.28.6", - "@babel/plugin-transform-optional-chaining": "^7.28.6", - "@babel/plugin-transform-parameters": "^7.27.7", - "@babel/plugin-transform-private-methods": "^7.28.6", - "@babel/plugin-transform-private-property-in-object": "^7.28.6", - "@babel/plugin-transform-property-literals": "^7.27.1", - "@babel/plugin-transform-regenerator": "^7.29.0", - "@babel/plugin-transform-regexp-modifiers": "^7.28.6", - "@babel/plugin-transform-reserved-words": "^7.27.1", - "@babel/plugin-transform-shorthand-properties": "^7.27.1", - "@babel/plugin-transform-spread": "^7.28.6", - "@babel/plugin-transform-sticky-regex": "^7.27.1", - "@babel/plugin-transform-template-literals": "^7.27.1", - "@babel/plugin-transform-typeof-symbol": "^7.27.1", - "@babel/plugin-transform-unicode-escapes": "^7.27.1", - "@babel/plugin-transform-unicode-property-regex": "^7.28.6", - "@babel/plugin-transform-unicode-regex": "^7.27.1", - "@babel/plugin-transform-unicode-sets-regex": "^7.28.6", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.15", - "babel-plugin-polyfill-corejs3": "^0.14.0", - "babel-plugin-polyfill-regenerator": "^0.6.6", - "core-js-compat": "^3.48.0", - "semver": "^6.3.1" - }, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz", + "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/template": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", - "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz", + "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6" - }, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@babel/traverse": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", - "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz", + "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0", - "debug": "^4.3.1" - }, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@babel/types": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", - "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz", + "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" - }, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@emnapi/runtime": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.2.tgz", - "integrity": "sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==", + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz", + "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", "optional": true, - "dependencies": { - "tslib": "^2.4.0" + "os": [ + "win32" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@gulpjs/messages": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@gulpjs/messages/-/messages-1.1.0.tgz", - "integrity": "sha512-Ys9sazDatyTgZVb4xPlDufLweJ/Os2uHWOv+Caxvy2O85JcnT4M3vc73bi8pdLWlv3fdWQz3pdI9tVwo8rQQSg==", + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz", + "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==", + "cpu": [ + "ia32" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=10.13.0" + "node": ">=18" } }, - "node_modules/@gulpjs/to-absolute-glob": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@gulpjs/to-absolute-glob/-/to-absolute-glob-4.0.0.tgz", - "integrity": "sha512-kjotm7XJrJ6v+7knhPaRgaT6q8F8K2jiafwYdNHLzmV0uGLuZY43FK6smNSHUPrhq5kX2slCUy+RGG/xGqmIKA==", + "node_modules/@esbuild/win32-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz", + "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "is-negated-glob": "^1.0.0" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=10.13.0" + "node": ">=18" } }, "node_modules/@img/colour": { @@ -1488,6 +841,7 @@ "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", "dev": true, "license": "MIT", + "optional": true, "engines": { "node": ">=18" } @@ -1972,420 +1326,696 @@ "url": "https://opencollective.com/libvips" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true + }, + "node_modules/@oslojs/encoding": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@oslojs/encoding/-/encoding-1.1.0.tgz", + "integrity": "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==", "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } + "license": "MIT" }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "node_modules/@rollup/pluginutils": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.2.tgz", + "integrity": "sha512-dnlp69efPPg6Uaw2dVqzWRfAWRnYVb1XJ8CyyhIbZeaq4CA5/mLeZ1IEt9QqQxmbdvagjLIm2ZL8BxXv5lH4Yw==", + "cpu": [ + "arm" + ], "dev": true, - "engines": { - "node": ">=6.0.0" - } + "license": "MIT", + "optional": true, + "os": [ + "android" + ] }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.11", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", - "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.2.tgz", + "integrity": "sha512-OqZTwDRDchGRHHm/hwLOL7uVPB9aUvI0am/eQuWMNyFHf5PSEQmyEeYYheA0EPPKUO/l0uigCp+iaTjoLjVoHg==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } + "optional": true, + "os": [ + "android" + ] }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.2.tgz", + "integrity": "sha512-UwRE7CGpvSVEQS8gUMBe1uADWjNnVgP3Iusyda1nSRwNDCsRjnGc7w6El6WLQsXmZTbLZx9cecegumcitNfpmA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.2.tgz", + "integrity": "sha512-gjEtURKLCC5VXm1I+2i1u9OhxFsKAQJKTVB8WvDAHF+oZlq0GTVFOlTlO1q3AlCTE/DF32c16ESvfgqR7343/g==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/@parcel/watcher": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.6.tgz", - "integrity": "sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==", + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.2.tgz", + "integrity": "sha512-Bcl6CYDeAgE70cqZaMojOi/eK63h5Me97ZqAQoh77VPjMysA/4ORQBRGo3rRy45x4MzVlU9uZxs8Uwy7ZaKnBw==", + "cpu": [ + "arm64" + ], "dev": true, - "hasInstallScript": true, + "license": "MIT", "optional": true, - "dependencies": { - "detect-libc": "^2.0.3", - "is-glob": "^4.0.3", - "node-addon-api": "^7.0.0", - "picomatch": "^4.0.3" - }, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.5.6", - "@parcel/watcher-darwin-arm64": "2.5.6", - "@parcel/watcher-darwin-x64": "2.5.6", - "@parcel/watcher-freebsd-x64": "2.5.6", - "@parcel/watcher-linux-arm-glibc": "2.5.6", - "@parcel/watcher-linux-arm-musl": "2.5.6", - "@parcel/watcher-linux-arm64-glibc": "2.5.6", - "@parcel/watcher-linux-arm64-musl": "2.5.6", - "@parcel/watcher-linux-x64-glibc": "2.5.6", - "@parcel/watcher-linux-x64-musl": "2.5.6", - "@parcel/watcher-win32-arm64": "2.5.6", - "@parcel/watcher-win32-ia32": "2.5.6", - "@parcel/watcher-win32-x64": "2.5.6" - } - }, - "node_modules/@parcel/watcher-android-arm64": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.6.tgz", - "integrity": "sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==", + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.2.tgz", + "integrity": "sha512-LU+TPda3mAE2QB0/Hp5VyeKJivpC6+tlOXd1VMoXV/YFMvk/MNk5iXeBfB4MQGRWyOYVJ01625vjkr0Az98OJQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.2.tgz", + "integrity": "sha512-2QxQrM+KQ7DAW4o22j+XZ6RKdxjLD7BOWTP0Bv0tmjdyhXSsr2Ul1oJDQqh9Zf5qOwTuTc7Ek83mOFaKnodPjg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.2.tgz", + "integrity": "sha512-TbziEu2DVsTEOPif2mKWkMeDMLoYjx95oESa9fkQQK7r/Orta0gnkcDpzwufEcAO2BLBsD7mZkXGFqEdMRRwfw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.2.tgz", + "integrity": "sha512-bO/rVDiDUuM2YfuCUwZ1t1cP+/yqjqz+Xf2VtkdppefuOFS2OSeAfgafaHNkFn0t02hEyXngZkxtGqXcXwO8Rg==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ - "android" + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.2.tgz", + "integrity": "sha512-hr26p7e93Rl0Za+JwW7EAnwAvKkehh12BU1Llm9Ykiibg4uIr2rbpxG9WCf56GuvidlTG9KiiQT/TXT1yAWxTA==", + "cpu": [ + "arm64" ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.2.tgz", + "integrity": "sha512-pOjB/uSIyDt+ow3k/RcLvUAOGpysT2phDn7TTUB3n75SlIgZzM6NKAqlErPhoFU+npgY3/n+2HYIQVbF70P9/A==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.2.tgz", + "integrity": "sha512-2/w+q8jszv9Ww1c+6uJT3OwqhdmGP2/4T17cu8WuwyUuuaCDDJ2ojdyYwZzCxx0GcsZBhzi3HmH+J5pZNXnd+Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.6.tgz", - "integrity": "sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==", + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.2.tgz", + "integrity": "sha512-11+aL5vKheYgczxtPVVRhdptAM2H7fcDR5Gw4/bTcteuZBlH4oP9f5s9zYO9aGZvoGeBpqXI/9TZZihZ609wKw==", "cpu": [ - "arm64" + "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } + "linux" + ] }, - "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.6.tgz", - "integrity": "sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==", + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.2.tgz", + "integrity": "sha512-i16fokAGK46IVZuV8LIIwMdtqhin9hfYkCh8pf8iC3QU3LpwL+1FSFGej+O7l3E/AoknL6Dclh2oTdnRMpTzFQ==", "cpu": [ - "x64" + "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } + "linux" + ] }, - "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.6.tgz", - "integrity": "sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==", + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.2.tgz", + "integrity": "sha512-49FkKS6RGQoriDSK/6E2GkAsAuU5kETFCh7pG4yD/ylj9rKhTmO3elsnmBvRD4PgJPds5W2PkhC82aVwmUcJ7A==", "cpu": [ - "x64" + "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } + "linux" + ] }, - "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.6.tgz", - "integrity": "sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==", + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.2.tgz", + "integrity": "sha512-mjYNkHPfGpUR00DuM1ZZIgs64Hpf4bWcz9Z41+4Q+pgDx73UwWdAYyf6EG/lRFldmdHHzgrYyge5akFUW0D3mQ==", "cpu": [ - "arm" + "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } + ] }, - "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.6.tgz", - "integrity": "sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==", + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.2.tgz", + "integrity": "sha512-ALyvJz965BQk8E9Al/JDKKDLH2kfKFLTGMlgkAbbYtZuJt9LU8DW3ZoDMCtQpXAltZxwBHevXz5u+gf0yA0YoA==", "cpu": [ - "arm" + "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } + ] }, - "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.6.tgz", - "integrity": "sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==", + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.2.tgz", + "integrity": "sha512-UQjrkIdWrKI626Du8lCQ6MJp/6V1LAo2bOK9OTu4mSn8GGXIkPXk/Vsp4bLHCd9Z9Iz2OTEaokUE90VweJgIYQ==", "cpu": [ - "arm64" + "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } + ] }, - "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.6.tgz", - "integrity": "sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==", + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.2.tgz", + "integrity": "sha512-bTsRGj6VlSdn/XD4CGyzMnzaBs9bsRxy79eTqTCBsA8TMIEky7qg48aPkvJvFe1HyzQ5oMZdg7AnVlWQSKLTnw==", "cpu": [ - "arm64" + "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } + ] }, - "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.6.tgz", - "integrity": "sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==", + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.2.tgz", + "integrity": "sha512-6d4Z3534xitaA1FcMWP7mQPq5zGwBmGbhphh2DwaA1aNIXUu3KTOfwrWpbwI4/Gr0uANo7NTtaykFyO2hPuFLg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } + "openbsd" + ] }, - "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.6.tgz", - "integrity": "sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==", + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.2.tgz", + "integrity": "sha512-NetAg5iO2uN7eB8zE5qrZ3CSil+7IJt4WDFLcC75Ymywq1VZVD6qJ6EvNLjZ3rEm6gB7XW5JdT60c6MN35Z85Q==", "cpu": [ - "x64" + "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } + "openharmony" + ] }, - "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.6.tgz", - "integrity": "sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==", + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.2.tgz", + "integrity": "sha512-NCYhOotpgWZ5kdxCZsv6Iudx0wX8980Q/oW4pNFNihpBKsDbEA1zpkfxJGC0yugsUuyDZ7gL37dbzwhR0VI7pQ==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } + ] }, - "node_modules/@parcel/watcher-win32-ia32": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.6.tgz", - "integrity": "sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==", + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.2.tgz", + "integrity": "sha512-RXsaOqXxfoUBQoOgvmmijVxJnW2IGB0eoMO7F8FAjaj0UTywUO/luSqimWBJn04WNgUkeNhh7fs7pESXajWmkg==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } + ] }, - "node_modules/@parcel/watcher-win32-x64": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.6.tgz", - "integrity": "sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==", + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.2.tgz", + "integrity": "sha512-qdAzEULD+/hzObedtmV6iBpdL5TIbKVztGiK7O3/KYSf+HIzU257+MX1EXJcyIiDbMAqmbwaufcYPvyRryeZtA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.2.tgz", + "integrity": "sha512-Nd/SgG27WoA9e+/TdK74KnHz852TLa94ovOYySo/yMPuTmpckK/jIF2jSwS3g7ELSKXK13/cVdmg1Z/DaCWKxA==", + "cpu": [ + "x64" ], - "engines": { - "node": ">= 10.0.0" + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@shikijs/core": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-4.0.2.tgz", + "integrity": "sha512-hxT0YF4ExEqB8G/qFdtJvpmHXBYJ2lWW7qTHDarVkIudPFE6iCIrqdgWxGn5s+ppkGXI0aEGlibI0PAyzP3zlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/primitive": "4.0.2", + "@shikijs/types": "4.0.2", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.5" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "engines": { + "node": ">=20" } }, - "node_modules/@types/expect": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/@types/expect/-/expect-1.20.4.tgz", - "integrity": "sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==", + "node_modules/@shikijs/engine-javascript": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-4.0.2.tgz", + "integrity": "sha512-7PW0Nm49DcoUIQEXlJhNNBHyoGMjalRETTCcjMqEaMoJRLljy1Bi/EGV3/qLBgLKQejdspiiYuHGQW6dX94Nag==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.0.2", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^4.3.4" + }, + "engines": { + "node": ">=20" + } }, - "node_modules/@types/node": { - "version": "25.6.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.6.0.tgz", - "integrity": "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==", + "node_modules/@shikijs/engine-oniguruma": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.0.2.tgz", + "integrity": "sha512-UpCB9Y2sUKlS9z8juFSKz7ZtysmeXCgnRF0dlhXBkmQnek7lAToPte8DkxmEYGNTMii72zU/lyXiCB6StuZeJg==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~7.19.0" + "@shikijs/types": "4.0.2", + "@shikijs/vscode-textmate": "^10.0.2" + }, + "engines": { + "node": ">=20" } }, - "node_modules/@types/vinyl": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@types/vinyl/-/vinyl-2.0.12.tgz", - "integrity": "sha512-Sr2fYMBUVGYq8kj3UthXFAu5UN6ZW+rYr4NACjZQJvHvj+c8lYv0CahmZ2P/r7iUkN44gGUBwqxZkrKXYPb7cw==", + "node_modules/@shikijs/langs": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.0.2.tgz", + "integrity": "sha512-KaXby5dvoeuZzN0rYQiPMjFoUrz4hgwIE+D6Du9owcHcl6/g16/yT5BQxSW5cGt2MZBz6Hl0YuRqf12omRfUUg==", "dev": true, "license": "MIT", "dependencies": { - "@types/expect": "^1.20.4", - "@types/node": "*" + "@shikijs/types": "4.0.2" + }, + "engines": { + "node": ">=20" } }, - "node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "node_modules/@shikijs/primitive": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/primitive/-/primitive-4.0.2.tgz", + "integrity": "sha512-M6UMPrSa3fN5ayeJwFVl9qWofl273wtK1VG8ySDZ1mQBfhCpdd8nEx7nPZ/tk7k+TYcpqBZzj/AnwxT9lO+HJw==", "dev": true, - "bin": { - "acorn": "bin/acorn" + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.0.2", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" }, "engines": { - "node": ">=0.4.0" + "node": ">=20" } }, - "node_modules/ansi-colors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", - "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "node_modules/@shikijs/themes": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.0.2.tgz", + "integrity": "sha512-mjCafwt8lJJaVSsQvNVrJumbnnj1RI8jbUKrPKgE6E3OvQKxnuRoBaYC51H4IGHePsGN/QtALglWBU7DoKDFnA==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-wrap": "^0.1.0" + "@shikijs/types": "4.0.2" }, "engines": { - "node": ">=0.10.0" + "node": ">=20" } }, - "node_modules/ansi-gray": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", - "integrity": "sha512-HrgGIZUl8h2EHuZaU9hTR/cU5nhKxpVE1V6kdGsQ8e4zirElJ5fvtfc8N7Q1oq1aatO275i8pUFUCpNWCAnVWw==", + "node_modules/@shikijs/types": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.0.2.tgz", + "integrity": "sha512-qzbeRooUTPnLE+sHD/Z8DStmaDgnbbc/pMrU203950aRqjX/6AFHeDYT+j00y2lPdz0ywJKx7o/7qnqTivtlXg==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-wrap": "0.1.0" + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" }, "engines": { - "node": ">=0.10.0" + "node": ">=20" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/debug": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", + "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/nlcst": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/nlcst/-/nlcst-2.0.3.tgz", + "integrity": "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "dev": true, + "license": "ISC" + }, + "node_modules/@volar/kit": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/kit/-/kit-2.4.28.tgz", + "integrity": "sha512-cKX4vK9dtZvDRaAzeoUdaAJEew6IdxHNCRrdp5Kvcl6zZOqb6jTOfk3kXkIkG3T7oTFXguEMt5+9ptyqYR84Pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-service": "2.4.28", + "@volar/typescript": "2.4.28", + "typesafe-path": "^0.2.2", + "vscode-languageserver-textdocument": "^1.0.11", + "vscode-uri": "^3.0.8" + }, + "peerDependencies": { + "typescript": "*" + } + }, + "node_modules/@volar/language-core": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.28.tgz", + "integrity": "sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/source-map": "2.4.28" + } + }, + "node_modules/@volar/language-server": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/language-server/-/language-server-2.4.28.tgz", + "integrity": "sha512-NqcLnE5gERKuS4PUFwlhMxf6vqYo7hXtbMFbViXcbVkbZ905AIVWhnSo0ZNBC2V127H1/2zP7RvVOVnyITFfBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.28", + "@volar/language-service": "2.4.28", + "@volar/typescript": "2.4.28", + "path-browserify": "^1.0.1", + "request-light": "^0.7.0", + "vscode-languageserver": "^9.0.1", + "vscode-languageserver-protocol": "^3.17.5", + "vscode-languageserver-textdocument": "^1.0.11", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@volar/language-service": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/language-service/-/language-service-2.4.28.tgz", + "integrity": "sha512-Rh/wYCZJrI5vCwMk9xyw/Z+MsWxlJY1rmMZPsxUoJKfzIRjS/NF1NmnuEcrMbEVGja00aVpCsInJfixQTMdvLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.28", + "vscode-languageserver-protocol": "^3.17.5", + "vscode-languageserver-textdocument": "^1.0.11", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@volar/source-map": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.28.tgz", + "integrity": "sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@volar/typescript": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.28.tgz", + "integrity": "sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.28", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vscode/emmet-helper": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@vscode/emmet-helper/-/emmet-helper-2.11.0.tgz", + "integrity": "sha512-QLxjQR3imPZPQltfbWRnHU6JecWTF1QSWhx3GAKQpslx7y3Dp6sIIXhKjiUJ/BR9FX8PVthjr9PD6pNwOJfAzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "emmet": "^2.4.3", + "jsonc-parser": "^2.3.0", + "vscode-languageserver-textdocument": "^1.0.1", + "vscode-languageserver-types": "^3.15.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vscode/l10n": { + "version": "0.0.18", + "resolved": "https://registry.npmjs.org/@vscode/l10n/-/l10n-0.0.18.tgz", + "integrity": "sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-draft-04": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", + "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^8.5.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, "node_modules/ansi-regex": { @@ -2414,15 +2044,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/ansi-wrap": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha512-ZyznvL8k/FZeQHr2T6LzcJ/+vBApDnMNZvfVFy3At0knswWd6rJ3/0Hhmpu8oqa6C92npmozs890sX9Dl6q+Qw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -2457,467 +2078,231 @@ "dev": true, "license": "Python-2.0" }, - "node_modules/arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-slice": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", - "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "dev": true - }, - "node_modules/assert-never": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/assert-never/-/assert-never-1.4.0.tgz", - "integrity": "sha512-5oJg84os6NMQNl27T9LnZkvvqzvAnHu03ShCnoj6bsJwS7L8AO4lf+C/XjK/nvzEqQB744moC6V128RucQd1jA==", - "dev": true - }, - "node_modules/assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, - "node_modules/async-done": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/async-done/-/async-done-2.0.0.tgz", - "integrity": "sha512-j0s3bzYq9yKIVLKGE/tWlCpa3PfFLcrDZLTSVdnnCTGagXuXBJO4SsY9Xdk/fQBirCkH4evW5xOeJXqlAQFdsw==", + "node_modules/array-iterate": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-2.0.1.tgz", + "integrity": "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==", "dev": true, "license": "MIT", - "dependencies": { - "end-of-stream": "^1.4.4", - "once": "^1.4.0", - "stream-exhaust": "^1.0.2" - }, - "engines": { - "node": ">= 10.13.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/async-settle": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-2.0.0.tgz", - "integrity": "sha512-Obu/KE8FurfQRN6ODdHN9LuXqwC+JFIM9NRyZqJJ4ZfLJmIYN9Rg0/kb+wF70VV5+fJusTMQlJ1t5rF7J/ETdg==", + "node_modules/astro": { + "version": "6.1.9", + "resolved": "https://registry.npmjs.org/astro/-/astro-6.1.9.tgz", + "integrity": "sha512-NsAHzMzpznB281g2aM5qnBt2QjfH6ttKiZ3hSZw52If8JJ+62kbnBKbyKhR2glQcJLl7Jfe4GSl0DihFZ36rRQ==", "dev": true, "license": "MIT", "dependencies": { - "async-done": "^2.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.27", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.27.tgz", - "integrity": "sha512-NP9APE+tO+LuJGn7/9+cohklunJsXWiaWEfV3si4Gi/XHDwVNgkwr1J3RQYFIvPy76GmJ9/bW8vyoU1LcxwKHA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "browserslist": "^4.28.1", - "caniuse-lite": "^1.0.30001774", - "fraction.js": "^5.3.4", - "picocolors": "^1.1.1", - "postcss-value-parser": "^4.2.0" + "@astrojs/compiler": "^3.0.1", + "@astrojs/internal-helpers": "0.9.0", + "@astrojs/markdown-remark": "7.1.1", + "@astrojs/telemetry": "3.3.1", + "@capsizecss/unpack": "^4.0.0", + "@clack/prompts": "^1.1.0", + "@oslojs/encoding": "^1.1.0", + "@rollup/pluginutils": "^5.3.0", + "aria-query": "^5.3.2", + "axobject-query": "^4.1.0", + "ci-info": "^4.4.0", + "clsx": "^2.1.1", + "common-ancestor-path": "^2.0.0", + "cookie": "^1.1.1", + "devalue": "^5.6.3", + "diff": "^8.0.3", + "dset": "^3.1.4", + "es-module-lexer": "^2.0.0", + "esbuild": "^0.27.3", + "flattie": "^1.1.1", + "fontace": "~0.4.1", + "github-slugger": "^2.0.0", + "html-escaper": "3.0.3", + "http-cache-semantics": "^4.2.0", + "js-yaml": "^4.1.1", + "magic-string": "^0.30.21", + "magicast": "^0.5.2", + "mrmime": "^2.0.1", + "neotraverse": "^0.6.18", + "obug": "^2.1.1", + "p-limit": "^7.3.0", + "p-queue": "^9.1.0", + "package-manager-detector": "^1.6.0", + "piccolore": "^0.1.3", + "picomatch": "^4.0.4", + "rehype": "^13.0.2", + "semver": "^7.7.4", + "shiki": "^4.0.2", + "smol-toml": "^1.6.0", + "svgo": "^4.0.1", + "tinyclip": "^0.1.12", + "tinyexec": "^1.0.4", + "tinyglobby": "^0.2.15", + "tsconfck": "^3.1.6", + "ultrahtml": "^1.6.0", + "unifont": "~0.7.4", + "unist-util-visit": "^5.1.0", + "unstorage": "^1.17.5", + "vfile": "^6.0.3", + "vite": "^7.3.2", + "vitefu": "^1.1.2", + "xxhash-wasm": "^1.1.0", + "yargs-parser": "^22.0.0", + "zod": "^4.3.6" }, "bin": { - "autoprefixer": "bin/autoprefixer" + "astro": "bin/astro.mjs" }, "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/b4a": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.0.tgz", - "integrity": "sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==", - "dev": true, - "license": "Apache-2.0", - "peerDependencies": { - "react-native-b4a": "*" - }, - "peerDependenciesMeta": { - "react-native-b4a": { - "optional": true - } - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.16", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.16.tgz", - "integrity": "sha512-xaVwwSfebXf0ooE11BJovZYKhFjIvQo7TsyVpETuIeH2JHv0k/T6Y5j22pPTvqYqmpkxdlPAJlyJ0tfOJAoMxw==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-define-polyfill-provider": "^0.6.7", - "semver": "^6.3.1" + "node": ">=22.12.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0" }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.1.tgz", - "integrity": "sha512-ENp89vM9Pw4kv/koBb5N2f9bDZsR0hpf3BdPMOg/pkS3pwO4dzNnQZVXtBbeyAadgm865DmQG2jMMLqmZXvuCw==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.7", - "core-js-compat": "^3.48.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/astrodotbuild" }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + "optionalDependencies": { + "sharp": "^0.34.0" } }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.7.tgz", - "integrity": "sha512-OTYbUlSwXhNgr4g6efMZgsO8//jA61P7ZbRX3iTT53VON8l+WQS8IAUEVo4a4cWknrg2W8Cj4gQhRYNCJ8GkAA==", + "node_modules/astro/node_modules/@astrojs/compiler": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-3.0.1.tgz", + "integrity": "sha512-z97oYbdebO5aoWzuJ/8q5hLK232+17KcLZ7cJ8BCWk6+qNzVxn/gftC0KzMBUTD8WAaBkPpNSQK6PXLnNrZ0CA==", "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.7" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } + "license": "MIT" }, - "node_modules/babel-walk": { - "version": "3.0.0-canary-5", - "resolved": "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0-canary-5.tgz", - "integrity": "sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==", + "node_modules/astro/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, - "dependencies": { - "@babel/types": "^7.9.6" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">= 10.0.0" + "node": ">=10" } }, - "node_modules/bach": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/bach/-/bach-2.0.1.tgz", - "integrity": "sha512-A7bvGMGiTOxGMpNupYl9HQTf0FFDNF4VCmks4PJpFyN1AX2pdKuxuwdvUz2Hu388wcgp+OvGFNsumBfFNkR7eg==", + "node_modules/astro/node_modules/yargs-parser": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", "dev": true, - "license": "MIT", - "dependencies": { - "async-done": "^2.0.0", - "async-settle": "^2.0.0", - "now-and-later": "^3.0.0" - }, + "license": "ISC", "engines": { - "node": ">=10.13.0" + "node": "^20.19.0 || ^22.12.0 || >=23" } }, - "node_modules/bare-events": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz", - "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==", + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", "dev": true, "license": "Apache-2.0", - "peerDependencies": { - "bare-abort-controller": "*" - }, - "peerDependenciesMeta": { - "bare-abort-controller": { - "optional": true - } - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/baseline-browser-mapping": { - "version": "2.10.7", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.7.tgz", - "integrity": "sha512-1ghYO3HnxGec0TCGBXiDLVns4eCSx4zJpxnHrlqFQajmhfKMQBzUGDdkMK7fUW7PTHTeLf+j87aTuKuuwWzMGw==", - "dev": true, - "bin": { - "baseline-browser-mapping": "dist/cli.cjs" - }, "engines": { - "node": ">=6.0.0" + "node": ">= 0.4" } }, - "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==", + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" - }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "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==", + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true, + "license": "ISC" + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", "dev": true, "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/browserslist": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", - "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", "dev": true, - "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" - } - ], - "dependencies": { - "baseline-browser-mapping": "^2.9.0", - "caniuse-lite": "^1.0.30001759", - "electron-to-chromium": "^1.5.263", - "node-releases": "^2.0.27", - "update-browserslist-db": "^1.2.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", "dev": true, - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", "dev": true, - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, + "license": "MIT", "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001778", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001778.tgz", - "integrity": "sha512-PN7uxFL+ExFJO61aVmP1aIEG4i9whQd4eoSCebav62UwDyp5OHh06zN4jqKSMePVgxHifCw1QJxdRkA1Pisekg==", + "node_modules/ci-info": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", "dev": true, "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" + "url": "https://github.com/sponsors/sibiraj-s" } - ] - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, + ], "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/character-parser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz", - "integrity": "sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==", - "dev": true, - "dependencies": { - "is-regex": "^1.0.3" + "node": ">=8" } }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", "dev": true, "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": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/clone-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", - "integrity": "sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==", - "dev": true - }, - "node_modules/cloneable-readable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", - "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "process-nextick-args": "^2.0.0", - "readable-stream": "^2.3.5" + "node": ">=6" } }, "node_modules/color-convert": { @@ -2940,79 +2325,137 @@ "dev": true, "license": "MIT" }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", "dev": true, - "bin": { - "color-support": "bin.js" + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "node_modules/common-ancestor-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-2.0.0.tgz", + "integrity": "sha512-dnN3ibLeoRf2HNC+OlCiNc5d2zxbLJXOtiZUudNFSXZrNSydxcCsSpRzXwfu7BBWCIfHPw+xTayeBvJCP/D8Ng==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">= 18" + } }, - "node_modules/constantinople": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-4.0.1.tgz", - "integrity": "sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==", + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cookie-es": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.2.3.tgz", + "integrity": "sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==", + "dev": true, + "license": "MIT" + }, + "node_modules/crossws": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.3.5.tgz", + "integrity": "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/parser": "^7.6.0", - "@babel/types": "^7.6.1" + "uncrypto": "^0.1.3" } }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true + "node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } }, - "node_modules/copy-props": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-4.0.0.tgz", - "integrity": "sha512-bVWtw1wQLzzKiYROtvNlbJgxgBYt2bMJpkCbKmXM3xyijvcjjWXEk5nyrrT3bgJ7ODb19ZohE2T0Y3FgNPyoTw==", + "node_modules/css-tree": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", "dev": true, "license": "MIT", "dependencies": { - "each-props": "^3.0.0", - "is-plain-object": "^5.0.0" + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" }, "engines": { - "node": ">= 10.13.0" + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" } }, - "node_modules/copy-props/node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", "dev": true, "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, "engines": { - "node": ">=0.10.0" + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" } }, - "node_modules/core-js-compat": { - "version": "3.48.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.48.0.tgz", - "integrity": "sha512-OM4cAF3D6VtH/WkLtWvyNC56EZVXsZdU3iqaMG2B4WvYrlqU831pc4UtG5yp0sE9z8Y02wVN7PjW5Zf9Gt0f1Q==", + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", "dev": true, + "license": "MIT", "dependencies": { - "browserslist": "^4.28.1" + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" } }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "dev": true, + "license": "CC0-1.0" }, "node_modules/debug": { "version": "4.4.3", @@ -3031,87 +2474,177 @@ } } }, - "node_modules/detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", + "node_modules/decode-named-character-reference": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", + "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/defu": { + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz", + "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, + "node_modules/destr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", + "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", + "dev": true, + "license": "MIT" + }, "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==", "dev": true, + "optional": true, "engines": { "node": ">=8" } }, - "node_modules/doctypes": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", - "integrity": "sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==", - "dev": true + "node_modules/devalue": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.7.1.tgz", + "integrity": "sha512-MUbZ586EgQqdRnC4yDrlod3BEdyvE4TapGYHMW2CiaW+KkkFmWEFqBUaLltEZCGi0iFXCEjRF0OjF0DV2QHjOA==", + "dev": true, + "license": "MIT" }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" + "dequal": "^2.0.0" }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/diff": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.4.tgz", + "integrity": "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==", + "dev": true, + "license": "BSD-3-Clause", "engines": { - "node": ">= 0.4" + "node": ">=0.3.1" } }, - "node_modules/each-props": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/each-props/-/each-props-3.0.0.tgz", - "integrity": "sha512-IYf1hpuWrdzse/s/YJOrFmU15lyhSzxelNVAHTEG3DtP4QsLTWZUzcUL3HMXmKQxXpa4EIrBPpwRgj0aehdvAw==", + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true, + "license": "MIT" + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dev": true, "license": "MIT", "dependencies": { - "is-plain-object": "^5.0.0", - "object.defaults": "^1.1.0" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" }, - "engines": { - "node": ">= 10.13.0" + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, - "node_modules/each-props/node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "dev": true, - "license": "MIT", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" } }, - "node_modules/easy-transform-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/easy-transform-stream/-/easy-transform-stream-1.0.1.tgz", - "integrity": "sha512-ktkaa6XR7COAR3oj02CF3IOgz2m1hCaY3SfzvKT4Svt2MhHw9XCt+ncJNWfe2TGz31iqzNGZ8spdKQflj+Rlog==", + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.16" + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/fb55/domutils?sponsor=1" } }, - "node_modules/electron-to-chromium": { - "version": "1.5.313", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.313.tgz", - "integrity": "sha512-QBMrTWEf00GXZmJyx2lbYD45jpI3TUFnNIzJ5BBc8piGUDwMPa1GV6HJWTZVvY/eiN3fSopl7NRbgGp9sZ9LTA==", - "dev": true + "node_modules/dset": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.4.tgz", + "integrity": "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/emmet": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/emmet/-/emmet-2.4.11.tgz", + "integrity": "sha512-23QPJB3moh/U9sT4rQzGgeyyGIrcM+GH5uVYg2C6wZIxAIJq7Ng3QLT79tl8FUwDXhyq9SusfknOrofAKqvgyQ==", + "dev": true, + "license": "MIT", + "workspaces": [ + "./packages/scanner", + "./packages/abbreviation", + "./packages/css-abbreviation", + "./" + ], + "dependencies": { + "@emmetio/abbreviation": "^2.3.3", + "@emmetio/css-abbreviation": "^2.1.8" + } }, "node_modules/emoji-regex": { "version": "8.0.0", @@ -3120,15 +2653,6 @@ "dev": true, "license": "MIT" }, - "node_modules/end-of-stream": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", - "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", - "dev": true, - "dependencies": { - "once": "^1.4.0" - } - }, "node_modules/entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", @@ -3142,34 +2666,53 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "node_modules/es-module-lexer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", + "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", "dev": true, - "engines": { - "node": ">= 0.4" - } + "license": "MIT" }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "node_modules/esbuild": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz", + "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==", "dev": true, - "dependencies": { - "es-errors": "^1.3.0" + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" }, "engines": { - "node": ">= 0.4" + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.7", + "@esbuild/android-arm": "0.27.7", + "@esbuild/android-arm64": "0.27.7", + "@esbuild/android-x64": "0.27.7", + "@esbuild/darwin-arm64": "0.27.7", + "@esbuild/darwin-x64": "0.27.7", + "@esbuild/freebsd-arm64": "0.27.7", + "@esbuild/freebsd-x64": "0.27.7", + "@esbuild/linux-arm": "0.27.7", + "@esbuild/linux-arm64": "0.27.7", + "@esbuild/linux-ia32": "0.27.7", + "@esbuild/linux-loong64": "0.27.7", + "@esbuild/linux-mips64el": "0.27.7", + "@esbuild/linux-ppc64": "0.27.7", + "@esbuild/linux-riscv64": "0.27.7", + "@esbuild/linux-s390x": "0.27.7", + "@esbuild/linux-x64": "0.27.7", + "@esbuild/netbsd-arm64": "0.27.7", + "@esbuild/netbsd-x64": "0.27.7", + "@esbuild/openbsd-arm64": "0.27.7", + "@esbuild/openbsd-x64": "0.27.7", + "@esbuild/openharmony-arm64": "0.27.7", + "@esbuild/sunos-x64": "0.27.7", + "@esbuild/win32-arm64": "0.27.7", + "@esbuild/win32-ia32": "0.27.7", + "@esbuild/win32-x64": "0.27.7" } }, "node_modules/escalade": { @@ -3181,37 +2724,32 @@ "node": ">=6" } }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/events-universal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", - "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true, - "license": "Apache-2.0", - "dependencies": { - "bare-events": "^2.7.0" - } + "license": "MIT" }, - "node_modules/expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", "dev": true, - "license": "MIT", - "dependencies": { - "homedir-polyfill": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } + "license": "MIT" }, "node_modules/extend": { "version": "3.0.2", @@ -3220,197 +2758,106 @@ "dev": true, "license": "MIT" }, - "node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extend-shallow/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fancy-log": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", - "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", - "dev": true, - "dependencies": { - "ansi-gray": "^0.1.1", - "color-support": "^1.1.3", - "parse-node-version": "^1.0.0", - "time-stamp": "^1.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true, "license": "MIT" }, - "node_modules/fast-levenshtein": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-3.0.0.tgz", - "integrity": "sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "fastest-levenshtein": "^1.0.7" - } - }, - "node_modules/fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.9.1" - } - }, - "node_modules/fastq": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", - "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", - "dev": true, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/findup-sync": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-5.0.0.tgz", - "integrity": "sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==", + "node_modules/fast-string-truncated-width": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/fast-string-truncated-width/-/fast-string-truncated-width-1.2.1.tgz", + "integrity": "sha512-Q9acT/+Uu3GwGj+5w/zsGuQjh9O1TyywhIwAxHudtWrgF09nHOPrvTLhQevPbttcxjr/SNN7mJmfOw/B1bXgow==", "dev": true, - "license": "MIT", - "dependencies": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.3", - "micromatch": "^4.0.4", - "resolve-dir": "^1.0.1" - }, - "engines": { - "node": ">= 10.13.0" - } + "license": "MIT" }, - "node_modules/fined": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fined/-/fined-2.0.0.tgz", - "integrity": "sha512-OFRzsL6ZMHz5s0JrsEr+TpdGNCtrVtnuG3x1yzGNiQHT0yaDnXAj8V/lWcpJVrnoDpcwXcASxAZYbuXda2Y82A==", + "node_modules/fast-string-width": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-string-width/-/fast-string-width-1.1.0.tgz", + "integrity": "sha512-O3fwIVIH5gKB38QNbdg+3760ZmGz0SZMgvwJbA1b2TGXceKE6A2cOlfogh1iw8lr049zPyd7YADHy+B7U4W9bQ==", "dev": true, "license": "MIT", "dependencies": { - "expand-tilde": "^2.0.2", - "is-plain-object": "^5.0.0", - "object.defaults": "^1.1.0", - "object.pick": "^1.3.0", - "parse-filepath": "^1.0.2" - }, - "engines": { - "node": ">= 10.13.0" + "fast-string-truncated-width": "^1.2.0" } }, - "node_modules/fined/node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" }, - "node_modules/flagged-respawn": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-2.0.0.tgz", - "integrity": "sha512-Gq/a6YCi8zexmGHMuJwahTGzXlAZAOsbCVKduWXC6TlLCjjFRlExMJc4GC2NYPYZ0r/brw9P7CpRgQmlPVeOoA==", + "node_modules/fast-wrap-ansi": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/fast-wrap-ansi/-/fast-wrap-ansi-0.1.6.tgz", + "integrity": "sha512-HlUwET7a5gqjURj70D5jl7aC3Zmy4weA1SHUfM0JFI0Ptq987NH2TwbBFLoERhfwk+E+eaq4EK3jXoT+R3yp3w==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 10.13.0" + "dependencies": { + "fast-string-width": "^1.1.0" } }, - "node_modules/for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } } }, - "node_modules/for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==", + "node_modules/flattie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flattie/-/flattie-1.1.1.tgz", + "integrity": "sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==", "dev": true, "license": "MIT", - "dependencies": { - "for-in": "^1.0.1" - }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/fraction.js": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", - "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "node_modules/fontace": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/fontace/-/fontace-0.4.1.tgz", + "integrity": "sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw==", "dev": true, - "engines": { - "node": "*" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/rawify" + "license": "MIT", + "dependencies": { + "fontkitten": "^1.0.2" } }, - "node_modules/fs-mkdirp-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-2.0.1.tgz", - "integrity": "sha512-UTOY+59K6IA94tec8Wjqm0FSh5OVudGNB0NL/P6fB3HiE3bYOY3VYBGijsnOHNkQSwC1FKkU77pmq7xp9CskLw==", + "node_modules/fontkitten": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fontkitten/-/fontkitten-1.0.3.tgz", + "integrity": "sha512-Wp1zXWPVUPBmfoa3Cqc9ctaKuzKAV6uLstRqlR56kSjplf5uAce+qeyYym7F+PHbGTk+tCEdkCW6RD7DX/gBZw==", "dev": true, "license": "MIT", "dependencies": { - "graceful-fs": "^4.2.8", - "streamx": "^2.12.0" + "tiny-inflate": "^1.0.3" }, "engines": { - "node": ">=10.13.0" + "node": ">=20" } }, "node_modules/fsevents": { @@ -3428,24 +2875,6 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.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", @@ -3456,987 +2885,1268 @@ "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "node_modules/github-slugger": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", + "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", "dev": true, + "license": "ISC" + }, + "node_modules/h3": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.11.tgz", + "integrity": "sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==", + "dev": true, + "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" + "cookie-es": "^1.2.3", + "crossws": "^0.3.5", + "defu": "^6.1.6", + "destr": "^2.0.5", + "iron-webcrypto": "^1.2.1", + "node-mock-http": "^1.0.4", + "radix3": "^1.1.2", + "ufo": "^1.6.3", + "uncrypto": "^0.1.3" + } + }, + "node_modules/hast-util-from-html": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.3.tgz", + "integrity": "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "devlop": "^1.1.0", + "hast-util-from-parse5": "^8.0.0", + "parse5": "^7.0.0", + "vfile": "^6.0.0", + "vfile-message": "^4.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "node_modules/hast-util-from-parse5": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", + "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", "dev": true, + "license": "MIT", "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^9.0.0", + "property-information": "^7.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" }, - "engines": { - "node": ">= 0.4" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "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==", + "node_modules/hast-util-is-element": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", + "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "is-glob": "^4.0.1" + "@types/hast": "^3.0.0" }, - "engines": { - "node": ">= 6" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/glob-stream": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-8.0.3.tgz", - "integrity": "sha512-fqZVj22LtFJkHODT+M4N1RJQ3TjnnQhfE9GwZI8qXscYarnhpip70poMldRnP8ipQ/w0B621kOhfc53/J9bd/A==", + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", "dev": true, "license": "MIT", "dependencies": { - "@gulpjs/to-absolute-glob": "^4.0.0", - "anymatch": "^3.1.3", - "fastq": "^1.13.0", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "is-negated-glob": "^1.0.0", - "normalize-path": "^3.0.0", - "streamx": "^2.12.5" + "@types/hast": "^3.0.0" }, - "engines": { - "node": ">=10.13.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/glob-stream/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "node_modules/hast-util-raw": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", + "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "is-glob": "^4.0.3" + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" }, - "engines": { - "node": ">=10.13.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/glob-watcher": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-6.0.0.tgz", - "integrity": "sha512-wGM28Ehmcnk2NqRORXFOTOR064L4imSw3EeOqU5bIwUf62eXGwg89WivH6VMahL8zlQHeodzvHpXplrqzrz3Nw==", + "node_modules/hast-util-to-html": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", "dev": true, "license": "MIT", "dependencies": { - "async-done": "^2.0.0", - "chokidar": "^3.5.3" + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" }, - "engines": { - "node": ">= 10.13.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "node_modules/hast-util-to-parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.1.tgz", + "integrity": "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==", "dev": true, "license": "MIT", "dependencies": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "node_modules/hast-util-to-text": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz", + "integrity": "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==", "dev": true, "license": "MIT", "dependencies": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "hast-util-is-element": "^3.0.0", + "unist-util-find-after": "^5.0.0" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/glogg": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/glogg/-/glogg-2.2.0.tgz", - "integrity": "sha512-eWv1ds/zAlz+M1ioHsyKJomfY7jbDDPpwSkv14KQj89bycx1nvK5/2Cj/T9g7kzJcX5Bc7Yv22FjfBZS/jl94A==", + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", "dev": true, "license": "MIT", "dependencies": { - "sparkles": "^2.1.0" + "@types/hast": "^3.0.0" }, - "engines": { - "node": ">= 10.13.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "node_modules/hastscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", + "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", "dev": true, - "engines": { - "node": ">= 0.4" + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "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==", - "dev": true + "node_modules/html-escaper": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz", + "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==", + "dev": true, + "license": "MIT" }, - "node_modules/gulp": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/gulp/-/gulp-5.0.1.tgz", - "integrity": "sha512-PErok3DZSA5WGMd6XXV3IRNO0mlB+wW3OzhFJLEec1jSERg2j1bxJ6e5Fh6N6fn3FH2T9AP4UYNb/pYlADB9sA==", + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", "dev": true, "license": "MIT", - "dependencies": { - "glob-watcher": "^6.0.0", - "gulp-cli": "^3.1.0", - "undertaker": "^2.0.0", - "vinyl-fs": "^4.0.2" - }, - "bin": { - "gulp": "bin/gulp.js" - }, - "engines": { - "node": ">=10.13.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/gulp-autoprefixer": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/gulp-autoprefixer/-/gulp-autoprefixer-10.0.0.tgz", - "integrity": "sha512-z3cSJFGRVrK9BRY6Ld884AhPxiSrS7XnleLusQ4luYBF8ZHPz0eB4Osbrykd0BsnPwwTYpLk59C2rR6Lni/5sA==", + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/iron-webcrypto": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz", + "integrity": "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==", "dev": true, "license": "MIT", - "dependencies": { - "autoprefixer": "^10.4.21", - "gulp-plugin-extras": "^1.1.0", - "postcss": "^8.5.6", - "vinyl-sourcemaps-apply": "^0.2.1" + "funding": { + "url": "https://github.com/sponsors/brc-dd" + } + }, + "node_modules/is-docker": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-4.0.0.tgz", + "integrity": "sha512-LHE+wROyG/Y/0ZnbktRCoTix2c1RhgWaZraMZ8o1Q7zCh0VSrICJQO5oqIIISrcSBtrXv0o233w1IYwsWCjTzA==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" }, "engines": { "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" - }, - "peerDependencies": { - "gulp": ">=4" - }, - "peerDependenciesMeta": { - "gulp": { - "optional": true - } } }, - "node_modules/gulp-babel": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/gulp-babel/-/gulp-babel-8.0.0.tgz", - "integrity": "sha512-oomaIqDXxFkg7lbpBou/gnUkX51/Y/M2ZfSjL2hdqXTAlSWZcgZtd2o0cOH0r/eE8LWD0+Q/PsLsr2DKOoqToQ==", + "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==", "dev": true, - "dependencies": { - "plugin-error": "^1.0.1", - "replace-ext": "^1.0.0", - "through2": "^2.0.0", - "vinyl-sourcemaps-apply": "^0.2.0" - }, + "license": "MIT", "engines": { - "node": ">=6" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">=8" } }, - "node_modules/gulp-cli": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-3.1.0.tgz", - "integrity": "sha512-zZzwlmEsTfXcxRKiCHsdyjZZnFvXWM4v1NqBJSYbuApkvVKivjcmOS2qruAJ+PkEHLFavcDKH40DPc1+t12a9Q==", + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", "dev": true, "license": "MIT", "dependencies": { - "@gulpjs/messages": "^1.1.0", - "chalk": "^4.1.2", - "copy-props": "^4.0.0", - "gulplog": "^2.2.0", - "interpret": "^3.1.1", - "liftoff": "^5.0.1", - "mute-stdout": "^2.0.0", - "replace-homedir": "^2.0.0", - "semver-greatest-satisfied-range": "^2.0.0", - "string-width": "^4.2.3", - "v8flags": "^4.0.0", - "yargs": "^16.2.0" + "is-docker": "^3.0.0" }, "bin": { - "gulp": "bin/gulp.js" + "is-inside-container": "cli.js" }, "engines": { - "node": ">=10.13.0" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/gulp-plugin-extras": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/gulp-plugin-extras/-/gulp-plugin-extras-1.1.0.tgz", - "integrity": "sha512-T0AXOEVoKYzLIBlwEZ7LtAx2w4ExIozIoxVeYEVLFbdxI7i0sWvFDq0F8mm47djixDF3vAqDPoyGwh3Sg/PWtQ==", + "node_modules/is-inside-container/node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", "dev": true, "license": "MIT", - "dependencies": { - "@types/vinyl": "^2.0.12", - "chalk": "^5.3.0", - "easy-transform-stream": "^1.0.1" + "bin": { + "is-docker": "cli.js" }, "engines": { - "node": ">=18" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/gulp-plugin-extras/node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", "dev": true, "license": "MIT", "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" + "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/gulp-pug": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/gulp-pug/-/gulp-pug-5.0.0.tgz", - "integrity": "sha512-NPnuj9hw35s78X/6Ho0vieKT/ipa0rh8cEAq3R4RWybZ7XEFPNez0O6kcxJipOLp3U6gjglsU1yiAR28bkuFkA==", + "node_modules/is-wsl": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", "dev": true, + "license": "MIT", "dependencies": { - "fancy-log": "^1.3.3", - "plugin-error": "^1.0.1", - "pug": "^3.0.2", - "replace-ext": "^2.0.0", - "through2": "^4.0.2", - "vinyl-contents": "^1.0.0" + "is-inside-container": "^1.0.0" }, "engines": { - "node": ">=10.13.0" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/gulp-pug/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "dev": true, + "license": "MIT", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "argparse": "^2.0.1" }, - "engines": { - "node": ">= 6" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/gulp-pug/node_modules/replace-ext": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-2.0.0.tgz", - "integrity": "sha512-UszKE5KVK6JvyD92nzMn9cDapSk6w/CaFZ96CnmDMUqH9oowfxF/ZjRITD25H4DnOQClLA4/j7jLGXXLVKxAug==", + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsonc-parser": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.1.tgz", + "integrity": "sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==", + "dev": true, + "license": "MIT" + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 10" + "node": ">=6" } }, - "node_modules/gulp-pug/node_modules/through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "dev": true, + "license": "MIT", "dependencies": { - "readable-stream": "3" + "@jridgewell/sourcemap-codec": "^1.5.5" } }, - "node_modules/gulp-sass": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/gulp-sass/-/gulp-sass-6.0.1.tgz", - "integrity": "sha512-4wonidxB8lGPHvahelpGavUBJAuERSl+OIVxPCyQthK4lSJhZ/u3/qjFcyAtnMIXDl6fXTn34H4BXsN7gt54kQ==", + "node_modules/magicast": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.2.tgz", + "integrity": "sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==", "dev": true, "license": "MIT", "dependencies": { - "lodash.clonedeep": "^4.5.0", - "picocolors": "^1.0.0", - "plugin-error": "^1.0.1", - "replace-ext": "^2.0.0", - "strip-ansi": "^6.0.1", - "vinyl-sourcemaps-apply": "^0.2.1" - }, - "engines": { - "node": ">=12" + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "source-map-js": "^1.2.1" } }, - "node_modules/gulp-sass/node_modules/replace-ext": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-2.0.0.tgz", - "integrity": "sha512-UszKE5KVK6JvyD92nzMn9cDapSk6w/CaFZ96CnmDMUqH9oowfxF/ZjRITD25H4DnOQClLA4/j7jLGXXLVKxAug==", + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", "dev": true, - "engines": { - "node": ">= 10" + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/gulp-terser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/gulp-terser/-/gulp-terser-2.1.0.tgz", - "integrity": "sha512-lQ3+JUdHDVISAlUIUSZ/G9Dz/rBQHxOiYDQ70IVWFQeh4b33TC1MCIU+K18w07PS3rq/CVc34aQO4SUbdaNMPQ==", + "node_modules/mdast-util-definitions": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-6.0.0.tgz", + "integrity": "sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==", "dev": true, "license": "MIT", "dependencies": { - "plugin-error": "^1.0.1", - "terser": "^5.9.0", - "through2": "^4.0.2", - "vinyl-sourcemaps-apply": "^0.2.1" + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" }, - "engines": { - "node": ">=10" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/gulp-terser/node_modules/acorn": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", - "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", "dev": true, "license": "MIT", - "bin": { - "acorn": "bin/acorn" + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" }, - "engines": { - "node": ">=0.4.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/gulp-terser/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "node_modules/mdast-util-from-markdown": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz", + "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==", "dev": true, "license": "MIT", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" }, - "engines": { - "node": ">= 6" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/gulp-terser/node_modules/terser": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.1.tgz", - "integrity": "sha512-vzCjQO/rgUuK9sf8VJZvjqiqiHFaZLnOiimmUuOKODxWL8mm/xua7viT7aqX7dgPY60otQjUotzFMmCB4VdmqQ==", + "node_modules/mdast-util-gfm": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.15.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" }, - "bin": { - "terser": "bin/terser" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" }, - "engines": { - "node": ">=10" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/gulp-terser/node_modules/through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", "dev": true, "license": "MIT", "dependencies": { - "readable-stream": "3" + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/gulplog": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-2.2.0.tgz", - "integrity": "sha512-V2FaKiOhpR3DRXZuYdRLn/qiY0yI5XmqbTKrYbdemJ+xOh2d2MOweI/XFgMzd/9+1twdvMwllnZbWZNJ+BOm4A==", + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", "dev": true, "license": "MIT", "dependencies": { - "glogg": "^2.2.0" + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" }, - "engines": { - "node": ">= 10.13.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", "dev": true, - "engines": { - "node": ">= 0.4" + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", "dev": true, + "license": "MIT", "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", "dev": true, + "license": "MIT", "dependencies": { - "function-bind": "^1.1.2" + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" }, - "engines": { - "node": ">= 0.4" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", "dev": true, "license": "MIT", "dependencies": { - "parse-passwd": "^1.0.0" + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", "dev": true, "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" + "@types/mdast": "^4.0.0" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "node_modules/mdn-data": { + "version": "2.27.1", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", + "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", "dev": true, "funding": [ { - "type": "github", - "url": "https://github.com/sponsors/feross" + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" }, { - "type": "patreon", - "url": "https://www.patreon.com/feross" + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" }, { - "type": "consulting", - "url": "https://feross.org/support" + "type": "OpenCollective", + "url": "https://opencollective.com/unified" } - ] - }, - "node_modules/immutable": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.5.tgz", - "integrity": "sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==", - "dev": true - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "node_modules/interpret": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", - "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", - "dev": true, + ], "license": "MIT", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", "dev": true, "license": "MIT", "dependencies": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/is-binary-path": { + "node_modules/micromark-extension-gfm-autolink-literal": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", "dev": true, "license": "MIT", "dependencies": { - "binary-extensions": "^2.0.0" + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" }, - "engines": { - "node": ">=8" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", "dev": true, + "license": "MIT", "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/is-expression": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-4.0.0.tgz", - "integrity": "sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==", + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", "dev": true, + "license": "MIT", "dependencies": { - "acorn": "^7.1.1", - "object-assign": "^4.1.1" + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/is-extglob": { + "node_modules/micromark-extension-gfm-table": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "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==", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", "dev": true, "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==", - "dev": true, "dependencies": { - "is-extglob": "^2.1.1" + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-negated-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", - "integrity": "sha512-czXVVn/QEmgvej1f50BZ648vUI+em0xqMq2Sn+QncCLN4zj1UAxlT+kw/6ggQTOaZPd1HqKQGEqbpQVtJucWug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "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==", + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, "dependencies": { - "isobject": "^3.0.1" + "micromark-util-types": "^2.0.0" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/is-promise": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", - "dev": true - }, - "node_modules/is-regex": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "is-unc-path": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "unc-path-regex": "^0.1.2" - }, - "engines": { - "node": ">=0.10.0" + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/is-valid-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", - "integrity": "sha512-AhiROmoEFDSsjx8hW+5sGwgKVIORcXnrlAx/R0ZSeaPw70Vw0CqkGBBhHGL58Uox2eXnU1AnvXJl1XlyedO5bA==", + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/js-stringify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", - "integrity": "sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g==", - "dev": true - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/jstransformer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", - "integrity": "sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A==", + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", "dependencies": { - "is-promise": "^2.0.0", - "promise": "^7.0.1" + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/jstransformer-markdown-it": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/jstransformer-markdown-it/-/jstransformer-markdown-it-3.0.0.tgz", - "integrity": "sha512-/2fNT0ir/D0NYI5roBTVRwDV2YBjMfU3f/wSeraKLfOMNxcrIJatjJQy4zPmwQBxqKxUojXBN8hmfQBMTLZ3KA==", + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "markdown-it": "^13.0.1" - }, - "engines": { - "node": ">=7" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/last-run": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/last-run/-/last-run-2.0.0.tgz", - "integrity": "sha512-j+y6WhTLN4Itnf9j5ZQos1BGPCS8DAwmgMroR3OzfxAsBxam0hMw7J8M3KqZl0pLQJ1jNnwIexg5DYpC/ctwEQ==", + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", - "engines": { - "node": ">= 10.13.0" + "dependencies": { + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/lead": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/lead/-/lead-4.0.0.tgz", - "integrity": "sha512-DpMa59o5uGUWWjruMp71e6knmwKU3jRBBn1kjuLWN9EeIOxNeSAwvHf03WIl8g/ZMR2oSQC9ej3yeLBwdDc/pg==", + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", - "engines": { - "node": ">=10.13.0" + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/liftoff": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-5.0.1.tgz", - "integrity": "sha512-wwLXMbuxSF8gMvubFcFRp56lkFV69twvbU5vDPbaw+Q+/rF8j0HKjGbIdlSi+LuJm9jf7k9PB+nTxnsLMPcv2Q==", + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "extend": "^3.0.2", - "findup-sync": "^5.0.0", - "fined": "^2.0.0", - "flagged-respawn": "^2.0.0", - "is-plain-object": "^5.0.0", - "rechoir": "^0.8.0", - "resolve": "^1.20.0" - }, - "engines": { - "node": ">=10.13.0" + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/liftoff/node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/linkify-it": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "uc.micro": "^2.0.0" + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", - "dev": true + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", "dependencies": { - "yallist": "^3.0.2" + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "micromark-util-types": "^2.0.0" } }, - "node_modules/markdown-it": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.1.tgz", - "integrity": "sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==", + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "argparse": "^2.0.1", - "entities": "^4.4.0", - "linkify-it": "^5.0.0", - "mdurl": "^2.0.0", - "punycode.js": "^2.3.1", - "uc.micro": "^2.1.0" - }, - "bin": { - "markdown-it": "bin/markdown-it.mjs" + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", "dev": true, - "engines": { - "node": ">= 0.4" + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT" }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" }, - "node_modules/micromatch/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==", + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "node": ">=10" } }, "node_modules/ms": { @@ -4445,15 +4155,12 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, - "node_modules/mute-stdout": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-2.0.0.tgz", - "integrity": "sha512-32GSKM3Wyc8dg/p39lWPKYu8zci9mJFzV1Np9Of0ZEpe6Fhssn/FbI7ywAMd40uX+p3ZKh3T5EeCFv81qS3HmQ==", + "node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.13.0" - } + "license": "MIT" }, "node_modules/nanoid": { "version": "3.3.11", @@ -4473,18 +4180,43 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/node-addon-api": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", - "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "node_modules/neotraverse": { + "version": "0.6.18", + "resolved": "https://registry.npmjs.org/neotraverse/-/neotraverse-0.6.18.tgz", + "integrity": "sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==", "dev": true, - "optional": true + "license": "MIT", + "engines": { + "node": ">= 10" + } }, - "node_modules/node-releases": { - "version": "2.0.36", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz", - "integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==", - "dev": true + "node_modules/nlcst-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-4.0.0.tgz", + "integrity": "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/node-fetch-native": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz", + "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-mock-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/node-mock-http/-/node-mock-http-1.0.4.tgz", + "integrity": "sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==", + "dev": true, + "license": "MIT" }, "node_modules/normalize-path": { "version": "3.0.0", @@ -4496,129 +4228,180 @@ "node": ">=0.10.0" } }, - "node_modules/now-and-later": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-3.0.0.tgz", - "integrity": "sha512-pGO4pzSdaxhWTGkfSfHx3hVzJVslFPwBp2Myq9MYN/ChfJZF87ochMAXnvz6/58RJSf5ik2q9tXprBBrk2cpcg==", + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "once": "^1.4.0" + "boolbase": "^1.0.0" }, - "engines": { - "node": ">= 10.13.0" + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "node_modules/obug": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", + "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", "dev": true, - "engines": { - "node": ">=0.10.0" - } + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT" }, - "node_modules/object.defaults": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", - "integrity": "sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==", + "node_modules/ofetch": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.5.1.tgz", + "integrity": "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==", "dev": true, "license": "MIT", "dependencies": { - "array-each": "^1.0.1", - "array-slice": "^1.0.0", - "for-own": "^1.0.0", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" + "destr": "^2.0.5", + "node-fetch-native": "^1.6.7", + "ufo": "^1.6.1" } }, - "node_modules/object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "node_modules/ohash": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", "dev": true, - "license": "MIT", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } + "license": "MIT" }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "node_modules/oniguruma-parser": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.2.tgz", + "integrity": "sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==", "dev": true, + "license": "MIT" + }, + "node_modules/oniguruma-to-es": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.6.tgz", + "integrity": "sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==", + "dev": true, + "license": "MIT", "dependencies": { - "wrappy": "1" + "oniguruma-parser": "^0.12.2", + "regex": "^6.1.0", + "regex-recursion": "^6.0.2" } }, - "node_modules/parse-filepath": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", + "node_modules/p-limit": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-7.3.0.tgz", + "integrity": "sha512-7cIXg/Z0M5WZRblrsOla88S4wAK+zOQQWeBYfV3qJuJXMr+LnbYjaadrFaS0JILfEDPVqHyKnZ1Z/1d6J9VVUw==", "dev": true, "license": "MIT", "dependencies": { - "is-absolute": "^1.0.0", - "map-cache": "^0.2.0", - "path-root": "^0.1.1" + "yocto-queue": "^1.2.1" }, "engines": { - "node": ">=0.8" + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parse-node-version": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "node_modules/p-queue": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-9.1.2.tgz", + "integrity": "sha512-ktsDOALzTYTWWF1PbkNVg2rOt+HaOaMWJMUnt7T3qf5tvZ1L8dBW3tObzprBcXNMKkwj+yFSLqHso0x+UFcJXw==", "dev": true, + "license": "MIT", + "dependencies": { + "eventemitter3": "^5.0.1", + "p-timeout": "^7.0.0" + }, "engines": { - "node": ">= 0.10" + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", + "node_modules/p-timeout": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-7.0.1.tgz", + "integrity": "sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "node_modules/package-manager-detector": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.6.0.tgz", + "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==", + "dev": true, + "license": "MIT" }, - "node_modules/path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", + "node_modules/parse-latin": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-7.0.0.tgz", + "integrity": "sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==", "dev": true, "license": "MIT", "dependencies": { - "path-root-regex": "^0.1.0" + "@types/nlcst": "^2.0.0", + "@types/unist": "^3.0.0", + "nlcst-to-string": "^4.0.0", + "unist-util-modify-children": "^4.0.0", + "unist-util-visit-children": "^3.0.0", + "vfile": "^6.0.0" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", "dev": true, "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "license": "BSD-2-Clause", "engines": { - "node": ">=0.10.0" + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "license": "MIT" + }, + "node_modules/piccolore": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/piccolore/-/piccolore-0.1.3.tgz", + "integrity": "sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==", + "dev": true, + "license": "ISC" + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -4631,7 +4414,6 @@ "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", - "optional": true, "engines": { "node": ">=12" }, @@ -4639,25 +4421,10 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/plugin-error": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", - "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", - "dev": true, - "dependencies": { - "ansi-colors": "^1.0.1", - "arr-diff": "^4.0.0", - "arr-union": "^3.1.0", - "extend-shallow": "^3.0.2" - }, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/postcss": { - "version": "8.5.8", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", - "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.10.tgz", + "integrity": "sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==", "dev": true, "funding": [ { @@ -4673,6 +4440,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -4682,1135 +4450,1462 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true + "node_modules/prettier": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.3.tgz", + "integrity": "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true + "node_modules/prismjs": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/radix3": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz", + "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==", + "dev": true, + "license": "MIT" + }, + "node_modules/regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", + "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-recursion": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", + "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } }, - "node_modules/promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "node_modules/regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", + "dev": true, + "license": "MIT" + }, + "node_modules/rehype": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/rehype/-/rehype-13.0.2.tgz", + "integrity": "sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==", "dev": true, + "license": "MIT", "dependencies": { - "asap": "~2.0.3" + "@types/hast": "^3.0.0", + "rehype-parse": "^9.0.0", + "rehype-stringify": "^10.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/pug": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/pug/-/pug-3.0.3.tgz", - "integrity": "sha512-uBi6kmc9f3SZ3PXxqcHiUZLmIXgfgWooKWXcwSGwQd2Zi5Rb0bT14+8CJjJgI8AB+nndLaNgHGrcc6bPIB665g==", + "node_modules/rehype-parse": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-9.0.1.tgz", + "integrity": "sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==", "dev": true, + "license": "MIT", "dependencies": { - "pug-code-gen": "^3.0.3", - "pug-filters": "^4.0.0", - "pug-lexer": "^5.0.1", - "pug-linker": "^4.0.0", - "pug-load": "^3.0.0", - "pug-parser": "^6.0.0", - "pug-runtime": "^3.0.1", - "pug-strip-comments": "^2.0.0" + "@types/hast": "^3.0.0", + "hast-util-from-html": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/pug-attrs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-3.0.0.tgz", - "integrity": "sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==", + "node_modules/rehype-raw": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", + "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", "dev": true, + "license": "MIT", "dependencies": { - "constantinople": "^4.0.1", - "js-stringify": "^1.0.2", - "pug-runtime": "^3.0.0" + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/pug-code-gen": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-3.0.3.tgz", - "integrity": "sha512-cYQg0JW0w32Ux+XTeZnBEeuWrAY7/HNE6TWnhiHGnnRYlCgyAUPoyh9KzCMa9WhcJlJ1AtQqpEYHc+vbCzA+Aw==", + "node_modules/rehype-stringify": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-10.0.1.tgz", + "integrity": "sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==", "dev": true, + "license": "MIT", "dependencies": { - "constantinople": "^4.0.1", - "doctypes": "^1.1.0", - "js-stringify": "^1.0.2", - "pug-attrs": "^3.0.0", - "pug-error": "^2.1.0", - "pug-runtime": "^3.0.1", - "void-elements": "^3.1.0", - "with": "^7.0.0" + "@types/hast": "^3.0.0", + "hast-util-to-html": "^9.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/pug-error": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-2.1.0.tgz", - "integrity": "sha512-lv7sU9e5Jk8IeUheHata6/UThZ7RK2jnaaNztxfPYUY+VxZyk/ePVaNZ/vwmH8WqGvDz3LrNYt/+gA55NDg6Pg==", - "dev": true - }, - "node_modules/pug-filters": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-4.0.0.tgz", - "integrity": "sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==", + "node_modules/remark-gfm": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", "dev": true, + "license": "MIT", "dependencies": { - "constantinople": "^4.0.1", - "jstransformer": "1.0.0", - "pug-error": "^2.0.0", - "pug-walk": "^2.0.0", - "resolve": "^1.15.1" + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/pug-lexer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-5.0.1.tgz", - "integrity": "sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==", + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", "dev": true, + "license": "MIT", "dependencies": { - "character-parser": "^2.2.0", - "is-expression": "^4.0.0", - "pug-error": "^2.0.0" + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/pug-linker": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-4.0.0.tgz", - "integrity": "sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==", + "node_modules/remark-rehype": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", "dev": true, + "license": "MIT", "dependencies": { - "pug-error": "^2.0.0", - "pug-walk": "^2.0.0" + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/pug-load": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-3.0.0.tgz", - "integrity": "sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==", + "node_modules/remark-smartypants": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/remark-smartypants/-/remark-smartypants-3.0.2.tgz", + "integrity": "sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==", "dev": true, + "license": "MIT", "dependencies": { - "object-assign": "^4.1.1", - "pug-walk": "^2.0.0" + "retext": "^9.0.0", + "retext-smartypants": "^6.0.0", + "unified": "^11.0.4", + "unist-util-visit": "^5.0.0" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/pug-parser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-6.0.0.tgz", - "integrity": "sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==", + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", "dev": true, + "license": "MIT", "dependencies": { - "pug-error": "^2.0.0", - "token-stream": "1.0.0" + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/pug-runtime": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-3.0.1.tgz", - "integrity": "sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg==", - "dev": true + "node_modules/request-light": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/request-light/-/request-light-0.7.0.tgz", + "integrity": "sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q==", + "dev": true, + "license": "MIT" }, - "node_modules/pug-strip-comments": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz", - "integrity": "sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==", + "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==", "dev": true, - "dependencies": { - "pug-error": "^2.0.0" + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/pug-walk": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-2.0.0.tgz", - "integrity": "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==", - "dev": true - }, - "node_modules/punycode.js": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", - "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "node_modules/retext": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/retext/-/retext-9.0.0.tgz", + "integrity": "sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==", "dev": true, + "license": "MIT", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "@types/nlcst": "^2.0.0", + "retext-latin": "^4.0.0", + "retext-stringify": "^4.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "node_modules/retext-latin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/retext-latin/-/retext-latin-4.0.0.tgz", + "integrity": "sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==", "dev": true, "license": "MIT", "dependencies": { - "picomatch": "^2.2.1" + "@types/nlcst": "^2.0.0", + "parse-latin": "^7.0.0", + "unified": "^11.0.0" }, - "engines": { - "node": ">=8.10.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/readdirp/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==", + "node_modules/retext-smartypants": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/retext-smartypants/-/retext-smartypants-6.2.0.tgz", + "integrity": "sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">=8.6" + "dependencies": { + "@types/nlcst": "^2.0.0", + "nlcst-to-string": "^4.0.0", + "unist-util-visit": "^5.0.0" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/rechoir": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", - "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "node_modules/retext-stringify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/retext-stringify/-/retext-stringify-4.0.0.tgz", + "integrity": "sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==", "dev": true, "license": "MIT", "dependencies": { - "resolve": "^1.20.0" + "@types/nlcst": "^2.0.0", + "nlcst-to-string": "^4.0.0", + "unified": "^11.0.0" }, - "engines": { - "node": ">= 10.13.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", - "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", + "node_modules/rollup": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.2.tgz", + "integrity": "sha512-J9qZyW++QK/09NyN/zeO0dG/1GdGfyp9lV8ajHnRVLfo/uFsbji5mHnDgn/qYdUHyCkM2N+8VyspgZclfAh0eQ==", "dev": true, + "license": "MIT", "dependencies": { - "regenerate": "^1.4.2" + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=4" + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.60.2", + "@rollup/rollup-android-arm64": "4.60.2", + "@rollup/rollup-darwin-arm64": "4.60.2", + "@rollup/rollup-darwin-x64": "4.60.2", + "@rollup/rollup-freebsd-arm64": "4.60.2", + "@rollup/rollup-freebsd-x64": "4.60.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.60.2", + "@rollup/rollup-linux-arm-musleabihf": "4.60.2", + "@rollup/rollup-linux-arm64-gnu": "4.60.2", + "@rollup/rollup-linux-arm64-musl": "4.60.2", + "@rollup/rollup-linux-loong64-gnu": "4.60.2", + "@rollup/rollup-linux-loong64-musl": "4.60.2", + "@rollup/rollup-linux-ppc64-gnu": "4.60.2", + "@rollup/rollup-linux-ppc64-musl": "4.60.2", + "@rollup/rollup-linux-riscv64-gnu": "4.60.2", + "@rollup/rollup-linux-riscv64-musl": "4.60.2", + "@rollup/rollup-linux-s390x-gnu": "4.60.2", + "@rollup/rollup-linux-x64-gnu": "4.60.2", + "@rollup/rollup-linux-x64-musl": "4.60.2", + "@rollup/rollup-openbsd-x64": "4.60.2", + "@rollup/rollup-openharmony-arm64": "4.60.2", + "@rollup/rollup-win32-arm64-msvc": "4.60.2", + "@rollup/rollup-win32-ia32-msvc": "4.60.2", + "@rollup/rollup-win32-x64-gnu": "4.60.2", + "@rollup/rollup-win32-x64-msvc": "4.60.2", + "fsevents": "~2.3.2" + } + }, + "node_modules/sax": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" } }, - "node_modules/regexpu-core": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", - "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", + "node_modules/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, "dependencies": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.2.2", - "regjsgen": "^0.8.0", - "regjsparser": "^0.13.0", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.2.1" + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" }, "engines": { - "node": ">=4" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" } }, - "node_modules/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", - "dev": true + "node_modules/sharp/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } }, - "node_modules/regjsparser": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz", - "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", + "node_modules/shiki": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-4.0.2.tgz", + "integrity": "sha512-eAVKTMedR5ckPo4xne/PjYQYrU3qx78gtJZ+sHlXEg5IHhhoQhMfZVzetTYuaJS0L2Ef3AcCRzCHV8T0WI6nIQ==", "dev": true, + "license": "MIT", "dependencies": { - "jsesc": "~3.1.0" + "@shikijs/core": "4.0.2", + "@shikijs/engine-javascript": "4.0.2", + "@shikijs/engine-oniguruma": "4.0.2", + "@shikijs/langs": "4.0.2", + "@shikijs/themes": "4.0.2", + "@shikijs/types": "4.0.2", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" }, - "bin": { - "regjsparser": "bin/parser" + "engines": { + "node": ">=20" } }, - "node_modules/remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", - "dev": true + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true, + "license": "MIT" }, - "node_modules/replace-ext": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", - "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", + "node_modules/smol-toml": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.6.1.tgz", + "integrity": "sha512-dWUG8F5sIIARXih1DTaQAX4SsiTXhInKf1buxdY9DIg4ZYPZK5nGM1VRIYmEbDbsHt7USo99xSLFu5Q1IqTmsg==", "dev": true, + "license": "BSD-3-Clause", "engines": { - "node": ">= 0.10" + "node": ">= 18" + }, + "funding": { + "url": "https://github.com/sponsors/cyyynthia" } }, - "node_modules/replace-homedir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-2.0.0.tgz", - "integrity": "sha512-bgEuQQ/BHW0XkkJtawzrfzHFSN70f/3cNOiHa2QsYxqrjaC30X1k74FJ6xswVBP0sr0SpGIdVFuPwfrYziVeyw==", + "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==", "dev": true, - "license": "MIT", "engines": { - "node": ">= 10.13.0" + "node": ">=0.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==", + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.10.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/resolve": { - "version": "1.22.11", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", "dependencies": { - "is-core-module": "^2.16.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">= 0.4" + "node": ">=8" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "dev": true, + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", "dependencies": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/resolve-options": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-2.0.0.tgz", - "integrity": "sha512-/FopbmmFOQCfsCx77BRFdKOniglTiHumLgwvd6IDPihy1GKkadZbgQJBcTb2lMzSR1pndzd96b1nZrreZ7+9/A==", + "node_modules/svgo": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.1.tgz", + "integrity": "sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w==", "dev": true, "license": "MIT", "dependencies": { - "value-or-function": "^4.0.0" + "commander": "^11.1.0", + "css-select": "^5.1.0", + "css-tree": "^3.0.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.1.1", + "sax": "^1.5.0" + }, + "bin": { + "svgo": "bin/svgo.js" }, "engines": { - "node": ">= 10.13.0" + "node": ">=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" } }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "node_modules/svgo/node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", "dev": true, "license": "MIT", "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "node": ">=16" } }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "node_modules/tiny-inflate": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", + "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", "dev": true, "license": "MIT" }, - "node_modules/sass": { - "version": "1.99.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.99.0.tgz", - "integrity": "sha512-kgW13M54DUB7IsIRM5LvJkNlpH+WhMpooUcaWGFARkF1Tc82v9mIWkCbCYf+MBvpIUBSeSOTilpZjEPr2VYE6Q==", + "node_modules/tinyclip": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/tinyclip/-/tinyclip-0.1.12.tgz", + "integrity": "sha512-Ae3OVUqifDw0wBriIBS7yVaW44Dp6eSHQcyq4Igc7eN2TJH/2YsicswaW+J/OuMvhpDPOKEgpAZCjkb4hpoyeA==", "dev": true, "license": "MIT", - "dependencies": { - "chokidar": "^4.0.0", - "immutable": "^5.1.5", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" - }, "engines": { - "node": ">=14.0.0" - }, - "optionalDependencies": { - "@parcel/watcher": "^2.4.1" + "node": "^16.14.0 || >= 17.3.0" } }, - "node_modules/sass/node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "node_modules/tinyexec": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.1.1.tgz", + "integrity": "sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg==", "dev": true, - "dependencies": { - "readdirp": "^4.0.1" - }, + "license": "MIT", "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" + "node": ">=18" } }, - "node_modules/sass/node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, "engines": { - "node": ">= 14.18.0" + "node": ">=12.0.0" }, "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" + "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", "dev": true, - "bin": { - "semver": "bin/semver.js" + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/semver-greatest-satisfied-range": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-2.0.0.tgz", - "integrity": "sha512-lH3f6kMbwyANB7HuOWRMlLCa2itaCrZJ+SAqqkSZrZKO/cAsk2EOyaKHUtNkVLFyFW9pct22SFesFp3Z7zpA0g==", + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", "dev": true, "license": "MIT", - "dependencies": { - "sver": "^1.8.3" - }, - "engines": { - "node": ">= 10.13.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/sharp": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", - "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "node_modules/tsconfck": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.6.tgz", + "integrity": "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==", "dev": true, - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@img/colour": "^1.0.0", - "detect-libc": "^2.1.2", - "semver": "^7.7.3" + "license": "MIT", + "bin": { + "tsconfck": "bin/tsconfck.js" }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": "^18 || >=20" }, - "funding": { - "url": "https://opencollective.com/libvips" + "peerDependencies": { + "typescript": "^5.0.0" }, - "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.34.5", - "@img/sharp-darwin-x64": "0.34.5", - "@img/sharp-libvips-darwin-arm64": "1.2.4", - "@img/sharp-libvips-darwin-x64": "1.2.4", - "@img/sharp-libvips-linux-arm": "1.2.4", - "@img/sharp-libvips-linux-arm64": "1.2.4", - "@img/sharp-libvips-linux-ppc64": "1.2.4", - "@img/sharp-libvips-linux-riscv64": "1.2.4", - "@img/sharp-libvips-linux-s390x": "1.2.4", - "@img/sharp-libvips-linux-x64": "1.2.4", - "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", - "@img/sharp-libvips-linuxmusl-x64": "1.2.4", - "@img/sharp-linux-arm": "0.34.5", - "@img/sharp-linux-arm64": "0.34.5", - "@img/sharp-linux-ppc64": "0.34.5", - "@img/sharp-linux-riscv64": "0.34.5", - "@img/sharp-linux-s390x": "0.34.5", - "@img/sharp-linux-x64": "0.34.5", - "@img/sharp-linuxmusl-arm64": "0.34.5", - "@img/sharp-linuxmusl-x64": "0.34.5", - "@img/sharp-wasm32": "0.34.5", - "@img/sharp-win32-arm64": "0.34.5", - "@img/sharp-win32-ia32": "0.34.5", - "@img/sharp-win32-x64": "0.34.5" + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/sharp/node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } + "license": "0BSD", + "optional": true }, - "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "node_modules/typesafe-path": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/typesafe-path/-/typesafe-path-0.2.2.tgz", + "integrity": "sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA==", "dev": true, - "engines": { - "node": ">=0.10.0" - } + "license": "MIT" }, - "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==", + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, "engines": { - "node": ">=0.10.0" + "node": ">=14.17" } }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "node_modules/typescript-auto-import-cache": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/typescript-auto-import-cache/-/typescript-auto-import-cache-0.3.6.tgz", + "integrity": "sha512-RpuHXrknHdVdK7wv/8ug3Fr0WNsNi5l5aB8MYYuXhq2UH5lnEB1htJ1smhtD5VeCsGr2p8mUDtd83LCQDFVgjQ==", "dev": true, + "license": "MIT", "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "semver": "^7.3.8" } }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/typescript-auto-import-cache/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/sparkles": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-2.1.0.tgz", - "integrity": "sha512-r7iW1bDw8R/cFifrD3JnQJX0K1jqT0kprL48BiBpLZLJPmAm34zsVBsK5lc7HirZYZqMW65dOXZgbAGt/I6frg==", + "node_modules/ufo": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", + "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.13.0" - } + "license": "MIT" }, - "node_modules/stream-composer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stream-composer/-/stream-composer-1.0.2.tgz", - "integrity": "sha512-bnBselmwfX5K10AH6L4c8+S5lgZMWI7ZYrz2rvYjCPB2DIMC4Ig8OpxGpNJSxRZ58oti7y1IcNvjBAz9vW5m4w==", + "node_modules/ultrahtml": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ultrahtml/-/ultrahtml-1.6.0.tgz", + "integrity": "sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==", "dev": true, - "license": "MIT", - "dependencies": { - "streamx": "^2.13.2" - } + "license": "MIT" }, - "node_modules/stream-exhaust": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", - "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==", + "node_modules/uncrypto": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/uncrypto/-/uncrypto-0.1.3.tgz", + "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==", "dev": true, "license": "MIT" }, - "node_modules/streamx": { - "version": "2.25.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.25.0.tgz", - "integrity": "sha512-0nQuG6jf1w+wddNEEXCF4nTg3LtufWINB5eFEN+5TNZW7KWJp6x87+JFL43vaAUPyCfH1wID+mNVyW6OHtFamg==", + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", "dev": true, "license": "MIT", "dependencies": { - "events-universal": "^1.0.0", - "fast-fifo": "^1.3.2", - "text-decoder": "^1.1.0" + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "node_modules/unifont": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/unifont/-/unifont-0.7.4.tgz", + "integrity": "sha512-oHeis4/xl42HUIeHuNZRGEvxj5AaIKR+bHPNegRq5LV1gdc3jundpONbjglKpihmJf+dswygdMJn3eftGIMemg==", "dev": true, + "license": "MIT", "dependencies": { - "safe-buffer": "~5.1.0" + "css-tree": "^3.1.0", + "ofetch": "^1.5.1", + "ohash": "^2.0.11" } }, - "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==", + "node_modules/unist-util-find-after": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz", + "integrity": "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==", "dev": true, "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" }, - "engines": { - "node": ">=8" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/strip-ansi": { + "node_modules/unist-util-is": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "@types/unist": "^3.0.0" }, - "engines": { - "node": ">=8" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/unist-util-modify-children": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-4.0.0.tgz", + "integrity": "sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==", "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" + "@types/unist": "^3.0.0", + "array-iterate": "^2.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/sver": { - "version": "1.8.4", - "resolved": "https://registry.npmjs.org/sver/-/sver-1.8.4.tgz", - "integrity": "sha512-71o1zfzyawLfIWBOmw8brleKyvnbn73oVHNCsu51uPMz/HWiKkkXsI31JjHW5zqXEqnPYkIiHd8ZmL7FCimLEA==", + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", "dev": true, "license": "MIT", - "optionalDependencies": { - "semver": "^6.3.0" + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/teex": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz", - "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==", + "node_modules/unist-util-remove-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", + "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", "dev": true, "license": "MIT", "dependencies": { - "streamx": "^2.12.5" + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/text-decoder": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.7.tgz", - "integrity": "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==", + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "b4a": "^1.6.4" + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "node_modules/unist-util-visit": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", "dev": true, + "license": "MIT", "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/time-stamp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", - "integrity": "sha512-gLCeArryy2yNTRzTGKbZbloctj64jkZ57hj5zdraXue6aFgd6PmvVtEyiUU+hvU0v7q08oVv8r8ev0tRo6bvgw==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "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==", + "node_modules/unist-util-visit-children": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit-children/-/unist-util-visit-children-3.0.0.tgz", + "integrity": "sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==", "dev": true, "license": "MIT", "dependencies": { - "is-number": "^7.0.0" + "@types/unist": "^3.0.0" }, - "engines": { - "node": ">=8.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/to-through": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/to-through/-/to-through-3.0.0.tgz", - "integrity": "sha512-y8MN937s/HVhEoBU1SxfHC+wxCHkV1a9gW8eAdTadYh/bGyesZIVcbjI+mSpFbSVwQici/XjBjuUyri1dnXwBw==", + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", "dev": true, "license": "MIT", "dependencies": { - "streamx": "^2.12.5" + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" }, - "engines": { - "node": ">=10.13.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/token-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-1.0.0.tgz", - "integrity": "sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==", - "dev": true - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD", - "optional": true - }, - "node_modules/uc.micro": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", - "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", - "dev": true, - "license": "MIT" - }, - "node_modules/unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", + "node_modules/unstorage": { + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.5.tgz", + "integrity": "sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg==", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "anymatch": "^3.1.3", + "chokidar": "^5.0.0", + "destr": "^2.0.5", + "h3": "^1.15.10", + "lru-cache": "^11.2.7", + "node-fetch-native": "^1.6.7", + "ofetch": "^1.5.1", + "ufo": "^1.6.3" + }, + "peerDependencies": { + "@azure/app-configuration": "^1.8.0", + "@azure/cosmos": "^4.2.0", + "@azure/data-tables": "^13.3.0", + "@azure/identity": "^4.6.0", + "@azure/keyvault-secrets": "^4.9.0", + "@azure/storage-blob": "^12.26.0", + "@capacitor/preferences": "^6 || ^7 || ^8", + "@deno/kv": ">=0.9.0", + "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", + "@planetscale/database": "^1.19.0", + "@upstash/redis": "^1.34.3", + "@vercel/blob": ">=0.27.1", + "@vercel/functions": "^2.2.12 || ^3.0.0", + "@vercel/kv": "^1 || ^2 || ^3", + "aws4fetch": "^1.0.20", + "db0": ">=0.2.1", + "idb-keyval": "^6.2.1", + "ioredis": "^5.4.2", + "uploadthing": "^7.4.4" + }, + "peerDependenciesMeta": { + "@azure/app-configuration": { + "optional": true + }, + "@azure/cosmos": { + "optional": true + }, + "@azure/data-tables": { + "optional": true + }, + "@azure/identity": { + "optional": true + }, + "@azure/keyvault-secrets": { + "optional": true + }, + "@azure/storage-blob": { + "optional": true + }, + "@capacitor/preferences": { + "optional": true + }, + "@deno/kv": { + "optional": true + }, + "@netlify/blobs": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@upstash/redis": { + "optional": true + }, + "@vercel/blob": { + "optional": true + }, + "@vercel/functions": { + "optional": true + }, + "@vercel/kv": { + "optional": true + }, + "aws4fetch": { + "optional": true + }, + "db0": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "ioredis": { + "optional": true + }, + "uploadthing": { + "optional": true + } } }, - "node_modules/undertaker": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-2.0.0.tgz", - "integrity": "sha512-tO/bf30wBbTsJ7go80j0RzA2rcwX6o7XPBpeFcb+jzoeb4pfMM2zUeSDIkY1AWqeZabWxaQZ/h8N9t35QKDLPQ==", + "node_modules/unstorage/node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", "dev": true, "license": "MIT", "dependencies": { - "bach": "^2.0.1", - "fast-levenshtein": "^3.0.0", - "last-run": "^2.0.0", - "undertaker-registry": "^2.0.0" + "readdirp": "^5.0.0" }, "engines": { - "node": ">=10.13.0" + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/undertaker-registry": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-2.0.0.tgz", - "integrity": "sha512-+hhVICbnp+rlzZMgxXenpvTxpuvA67Bfgtt+O9WOE5jo7w/dyiF1VmoZVIHvP2EkUjsyKyTwYKlLhA+j47m1Ew==", + "node_modules/unstorage/node_modules/lru-cache": { + "version": "11.3.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.5.tgz", + "integrity": "sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==", "dev": true, - "license": "MIT", + "license": "BlueOak-1.0.0", "engines": { - "node": ">= 10.13.0" + "node": "20 || >=22" } }, - "node_modules/undici-types": { - "version": "7.19.2", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.19.2.tgz", - "integrity": "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==", - "dev": true, - "license": "MIT" - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", - "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "node_modules/unstorage/node_modules/readdirp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", "dev": true, + "license": "MIT", "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" }, - "engines": { - "node": ">=4" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", - "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", + "node_modules/vfile-location": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", + "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", "dev": true, - "engines": { - "node": ">=4" + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", - "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", "dev": true, - "engines": { - "node": ">=4" + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "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==", + "node_modules/vite": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.2.tgz", + "integrity": "sha512-Bby3NOsna2jsjfLVOHKes8sGwgl4TT0E6vvpYgnAYDIF/tie7MRaFthmKuHx1NSXjiTueXH3do80FMQgvEktRg==", "dev": true, - "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" + "esbuild": "^0.27.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" }, "bin": { - "update-browserslist-db": "cli.js" + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" }, "peerDependencies": { - "browserslist": ">= 4.21.0" + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } } }, - "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==", - "dev": true - }, - "node_modules/v8flags": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-4.0.1.tgz", - "integrity": "sha512-fcRLaS4H/hrZk9hYwbdRM35D0U8IYMfEClhXxCivOojl+yTRAZH3Zy2sSy6qVCiGbV9YAtPssP6jaChqC9vPCg==", + "node_modules/vitefu": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.3.tgz", + "integrity": "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 10.13.0" + "workspaces": [ + "tests/deps/*", + "tests/projects/*", + "tests/projects/workspace/packages/*" + ], + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } } }, - "node_modules/value-or-function": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-4.0.0.tgz", - "integrity": "sha512-aeVK81SIuT6aMJfNo9Vte8Dw0/FZINGBV8BfCraGtqVxIeLAEhJyoWs8SmvRVmXfGss2PmmOwZCuBPbZR+IYWg==", + "node_modules/volar-service-css": { + "version": "0.0.70", + "resolved": "https://registry.npmjs.org/volar-service-css/-/volar-service-css-0.0.70.tgz", + "integrity": "sha512-K1qyOvBpE3rzdAv3e4/6Rv5yizrYPy5R/ne3IWCAzLBuMO4qBMV3kSqWzj6KUVe6S0AnN6wxF7cRkiaKfYMYJw==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/vinyl": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", - "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", - "dev": true, "dependencies": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" + "vscode-css-languageservice": "^6.3.0", + "vscode-languageserver-textdocument": "^1.0.11", + "vscode-uri": "^3.0.8" }, - "engines": { - "node": ">= 0.10" + "peerDependencies": { + "@volar/language-service": "~2.4.0" + }, + "peerDependenciesMeta": { + "@volar/language-service": { + "optional": true + } } }, - "node_modules/vinyl-contents": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/vinyl-contents/-/vinyl-contents-1.0.0.tgz", - "integrity": "sha512-xBH8ZUy8IK7K06eCBmd2GGjdf1EqNEGPNfRP2VsrCvSvsOggywGCGZg435WZiG/kcyCdXc1CZXCf4pUJ2EuEsg==", + "node_modules/volar-service-emmet": { + "version": "0.0.70", + "resolved": "https://registry.npmjs.org/volar-service-emmet/-/volar-service-emmet-0.0.70.tgz", + "integrity": "sha512-xi5bC4m/VyE3zy/n2CXspKeDZs3qA41tHLTw275/7dNWM/RqE2z3BnDICQybHIVp/6G1iOQj5c1qXMgQC08TNg==", "dev": true, + "license": "MIT", "dependencies": { - "bl": "^3.0.0", - "readable-stream": "^3.3.0", - "vinyl": "^2.2.0" + "@emmetio/css-parser": "^0.4.1", + "@emmetio/html-matcher": "^1.3.0", + "@vscode/emmet-helper": "^2.9.3", + "vscode-uri": "^3.0.8" }, - "engines": { - "node": ">= 6" + "peerDependencies": { + "@volar/language-service": "~2.4.0" + }, + "peerDependenciesMeta": { + "@volar/language-service": { + "optional": true + } } }, - "node_modules/vinyl-contents/node_modules/bl": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/bl/-/bl-3.0.1.tgz", - "integrity": "sha512-jrCW5ZhfQ/Vt07WX1Ngs+yn9BDqPL/gw28S7s9H6QK/gupnizNzJAss5akW20ISgOrbLTlXOOCTJeNUQqruAWQ==", + "node_modules/volar-service-html": { + "version": "0.0.70", + "resolved": "https://registry.npmjs.org/volar-service-html/-/volar-service-html-0.0.70.tgz", + "integrity": "sha512-eR6vCgMdmYAo4n+gcT7DSyBQbwB8S3HZZvSagTf0sxNaD4WppMCFfpqWnkrlGStPKMZvMiejRRVmqsX9dYcTvQ==", "dev": true, + "license": "MIT", "dependencies": { - "readable-stream": "^3.0.1" + "vscode-html-languageservice": "^5.3.0", + "vscode-languageserver-textdocument": "^1.0.11", + "vscode-uri": "^3.0.8" + }, + "peerDependencies": { + "@volar/language-service": "~2.4.0" + }, + "peerDependenciesMeta": { + "@volar/language-service": { + "optional": true + } } }, - "node_modules/vinyl-contents/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "node_modules/volar-service-prettier": { + "version": "0.0.70", + "resolved": "https://registry.npmjs.org/volar-service-prettier/-/volar-service-prettier-0.0.70.tgz", + "integrity": "sha512-Z6BCFSpGVCd8BPAsZ785Kce1BGlWd5ODqmqZGVuB14MJvrR4+CYz6cDy4F+igmE1gMifqfvMhdgT8Aud4M5ngg==", "dev": true, + "license": "MIT", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "vscode-uri": "^3.0.8" }, - "engines": { - "node": ">= 6" + "peerDependencies": { + "@volar/language-service": "~2.4.0", + "prettier": "^2.2 || ^3.0" + }, + "peerDependenciesMeta": { + "@volar/language-service": { + "optional": true + }, + "prettier": { + "optional": true + } } }, - "node_modules/vinyl-fs": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-4.0.2.tgz", - "integrity": "sha512-XRFwBLLTl8lRAOYiBqxY279wY46tVxLaRhSwo3GzKEuLz1giffsOquWWboD/haGf5lx+JyTigCFfe7DWHoARIA==", + "node_modules/volar-service-typescript": { + "version": "0.0.70", + "resolved": "https://registry.npmjs.org/volar-service-typescript/-/volar-service-typescript-0.0.70.tgz", + "integrity": "sha512-l46Bx4cokkUedTd74ojO5H/zqHZJ8SUuyZ0IB8JN4jfRqUM3bQFBHoOwlZCyZmOeO0A3RQNkMnFclxO4c++gsg==", "dev": true, "license": "MIT", "dependencies": { - "fs-mkdirp-stream": "^2.0.1", - "glob-stream": "^8.0.3", - "graceful-fs": "^4.2.11", - "iconv-lite": "^0.6.3", - "is-valid-glob": "^1.0.0", - "lead": "^4.0.0", - "normalize-path": "3.0.0", - "resolve-options": "^2.0.0", - "stream-composer": "^1.0.2", - "streamx": "^2.14.0", - "to-through": "^3.0.0", - "value-or-function": "^4.0.0", - "vinyl": "^3.0.1", - "vinyl-sourcemap": "^2.0.0" + "path-browserify": "^1.0.1", + "semver": "^7.6.2", + "typescript-auto-import-cache": "^0.3.5", + "vscode-languageserver-textdocument": "^1.0.11", + "vscode-nls": "^5.2.0", + "vscode-uri": "^3.0.8" }, - "engines": { - "node": ">=10.13.0" + "peerDependencies": { + "@volar/language-service": "~2.4.0" + }, + "peerDependenciesMeta": { + "@volar/language-service": { + "optional": true + } } }, - "node_modules/vinyl-fs/node_modules/replace-ext": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-2.0.0.tgz", - "integrity": "sha512-UszKE5KVK6JvyD92nzMn9cDapSk6w/CaFZ96CnmDMUqH9oowfxF/ZjRITD25H4DnOQClLA4/j7jLGXXLVKxAug==", + "node_modules/volar-service-typescript-twoslash-queries": { + "version": "0.0.70", + "resolved": "https://registry.npmjs.org/volar-service-typescript-twoslash-queries/-/volar-service-typescript-twoslash-queries-0.0.70.tgz", + "integrity": "sha512-IdD13Z9N2Bu8EM6CM0fDV1E69olEYGHDU25X51YXmq8Y0CmJ2LNj6gOiBJgpS5JGUqFzECVhMNBW7R0sPdRTMQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 10" + "dependencies": { + "vscode-uri": "^3.0.8" + }, + "peerDependencies": { + "@volar/language-service": "~2.4.0" + }, + "peerDependenciesMeta": { + "@volar/language-service": { + "optional": true + } } }, - "node_modules/vinyl-fs/node_modules/vinyl": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-3.0.1.tgz", - "integrity": "sha512-0QwqXteBNXgnLCdWdvPQBX6FXRHtIH3VhJPTd5Lwn28tJXc34YqSCWUmkOvtJHBmB3gGoPtrOKk3Ts8/kEZ9aA==", + "node_modules/volar-service-typescript/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, - "license": "MIT", - "dependencies": { - "clone": "^2.1.2", - "remove-trailing-separator": "^1.1.0", - "replace-ext": "^2.0.0", - "teex": "^1.0.1" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">=10.13.0" + "node": ">=10" } }, - "node_modules/vinyl-sourcemap": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-2.0.0.tgz", - "integrity": "sha512-BAEvWxbBUXvlNoFQVFVHpybBbjW1r03WhohJzJDSfgrrK5xVYIDTan6xN14DlyImShgDRv2gl9qhM6irVMsV0Q==", + "node_modules/volar-service-yaml": { + "version": "0.0.70", + "resolved": "https://registry.npmjs.org/volar-service-yaml/-/volar-service-yaml-0.0.70.tgz", + "integrity": "sha512-0c8bXDBeoATF9F6iPIlOuYTuZAC4c+yi0siQo920u7eiBJk8oQmUmg9cDUbR4+Gl++bvGP4plj3fErbJuPqdcQ==", "dev": true, "license": "MIT", "dependencies": { - "convert-source-map": "^2.0.0", - "graceful-fs": "^4.2.10", - "now-and-later": "^3.0.0", - "streamx": "^2.12.5", - "vinyl": "^3.0.0", - "vinyl-contents": "^2.0.0" + "vscode-uri": "^3.0.8", + "yaml-language-server": "~1.20.0" }, - "engines": { - "node": ">=10.13.0" + "peerDependencies": { + "@volar/language-service": "~2.4.0" + }, + "peerDependenciesMeta": { + "@volar/language-service": { + "optional": true + } } }, - "node_modules/vinyl-sourcemap/node_modules/bl": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", - "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", + "node_modules/vscode-css-languageservice": { + "version": "6.3.10", + "resolved": "https://registry.npmjs.org/vscode-css-languageservice/-/vscode-css-languageservice-6.3.10.tgz", + "integrity": "sha512-eq5N9Er3fC4vA9zd9EFhyBG90wtCCuXgRSpAndaOgXMh1Wgep5lBgRIeDgjZBW9pa+332yC9+49cZMW8jcL3MA==", "dev": true, "license": "MIT", "dependencies": { - "buffer": "^6.0.3", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" + "@vscode/l10n": "^0.0.18", + "vscode-languageserver-textdocument": "^1.0.12", + "vscode-languageserver-types": "3.17.5", + "vscode-uri": "^3.1.0" } }, - "node_modules/vinyl-sourcemap/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "node_modules/vscode-html-languageservice": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/vscode-html-languageservice/-/vscode-html-languageservice-5.6.2.tgz", + "integrity": "sha512-ulCrSnFnfQ16YzvwnYUgEbUEl/ZG7u2eV27YhvLObSHKkb8fw1Z9cgsnUwjTEeDIdJDoTDTDpxuhQwoenoLNMg==", "dev": true, - "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": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" + "@vscode/l10n": "^0.0.18", + "vscode-languageserver-textdocument": "^1.0.12", + "vscode-languageserver-types": "^3.17.5", + "vscode-uri": "^3.1.0" } }, - "node_modules/vinyl-sourcemap/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "node_modules/vscode-json-languageservice": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/vscode-json-languageservice/-/vscode-json-languageservice-4.1.8.tgz", + "integrity": "sha512-0vSpg6Xd9hfV+eZAaYN63xVVMOTmJ4GgHxXnkLCh+9RsQBkWKIghzLhW2B9ebfG+LQQg8uLtsQ2aUKjTgE+QOg==", "dev": true, "license": "MIT", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "jsonc-parser": "^3.0.0", + "vscode-languageserver-textdocument": "^1.0.1", + "vscode-languageserver-types": "^3.16.0", + "vscode-nls": "^5.0.0", + "vscode-uri": "^3.0.2" }, "engines": { - "node": ">= 6" + "npm": ">=7.0.0" } }, - "node_modules/vinyl-sourcemap/node_modules/replace-ext": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-2.0.0.tgz", - "integrity": "sha512-UszKE5KVK6JvyD92nzMn9cDapSk6w/CaFZ96CnmDMUqH9oowfxF/ZjRITD25H4DnOQClLA4/j7jLGXXLVKxAug==", + "node_modules/vscode-json-languageservice/node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/vscode-jsonrpc": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", + "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", "dev": true, "license": "MIT", "engines": { - "node": ">= 10" + "node": ">=14.0.0" } }, - "node_modules/vinyl-sourcemap/node_modules/vinyl": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-3.0.1.tgz", - "integrity": "sha512-0QwqXteBNXgnLCdWdvPQBX6FXRHtIH3VhJPTd5Lwn28tJXc34YqSCWUmkOvtJHBmB3gGoPtrOKk3Ts8/kEZ9aA==", + "node_modules/vscode-languageserver": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", + "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", "dev": true, "license": "MIT", "dependencies": { - "clone": "^2.1.2", - "remove-trailing-separator": "^1.1.0", - "replace-ext": "^2.0.0", - "teex": "^1.0.1" + "vscode-languageserver-protocol": "3.17.5" }, - "engines": { - "node": ">=10.13.0" + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" } }, - "node_modules/vinyl-sourcemap/node_modules/vinyl-contents": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/vinyl-contents/-/vinyl-contents-2.0.0.tgz", - "integrity": "sha512-cHq6NnGyi2pZ7xwdHSW1v4Jfnho4TEGtxZHw01cmnc8+i7jgR6bRnED/LbrKan/Q7CvVLbnvA5OepnhbpjBZ5Q==", + "node_modules/vscode-languageserver-protocol": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", + "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", "dev": true, "license": "MIT", "dependencies": { - "bl": "^5.0.0", - "vinyl": "^3.0.0" - }, - "engines": { - "node": ">=10.13.0" + "vscode-jsonrpc": "8.2.0", + "vscode-languageserver-types": "3.17.5" } }, - "node_modules/vinyl-sourcemaps-apply": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", - "integrity": "sha512-+oDh3KYZBoZC8hfocrbrxbLUeaYtQK7J5WU5Br9VqWqmCll3tFJqKp97GC9GmMsVIL0qnx2DgEDVxdo5EZ5sSw==", + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", + "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==", "dev": true, - "dependencies": { - "source-map": "^0.5.1" - } + "license": "MIT" + }, + "node_modules/vscode-languageserver-types": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", + "dev": true, + "license": "MIT" + }, + "node_modules/vscode-nls": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-5.2.0.tgz", + "integrity": "sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==", + "dev": true, + "license": "MIT" }, - "node_modules/void-elements": { + "node_modules/vscode-uri": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", - "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", "dev": true, - "engines": { - "node": ">=0.10.0" - } + "license": "MIT" }, - "node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/with": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/with/-/with-7.0.2.tgz", - "integrity": "sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==", + "node_modules/which-pm-runs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz", + "integrity": "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==", "dev": true, - "dependencies": { - "@babel/parser": "^7.9.6", - "@babel/types": "^7.9.6", - "assert-never": "^1.2.1", - "babel-walk": "3.0.0-canary-5" - }, + "license": "MIT", "engines": { - "node": ">= 10.0.0" + "node": ">=4" } }, "node_modules/wrap-ansi": { @@ -5831,20 +5926,12 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "node_modules/xxhash-wasm": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-1.1.0.tgz", + "integrity": "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==", "dev": true, - "engines": { - "node": ">=0.4" - } + "license": "MIT" }, "node_modules/y18n": { "version": "5.0.8", @@ -5856,39 +5943,84 @@ "node": ">=10" } }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "node_modules/yaml": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz", + "integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "node_modules/yaml-language-server": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/yaml-language-server/-/yaml-language-server-1.20.0.tgz", + "integrity": "sha512-qhjK/bzSRZ6HtTvgeFvjNPJGWdZ0+x5NREV/9XZWFjIGezew2b4r5JPy66IfOhd5OA7KeFwk1JfmEbnTvev0cA==", "dev": true, "license": "MIT", "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "@vscode/l10n": "^0.0.18", + "ajv": "^8.17.1", + "ajv-draft-04": "^1.0.0", + "prettier": "^3.5.0", + "request-light": "^0.5.7", + "vscode-json-languageservice": "4.1.8", + "vscode-languageserver": "^9.0.0", + "vscode-languageserver-textdocument": "^1.0.1", + "vscode-languageserver-types": "^3.16.0", + "vscode-uri": "^3.0.2", + "yaml": "2.7.1" }, - "engines": { - "node": ">=10" + "bin": { + "yaml-language-server": "bin/yaml-language-server" } }, - "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "node_modules/yaml-language-server/node_modules/request-light": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/request-light/-/request-light-0.5.8.tgz", + "integrity": "sha512-3Zjgh+8b5fhRJBQZoy+zbVKpAQGLyka0MPgW3zruTF4dFFJ8Fqcfu9YsAvi/rvdcaTeWG3MkbZv4WKxAn/84Lg==", "dev": true, - "license": "ISC", + "license": "MIT" + }, + "node_modules/yocto-queue": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", + "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", + "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } } } diff --git a/package.json b/package.json index 22a60c85..01291a82 100644 --- a/package.json +++ b/package.json @@ -1,34 +1,26 @@ { - "name": "FirefoxCSSStore", + "name": "firefoxcss-store", "version": "1.0.0", - "description": "Firefox CSS Store", + "description": "A community catalog for discovering and sharing Firefox userChrome.css themes.", "scripts": { - "build": "gulp", - "test": "node tests/themes.check.js" + "dev": "astro dev", + "build": "astro check && astro build", + "preview": "astro preview", + "test": "node scripts/validate-themes.mjs", + "audit:theme-repos": "node scripts/audit-theme-repositories.mjs", + "refresh:themes": "node scripts/refresh-theme-stats.mjs" }, "repository": { "type": "git", "url": "git@github.com:FirefoxCSS-Store/FirefoxCSS-Store.github.io.git" }, "overrides": { - "@parcel/watcher": { - "picomatch": "^4.0.4" - }, - "jstransformer-markdown-it": { - "markdown-it": "^14.1.1" - } + "yaml": "^2.8.3" }, "devDependencies": { - "@babel/core": "^7.29.0", - "@babel/preset-env": "^7.29.2", - "gulp": "^5.0.1", - "gulp-autoprefixer": "^10.0.0", - "gulp-babel": "^8.0.0", - "gulp-pug": "^5.0.0", - "gulp-sass": "^6.0.1", - "gulp-terser": "^2.1.0", - "jstransformer-markdown-it": "^3.0.0", - "sass": "^1.99.0", - "sharp": "^0.34.5" + "@astrojs/check": "^0.9.8", + "astro": "^6.1.9", + "typescript": "^5.9.3", + "zod": "^4.3.6" } } diff --git a/docs/assets/img/themes/11608darkstar_3.webp b/public/assets/img/themes/11608darkstar_3.webp similarity index 100% rename from docs/assets/img/themes/11608darkstar_3.webp rename to public/assets/img/themes/11608darkstar_3.webp diff --git a/docs/assets/img/themes/12950preview.webp b/public/assets/img/themes/12950preview.webp similarity index 100% rename from docs/assets/img/themes/12950preview.webp rename to public/assets/img/themes/12950preview.webp diff --git a/docs/assets/img/themes/13268136501706-accca691-b9c3-4841-acd7-6bb843d2f422.webp b/public/assets/img/themes/13268136501706-accca691-b9c3-4841-acd7-6bb843d2f422.webp similarity index 100% rename from docs/assets/img/themes/13268136501706-accca691-b9c3-4841-acd7-6bb843d2f422.webp rename to public/assets/img/themes/13268136501706-accca691-b9c3-4841-acd7-6bb843d2f422.webp diff --git a/docs/assets/img/themes/18217146305253-e257fbc0-993b-4e79-a0b4-0c0e6c95228b.webp b/public/assets/img/themes/18217146305253-e257fbc0-993b-4e79-a0b4-0c0e6c95228b.webp similarity index 100% rename from docs/assets/img/themes/18217146305253-e257fbc0-993b-4e79-a0b4-0c0e6c95228b.webp rename to public/assets/img/themes/18217146305253-e257fbc0-993b-4e79-a0b4-0c0e6c95228b.webp diff --git a/docs/assets/img/themes/18328141609919-befbc7f3-5199-4672-9ba1-8551d2a4e5a1.webp b/public/assets/img/themes/18328141609919-befbc7f3-5199-4672-9ba1-8551d2a4e5a1.webp similarity index 100% rename from docs/assets/img/themes/18328141609919-befbc7f3-5199-4672-9ba1-8551d2a4e5a1.webp rename to public/assets/img/themes/18328141609919-befbc7f3-5199-4672-9ba1-8551d2a4e5a1.webp diff --git a/docs/assets/img/themes/184007ilia7199au71.webp b/public/assets/img/themes/184007ilia7199au71.webp similarity index 100% rename from docs/assets/img/themes/184007ilia7199au71.webp rename to public/assets/img/themes/184007ilia7199au71.webp diff --git a/docs/assets/img/themes/19.webp b/public/assets/img/themes/19.webp similarity index 100% rename from docs/assets/img/themes/19.webp rename to public/assets/img/themes/19.webp diff --git a/docs/assets/img/themes/20.webp b/public/assets/img/themes/20.webp similarity index 100% rename from docs/assets/img/themes/20.webp rename to public/assets/img/themes/20.webp diff --git a/docs/assets/img/themes/20053home.webp b/public/assets/img/themes/20053home.webp similarity index 100% rename from docs/assets/img/themes/20053home.webp rename to public/assets/img/themes/20053home.webp diff --git a/docs/assets/img/themes/20930130265614-a7559ea7-70fd-44f9-a790-34c5c0e31493.webp b/public/assets/img/themes/20930130265614-a7559ea7-70fd-44f9-a790-34c5c0e31493.webp similarity index 100% rename from docs/assets/img/themes/20930130265614-a7559ea7-70fd-44f9-a790-34c5c0e31493.webp rename to public/assets/img/themes/20930130265614-a7559ea7-70fd-44f9-a790-34c5c0e31493.webp diff --git a/docs/assets/img/themes/22381112138598-fe8cd400-8bd1-11eb-8eed-edcca2c689d8.webp b/public/assets/img/themes/22381112138598-fe8cd400-8bd1-11eb-8eed-edcca2c689d8.webp similarity index 100% rename from docs/assets/img/themes/22381112138598-fe8cd400-8bd1-11eb-8eed-edcca2c689d8.webp rename to public/assets/img/themes/22381112138598-fe8cd400-8bd1-11eb-8eed-edcca2c689d8.webp diff --git a/docs/assets/img/themes/24535ff_protonbutquantum.webp b/public/assets/img/themes/24535ff_protonbutquantum.webp similarity index 100% rename from docs/assets/img/themes/24535ff_protonbutquantum.webp rename to public/assets/img/themes/24535ff_protonbutquantum.webp diff --git a/docs/assets/img/themes/2507221055856-8690c288-d236-4905-a58e-78e11b8238e3.gif b/public/assets/img/themes/2507221055856-8690c288-d236-4905-a58e-78e11b8238e3.gif similarity index 100% rename from docs/assets/img/themes/2507221055856-8690c288-d236-4905-a58e-78e11b8238e3.gif rename to public/assets/img/themes/2507221055856-8690c288-d236-4905-a58e-78e11b8238e3.gif diff --git a/docs/assets/img/themes/25940safari2.webp b/public/assets/img/themes/25940safari2.webp similarity index 100% rename from docs/assets/img/themes/25940safari2.webp rename to public/assets/img/themes/25940safari2.webp diff --git a/docs/assets/img/themes/29957ui.webp b/public/assets/img/themes/29957ui.webp similarity index 100% rename from docs/assets/img/themes/29957ui.webp rename to public/assets/img/themes/29957ui.webp diff --git a/docs/assets/img/themes/30433preview.webp b/public/assets/img/themes/30433preview.webp similarity index 100% rename from docs/assets/img/themes/30433preview.webp rename to public/assets/img/themes/30433preview.webp diff --git a/docs/assets/img/themes/321608U0N6E.webp b/public/assets/img/themes/321608U0N6E.webp similarity index 100% rename from docs/assets/img/themes/321608U0N6E.webp rename to public/assets/img/themes/321608U0N6E.webp diff --git a/docs/assets/img/themes/6299firefox-26-11-2023.webp b/public/assets/img/themes/6299firefox-26-11-2023.webp similarity index 100% rename from docs/assets/img/themes/6299firefox-26-11-2023.webp rename to public/assets/img/themes/6299firefox-26-11-2023.webp diff --git a/docs/assets/img/themes/8988rjy7uTd.webp b/public/assets/img/themes/8988rjy7uTd.webp similarity index 100% rename from docs/assets/img/themes/8988rjy7uTd.webp rename to public/assets/img/themes/8988rjy7uTd.webp diff --git a/docs/assets/img/themes/9037DGTAHYA.webp b/public/assets/img/themes/9037DGTAHYA.webp similarity index 100% rename from docs/assets/img/themes/9037DGTAHYA.webp rename to public/assets/img/themes/9037DGTAHYA.webp diff --git a/docs/assets/img/themes/AestheticFox.webp b/public/assets/img/themes/AestheticFox.webp similarity index 100% rename from docs/assets/img/themes/AestheticFox.webp rename to public/assets/img/themes/AestheticFox.webp diff --git a/docs/assets/img/themes/ArnimFox.webp b/public/assets/img/themes/ArnimFox.webp similarity index 100% rename from docs/assets/img/themes/ArnimFox.webp rename to public/assets/img/themes/ArnimFox.webp diff --git a/docs/assets/img/themes/AutoColor-Minimal-Proton.webp b/public/assets/img/themes/AutoColor-Minimal-Proton.webp similarity index 100% rename from docs/assets/img/themes/AutoColor-Minimal-Proton.webp rename to public/assets/img/themes/AutoColor-Minimal-Proton.webp diff --git a/docs/assets/img/themes/Bali10050sPreview.webp b/public/assets/img/themes/Bali10050sPreview.webp similarity index 100% rename from docs/assets/img/themes/Bali10050sPreview.webp rename to public/assets/img/themes/Bali10050sPreview.webp diff --git a/docs/assets/img/themes/Chameleons-Beauty.webp b/public/assets/img/themes/Chameleons-Beauty.webp similarity index 100% rename from docs/assets/img/themes/Chameleons-Beauty.webp rename to public/assets/img/themes/Chameleons-Beauty.webp diff --git a/docs/assets/img/themes/Clean_and_Transparent.webp b/public/assets/img/themes/Clean_and_Transparent.webp similarity index 100% rename from docs/assets/img/themes/Clean_and_Transparent.webp rename to public/assets/img/themes/Clean_and_Transparent.webp diff --git a/docs/assets/img/themes/CompactFoxPreview.webp b/public/assets/img/themes/CompactFoxPreview.webp similarity index 100% rename from docs/assets/img/themes/CompactFoxPreview.webp rename to public/assets/img/themes/CompactFoxPreview.webp diff --git a/docs/assets/img/themes/Edge-FrFox.webp b/public/assets/img/themes/Edge-FrFox.webp similarity index 100% rename from docs/assets/img/themes/Edge-FrFox.webp rename to public/assets/img/themes/Edge-FrFox.webp diff --git a/docs/assets/img/themes/Edge-Frfox.webp b/public/assets/img/themes/Edge-Frfox.webp similarity index 100% rename from docs/assets/img/themes/Edge-Frfox.webp rename to public/assets/img/themes/Edge-Frfox.webp diff --git a/docs/assets/img/themes/Elegant-Nord-Theme.webp b/public/assets/img/themes/Elegant-Nord-Theme.webp similarity index 100% rename from docs/assets/img/themes/Elegant-Nord-Theme.webp rename to public/assets/img/themes/Elegant-Nord-Theme.webp diff --git a/docs/assets/img/themes/FF_Ultima.gif b/public/assets/img/themes/FF_Ultima.gif similarity index 100% rename from docs/assets/img/themes/FF_Ultima.gif rename to public/assets/img/themes/FF_Ultima.gif diff --git a/docs/assets/img/themes/FF_Ultima.webp b/public/assets/img/themes/FF_Ultima.webp similarity index 100% rename from docs/assets/img/themes/FF_Ultima.webp rename to public/assets/img/themes/FF_Ultima.webp diff --git a/docs/assets/img/themes/Firefox-Alpha.webp b/public/assets/img/themes/Firefox-Alpha.webp similarity index 100% rename from docs/assets/img/themes/Firefox-Alpha.webp rename to public/assets/img/themes/Firefox-Alpha.webp diff --git a/docs/assets/img/themes/FrameUIScreenshot.webp b/public/assets/img/themes/FrameUIScreenshot.webp similarity index 100% rename from docs/assets/img/themes/FrameUIScreenshot.webp rename to public/assets/img/themes/FrameUIScreenshot.webp diff --git a/docs/assets/img/themes/GentleFox.webp b/public/assets/img/themes/GentleFox.webp similarity index 100% rename from docs/assets/img/themes/GentleFox.webp rename to public/assets/img/themes/GentleFox.webp diff --git a/docs/assets/img/themes/ImpossibleFox.webp b/public/assets/img/themes/ImpossibleFox.webp similarity index 100% rename from docs/assets/img/themes/ImpossibleFox.webp rename to public/assets/img/themes/ImpossibleFox.webp diff --git a/docs/assets/img/themes/Khalyl.webp b/public/assets/img/themes/Khalyl.webp similarity index 100% rename from docs/assets/img/themes/Khalyl.webp rename to public/assets/img/themes/Khalyl.webp diff --git a/docs/assets/img/themes/Lepton-PhotonStyle.webp b/public/assets/img/themes/Lepton-PhotonStyle.webp similarity index 100% rename from docs/assets/img/themes/Lepton-PhotonStyle.webp rename to public/assets/img/themes/Lepton-PhotonStyle.webp diff --git a/docs/assets/img/themes/Lepton.webp b/public/assets/img/themes/Lepton.webp similarity index 100% rename from docs/assets/img/themes/Lepton.webp rename to public/assets/img/themes/Lepton.webp diff --git a/docs/assets/img/themes/MacOSVibrant.webp b/public/assets/img/themes/MacOSVibrant.webp similarity index 100% rename from docs/assets/img/themes/MacOSVibrant.webp rename to public/assets/img/themes/MacOSVibrant.webp diff --git a/docs/assets/img/themes/Minimalist-DarkGreen.gif b/public/assets/img/themes/Minimalist-DarkGreen.gif similarity index 100% rename from docs/assets/img/themes/Minimalist-DarkGreen.gif rename to public/assets/img/themes/Minimalist-DarkGreen.gif diff --git a/docs/assets/img/themes/Monterey-Fox.webp b/public/assets/img/themes/Monterey-Fox.webp similarity index 100% rename from docs/assets/img/themes/Monterey-Fox.webp rename to public/assets/img/themes/Monterey-Fox.webp diff --git a/docs/assets/img/themes/MyFirefoxThemenotholar.webp b/public/assets/img/themes/MyFirefoxThemenotholar.webp similarity index 100% rename from docs/assets/img/themes/MyFirefoxThemenotholar.webp rename to public/assets/img/themes/MyFirefoxThemenotholar.webp diff --git a/docs/assets/img/themes/My_Firefox_theme_-_uFffDtark.webp b/public/assets/img/themes/My_Firefox_theme_-_uFffDtark.webp similarity index 100% rename from docs/assets/img/themes/My_Firefox_theme_-_uFffDtark.webp rename to public/assets/img/themes/My_Firefox_theme_-_uFffDtark.webp diff --git a/docs/assets/img/themes/NightSky.webp b/public/assets/img/themes/NightSky.webp similarity index 100% rename from docs/assets/img/themes/NightSky.webp rename to public/assets/img/themes/NightSky.webp diff --git a/docs/assets/img/themes/Oneliner_Deluxe.webp b/public/assets/img/themes/Oneliner_Deluxe.webp similarity index 100% rename from docs/assets/img/themes/Oneliner_Deluxe.webp rename to public/assets/img/themes/Oneliner_Deluxe.webp diff --git a/docs/assets/img/themes/PotatoFox.webp b/public/assets/img/themes/PotatoFox.webp similarity index 100% rename from docs/assets/img/themes/PotatoFox.webp rename to public/assets/img/themes/PotatoFox.webp diff --git a/docs/assets/img/themes/PretoFox.webp b/public/assets/img/themes/PretoFox.webp similarity index 100% rename from docs/assets/img/themes/PretoFox.webp rename to public/assets/img/themes/PretoFox.webp diff --git a/docs/assets/img/themes/Proton Square.webp b/public/assets/img/themes/Proton Square.webp similarity index 100% rename from docs/assets/img/themes/Proton Square.webp rename to public/assets/img/themes/Proton Square.webp diff --git a/docs/assets/img/themes/RealFire-main.webp b/public/assets/img/themes/RealFire-main.webp similarity index 100% rename from docs/assets/img/themes/RealFire-main.webp rename to public/assets/img/themes/RealFire-main.webp diff --git a/docs/assets/img/themes/Shina.webp b/public/assets/img/themes/Shina.webp similarity index 100% rename from docs/assets/img/themes/Shina.webp rename to public/assets/img/themes/Shina.webp diff --git a/docs/assets/img/themes/Simple_Oneliner.webp b/public/assets/img/themes/Simple_Oneliner.webp similarity index 100% rename from docs/assets/img/themes/Simple_Oneliner.webp rename to public/assets/img/themes/Simple_Oneliner.webp diff --git a/docs/assets/img/themes/TYHFox.webp b/public/assets/img/themes/TYHFox.webp similarity index 100% rename from docs/assets/img/themes/TYHFox.webp rename to public/assets/img/themes/TYHFox.webp diff --git a/docs/assets/img/themes/Technetium.webp b/public/assets/img/themes/Technetium.webp similarity index 100% rename from docs/assets/img/themes/Technetium.webp rename to public/assets/img/themes/Technetium.webp diff --git a/docs/assets/img/themes/Three_Rows.webp b/public/assets/img/themes/Three_Rows.webp similarity index 100% rename from docs/assets/img/themes/Three_Rows.webp rename to public/assets/img/themes/Three_Rows.webp diff --git a/docs/assets/img/themes/ViceFox.webp b/public/assets/img/themes/ViceFox.webp similarity index 100% rename from docs/assets/img/themes/ViceFox.webp rename to public/assets/img/themes/ViceFox.webp diff --git a/docs/assets/img/themes/aeroFirefox.webp b/public/assets/img/themes/aeroFirefox.webp similarity index 100% rename from docs/assets/img/themes/aeroFirefox.webp rename to public/assets/img/themes/aeroFirefox.webp diff --git a/docs/assets/img/themes/almostdarkproton.webp b/public/assets/img/themes/almostdarkproton.webp similarity index 100% rename from docs/assets/img/themes/almostdarkproton.webp rename to public/assets/img/themes/almostdarkproton.webp diff --git a/docs/assets/img/themes/alpenblue.webp b/public/assets/img/themes/alpenblue.webp similarity index 100% rename from docs/assets/img/themes/alpenblue.webp rename to public/assets/img/themes/alpenblue.webp diff --git a/docs/assets/img/themes/always-fullscreen-firefox.webp b/public/assets/img/themes/always-fullscreen-firefox.webp similarity index 100% rename from docs/assets/img/themes/always-fullscreen-firefox.webp rename to public/assets/img/themes/always-fullscreen-firefox.webp diff --git a/docs/assets/img/themes/animatedfox.webp b/public/assets/img/themes/animatedfox.webp similarity index 100% rename from docs/assets/img/themes/animatedfox.webp rename to public/assets/img/themes/animatedfox.webp diff --git a/docs/assets/img/themes/anotheroneline.webp b/public/assets/img/themes/anotheroneline.webp similarity index 100% rename from docs/assets/img/themes/anotheroneline.webp rename to public/assets/img/themes/anotheroneline.webp diff --git a/docs/assets/img/themes/arcadia.webp b/public/assets/img/themes/arcadia.webp similarity index 100% rename from docs/assets/img/themes/arcadia.webp rename to public/assets/img/themes/arcadia.webp diff --git a/docs/assets/img/themes/arcadiapreview.gif b/public/assets/img/themes/arcadiapreview.gif similarity index 100% rename from docs/assets/img/themes/arcadiapreview.gif rename to public/assets/img/themes/arcadiapreview.gif diff --git a/docs/assets/img/themes/arcfox.webp b/public/assets/img/themes/arcfox.webp similarity index 100% rename from docs/assets/img/themes/arcfox.webp rename to public/assets/img/themes/arcfox.webp diff --git a/docs/assets/img/themes/arcwtf.webp b/public/assets/img/themes/arcwtf.webp similarity index 100% rename from docs/assets/img/themes/arcwtf.webp rename to public/assets/img/themes/arcwtf.webp diff --git a/docs/assets/img/themes/blurfox.webp b/public/assets/img/themes/blurfox.webp similarity index 100% rename from docs/assets/img/themes/blurfox.webp rename to public/assets/img/themes/blurfox.webp diff --git a/docs/assets/img/themes/blurred.webp b/public/assets/img/themes/blurred.webp similarity index 100% rename from docs/assets/img/themes/blurred.webp rename to public/assets/img/themes/blurred.webp diff --git a/docs/assets/img/themes/cascade.webp b/public/assets/img/themes/cascade.webp similarity index 100% rename from docs/assets/img/themes/cascade.webp rename to public/assets/img/themes/cascade.webp diff --git a/docs/assets/img/themes/compact_verticaltabs_view.webp b/public/assets/img/themes/compact_verticaltabs_view.webp similarity index 100% rename from docs/assets/img/themes/compact_verticaltabs_view.webp rename to public/assets/img/themes/compact_verticaltabs_view.webp diff --git a/docs/assets/img/themes/custom_australistabs_protonUI.webp b/public/assets/img/themes/custom_australistabs_protonUI.webp similarity index 100% rename from docs/assets/img/themes/custom_australistabs_protonUI.webp rename to public/assets/img/themes/custom_australistabs_protonUI.webp diff --git a/docs/assets/img/themes/cyanmatrx.webp b/public/assets/img/themes/cyanmatrx.webp similarity index 100% rename from docs/assets/img/themes/cyanmatrx.webp rename to public/assets/img/themes/cyanmatrx.webp diff --git a/docs/assets/img/themes/d0sse_mac_fox_screen.webp b/public/assets/img/themes/d0sse_mac_fox_screen.webp similarity index 100% rename from docs/assets/img/themes/d0sse_mac_fox_screen.webp rename to public/assets/img/themes/d0sse_mac_fox_screen.webp diff --git a/docs/assets/img/themes/darkmatter.webp b/public/assets/img/themes/darkmatter.webp similarity index 100% rename from docs/assets/img/themes/darkmatter.webp rename to public/assets/img/themes/darkmatter.webp diff --git a/docs/assets/img/themes/diamondfucsia.webp b/public/assets/img/themes/diamondfucsia.webp similarity index 100% rename from docs/assets/img/themes/diamondfucsia.webp rename to public/assets/img/themes/diamondfucsia.webp diff --git a/docs/assets/img/themes/dracula.webp b/public/assets/img/themes/dracula.webp similarity index 100% rename from docs/assets/img/themes/dracula.webp rename to public/assets/img/themes/dracula.webp diff --git a/docs/assets/img/themes/duskfox.webp b/public/assets/img/themes/duskfox.webp similarity index 100% rename from docs/assets/img/themes/duskfox.webp rename to public/assets/img/themes/duskfox.webp diff --git a/docs/assets/img/themes/edgefox.webp b/public/assets/img/themes/edgefox.webp similarity index 100% rename from docs/assets/img/themes/edgefox.webp rename to public/assets/img/themes/edgefox.webp diff --git a/docs/assets/img/themes/edgyarc-fr.webp b/public/assets/img/themes/edgyarc-fr.webp similarity index 100% rename from docs/assets/img/themes/edgyarc-fr.webp rename to public/assets/img/themes/edgyarc-fr.webp diff --git a/docs/assets/img/themes/elegant_floorp.webp b/public/assets/img/themes/elegant_floorp.webp similarity index 100% rename from docs/assets/img/themes/elegant_floorp.webp rename to public/assets/img/themes/elegant_floorp.webp diff --git a/docs/assets/img/themes/elegantfox.webp b/public/assets/img/themes/elegantfox.webp similarity index 100% rename from docs/assets/img/themes/elegantfox.webp rename to public/assets/img/themes/elegantfox.webp diff --git a/docs/assets/img/themes/essence.webp b/public/assets/img/themes/essence.webp similarity index 100% rename from docs/assets/img/themes/essence.webp rename to public/assets/img/themes/essence.webp diff --git a/docs/assets/img/themes/ff-i3wm.webp b/public/assets/img/themes/ff-i3wm.webp similarity index 100% rename from docs/assets/img/themes/ff-i3wm.webp rename to public/assets/img/themes/ff-i3wm.webp diff --git a/docs/assets/img/themes/ff95.webp b/public/assets/img/themes/ff95.webp similarity index 100% rename from docs/assets/img/themes/ff95.webp rename to public/assets/img/themes/ff95.webp diff --git a/docs/assets/img/themes/ff95xtracompact.webp b/public/assets/img/themes/ff95xtracompact.webp similarity index 100% rename from docs/assets/img/themes/ff95xtracompact.webp rename to public/assets/img/themes/ff95xtracompact.webp diff --git a/docs/assets/img/themes/fireFoxOneLinerCSS.webp b/public/assets/img/themes/fireFoxOneLinerCSS.webp similarity index 100% rename from docs/assets/img/themes/fireFoxOneLinerCSS.webp rename to public/assets/img/themes/fireFoxOneLinerCSS.webp diff --git a/docs/assets/img/themes/firefox-eos6-theme.webp b/public/assets/img/themes/firefox-eos6-theme.webp similarity index 100% rename from docs/assets/img/themes/firefox-eos6-theme.webp rename to public/assets/img/themes/firefox-eos6-theme.webp diff --git a/docs/assets/img/themes/firefox-gnome-theme.webp b/public/assets/img/themes/firefox-gnome-theme.webp similarity index 100% rename from docs/assets/img/themes/firefox-gnome-theme.webp rename to public/assets/img/themes/firefox-gnome-theme.webp diff --git a/docs/assets/img/themes/firefox-gx.webp b/public/assets/img/themes/firefox-gx.webp similarity index 100% rename from docs/assets/img/themes/firefox-gx.webp rename to public/assets/img/themes/firefox-gx.webp diff --git a/docs/assets/img/themes/firefox-one.webp b/public/assets/img/themes/firefox-one.webp similarity index 100% rename from docs/assets/img/themes/firefox-one.webp rename to public/assets/img/themes/firefox-one.webp diff --git a/docs/assets/img/themes/firefoxcss.webp b/public/assets/img/themes/firefoxcss.webp similarity index 100% rename from docs/assets/img/themes/firefoxcss.webp rename to public/assets/img/themes/firefoxcss.webp diff --git a/docs/assets/img/themes/firefoxcssplus.webp b/public/assets/img/themes/firefoxcssplus.webp similarity index 100% rename from docs/assets/img/themes/firefoxcssplus.webp rename to public/assets/img/themes/firefoxcssplus.webp diff --git a/docs/assets/img/themes/firefoxhalo.webp b/public/assets/img/themes/firefoxhalo.webp similarity index 100% rename from docs/assets/img/themes/firefoxhalo.webp rename to public/assets/img/themes/firefoxhalo.webp diff --git a/docs/assets/img/themes/firefoxmodblur.webp b/public/assets/img/themes/firefoxmodblur.webp similarity index 100% rename from docs/assets/img/themes/firefoxmodblur.webp rename to public/assets/img/themes/firefoxmodblur.webp diff --git a/docs/assets/img/themes/firefoxoneline.webp b/public/assets/img/themes/firefoxoneline.webp similarity index 100% rename from docs/assets/img/themes/firefoxoneline.webp rename to public/assets/img/themes/firefoxoneline.webp diff --git a/docs/assets/img/themes/firefoxreview.webp b/public/assets/img/themes/firefoxreview.webp similarity index 100% rename from docs/assets/img/themes/firefoxreview.webp rename to public/assets/img/themes/firefoxreview.webp diff --git a/docs/assets/img/themes/firefoxuwpstyle.webp b/public/assets/img/themes/firefoxuwpstyle.webp similarity index 100% rename from docs/assets/img/themes/firefoxuwpstyle.webp rename to public/assets/img/themes/firefoxuwpstyle.webp diff --git a/docs/assets/img/themes/flying.webp b/public/assets/img/themes/flying.webp similarity index 100% rename from docs/assets/img/themes/flying.webp rename to public/assets/img/themes/flying.webp diff --git a/docs/assets/img/themes/fox11.webp b/public/assets/img/themes/fox11.webp similarity index 100% rename from docs/assets/img/themes/fox11.webp rename to public/assets/img/themes/fox11.webp diff --git a/docs/assets/img/themes/ftbf.webp b/public/assets/img/themes/ftbf.webp similarity index 100% rename from docs/assets/img/themes/ftbf.webp rename to public/assets/img/themes/ftbf.webp diff --git a/docs/assets/img/themes/fx-compact-mode.webp b/public/assets/img/themes/fx-compact-mode.webp similarity index 100% rename from docs/assets/img/themes/fx-compact-mode.webp rename to public/assets/img/themes/fx-compact-mode.webp diff --git a/docs/assets/img/themes/glassyfox.webp b/public/assets/img/themes/glassyfox.webp similarity index 100% rename from docs/assets/img/themes/glassyfox.webp rename to public/assets/img/themes/glassyfox.webp diff --git a/docs/assets/img/themes/martinfox.webp b/public/assets/img/themes/martinfox.webp similarity index 100% rename from docs/assets/img/themes/martinfox.webp rename to public/assets/img/themes/martinfox.webp diff --git a/docs/assets/img/themes/material-fox-updated-preview.webp b/public/assets/img/themes/material-fox-updated-preview.webp similarity index 100% rename from docs/assets/img/themes/material-fox-updated-preview.webp rename to public/assets/img/themes/material-fox-updated-preview.webp diff --git a/docs/assets/img/themes/materialfox.webp b/public/assets/img/themes/materialfox.webp similarity index 100% rename from docs/assets/img/themes/materialfox.webp rename to public/assets/img/themes/materialfox.webp diff --git a/docs/assets/img/themes/minifox.webp b/public/assets/img/themes/minifox.webp similarity index 100% rename from docs/assets/img/themes/minifox.webp rename to public/assets/img/themes/minifox.webp diff --git a/docs/assets/img/themes/minimal_arc.webp b/public/assets/img/themes/minimal_arc.webp similarity index 100% rename from docs/assets/img/themes/minimal_arc.webp rename to public/assets/img/themes/minimal_arc.webp diff --git a/docs/assets/img/themes/minimalfox.webp b/public/assets/img/themes/minimalfox.webp similarity index 100% rename from docs/assets/img/themes/minimalfox.webp rename to public/assets/img/themes/minimalfox.webp diff --git a/docs/assets/img/themes/minimalfuntionalfox.webp b/public/assets/img/themes/minimalfuntionalfox.webp similarity index 100% rename from docs/assets/img/themes/minimalfuntionalfox.webp rename to public/assets/img/themes/minimalfuntionalfox.webp diff --git a/docs/assets/img/themes/minimalist-oneliner.webp b/public/assets/img/themes/minimalist-oneliner.webp similarity index 100% rename from docs/assets/img/themes/minimalist-oneliner.webp rename to public/assets/img/themes/minimalist-oneliner.webp diff --git a/docs/assets/img/themes/molff.webp b/public/assets/img/themes/molff.webp similarity index 100% rename from docs/assets/img/themes/molff.webp rename to public/assets/img/themes/molff.webp diff --git a/docs/assets/img/themes/monochromeNeubrutalism.webp b/public/assets/img/themes/monochromeNeubrutalism.webp similarity index 100% rename from docs/assets/img/themes/monochromeNeubrutalism.webp rename to public/assets/img/themes/monochromeNeubrutalism.webp diff --git a/docs/assets/img/themes/moonlight.webp b/public/assets/img/themes/moonlight.webp similarity index 100% rename from docs/assets/img/themes/moonlight.webp rename to public/assets/img/themes/moonlight.webp diff --git a/docs/assets/img/themes/natura.webp b/public/assets/img/themes/natura.webp similarity index 100% rename from docs/assets/img/themes/natura.webp rename to public/assets/img/themes/natura.webp diff --git a/docs/assets/img/themes/nord.webp b/public/assets/img/themes/nord.webp similarity index 100% rename from docs/assets/img/themes/nord.webp rename to public/assets/img/themes/nord.webp diff --git a/docs/assets/img/themes/onebar.webp b/public/assets/img/themes/onebar.webp similarity index 100% rename from docs/assets/img/themes/onebar.webp rename to public/assets/img/themes/onebar.webp diff --git a/docs/assets/img/themes/onelineproton.webp b/public/assets/img/themes/onelineproton.webp similarity index 100% rename from docs/assets/img/themes/onelineproton.webp rename to public/assets/img/themes/onelineproton.webp diff --git a/docs/assets/img/themes/opera-gx.webp b/public/assets/img/themes/opera-gx.webp similarity index 100% rename from docs/assets/img/themes/opera-gx.webp rename to public/assets/img/themes/opera-gx.webp diff --git a/docs/assets/img/themes/parfait.webp b/public/assets/img/themes/parfait.webp similarity index 100% rename from docs/assets/img/themes/parfait.webp rename to public/assets/img/themes/parfait.webp diff --git a/docs/assets/img/themes/pro-fox.webp b/public/assets/img/themes/pro-fox.webp similarity index 100% rename from docs/assets/img/themes/pro-fox.webp rename to public/assets/img/themes/pro-fox.webp diff --git a/docs/assets/img/themes/proton-ui-gradient-rounded-tabs-display.webp b/public/assets/img/themes/proton-ui-gradient-rounded-tabs-display.webp similarity index 100% rename from docs/assets/img/themes/proton-ui-gradient-rounded-tabs-display.webp rename to public/assets/img/themes/proton-ui-gradient-rounded-tabs-display.webp diff --git a/docs/assets/img/themes/protovibrant.webp b/public/assets/img/themes/protovibrant.webp similarity index 100% rename from docs/assets/img/themes/protovibrant.webp rename to public/assets/img/themes/protovibrant.webp diff --git a/docs/assets/img/themes/quietfox.webp b/public/assets/img/themes/quietfox.webp similarity index 100% rename from docs/assets/img/themes/quietfox.webp rename to public/assets/img/themes/quietfox.webp diff --git a/docs/assets/img/themes/rainfox.webp b/public/assets/img/themes/rainfox.webp similarity index 100% rename from docs/assets/img/themes/rainfox.webp rename to public/assets/img/themes/rainfox.webp diff --git a/docs/assets/img/themes/remote-102-ff-ultima.gif b/public/assets/img/themes/remote-102-ff-ultima.gif similarity index 100% rename from docs/assets/img/themes/remote-102-ff-ultima.gif rename to public/assets/img/themes/remote-102-ff-ultima.gif diff --git a/docs/assets/img/themes/remote-118-ministhetic-firefox.gif b/public/assets/img/themes/remote-118-ministhetic-firefox.gif similarity index 100% rename from docs/assets/img/themes/remote-118-ministhetic-firefox.gif rename to public/assets/img/themes/remote-118-ministhetic-firefox.gif diff --git a/docs/assets/img/themes/remote-121-downtoneui.gif b/public/assets/img/themes/remote-121-downtoneui.gif similarity index 100% rename from docs/assets/img/themes/remote-121-downtoneui.gif rename to public/assets/img/themes/remote-121-downtoneui.gif diff --git a/docs/assets/img/themes/remote-122-firefox-moonlight-theme.webp b/public/assets/img/themes/remote-122-firefox-moonlight-theme.webp similarity index 100% rename from docs/assets/img/themes/remote-122-firefox-moonlight-theme.webp rename to public/assets/img/themes/remote-122-firefox-moonlight-theme.webp diff --git a/docs/assets/img/themes/remote-124-sakuras-simple-sidebar.gif b/public/assets/img/themes/remote-124-sakuras-simple-sidebar.gif similarity index 100% rename from docs/assets/img/themes/remote-124-sakuras-simple-sidebar.gif rename to public/assets/img/themes/remote-124-sakuras-simple-sidebar.gif diff --git a/docs/assets/img/themes/remote-125-littlefox.webp b/public/assets/img/themes/remote-125-littlefox.webp similarity index 100% rename from docs/assets/img/themes/remote-125-littlefox.webp rename to public/assets/img/themes/remote-125-littlefox.webp diff --git a/docs/assets/img/themes/remote-126-flexfox.webp b/public/assets/img/themes/remote-126-flexfox.webp similarity index 100% rename from docs/assets/img/themes/remote-126-flexfox.webp rename to public/assets/img/themes/remote-126-flexfox.webp diff --git a/docs/assets/img/themes/remote-127-git-userchrome.gif b/public/assets/img/themes/remote-127-git-userchrome.gif similarity index 100% rename from docs/assets/img/themes/remote-127-git-userchrome.gif rename to public/assets/img/themes/remote-127-git-userchrome.gif diff --git a/docs/assets/img/themes/remote-128-gruvbox-gnomeish.webp b/public/assets/img/themes/remote-128-gruvbox-gnomeish.webp similarity index 100% rename from docs/assets/img/themes/remote-128-gruvbox-gnomeish.webp rename to public/assets/img/themes/remote-128-gruvbox-gnomeish.webp diff --git a/docs/assets/img/themes/remote-130-newfox.webp b/public/assets/img/themes/remote-130-newfox.webp similarity index 100% rename from docs/assets/img/themes/remote-130-newfox.webp rename to public/assets/img/themes/remote-130-newfox.webp diff --git a/docs/assets/img/themes/remote-131-transparentfox.webp b/public/assets/img/themes/remote-131-transparentfox.webp similarity index 100% rename from docs/assets/img/themes/remote-131-transparentfox.webp rename to public/assets/img/themes/remote-131-transparentfox.webp diff --git a/docs/assets/img/themes/remote-132-wmfox.webp b/public/assets/img/themes/remote-132-wmfox.webp similarity index 100% rename from docs/assets/img/themes/remote-132-wmfox.webp rename to public/assets/img/themes/remote-132-wmfox.webp diff --git a/docs/assets/img/themes/remote-133-fennec.webp b/public/assets/img/themes/remote-133-fennec.webp similarity index 100% rename from docs/assets/img/themes/remote-133-fennec.webp rename to public/assets/img/themes/remote-133-fennec.webp diff --git a/docs/assets/img/themes/remote-134-dynamic-color.webp b/public/assets/img/themes/remote-134-dynamic-color.webp similarity index 100% rename from docs/assets/img/themes/remote-134-dynamic-color.webp rename to public/assets/img/themes/remote-134-dynamic-color.webp diff --git a/docs/assets/img/themes/rounded_fox.webp b/public/assets/img/themes/rounded_fox.webp similarity index 100% rename from docs/assets/img/themes/rounded_fox.webp rename to public/assets/img/themes/rounded_fox.webp diff --git a/docs/assets/img/themes/screenshot-site.webp b/public/assets/img/themes/screenshot-site.webp similarity index 100% rename from docs/assets/img/themes/screenshot-site.webp rename to public/assets/img/themes/screenshot-site.webp diff --git a/public/assets/img/themes/seal-mint-1.png b/public/assets/img/themes/seal-mint-1.png new file mode 100644 index 00000000..b312dda7 Binary files /dev/null and b/public/assets/img/themes/seal-mint-1.png differ diff --git a/docs/assets/img/themes/shyfox.webp b/public/assets/img/themes/shyfox.webp similarity index 100% rename from docs/assets/img/themes/shyfox.webp rename to public/assets/img/themes/shyfox.webp diff --git a/docs/assets/img/themes/sidefox.webp b/public/assets/img/themes/sidefox.webp similarity index 100% rename from docs/assets/img/themes/sidefox.webp rename to public/assets/img/themes/sidefox.webp diff --git a/docs/assets/img/themes/silentfox.webp b/public/assets/img/themes/silentfox.webp similarity index 100% rename from docs/assets/img/themes/silentfox.webp rename to public/assets/img/themes/silentfox.webp diff --git a/docs/assets/img/themes/simplefox-feather.webp b/public/assets/img/themes/simplefox-feather.webp similarity index 100% rename from docs/assets/img/themes/simplefox-feather.webp rename to public/assets/img/themes/simplefox-feather.webp diff --git a/docs/assets/img/themes/simplefox.webp b/public/assets/img/themes/simplefox.webp similarity index 100% rename from docs/assets/img/themes/simplefox.webp rename to public/assets/img/themes/simplefox.webp diff --git a/docs/assets/img/themes/simplerentfox.webp b/public/assets/img/themes/simplerentfox.webp similarity index 100% rename from docs/assets/img/themes/simplerentfox.webp rename to public/assets/img/themes/simplerentfox.webp diff --git a/docs/assets/img/themes/simplify_darkish_for_firefox_preview.webp b/public/assets/img/themes/simplify_darkish_for_firefox_preview.webp similarity index 100% rename from docs/assets/img/themes/simplify_darkish_for_firefox_preview.webp rename to public/assets/img/themes/simplify_darkish_for_firefox_preview.webp diff --git a/docs/assets/img/themes/simplify_silver_peach_for_firefox_preview.webp b/public/assets/img/themes/simplify_silver_peach_for_firefox_preview.webp similarity index 100% rename from docs/assets/img/themes/simplify_silver_peach_for_firefox_preview.webp rename to public/assets/img/themes/simplify_silver_peach_for_firefox_preview.webp diff --git a/docs/assets/img/themes/snowfox.webp b/public/assets/img/themes/snowfox.webp similarity index 100% rename from docs/assets/img/themes/snowfox.webp rename to public/assets/img/themes/snowfox.webp diff --git a/docs/assets/img/themes/soupbowlmodoki.webp b/public/assets/img/themes/soupbowlmodoki.webp similarity index 100% rename from docs/assets/img/themes/soupbowlmodoki.webp rename to public/assets/img/themes/soupbowlmodoki.webp diff --git a/docs/assets/img/themes/splashcompact.webp b/public/assets/img/themes/splashcompact.webp similarity index 100% rename from docs/assets/img/themes/splashcompact.webp rename to public/assets/img/themes/splashcompact.webp diff --git a/docs/assets/img/themes/starry-fox-resize.webp b/public/assets/img/themes/starry-fox-resize.webp similarity index 100% rename from docs/assets/img/themes/starry-fox-resize.webp rename to public/assets/img/themes/starry-fox-resize.webp diff --git a/docs/assets/img/themes/sweetpop.webp b/public/assets/img/themes/sweetpop.webp similarity index 100% rename from docs/assets/img/themes/sweetpop.webp rename to public/assets/img/themes/sweetpop.webp diff --git a/docs/assets/img/themes/tilefox.webp b/public/assets/img/themes/tilefox.webp similarity index 100% rename from docs/assets/img/themes/tilefox.webp rename to public/assets/img/themes/tilefox.webp diff --git a/docs/assets/img/themes/titlebarfix.webp b/public/assets/img/themes/titlebarfix.webp similarity index 100% rename from docs/assets/img/themes/titlebarfix.webp rename to public/assets/img/themes/titlebarfix.webp diff --git a/docs/assets/img/themes/waterfall.webp b/public/assets/img/themes/waterfall.webp similarity index 100% rename from docs/assets/img/themes/waterfall.webp rename to public/assets/img/themes/waterfall.webp diff --git a/docs/assets/img/themes/whitesur.webp b/public/assets/img/themes/whitesur.webp similarity index 100% rename from docs/assets/img/themes/whitesur.webp rename to public/assets/img/themes/whitesur.webp diff --git a/docs/assets/img/themes/whitesur_vinceliuice.webp b/public/assets/img/themes/whitesur_vinceliuice.webp similarity index 100% rename from docs/assets/img/themes/whitesur_vinceliuice.webp rename to public/assets/img/themes/whitesur_vinceliuice.webp diff --git a/docs/assets/img/themes/xtracompact.webp b/public/assets/img/themes/xtracompact.webp similarity index 100% rename from docs/assets/img/themes/xtracompact.webp rename to public/assets/img/themes/xtracompact.webp diff --git a/docs/assets/img/themes/zaps-photon.webp b/public/assets/img/themes/zaps-photon.webp similarity index 100% rename from docs/assets/img/themes/zaps-photon.webp rename to public/assets/img/themes/zaps-photon.webp diff --git a/docs/icon.png b/public/icon.png similarity index 100% rename from docs/icon.png rename to public/icon.png diff --git a/dev/config/robots.txt b/public/robots.txt similarity index 100% rename from dev/config/robots.txt rename to public/robots.txt diff --git a/scripts/audit-theme-repositories.mjs b/scripts/audit-theme-repositories.mjs new file mode 100644 index 00000000..8540926c --- /dev/null +++ b/scripts/audit-theme-repositories.mjs @@ -0,0 +1,261 @@ +import fs from 'node:fs/promises' +import path from 'node:path' +import { fileURLToPath } from 'node:url' + +const root = path.dirname(path.dirname(fileURLToPath(import.meta.url))) +const themesDir = path.join(root, 'src/content/themes') +const reportPath = path.join(root, process.env.RETIREMENT_REPORT || 'theme-repository-audit.md') +const githubToken = process.env.GITHUB_TOKEN +const gitlabToken = process.env.GITLAB_TOKEN +const codebergToken = process.env.CODEBERG_TOKEN +const genericGiteaToken = process.env.GITEA_TOKEN + +function authHeaders(token, scheme = 'Bearer') { + return token ? { Authorization: `${scheme} ${token}` } : {} +} + +async function requestRepository(url, headers = {}) { + const response = await fetch(url, { headers }) + + if (response.status === 404 || response.status === 410) { + return { exists: false, status: response.status } + } + + if (!response.ok) { + throw new Error(`${response.status} ${response.statusText}`) + } + + return { exists: true, data: await response.json() } +} + +function parseRepo(repository) { + const url = new URL(repository) + const [owner, name] = url.pathname.replace(/^\/|\/$/g, '').split('/') + + if (!owner || !name) { + throw new Error(`Unsupported repository path: ${repository}`) + } + + return { host: url.hostname.replace(/^www\./, ''), owner, name } +} + +function normalizeAvatar(host, avatar) { + if (!avatar) return null + if (avatar.startsWith('http://') || avatar.startsWith('https://')) return avatar + if (avatar.startsWith('/')) return `https://${host}${avatar}` + return null +} + +async function readGithub(repo) { + const result = await requestRepository( + `https://api.github.com/repos/${repo.owner}/${repo.name}`, + authHeaders(githubToken) + ) + + if (!result.exists) return result + + return { + exists: true, + archived: Boolean(result.data.archived), + stats: { + stars: result.data.stargazers_count ?? 0, + updatedAt: result.data.pushed_at ?? result.data.updated_at ?? null, + ownerAvatar: result.data.owner?.avatar_url ?? null, + accessible: true + } + } +} + +async function readGitlab(repo) { + const encoded = encodeURIComponent(`${repo.owner}/${repo.name}`) + const result = await requestRepository( + `https://gitlab.com/api/v4/projects/${encoded}`, + authHeaders(gitlabToken) + ) + + if (!result.exists) return result + + return { + exists: true, + archived: Boolean(result.data.archived), + stats: { + stars: result.data.star_count ?? 0, + updatedAt: result.data.last_activity_at ?? null, + ownerAvatar: normalizeAvatar('gitlab.com', result.data.namespace?.avatar_url ?? null), + accessible: true + } + } +} + +async function readGitea(repo) { + const token = repo.host === 'codeberg.org' ? codebergToken : genericGiteaToken + const result = await requestRepository( + `https://${repo.host}/api/v1/repos/${repo.owner}/${repo.name}`, + authHeaders(token, 'token') + ) + + if (!result.exists) return result + + return { + exists: true, + archived: Boolean(result.data.archived), + stats: { + stars: result.data.stars_count ?? result.data.stargazers_count ?? 0, + updatedAt: result.data.updated_at ?? null, + ownerAvatar: normalizeAvatar(repo.host, result.data.owner?.avatar_url ?? null), + accessible: true + } + } +} + +async function inspectRepository(repository) { + const repo = parseRepo(repository) + + if (repo.host === 'github.com') return readGithub(repo) + if (repo.host === 'gitlab.com') return readGitlab(repo) + return readGitea(repo) +} + +function retirementFor(result) { + if (!result.exists) { + return { + reason: 'repository-unavailable', + details: `Repository returned ${result.status}; it may have been deleted, moved, or made private.` + } + } + + if (result.archived) { + return { + reason: 'repository-archived', + details: 'Repository is archived by its owner.' + } + } + + return null +} + +function renderReport(archiveMoves, removals, skipped, checkedAt) { + const lines = [ + '# Monthly Theme Repository Audit', + '', + `Checked at: ${checkedAt}`, + '', + 'This PR was generated automatically for maintainer review.', + '', + '- Published repositories that still exist but are archived are moved to the public archive as unsupported themes.', + '- Published or archived repositories that no longer exist or are inaccessible are removed from the catalog.', + '' + ] + + if (archiveMoves.length === 0 && removals.length === 0) { + lines.push('No published or archived themes need archive or removal changes.') + } else { + if (archiveMoves.length > 0) { + lines.push('## Proposed Archive Moves', '') + for (const item of archiveMoves) { + lines.push(`- **${item.title}** (${item.slug})`) + lines.push(` - Repository: ${item.repository}`) + lines.push(` - Details: ${item.details}`) + } + } + + if (removals.length > 0) { + lines.push('', '## Proposed Removals', '') + for (const item of removals) { + lines.push(`- **${item.title}** (${item.slug})`) + lines.push(` - Repository: ${item.repository}`) + lines.push(` - Current status: ${item.status}`) + lines.push(` - Details: ${item.details}`) + } + } + } + + if (skipped.length > 0) { + lines.push('', '## Skipped For Manual Follow-Up', '') + for (const item of skipped) { + lines.push(`- **${item.title}** (${item.slug})`) + lines.push(` - Repository: ${item.repository}`) + lines.push(` - Error: ${item.error}`) + } + } + + lines.push('', 'Merging this PR will update the published hub and archive according to the reviewed changes.') + + return `${lines.join('\n')}\n` +} + +const checkedAt = new Date().toISOString() +const files = (await fs.readdir(themesDir)).filter((file) => file.endsWith('.json')).sort() +const archiveMoves = [] +const removals = [] +const skipped = [] +const auditableStatuses = new Set(['published', 'archived']) + +for (const file of files) { + const filePath = path.join(themesDir, file) + const theme = JSON.parse(await fs.readFile(filePath, 'utf8')) + + if (!auditableStatuses.has(theme.status)) continue + + try { + const result = await inspectRepository(theme.repository) + const retirement = retirementFor(result) + + if (!retirement) { + console.log(`OK ${theme.slug}`) + continue + } + + if (retirement.reason === 'repository-unavailable') { + await fs.unlink(filePath) + removals.push({ + title: theme.title, + slug: theme.slug, + repository: theme.repository, + status: theme.status, + details: retirement.details + }) + console.log(`REMOVE ${theme.slug}: ${retirement.reason}`) + continue + } + + if (theme.status === 'archived') { + console.log(`OK ${theme.slug}: already archived`) + continue + } + + theme.status = 'archived' + theme.stats = { ...theme.stats, ...result.stats, accessible: true } + theme.retirement = { + reason: 'repository-archived', + checkedAt, + details: retirement.details + } + + archiveMoves.push({ + title: theme.title, + slug: theme.slug, + repository: theme.repository, + ...theme.retirement + }) + + await fs.writeFile(filePath, `${JSON.stringify(theme, null, 2)}\n`) + console.log(`ARCHIVE ${theme.slug}: ${retirement.reason}`) + } catch (error) { + skipped.push({ + title: theme.title, + slug: theme.slug, + repository: theme.repository, + error: error.message + }) + + console.warn(`SKIP ${theme.slug}: ${error.message}`) + } +} + +await fs.writeFile(reportPath, renderReport(archiveMoves, removals, skipped, checkedAt)) + +console.log(`Proposed ${archiveMoves.length} archive move(s).`) +console.log(`Proposed ${removals.length} removal(s).`) +console.log(`Skipped ${skipped.length} theme(s).`) +console.log(`Report written to ${path.relative(root, reportPath)}.`) diff --git a/scripts/create-theme-submission-from-issue.mjs b/scripts/create-theme-submission-from-issue.mjs new file mode 100644 index 00000000..b8005c9f --- /dev/null +++ b/scripts/create-theme-submission-from-issue.mjs @@ -0,0 +1,344 @@ +import fs from 'node:fs' +import path from 'node:path' +import { Buffer } from 'node:buffer' +import { fileURLToPath } from 'node:url' +import { fetchRepositoryStats } from './repository-stats.mjs' + +const root = path.dirname(path.dirname(fileURLToPath(import.meta.url))) +const themesDir = path.join(root, 'src/content/themes') +const imagesDir = path.join(root, 'public/assets/img/themes') +const issueBodyFile = process.env.ISSUE_BODY_FILE +const issueBody = issueBodyFile + ? fs.readFileSync(path.resolve(root, issueBodyFile), 'utf8') + : process.env.ISSUE_BODY ?? '' +const issueNumber = process.env.ISSUE_NUMBER +const issueAuthor = process.env.ISSUE_AUTHOR + +if (!issueNumber || !/^\d+$/.test(issueNumber)) { + throw new Error('ISSUE_NUMBER must be set to a numeric GitHub issue number.') +} + +if (!issueAuthor) { + throw new Error('ISSUE_AUTHOR must be set.') +} + +const fields = parseIssueForm(issueBody) +const title = requiredField(fields, 'Theme title') +const repository = requiredUrl(requiredField(fields, 'Original repository'), 'Original repository') +const homepage = optionalUrl(optionalField(fields, 'Homepage'), 'Homepage') +const description = requiredField(fields, 'Short description') +const screenshotUrls = extractScreenshotUrls(requiredField(fields, 'Screenshot URLs')) +const tags = normalizeTags(requiredField(fields, 'Tags')) +const submitterRole = normalizeSubmitterRole(requiredField(fields, 'Your relationship to the theme')) +const notes = optionalField(fields, 'Notes for reviewers') +const slug = uniqueSlug(slugify(title)) +const submittedBy = issueAuthor.length >= 2 ? issueAuthor : null +const repositoryStats = await fetchRepositoryStats(repository) + +if (title.length < 2 || title.length > 80) { + throw new Error('Theme title must be between 2 and 80 characters.') +} + +if (description.length < 12 || description.length > 420) { + throw new Error('Short description must be between 12 and 420 characters.') +} + +fs.mkdirSync(imagesDir, { recursive: true }) + +const screenshots = [] +for (const [index, url] of screenshotUrls.entries()) { + const image = await downloadImage(url) + const filename = `${slug}-${index + 1}.${image.extension}` + const destination = path.join(imagesDir, filename) + + fs.writeFileSync(destination, image.buffer) + screenshots.push({ + src: `/assets/img/themes/${filename}`, + alt: `${title} screenshot ${index + 1}` + }) +} + +const theme = { + title, + slug, + description, + repository, + ...(homepage ? { homepage } : {}), + screenshots, + tags, + submitterRole, + status: 'candidate', + catalogIndex: candidateCatalogIndex(), + ...(submittedBy ? { submittedBy } : {}), + stats: repositoryStats +} + +const themePath = path.join(themesDir, `${slug}.json`) +fs.writeFileSync(themePath, `${JSON.stringify(theme, null, 2)}\n`) +fs.writeFileSync(path.join(root, 'theme-submission-pr.md'), prBody({ theme, notes, issueNumber, issueAuthor, screenshotUrls })) + +function parseIssueForm(body) { + const headings = [...body.matchAll(/^###\s+(.+?)\s*$/gm)] + const parsed = new Map() + + for (const [index, heading] of headings.entries()) { + const label = heading[1].trim() + const start = heading.index + heading[0].length + const end = headings[index + 1]?.index ?? body.length + const value = body.slice(start, end).trim() + + parsed.set(label, value === '_No response_' ? '' : value) + } + + return parsed +} + +function requiredField(fields, label) { + const value = optionalField(fields, label) + + if (!value) { + throw new Error(`Missing required issue field: ${label}`) + } + + return value +} + +function optionalField(fields, label) { + return (fields.get(label) ?? '').trim() +} + +function requiredUrl(value, label) { + const url = parseUrl(value, label) + + if (!['http:', 'https:'].includes(url.protocol)) { + throw new Error(`${label} must be an HTTP or HTTPS URL.`) + } + + return url.toString() +} + +function optionalUrl(value, label) { + if (!value) return null + + return requiredUrl(value, label) +} + +function parseUrl(value, label) { + try { + return new URL(value.trim()) + } catch { + throw new Error(`${label} must be a valid URL.`) + } +} + +function extractScreenshotUrls(value) { + const urls = new Set() + const markdownUrl = /!?\[[^\]]*\]\((https?:\/\/[^)\s]+)(?:\s+"[^"]*")?\)/g + const rawUrl = /https?:\/\/[^\s<>)"'\]]+/g + + for (const match of value.matchAll(markdownUrl)) { + urls.add(cleanUrl(match[1])) + } + + for (const match of value.matchAll(rawUrl)) { + urls.add(cleanUrl(match[0])) + } + + const screenshotUrls = [...urls].filter(Boolean) + + if (screenshotUrls.length === 0) { + throw new Error('At least one screenshot URL or attachment is required.') + } + + if (screenshotUrls.length > 6) { + throw new Error('Use 6 screenshots or fewer for a single submission.') + } + + return screenshotUrls +} + +function cleanUrl(value) { + return value + .trim() + .replace(/^["']+|["']+$/g, '') + .replace(/[.,;:]+$/, '') + .replace(/["'\]]+$/, '') +} + +function normalizeTags(value) { + const tags = [...new Set(value + .split(/[,\n]/) + .map((tag) => tag.trim().toLowerCase().replace(/^#/, '').replace(/\s+/g, ' ')) + .filter(Boolean))] + .sort((a, b) => a.localeCompare(b)) + + if (tags.length === 0) { + throw new Error('At least one tag is required.') + } + + if (tags.length > 24) { + throw new Error('Use 24 tags or fewer.') + } + + for (const tag of tags) { + if (!/^[a-z0-9][a-z0-9 .:+/_-]*[a-z0-9]$|^[a-z0-9]$/.test(tag)) { + throw new Error(`Invalid tag "${tag}". Tags must be lowercase and use letters, numbers, spaces, dots, colons, plus signs, slashes, underscores, or hyphens.`) + } + } + + return tags +} + +function normalizeSubmitterRole(value) { + const normalized = value.trim().toLowerCase() + const roles = new Map([ + ['author', 'author'], + ['maintainer', 'maintainer'], + ['user or recommender', 'user'], + ['user', 'user'], + ['recommender', 'user'] + ]) + const role = roles.get(normalized) + + if (!role) { + throw new Error(`Unsupported submitter role: ${value}`) + } + + return role +} + +function slugify(value) { + const slug = value + .normalize('NFKD') + .replace(/[\u0300-\u036f]/g, '') + .toLowerCase() + .replace(/[^a-z0-9]+/g, '-') + .replace(/^-+|-+$/g, '') + + if (!slug) { + throw new Error('Theme title could not be converted into a valid slug.') + } + + return slug +} + +function uniqueSlug(baseSlug) { + const directPath = path.join(themesDir, `${baseSlug}.json`) + + if (!fs.existsSync(directPath)) { + return baseSlug + } + + const issueSlug = `${baseSlug}-${issueNumber}` + const issuePath = path.join(themesDir, `${issueSlug}.json`) + + if (!fs.existsSync(issuePath)) { + return issueSlug + } + + throw new Error(`A theme entry already exists for slug "${baseSlug}" and issue slug "${issueSlug}".`) +} + +function candidateCatalogIndex() { + return 100000 + Number(issueNumber) +} + +async function downloadImage(value) { + const url = parseUrl(value, 'Screenshot URL') + + if (url.protocol !== 'https:') { + throw new Error(`Screenshot URLs must use HTTPS: ${value}`) + } + + if (isBlockedHost(url.hostname)) { + throw new Error(`Screenshot URL uses a blocked host: ${url.hostname}`) + } + + const response = await fetch(url, { + headers: { + 'user-agent': 'FirefoxCSS-Store-theme-submission' + }, + redirect: 'follow' + }) + + if (!response.ok) { + throw new Error(`Could not download screenshot ${value}: ${response.status} ${response.statusText}`) + } + + const contentType = response.headers.get('content-type')?.split(';')[0].trim().toLowerCase() + const extension = extensionFor(contentType, url.pathname) + + if (!extension) { + throw new Error(`Screenshot must be a PNG, JPG, WEBP, or GIF image: ${value}`) + } + + const buffer = Buffer.from(await response.arrayBuffer()) + const maxBytes = 8 * 1024 * 1024 + + if (buffer.length > maxBytes) { + throw new Error(`Screenshot is larger than 8 MB: ${value}`) + } + + return { buffer, extension } +} + +function isBlockedHost(hostname) { + const host = hostname.toLowerCase() + + return host === 'localhost' + || host === '0.0.0.0' + || host === '::1' + || /^127\./.test(host) + || /^10\./.test(host) + || /^192\.168\./.test(host) + || /^169\.254\./.test(host) + || /^172\.(1[6-9]|2\d|3[01])\./.test(host) +} + +function extensionFor(contentType, pathname) { + const byType = new Map([ + ['image/gif', 'gif'], + ['image/jpeg', 'jpg'], + ['image/png', 'png'], + ['image/webp', 'webp'] + ]) + + if (byType.has(contentType)) { + return byType.get(contentType) + } + + const extension = pathname.toLowerCase().match(/\.([a-z0-9]+)$/)?.[1] + + if (['gif', 'jpeg', 'jpg', 'png', 'webp'].includes(extension)) { + return extension === 'jpeg' ? 'jpg' : extension + } + + return null +} + +function prBody({ theme, notes, issueNumber, issueAuthor, screenshotUrls }) { + return `## Candidate theme submission + +Generated from #${issueNumber}. + +Closes #${issueNumber}. + +- Title: ${theme.title} +- Slug: \`${theme.slug}\` +- Repository: ${theme.repository} +- Submitted by: @${issueAuthor} +- Submitter role: ${theme.submitterRole} +- Status: \`${theme.status}\` +- Tags: ${theme.tags.map((tag) => `\`${tag}\``).join(', ')} +- Screenshots: ${screenshotUrls.length} + +Reviewer checklist: + +- Confirm the repository is the original project or an appropriate maintained fork. +- Confirm screenshots are safe to redistribute in this catalog. +- Edit title, description, tags, and screenshot alt text if needed. +- Keep \`status: "candidate"\` until the theme is ready to appear publicly. + +${notes ? `Notes from submitter:\n\n${notes}\n` : ''} +` +} diff --git a/scripts/publish-approved-theme-submission.mjs b/scripts/publish-approved-theme-submission.mjs new file mode 100644 index 00000000..280363fc --- /dev/null +++ b/scripts/publish-approved-theme-submission.mjs @@ -0,0 +1,76 @@ +import fs from 'node:fs' +import path from 'node:path' +import { execFileSync } from 'node:child_process' +import { fileURLToPath } from 'node:url' +import { fetchRepositoryStats } from './repository-stats.mjs' + +const root = path.dirname(path.dirname(fileURLToPath(import.meta.url))) +const themesDir = path.join(root, 'src/content/themes') + +const changedThemeFiles = new Set(execFileSync('git', [ + 'diff', + '--name-only', + 'origin/main...HEAD', + '--', + 'src/content/themes' +], { + cwd: root, + encoding: 'utf8' +}) + .split('\n') + .map((file) => file.trim()) + .filter((file) => file.endsWith('.json'))) + +for (const file of execFileSync('git', [ + 'status', + '--porcelain', + '--', + 'src/content/themes' +], { + cwd: root, + encoding: 'utf8' +}).split('\n')) { + const changedFile = file.slice(3).trim() + + if (changedFile.endsWith('.json')) { + changedThemeFiles.add(changedFile) + } +} + +const candidateFiles = [...changedThemeFiles].filter((file) => { + const theme = readTheme(path.join(root, file)) + return theme.status === 'candidate' +}) + +if (candidateFiles.length === 0) { + console.log('No candidate theme entry found in this submission PR.') + process.exit(0) +} + +if (candidateFiles.length > 1) { + throw new Error(`Expected one candidate theme entry, found ${candidateFiles.length}: ${candidateFiles.join(', ')}`) +} + +const candidatePath = path.join(root, candidateFiles[0]) +const candidate = readTheme(candidatePath) +candidate.status = 'published' +candidate.catalogIndex = nextCatalogIndex(candidatePath) +candidate.stats = await fetchRepositoryStats(candidate.repository, candidate.stats) + +fs.writeFileSync(candidatePath, `${JSON.stringify(candidate, null, 2)}\n`) +console.log(`Published ${candidate.slug} with catalogIndex ${candidate.catalogIndex}.`) + +function nextCatalogIndex(candidatePath) { + const indexes = fs.readdirSync(themesDir) + .filter((file) => file.endsWith('.json')) + .map((file) => path.join(themesDir, file)) + .filter((filePath) => filePath !== candidatePath) + .map((filePath) => readTheme(filePath).catalogIndex) + .filter((index) => Number.isInteger(index) && index < 100000) + + return Math.max(-1, ...indexes) + 1 +} + +function readTheme(filePath) { + return JSON.parse(fs.readFileSync(filePath, 'utf8')) +} diff --git a/scripts/refresh-theme-stats.mjs b/scripts/refresh-theme-stats.mjs new file mode 100644 index 00000000..1df812b7 --- /dev/null +++ b/scripts/refresh-theme-stats.mjs @@ -0,0 +1,29 @@ +import fs from 'node:fs/promises' +import path from 'node:path' +import { fileURLToPath } from 'node:url' +import { fetchRepositoryStats } from './repository-stats.mjs' + +const root = path.dirname(path.dirname(fileURLToPath(import.meta.url))) +const themesDir = path.join(root, 'src/content/themes') + +async function refreshTheme(file) { + const filePath = path.join(themesDir, file) + const theme = JSON.parse(await fs.readFile(filePath, 'utf8')) + theme.stats = { ...theme.stats, ...await fetchRepositoryStats(theme.repository, theme.stats) } + await fs.writeFile(filePath, `${JSON.stringify(theme, null, 2)}\n`) + console.log(`Refreshed ${theme.slug}`) +} + +const files = (await fs.readdir(themesDir)).filter((file) => file.endsWith('.json')).sort() + +for (const file of files) { + try { + await refreshTheme(file) + } catch (error) { + const filePath = path.join(themesDir, file) + const theme = JSON.parse(await fs.readFile(filePath, 'utf8')) + theme.stats = { ...theme.stats, accessible: false } + await fs.writeFile(filePath, `${JSON.stringify(theme, null, 2)}\n`) + console.warn(`Could not refresh ${file}: ${error.message}`) + } +} diff --git a/scripts/repository-stats.mjs b/scripts/repository-stats.mjs new file mode 100644 index 00000000..3ab45cac --- /dev/null +++ b/scripts/repository-stats.mjs @@ -0,0 +1,89 @@ +const githubToken = process.env.GITHUB_TOKEN +const gitlabToken = process.env.GITLAB_TOKEN +const codebergToken = process.env.CODEBERG_TOKEN + +export async function fetchRepositoryStats(repository, currentStats = {}) { + const repo = parseRepo(repository) + + try { + if (repo.host === 'github.com') { + return await readGithub(repo) + } + + if (repo.host === 'gitlab.com') { + return await readGitlab(repo) + } + + if (repo.host === 'codeberg.org') { + return await readCodeberg(repo) + } + + return { ...currentStats, accessible: true } + } catch { + return { + stars: currentStats.stars ?? 0, + updatedAt: currentStats.updatedAt ?? null, + ownerAvatar: currentStats.ownerAvatar ?? null, + accessible: false + } + } +} + +async function requestJson(url, headers = {}) { + const response = await fetch(url, { headers }) + + if (!response.ok) { + throw new Error(`${response.status} ${response.statusText}`) + } + + return response.json() +} + +function parseRepo(repository) { + const url = new URL(repository) + const [owner, name] = url.pathname.replace(/^\/|\/$/g, '').split('/') + + if (!owner || !name) { + throw new Error(`Unsupported repository path: ${repository}`) + } + + return { host: url.hostname.replace(/^www\./, ''), owner, name } +} + +async function readGithub({ owner, name }) { + const headers = githubToken ? { Authorization: `Bearer ${githubToken}` } : {} + const data = await requestJson(`https://api.github.com/repos/${owner}/${name}`, headers) + + return { + stars: data.stargazers_count ?? 0, + updatedAt: data.pushed_at ?? data.updated_at ?? null, + ownerAvatar: data.owner?.avatar_url ?? null, + accessible: true + } +} + +async function readGitlab({ owner, name }) { + const headers = gitlabToken ? { Authorization: `Bearer ${gitlabToken}` } : {} + const encoded = encodeURIComponent(`${owner}/${name}`) + const data = await requestJson(`https://gitlab.com/api/v4/projects/${encoded}`, headers) + const avatar = data.namespace?.avatar_url ?? null + + return { + stars: data.star_count ?? 0, + updatedAt: data.last_activity_at ?? null, + ownerAvatar: avatar?.startsWith('/') ? `https://gitlab.com${avatar}` : avatar, + accessible: true + } +} + +async function readCodeberg({ owner, name }) { + const headers = codebergToken ? { Authorization: `token ${codebergToken}` } : {} + const data = await requestJson(`https://codeberg.org/api/v1/repos/${owner}/${name}`, headers) + + return { + stars: data.stars_count ?? 0, + updatedAt: data.updated_at ?? null, + ownerAvatar: data.owner?.avatar_url ?? null, + accessible: true + } +} diff --git a/scripts/sort_themes.nu b/scripts/sort_themes.nu deleted file mode 100644 index b8e4173b..00000000 --- a/scripts/sort_themes.nu +++ /dev/null @@ -1,221 +0,0 @@ -#!/usr/bin/env -S nu --stdin -# -# Repository: FirefoxCSS-Store -# Author: BeyondMagic - João Farias 2024 -# Maintainer: BeyondMagic - João Farias 2024 - -# Github API. -export def github [ - token?: string # API Token. -]: record -> record { - let repo = $in - - let headers = if ($token | is-empty) { - [] - } else { - { - Authorization: $"Bearer ($token)" - } - } - - let item = try { - http get $"https://api.github.com/repos/($repo.owner)/($repo.name)" --headers $headers - } catch { - return null - } - - { - pushed_at: $item.pushed_at - stargazers_count: ($item.stargazers_count | into int) - avatar: $item.owner.avatar_url - } -} - -# Gitlab API. -export def gitlab [ - token?: string # API Token. -]: record -> record { - let repo = $in - - let headers = if ($token | is-empty) { - [] - } else { - { - Authorization: $"Bearer ($token)" - } - } - - let item = try { - http get $"https://gitlab.com/api/v4/projects/($repo.owner)%2F($repo.name)" --headers $headers - } catch { - return null - } - - { - pushed_at: $item.last_activity_at - stargazers_count: ($item.star_count | into int) - avatar: $item.namespace.avatar_url - } -} - -# Codeberg API. -export def codeberg [ - token?: string # API Token. -]: record -> record { - let repo = $in - - let headers = if ($token | is-empty) { - [] - } else { - { - Authorization: $"token ($token)" - } - } - - let item = try { - http get $"https://codeberg.org/api/v1/repos/($repo.owner)/($repo.name)" --headers $headers - } catch { - return null - } - - { - pushed_at: $item.updated_at - stargazers_count: ($item.stars_count | into int) - avatar: $item.owner.avatar_url - } -} - -# In case of not having API, clone and get information yourself. -export def clone [ - link: string # Git link of the repository. - --temp: string = '/tmp/firefoxcss-store/' # Temporary folder to save themes. -]: record -> string { - - mkdir $temp - - let repo = $in - let folder = $temp | path join $repo.name - - if ($folder | path exists) { - cd $folder - - ^git pull - } else { - - let clone_status = ^git clone $link $folder - | complete - | get exit_code - - # Could not clone the repository for unknown reasons. - if $clone_status != 0 { - return null - } - - cd $folder - } - - ^git show --quiet --date='format-local:%Y-%m-%dT%H:%M:%SZ' --format="%cd" -} - -# Parse link of repository. -def parse_link []: string -> record { - let data = $in - | split row '/' - - { - owner: $data.3 - name: $data.4 - } -} - -# Get extra information from themes and save it. -export def main [ - --github: string # API Token for Github. - --gitlab: string # API Token for Gitlab. - --codeberg: string # API Token for Codeberg. - --delay: duration = 2sec # Delay between API calls. - --source: string = "../themes.json" # Themes data. - --output: string = "./themes.json" # New data with themes. - --timezone: string = "UTC0" # Timezone for git calls. -]: nothing -> nothing { - - $env.TZ = $timezone - - let data = open $source - | each {|item| - - mut item = $item - - let link = $item.repository - - print $"Retrieving information from '($link)'." - - let info = if ($link | str contains 'github') { - sleep $delay - $link | parse_link | github $github - } else if ($link | str contains 'gitlab') { - sleep $delay - $link | parse_link | gitlab $gitlab - } else if ($link | str contains 'codeberg') { - sleep $delay - $link | parse_link | codeberg $codeberg - } else { - print "Using git cloning." - - let pushed_at = $link | parse_link | clone $link - - # If this theme hasn't been manually updated yet, - # which means, added the values for stars and avatar url, - # then, assign default value. - if not ('avatar' in $item) { - print "Need to update 'avatar' and 'stargazers_count'." - { - pushed_at: $pushed_at - stargazers_count: -1 - avatar: '' - } - # Default values for manually updated theme, but - # the field 'pushed_at'. - } else { - { - pushed_at: $pushed_at - stargazers_count: $item.stargazers_count - avatar: $item.avatar - } - } - } - - # Failed all attempts at retrieving information for this repository, - # Probably needs removal or it's deleted already, - # so it will remove automatically. - if ($info | is-empty) { - print $"Could not clone this repository!" - print "" - } else { - print "" - - # Update sorting columns. - if ('pushed_at' in $item) { - $item - | update 'pushed_at' $info.pushed_at - | update 'stargazers_count' $info.stargazers_count - | update 'avatar' $info.avatar - } else { - $item - | default $info.pushed_at 'pushed_at' - | default $info.stargazers_count 'stargazers_count' - | default $info.avatar 'avatar' - } - - } - } - - $data | save --force $output - - print "Replace the themes in the source directory? If no, will output the themes as JSON instead. To confirm, type either the word 'yes' or character 'y'." - let ask = input "Answer: " | str downcase - - if $ask == 'y' or $ask == 'yes' { - mv --force $output $source - } -} diff --git a/scripts/validate-themes.mjs b/scripts/validate-themes.mjs new file mode 100644 index 00000000..47f808b4 --- /dev/null +++ b/scripts/validate-themes.mjs @@ -0,0 +1,131 @@ +import fs from 'node:fs' +import path from 'node:path' +import { fileURLToPath } from 'node:url' +import { z } from 'zod' + +const root = path.dirname(path.dirname(fileURLToPath(import.meta.url))) +const themesDir = path.join(root, 'src/content/themes') +const publicDir = path.join(root, 'public') + +const tagSchema = z + .string() + .min(1) + .max(48) + .regex(/^[a-z0-9][a-z0-9 .:+/_-]*[a-z0-9]$|^[a-z0-9]$/) + +const themeSchema = z.object({ + title: z.string().min(2).max(80), + slug: z.string().regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/), + description: z.string().min(12).max(420), + repository: z.url(), + homepage: z.url().optional(), + screenshots: z.array(z.object({ + src: z.string().startsWith('/assets/img/themes/').refine((value) => !value.includes('//'), 'Path must not contain duplicate slashes'), + alt: z.string().min(2).max(120) + })).min(1), + tags: z.array(tagSchema).min(1).max(24), + submitterRole: z.enum(['author', 'user', 'maintainer', 'legacy']), + status: z.enum(['published', 'candidate', 'archived']).default('candidate'), + catalogIndex: z.number().int().nonnegative().default(100000), + submittedBy: z.string().min(2).max(80).optional(), + stats: z.object({ + stars: z.number().int().nonnegative().default(0), + updatedAt: z.iso.datetime({ offset: true }).nullable().default(null), + ownerAvatar: z.url().nullable().default(null), + accessible: z.boolean().default(true) + }).default({ + stars: 0, + updatedAt: null, + ownerAvatar: null, + accessible: true + }), + retirement: z.object({ + reason: z.enum(['repository-archived', 'repository-unavailable']), + checkedAt: z.iso.datetime({ offset: true }), + details: z.string().min(2).max(240) + }).optional() +}).superRefine((theme, context) => { + if (theme.status !== 'archived' && theme.retirement) { + context.addIssue({ + code: 'custom', + path: ['retirement'], + message: 'Only archived themes may include retirement metadata' + }) + } + + if (theme.status === 'archived' && !theme.retirement) { + context.addIssue({ + code: 'custom', + path: ['retirement'], + message: 'Archived themes must include retirement metadata' + }) + } +}) + +const files = fs.readdirSync(themesDir).filter((file) => file.endsWith('.json')).sort() +const slugs = new Set() +const catalogIndexes = new Set() +const errors = [] + +for (const file of files) { + const filePath = path.join(themesDir, file) + let data + + try { + data = JSON.parse(fs.readFileSync(filePath, 'utf8')) + } catch (error) { + errors.push(`${file}: invalid JSON: ${error.message}`) + continue + } + + const parsed = themeSchema.safeParse(data) + if (!parsed.success) { + for (const issue of parsed.error.issues) { + errors.push(`${file}: ${issue.path.join('.') || 'entry'}: ${issue.message}`) + } + continue + } + + const theme = parsed.data + const expectedFile = `${theme.slug}.json` + + if (file !== expectedFile) { + errors.push(`${file}: filename must be ${expectedFile}`) + } + + if (slugs.has(theme.slug)) { + errors.push(`${file}: duplicate slug ${theme.slug}`) + } + slugs.add(theme.slug) + + if (catalogIndexes.has(theme.catalogIndex)) { + errors.push(`${file}: duplicate catalogIndex ${theme.catalogIndex}`) + } + catalogIndexes.add(theme.catalogIndex) + + const sortedTags = [...theme.tags].sort((a, b) => a.localeCompare(b)) + if (theme.tags.join('\n') !== sortedTags.join('\n')) { + errors.push(`${file}: tags must be normalized and sorted alphabetically`) + } + + if (new Set(theme.tags).size !== theme.tags.length) { + errors.push(`${file}: tags must be unique`) + } + + for (const screenshot of theme.screenshots) { + const imagePath = path.join(publicDir, screenshot.src) + if (!fs.existsSync(imagePath)) { + errors.push(`${file}: missing screenshot ${screenshot.src}`) + } + } + + if (theme.status === 'candidate' && theme.catalogIndex < 100000) { + errors.push(`${file}: candidate themes must use catalogIndex 100000 or greater`) + } +} + +if (errors.length > 0) { + throw new Error(errors.join('\n')) +} + +console.log(`Validated ${files.length} theme entries.`) diff --git a/src/content.config.ts b/src/content.config.ts new file mode 100644 index 00000000..94a51988 --- /dev/null +++ b/src/content.config.ts @@ -0,0 +1,67 @@ +import { defineCollection } from 'astro:content' +import { glob } from 'astro/loaders' +import { z } from 'astro/zod' + +const themeStatus = z.enum(['published', 'candidate', 'archived']) +const submitterRole = z.enum(['author', 'user', 'maintainer', 'legacy']) +const tag = z + .string() + .min(1) + .max(48) + .regex(/^[a-z0-9][a-z0-9 .:+/_-]*[a-z0-9]$|^[a-z0-9]$/) + +const themes = defineCollection({ + loader: glob({ pattern: '**/*.json', base: './src/content/themes' }), + schema: z.object({ + title: z.string().min(2).max(80), + slug: z.string().regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/), + description: z.string().min(12).max(420), + repository: z.url(), + homepage: z.url().optional(), + screenshots: z + .array(z.object({ + src: z.string().startsWith('/assets/img/themes/').refine((value) => !value.includes('//')), + alt: z.string().min(2).max(120) + })) + .min(1), + tags: z.array(tag).min(1).max(24), + submitterRole, + status: themeStatus.default('candidate'), + catalogIndex: z.number().int().nonnegative().default(100000), + submittedBy: z.string().min(2).max(80).optional(), + stats: z.object({ + stars: z.number().int().nonnegative().default(0), + updatedAt: z.iso.datetime({ offset: true }).nullable().default(null), + ownerAvatar: z.url().nullable().default(null), + accessible: z.boolean().default(true) + }).default({ + stars: 0, + updatedAt: null, + ownerAvatar: null, + accessible: true + }), + retirement: z.object({ + reason: z.enum(['repository-archived', 'repository-unavailable']), + checkedAt: z.iso.datetime({ offset: true }), + details: z.string().min(2).max(240) + }).optional() + }).superRefine((theme, context) => { + if (theme.status !== 'archived' && theme.retirement) { + context.addIssue({ + code: 'custom', + path: ['retirement'], + message: 'Only archived themes may include retirement metadata' + }) + } + + if (theme.status === 'archived' && !theme.retirement) { + context.addIssue({ + code: 'custom', + path: ['retirement'], + message: 'Archived themes must include retirement metadata' + }) + } + }) +}) + +export const collections = { themes } diff --git a/src/content/themes/98-95fox-xtra-compact.json b/src/content/themes/98-95fox-xtra-compact.json new file mode 100644 index 00000000..6dfeb42f --- /dev/null +++ b/src/content/themes/98-95fox-xtra-compact.json @@ -0,0 +1,31 @@ +{ + "title": "98/95fox Xtra Compact", + "slug": "98-95fox-xtra-compact", + "description": "The mix of nostalgia and compact.", + "repository": "https://github.com/vintnarni/Firefox-98-Xtra-Compact", + "screenshots": [ + { + "src": "/assets/img/themes/ff95xtracompact.webp", + "alt": "98/95fox Xtra Compact screenshot" + } + ], + "tags": [ + "95", + "98", + "chicago", + "compact", + "light", + "programneer", + "retro", + "xtra" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 111, + "stats": { + "stars": 13, + "updatedAt": "2024-11-02T17:56:51Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/132811907?v=4", + "accessible": true + } +} diff --git a/src/content/themes/98-95fox.json b/src/content/themes/98-95fox.json new file mode 100644 index 00000000..15ea58a0 --- /dev/null +++ b/src/content/themes/98-95fox.json @@ -0,0 +1,29 @@ +{ + "title": "98/95fox", + "slug": "98-95fox", + "description": "Chicago 95 & Windows95/98-like theme for firefox", + "repository": "https://github.com/osem598/Firefox-98", + "screenshots": [ + { + "src": "/assets/img/themes/ff95.webp", + "alt": "98/95fox screenshot" + } + ], + "tags": [ + "95", + "98", + "chicago", + "light", + "osem598", + "retro" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 94, + "stats": { + "stars": 44, + "updatedAt": "2026-04-04T18:10:09Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/67332812?v=4", + "accessible": true + } +} diff --git a/src/content/themes/aero-firefox.json b/src/content/themes/aero-firefox.json new file mode 100644 index 00000000..18d05522 --- /dev/null +++ b/src/content/themes/aero-firefox.json @@ -0,0 +1,29 @@ +{ + "title": "Aero Firefox", + "slug": "aero-firefox", + "description": "Brings the Windows 7 titlebar buttons to modern versions of Firefox", + "repository": "https://github.com/SandTechStuff/AeroFirefox", + "screenshots": [ + { + "src": "/assets/img/themes/aeroFirefox.webp", + "alt": "Aero Firefox screenshot" + } + ], + "tags": [ + "aero", + "dark", + "light", + "lightweight", + "minimal", + "windows7" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 104, + "stats": { + "stars": 31, + "updatedAt": "2025-10-03T04:53:38Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/164842290?v=4", + "accessible": true + } +} diff --git a/src/content/themes/aestheticfox.json b/src/content/themes/aestheticfox.json new file mode 100644 index 00000000..20b399ff --- /dev/null +++ b/src/content/themes/aestheticfox.json @@ -0,0 +1,34 @@ +{ + "title": "AestheticFox", + "slug": "aestheticfox", + "description": "A minamist and aesthetic userstyle theme for Firefox", + "repository": "https://github.com/AidanMercer/AestheticFox", + "screenshots": [ + { + "src": "/assets/img/themes/AestheticFox.webp", + "alt": "AestheticFox screenshot" + } + ], + "tags": [ + "aesthetic", + "aestheticfox", + "clean", + "compact", + "minimal", + "minimalistic" + ], + "submitterRole": "legacy", + "status": "archived", + "catalogIndex": 72, + "stats": { + "stars": 30, + "updatedAt": "2023-05-22T18:16:55Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/96552673?v=4", + "accessible": true + }, + "retirement": { + "reason": "repository-archived", + "checkedAt": "2026-04-25T20:04:49.167Z", + "details": "Repository is archived by its owner." + } +} diff --git a/src/content/themes/alpen-blue-to-firefox-css.json b/src/content/themes/alpen-blue-to-firefox-css.json new file mode 100644 index 00000000..4d36d265 --- /dev/null +++ b/src/content/themes/alpen-blue-to-firefox-css.json @@ -0,0 +1,26 @@ +{ + "title": "Alpen Blue to Firefox CSS", + "slug": "alpen-blue-to-firefox-css", + "description": "Theme to Blue and Alpenglow lovers\n Compatibility: V89+", + "repository": "https://github.com/Godiesc/AlpenBlue", + "screenshots": [ + { + "src": "/assets/img/themes/alpenblue.webp", + "alt": "Alpen Blue to Firefox CSS screenshot" + } + ], + "tags": [ + "alpenglow", + "aplenblue", + "godiesc" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 29, + "stats": { + "stars": 67, + "updatedAt": "2022-06-19T19:00:45Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/22057609?v=4", + "accessible": true + } +} diff --git a/src/content/themes/animatedfox.json b/src/content/themes/animatedfox.json new file mode 100644 index 00000000..b75fb4ff --- /dev/null +++ b/src/content/themes/animatedfox.json @@ -0,0 +1,33 @@ +{ + "title": "AnimatedFox", + "slug": "animatedfox", + "description": "A minimal Firefox/LibreWolf theme with satisfying animations and a hidden URL bar.", + "repository": "https://github.com/RemyIsCool/AnimatedFox", + "screenshots": [ + { + "src": "/assets/img/themes/animatedfox.webp", + "alt": "AnimatedFox screenshot" + } + ], + "tags": [ + "animations", + "dark", + "hidden url bar", + "minimal", + "remyiscool" + ], + "submitterRole": "legacy", + "status": "archived", + "catalogIndex": 108, + "stats": { + "stars": 193, + "updatedAt": "2024-07-16T13:55:19Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/97812130?v=4", + "accessible": true + }, + "retirement": { + "reason": "repository-archived", + "checkedAt": "2026-04-25T20:04:49.167Z", + "details": "Repository is archived by its owner." + } +} diff --git a/src/content/themes/another-oneline.json b/src/content/themes/another-oneline.json new file mode 100644 index 00000000..a41e5e07 --- /dev/null +++ b/src/content/themes/another-oneline.json @@ -0,0 +1,32 @@ +{ + "title": "Another Oneline", + "slug": "another-oneline", + "description": "Another simple, oneline, minimal, keyboard-centered Firefox CSS theme.", + "repository": "https://github.com/mimipile/firefoxCSS", + "screenshots": [ + { + "src": "/assets/img/themes/screenshot-site.webp", + "alt": "Another Oneline screenshot" + } + ], + "tags": [ + "adaptative", + "dark", + "keyboard", + "keyboard centered", + "light", + "mimipile", + "minimal", + "onebar", + "oneline" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 99, + "stats": { + "stars": 134, + "updatedAt": "2024-08-26T09:06:51Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/74282993?v=4", + "accessible": true + } +} diff --git a/src/content/themes/arc-ui.json b/src/content/themes/arc-ui.json new file mode 100644 index 00000000..13ed7a79 --- /dev/null +++ b/src/content/themes/arc-ui.json @@ -0,0 +1,32 @@ +{ + "title": "Arc UI", + "slug": "arc-ui", + "description": "Make your Firefox like the Arc Browser.", + "repository": "https://github.com/dxdotdev/arc-ui", + "screenshots": [ + { + "src": "/assets/img/themes/29957ui.webp", + "alt": "Arc UI screenshot" + } + ], + "tags": [ + "arc browser", + "compact", + "dxdotdev", + "modern" + ], + "submitterRole": "legacy", + "status": "archived", + "catalogIndex": 115, + "stats": { + "stars": 74, + "updatedAt": "2025-01-05T13:34:56Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/157044645?v=4", + "accessible": true + }, + "retirement": { + "reason": "repository-archived", + "checkedAt": "2026-04-25T20:04:49.167Z", + "details": "Repository is archived by its owner." + } +} diff --git a/src/content/themes/arcadia.json b/src/content/themes/arcadia.json new file mode 100644 index 00000000..7cab8a1b --- /dev/null +++ b/src/content/themes/arcadia.json @@ -0,0 +1,31 @@ +{ + "title": "arcadia", + "slug": "arcadia", + "description": "Minimal Firefox theme and user.js focused on speed and design", + "repository": "https://github.com/tyrohellion/arcadia", + "screenshots": [ + { + "src": "/assets/img/themes/arcadia.webp", + "alt": "arcadia screenshot" + } + ], + "tags": [ + "clean", + "compact", + "dark", + "hovercards", + "minimal", + "minimalistic", + "simple", + "tyro" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 0, + "stats": { + "stars": 20, + "updatedAt": "2026-01-28T10:47:31Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/51808054?v=4", + "accessible": true + } +} diff --git a/src/content/themes/arcfox.json b/src/content/themes/arcfox.json new file mode 100644 index 00000000..af248e3b --- /dev/null +++ b/src/content/themes/arcfox.json @@ -0,0 +1,28 @@ +{ + "title": "arcfox", + "slug": "arcfox", + "description": "make firefox flow like arc", + "repository": "https://github.com/betterbrowser/arcfox", + "screenshots": [ + { + "src": "/assets/img/themes/arcfox.webp", + "alt": "arcfox screenshot" + } + ], + "tags": [ + "bettterbrowser", + "dark", + "light", + "luanderfarias", + "nikollesan" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 97, + "stats": { + "stars": 1247, + "updatedAt": "2025-06-01T21:38:03Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/126220586?v=4", + "accessible": true + } +} diff --git a/src/content/themes/arcwtf.json b/src/content/themes/arcwtf.json new file mode 100644 index 00000000..3a19a06a --- /dev/null +++ b/src/content/themes/arcwtf.json @@ -0,0 +1,31 @@ +{ + "title": "ArcWTF", + "slug": "arcwtf", + "description": "UserChrome.css theme to bring Arc Browser look from Windows to Firefox!", + "repository": "https://github.com/KiKaraage/ArcWTF/", + "screenshots": [ + { + "src": "/assets/img/themes/arcwtf.webp", + "alt": "ArcWTF screenshot" + } + ], + "tags": [ + "arc browser", + "autohide", + "dark", + "kikaraage", + "light", + "minimal", + "sidebery", + "vertical tabs" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 95, + "stats": { + "stars": 1733, + "updatedAt": "2025-11-14T07:18:17Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/10529881?v=4", + "accessible": true + } +} diff --git a/src/content/themes/arnimfox.json b/src/content/themes/arnimfox.json new file mode 100644 index 00000000..0064bb90 --- /dev/null +++ b/src/content/themes/arnimfox.json @@ -0,0 +1,28 @@ +{ + "title": "ArnimFox", + "slug": "arnimfox", + "description": "A Minimalist Dark Themed Firefox enabling vertical tabs support and modern URL Bar", + "repository": "https://github.com/SecondMikasa/ArnimFox", + "screenshots": [ + { + "src": "/assets/img/themes/ArnimFox.webp", + "alt": "ArnimFox screenshot" + } + ], + "tags": [ + "dark", + "minimalistic", + "sidebar", + "sidebery", + "vertical" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 91, + "stats": { + "stars": 6, + "updatedAt": "2024-01-28T10:20:05Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/129872339?v=4", + "accessible": true + } +} diff --git a/src/content/themes/aurorafox-auroral-firefox.json b/src/content/themes/aurorafox-auroral-firefox.json new file mode 100644 index 00000000..e46e13c8 --- /dev/null +++ b/src/content/themes/aurorafox-auroral-firefox.json @@ -0,0 +1,27 @@ +{ + "title": "AuroraFox- Auroral Firefox", + "slug": "aurorafox-auroral-firefox", + "description": "AuroraFox is a clean rounded Firefox theme, made using CSS, to match with the trendy 'Aurora' Colour Palette.", + "repository": "https://github.com/alfarexguy2019/aurora-fox", + "screenshots": [ + { + "src": "/assets/img/themes/18328141609919-befbc7f3-5199-4672-9ba1-8551d2a4e5a1.webp", + "alt": "AuroraFox- Auroral Firefox screenshot" + } + ], + "tags": [ + "alfarexguy2019", + "dark", + "minimal", + "purple" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 62, + "stats": { + "stars": 25, + "updatedAt": "2025-12-05T10:27:07Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/78948152?v=4", + "accessible": true + } +} diff --git a/src/content/themes/australis-like-tabs-in-proton-ui.json b/src/content/themes/australis-like-tabs-in-proton-ui.json new file mode 100644 index 00000000..294e0885 --- /dev/null +++ b/src/content/themes/australis-like-tabs-in-proton-ui.json @@ -0,0 +1,24 @@ +{ + "title": "Australis like tabs in Proton UI", + "slug": "australis-like-tabs-in-proton-ui", + "description": "Changes to make the new proton UI redesign in Firefox better; including changes to tabs, more compact-compact mode, proton gradient accents in elements and much more\n Compatibility: V89+", + "repository": "https://github.com/sagars007/Australis-like-tabs-FF-ProtonUI-changes", + "screenshots": [ + { + "src": "/assets/img/themes/custom_australistabs_protonUI.webp", + "alt": "Australis like tabs in Proton UI screenshot" + } + ], + "tags": [ + "compact" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 33, + "stats": { + "stars": 12, + "updatedAt": "2021-06-10T07:37:39Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/56472130?v=4", + "accessible": true + } +} diff --git a/src/content/themes/bali10050-s-theme.json b/src/content/themes/bali10050-s-theme.json new file mode 100644 index 00000000..88d4fadb --- /dev/null +++ b/src/content/themes/bali10050-s-theme.json @@ -0,0 +1,33 @@ +{ + "title": "Bali10050's theme", + "slug": "bali10050-s-theme", + "description": "A minimal looking oneliner, with modular code for easy editing", + "repository": "https://github.com/Bali10050/FirefoxCSS", + "screenshots": [ + { + "src": "/assets/img/themes/Bali10050sPreview.webp", + "alt": "Bali10050's theme screenshot" + } + ], + "tags": [ + "bali10050", + "dark", + "light", + "linux", + "minimalistic", + "oneline", + "proton", + "responsive", + "rounded", + "windows" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 77, + "stats": { + "stars": 381, + "updatedAt": "2026-01-22T13:30:49Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/110120798?v=4", + "accessible": true + } +} diff --git a/src/content/themes/blurredfox.json b/src/content/themes/blurredfox.json new file mode 100644 index 00000000..179d1ca5 --- /dev/null +++ b/src/content/themes/blurredfox.json @@ -0,0 +1,28 @@ +{ + "title": "blurredfox", + "slug": "blurredfox", + "description": "A modern Firefox CSS Theme", + "repository": "https://github.com/manilarome/blurredfox", + "screenshots": [ + { + "src": "/assets/img/themes/blurred.webp", + "alt": "blurredfox screenshot" + } + ], + "tags": [ + "blur", + "dark", + "light", + "linux", + "manilarome" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 8, + "stats": { + "stars": 923, + "updatedAt": "2023-06-27T10:12:27Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/40349590?v=4", + "accessible": true + } +} diff --git a/src/content/themes/brave-fox-the-reimagined-browser-reimagined.json b/src/content/themes/brave-fox-the-reimagined-browser-reimagined.json new file mode 100644 index 00000000..a285220d --- /dev/null +++ b/src/content/themes/brave-fox-the-reimagined-browser-reimagined.json @@ -0,0 +1,28 @@ +{ + "title": "Brave-Fox: The Reimagined Browser, Reimagined", + "slug": "brave-fox-the-reimagined-browser-reimagined", + "description": "Brave-Fox is a Firefox Theme that brings Brave's design elements into Firefox.", + "repository": "https://github.com/Soft-Bred/Brave-Fox", + "screenshots": [ + { + "src": "/assets/img/themes/184007ilia7199au71.webp", + "alt": "Brave-Fox: The Reimagined Browser, Reimagined screenshot" + } + ], + "tags": [ + "brave", + "javascript", + "js", + "pure", + "soft-bred" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 59, + "stats": { + "stars": 146, + "updatedAt": "2022-11-22T08:47:02Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/60551230?v=4", + "accessible": true + } +} diff --git a/src/content/themes/cascade.json b/src/content/themes/cascade.json new file mode 100644 index 00000000..783f7a4f --- /dev/null +++ b/src/content/themes/cascade.json @@ -0,0 +1,32 @@ +{ + "title": "Cascade", + "slug": "cascade", + "description": "A responsive \"One-Line\" theme based on SimpleFox for the new ProtonUI. \n Compatibility: V91+", + "repository": "https://github.com/andreasgrafen/cascade", + "screenshots": [ + { + "src": "/assets/img/themes/cascade.webp", + "alt": "Cascade screenshot" + } + ], + "tags": [ + "andreasgrafen", + "dark", + "light", + "minial", + "one-line", + "oneline", + "proton", + "responsive", + "v91" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 50, + "stats": { + "stars": 1597, + "updatedAt": "2025-10-02T01:05:43Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/159644623?v=4", + "accessible": true + } +} diff --git a/src/content/themes/chameleons-beauty-to-firefox-css.json b/src/content/themes/chameleons-beauty-to-firefox-css.json new file mode 100644 index 00000000..850296d4 --- /dev/null +++ b/src/content/themes/chameleons-beauty-to-firefox-css.json @@ -0,0 +1,28 @@ +{ + "title": "Chameleons-Beauty to Firefox CSS", + "slug": "chameleons-beauty-to-firefox-css", + "description": "Adaptive Theme to Firefox Themes \n Compatibility: V89+", + "repository": "https://github.com/Godiesc/Chameleons-Beauty", + "screenshots": [ + { + "src": "/assets/img/themes/Chameleons-Beauty.webp", + "alt": "Chameleons-Beauty to Firefox CSS screenshot" + } + ], + "tags": [ + "colourful", + "dark", + "godiesc", + "light", + "v89" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 40, + "stats": { + "stars": 116, + "updatedAt": "2025-10-09T23:05:40Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/22057609?v=4", + "accessible": true + } +} diff --git a/src/content/themes/clean-and-transparent.json b/src/content/themes/clean-and-transparent.json new file mode 100644 index 00000000..572ce143 --- /dev/null +++ b/src/content/themes/clean-and-transparent.json @@ -0,0 +1,30 @@ +{ + "title": "Clean and Transparent", + "slug": "clean-and-transparent", + "description": "Clean theme with as much transparency as Firefox lets you do \n Compatibility: V91+", + "repository": "https://github.com/Filip-Sutkowy/blurclean-firefox-theme", + "screenshots": [ + { + "src": "/assets/img/themes/Clean_and_Transparent.webp", + "alt": "Clean and Transparent screenshot" + } + ], + "tags": [ + "blur", + "dark", + "filip-sutkowy", + "light", + "pure", + "transparency", + "v91" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 57, + "stats": { + "stars": 111, + "updatedAt": "2021-09-29T21:49:09Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/24491499?v=4", + "accessible": true + } +} diff --git a/src/content/themes/compact-mode-to-firefox-css.json b/src/content/themes/compact-mode-to-firefox-css.json new file mode 100644 index 00000000..60613ecb --- /dev/null +++ b/src/content/themes/compact-mode-to-firefox-css.json @@ -0,0 +1,25 @@ +{ + "title": "Compact Mode to Firefox Css", + "slug": "compact-mode-to-firefox-css", + "description": "Theme to Make Firefox Compact and keep it's Beauty\n Compatibility: V89+", + "repository": "https://github.com/Godiesc/compactmodefirefoxcss", + "screenshots": [ + { + "src": "/assets/img/themes/splashcompact.webp", + "alt": "Compact Mode to Firefox Css screenshot" + } + ], + "tags": [ + "godiesc", + "toolkit" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 31, + "stats": { + "stars": 18, + "updatedAt": "2021-08-27T17:47:51Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/22057609?v=4", + "accessible": true + } +} diff --git a/src/content/themes/compactfox.json b/src/content/themes/compactfox.json new file mode 100644 index 00000000..9c5943c4 --- /dev/null +++ b/src/content/themes/compactfox.json @@ -0,0 +1,28 @@ +{ + "title": "CompactFox", + "slug": "compactfox", + "description": "A simple theme that compacts a lot of the UI elements", + "repository": "https://github.com/Tnings/CompactFox", + "screenshots": [ + { + "src": "/assets/img/themes/CompactFoxPreview.webp", + "alt": "CompactFox screenshot" + } + ], + "tags": [ + "compact", + "dark", + "light", + "pure", + "tnings" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 61, + "stats": { + "stars": 54, + "updatedAt": "2021-10-23T05:25:10Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/55812511?v=4", + "accessible": true + } +} diff --git a/src/content/themes/cyanmatrx.json b/src/content/themes/cyanmatrx.json new file mode 100644 index 00000000..1b813e5a --- /dev/null +++ b/src/content/themes/cyanmatrx.json @@ -0,0 +1,27 @@ +{ + "title": "cyanmatrx", + "slug": "cyanmatrx", + "description": "a simple, cool-esque, cyan monospace theme.", + "repository": "https://github.com/Barnacl437/cyanmatrx", + "screenshots": [ + { + "src": "/assets/img/themes/cyanmatrx.webp", + "alt": "cyanmatrx screenshot" + } + ], + "tags": [ + "cyan", + "cyanmatrx", + "dark", + "minimal" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 120, + "stats": { + "stars": 2, + "updatedAt": "2025-06-13T15:42:36Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/87983017?v=4", + "accessible": true + } +} diff --git a/src/content/themes/dark-star.json b/src/content/themes/dark-star.json new file mode 100644 index 00000000..5049ba77 --- /dev/null +++ b/src/content/themes/dark-star.json @@ -0,0 +1,28 @@ +{ + "title": "Dark Star", + "slug": "dark-star", + "description": "A color-customizable, zero navbar padding skin, modified from Starry Fox", + "repository": "https://gitlab.com/ivelieu/dark-star-firefox-skin", + "screenshots": [ + { + "src": "/assets/img/themes/11608darkstar_3.webp", + "alt": "Dark Star screenshot" + } + ], + "tags": [ + "customizable", + "dark", + "ivelieu", + "minimal", + "zeropadding" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 86, + "stats": { + "stars": 3, + "updatedAt": "2023-11-19T00:38:22.034Z", + "ownerAvatar": "https://gitlab.com/uploads/-/system/user/avatar/18385334/avatar.png", + "accessible": true + } +} diff --git a/src/content/themes/darkmatter.json b/src/content/themes/darkmatter.json new file mode 100644 index 00000000..4a22164d --- /dev/null +++ b/src/content/themes/darkmatter.json @@ -0,0 +1,27 @@ +{ + "title": "DarkMatter", + "slug": "darkmatter", + "description": "An intensively worked on, and highly customized dark theme made for Firefox Proton, stretching darkness into every corner of the browser and perfecting even the tiniest details", + "repository": "https://github.com/BloodyHell619/Firefox-Theme-DarkMatter", + "screenshots": [ + { + "src": "/assets/img/themes/darkmatter.webp", + "alt": "DarkMatter screenshot" + } + ], + "tags": [ + "dark", + "proton", + "squared", + "vertical" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 79, + "stats": { + "stars": 75, + "updatedAt": "2024-10-13T06:44:57Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/65298540?v=4", + "accessible": true + } +} diff --git a/src/content/themes/diamondfucsia-theme-to-firefox-css.json b/src/content/themes/diamondfucsia-theme-to-firefox-css.json new file mode 100644 index 00000000..528db940 --- /dev/null +++ b/src/content/themes/diamondfucsia-theme-to-firefox-css.json @@ -0,0 +1,24 @@ +{ + "title": "DiamondFucsia Theme to Firefox Css", + "slug": "diamondfucsia-theme-to-firefox-css", + "description": "Dark Theme to Firefox with Fuchsia Colors\n Compatibility: V89+", + "repository": "https://github.com/Godiesc/DiamondFucsia", + "screenshots": [ + { + "src": "/assets/img/themes/diamondfucsia.webp", + "alt": "DiamondFucsia Theme to Firefox Css screenshot" + } + ], + "tags": [ + "godiesc" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 32, + "stats": { + "stars": 6, + "updatedAt": "2023-11-25T12:46:57Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/22057609?v=4", + "accessible": true + } +} diff --git a/src/content/themes/downtoneui.json b/src/content/themes/downtoneui.json new file mode 100644 index 00000000..f67ae769 --- /dev/null +++ b/src/content/themes/downtoneui.json @@ -0,0 +1,26 @@ +{ + "title": "DownToneUI", + "slug": "downtoneui", + "description": "A modular UI customization for Firefox, using Sidebery for vertical tabs.", + "repository": "https://github.com/oviung/DownToneUI-Firefox", + "screenshots": [ + { + "src": "/assets/img/themes/remote-121-downtoneui.gif", + "alt": "DownToneUI screenshot" + } + ], + "tags": [ + "dark", + "sidebery", + "vertical" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 121, + "stats": { + "stars": 63, + "updatedAt": "2026-03-09T16:39:58Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/8101674?v=4", + "accessible": true + } +} diff --git a/src/content/themes/dracula.json b/src/content/themes/dracula.json new file mode 100644 index 00000000..ef0e9041 --- /dev/null +++ b/src/content/themes/dracula.json @@ -0,0 +1,27 @@ +{ + "title": "Dracula", + "slug": "dracula", + "description": "A Firefox CSS Theme that aims to recreate the look and feel of the Chromium version of Microsoft Edge in the style of Dracula.", + "repository": "https://github.com/jannikbuscha/firefox-dracula", + "screenshots": [ + { + "src": "/assets/img/themes/dracula.webp", + "alt": "Dracula screenshot" + } + ], + "tags": [ + "dark", + "dracula", + "edge", + "microsoft" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 74, + "stats": { + "stars": 20, + "updatedAt": "2024-07-10T07:08:42Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/74017697?v=4", + "accessible": true + } +} diff --git a/src/content/themes/duskfox.json b/src/content/themes/duskfox.json new file mode 100644 index 00000000..bca8b572 --- /dev/null +++ b/src/content/themes/duskfox.json @@ -0,0 +1,25 @@ +{ + "title": "duskFox", + "slug": "duskfox", + "description": "A dark indigo theme integrated with extensive functional and visual scripts.\n Compatibility: V89+", + "repository": "https://github.com/aminomancer/uc.css.js", + "screenshots": [ + { + "src": "/assets/img/themes/duskfox.webp", + "alt": "duskFox screenshot" + } + ], + "tags": [ + "dark", + "dusk" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 30, + "stats": { + "stars": 379, + "updatedAt": "2026-01-06T17:30:39Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/33384265?v=4", + "accessible": true + } +} diff --git a/src/content/themes/dynamic-color.json b/src/content/themes/dynamic-color.json new file mode 100644 index 00000000..40c1700d --- /dev/null +++ b/src/content/themes/dynamic-color.json @@ -0,0 +1,28 @@ +{ + "title": "Dynamic Color", + "slug": "dynamic-color", + "description": "Dark, dynamic (based on the system's accent color), theme for Firefox", + "repository": "https://github.com/zachvlat/Dynamic-Color-Firefox-Theme", + "screenshots": [ + { + "src": "/assets/img/themes/remote-134-dynamic-color.webp", + "alt": "Dynamic Color screenshot" + } + ], + "tags": [ + "accent", + "dark", + "dynamic", + "lightweight", + "zachvlat" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 134, + "stats": { + "stars": 8, + "updatedAt": "2026-04-18T12:37:26Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/28532979?v=4", + "accessible": true + } +} diff --git a/src/content/themes/edge-frfox.json b/src/content/themes/edge-frfox.json new file mode 100644 index 00000000..3f3e0590 --- /dev/null +++ b/src/content/themes/edge-frfox.json @@ -0,0 +1,31 @@ +{ + "title": "Edge-Frfox", + "slug": "edge-frfox", + "description": "A Firefox userChrome.css theme that aims to recreate the look and feel of Microsoft Edge.", + "repository": "https://github.com/bmFtZQ/Edge-FrFox", + "screenshots": [ + { + "src": "/assets/img/themes/Edge-Frfox.webp", + "alt": "Edge-Frfox screenshot" + } + ], + "tags": [ + "bmftzq", + "dark", + "fluent", + "light", + "linux", + "mac", + "microsoft", + "windows" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 22, + "stats": { + "stars": 763, + "updatedAt": "2026-04-03T12:59:23Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/62812711?v=4", + "accessible": true + } +} diff --git a/src/content/themes/edgefox.json b/src/content/themes/edgefox.json new file mode 100644 index 00000000..610eb978 --- /dev/null +++ b/src/content/themes/edgefox.json @@ -0,0 +1,25 @@ +{ + "title": "EdgeFox", + "slug": "edgefox", + "description": "Is a userchrome that imitates (or attempts to imitate) the style of Microsoft's Edge Chromiun browser.", + "repository": "https://github.com/23Bluemaster23/EdgeFox", + "screenshots": [ + { + "src": "/assets/img/themes/edgefox.webp", + "alt": "EdgeFox screenshot" + } + ], + "tags": [ + "edge", + "windows" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 20, + "stats": { + "stars": 33, + "updatedAt": "2021-09-26T14:59:13Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/49736771?v=4", + "accessible": true + } +} diff --git a/src/content/themes/edgyarc-fr.json b/src/content/themes/edgyarc-fr.json new file mode 100644 index 00000000..db0e718e --- /dev/null +++ b/src/content/themes/edgyarc-fr.json @@ -0,0 +1,34 @@ +{ + "title": "EdgyArc Fr", + "slug": "edgyarc-fr", + "description": "Combining the sleekness of Microsoft Edge and the aesthetics of the Arc browser", + "repository": "https://github.com/artsyfriedchicken/EdgyArc-fr/", + "screenshots": [ + { + "src": "/assets/img/themes/edgyarc-fr.webp", + "alt": "EdgyArc Fr screenshot" + } + ], + "tags": [ + "arc", + "artsyfriedchicken", + "blur", + "dark", + "edge", + "light", + "mac", + "macos", + "sidebery", + "translucent", + "vertical tabs" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 101, + "stats": { + "stars": 704, + "updatedAt": "2024-06-29T17:41:05Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/100123017?v=4", + "accessible": true + } +} diff --git a/src/content/themes/elegant-floorp.json b/src/content/themes/elegant-floorp.json new file mode 100644 index 00000000..2062c119 --- /dev/null +++ b/src/content/themes/elegant-floorp.json @@ -0,0 +1,28 @@ +{ + "title": "Elegant Floorp", + "slug": "elegant-floorp", + "description": "Default Floorp Fluential UI modded", + "repository": "https://github.com/Mingo-coder/Elegant-Floorp", + "homepage": "https://github.com/Mingo-coder/Elegant-Floorp/releases/download/v1.0/Elegant_Floorp.zip", + "screenshots": [ + { + "src": "/assets/img/themes/elegant_floorp.webp", + "alt": "Elegant Floorp screenshot" + } + ], + "tags": [ + "dark", + "floorp", + "light", + "mingo-coder" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 123, + "stats": { + "stars": 1, + "updatedAt": "2025-04-06T03:53:06Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/177513443?v=4", + "accessible": true + } +} diff --git a/src/content/themes/elegant-fox.json b/src/content/themes/elegant-fox.json new file mode 100644 index 00000000..277b0b7b --- /dev/null +++ b/src/content/themes/elegant-fox.json @@ -0,0 +1,28 @@ +{ + "title": "Elegant Fox", + "slug": "elegant-fox", + "description": "A firefox context menu theme and background wallpaper support with linux desktops being the main focus", + "repository": "https://github.com/ayushhroyy/elegantfox", + "screenshots": [ + { + "src": "/assets/img/themes/elegantfox.webp", + "alt": "Elegant Fox screenshot" + } + ], + "tags": [ + "adaptive", + "ayushhroyy", + "dark", + "light", + "nord" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 65, + "stats": { + "stars": 35, + "updatedAt": "2025-01-31T15:10:20Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/77523847?v=4", + "accessible": true + } +} diff --git a/src/content/themes/elegant-nord-theme.json b/src/content/themes/elegant-nord-theme.json new file mode 100644 index 00000000..25c89644 --- /dev/null +++ b/src/content/themes/elegant-nord-theme.json @@ -0,0 +1,25 @@ +{ + "title": "Elegant Nord Theme", + "slug": "elegant-nord-theme", + "description": "Elegant Nord Theme with material design", + "repository": "https://github.com/rafamadriz/Firefox-Elegant-NordTheme", + "screenshots": [ + { + "src": "/assets/img/themes/Elegant-Nord-Theme.webp", + "alt": "Elegant Nord Theme screenshot" + } + ], + "tags": [ + "material", + "nord" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 24, + "stats": { + "stars": 24, + "updatedAt": "2023-04-28T01:47:55Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/67771985?v=4", + "accessible": true + } +} diff --git a/src/content/themes/elementary-os-odin-firefox-theme.json b/src/content/themes/elementary-os-odin-firefox-theme.json new file mode 100644 index 00000000..ed490568 --- /dev/null +++ b/src/content/themes/elementary-os-odin-firefox-theme.json @@ -0,0 +1,28 @@ +{ + "title": "Elementary OS Odin Firefox theme", + "slug": "elementary-os-odin-firefox-theme", + "description": "This theme supports all the window buttons layouts from Tweaks and it blends into the elementary OS Odin user interface. \n Compatibility: V91+", + "repository": "https://github.com/Zonnev/elementaryos-firefox-theme", + "screenshots": [ + { + "src": "/assets/img/themes/firefox-eos6-theme.webp", + "alt": "Elementary OS Odin Firefox theme screenshot" + } + ], + "tags": [ + "dark", + "elementary-os", + "light", + "os", + "zonnev" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 53, + "stats": { + "stars": 443, + "updatedAt": "2026-03-04T18:57:14Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/32688765?v=4", + "accessible": true + } +} diff --git a/src/content/themes/essence.json b/src/content/themes/essence.json new file mode 100644 index 00000000..21b1e8b2 --- /dev/null +++ b/src/content/themes/essence.json @@ -0,0 +1,30 @@ +{ + "title": "Essence", + "slug": "essence", + "description": "Compact, beautiful and minimalistic theme for the Firefox web browser.", + "repository": "https://github.com/JarnotMaciej/Essence", + "screenshots": [ + { + "src": "/assets/img/themes/essence.webp", + "alt": "Essence screenshot" + } + ], + "tags": [ + "clean", + "compact", + "light", + "minimal", + "modern", + "oneline", + "rounded" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 82, + "stats": { + "stars": 42, + "updatedAt": "2024-07-08T10:58:01Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/92025751?v=4", + "accessible": true + } +} diff --git a/src/content/themes/fennec.json b/src/content/themes/fennec.json new file mode 100644 index 00000000..9724543f --- /dev/null +++ b/src/content/themes/fennec.json @@ -0,0 +1,33 @@ +{ + "title": "Fennec", + "slug": "fennec", + "description": "Minimal, customizable Firefox/LibreWolf setup with Zen-style sidebar workflow — no fork, no build.", + "repository": "https://github.com/tompassarelli/fennec", + "screenshots": [ + { + "src": "/assets/img/themes/remote-133-fennec.webp", + "alt": "Fennec screenshot" + } + ], + "tags": [ + "dark", + "keyboard", + "librewolf", + "light", + "lightweight", + "minimal", + "sidebar", + "sidebery", + "tompassarelli", + "vertical tabs" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 133, + "stats": { + "stars": 59, + "updatedAt": "2026-04-25T23:05:18Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/6378995?v=4", + "accessible": true + } +} diff --git a/src/content/themes/ff-ultima.json b/src/content/themes/ff-ultima.json new file mode 100644 index 00000000..7427531a --- /dev/null +++ b/src/content/themes/ff-ultima.json @@ -0,0 +1,27 @@ +{ + "title": "FF Ultima", + "slug": "ff-ultima", + "description": "The Firefox theme with too many options", + "repository": "https://github.com/soulhotel/FF-ULTIMA", + "screenshots": [ + { + "src": "/assets/img/themes/remote-102-ff-ultima.gif", + "alt": "FF Ultima screenshot" + } + ], + "tags": [ + "adaptive", + "customizable", + "modern", + "multiple layouts" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 102, + "stats": { + "stars": 1168, + "updatedAt": "2026-02-16T22:41:35Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/155501797?v=4", + "accessible": true + } +} diff --git a/src/content/themes/firefox-90-rainfox.json b/src/content/themes/firefox-90-rainfox.json new file mode 100644 index 00000000..e781015a --- /dev/null +++ b/src/content/themes/firefox-90-rainfox.json @@ -0,0 +1,29 @@ +{ + "title": "[Firefox 90+] RainFox", + "slug": "firefox-90-rainfox", + "description": "Restores Photon's look and feel but keeps Proton's clarity with some improvements and new features. \n Compatibility: V89+", + "repository": "https://github.com/1280px/rainfox", + "screenshots": [ + { + "src": "/assets/img/themes/rainfox.webp", + "alt": "[Firefox 90+] RainFox screenshot" + } + ], + "tags": [ + "uncategorized" + ], + "submitterRole": "legacy", + "status": "archived", + "catalogIndex": 37, + "stats": { + "stars": 73, + "updatedAt": "2022-02-04T15:28:44Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/71165491?v=4", + "accessible": true + }, + "retirement": { + "reason": "repository-archived", + "checkedAt": "2026-04-25T20:04:49.167Z", + "details": "Repository is archived by its owner." + } +} diff --git a/src/content/themes/firefox-alpha.json b/src/content/themes/firefox-alpha.json new file mode 100644 index 00000000..7ad0a062 --- /dev/null +++ b/src/content/themes/firefox-alpha.json @@ -0,0 +1,37 @@ +{ + "title": "Firefox-Alpha", + "slug": "firefox-alpha", + "description": "Super clear desktop browser with zero buttons and gesture controls", + "repository": "https://github.com/Tagggar/Firefox-Alpha", + "screenshots": [ + { + "src": "/assets/img/themes/Firefox-Alpha.webp", + "alt": "Firefox-Alpha screenshot" + } + ], + "tags": [ + "alpha", + "animation", + "clean", + "clear", + "compact", + "dark", + "gestures", + "light", + "minimal", + "minimalistic", + "responsive", + "rounded", + "simple", + "tagggar" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 85, + "stats": { + "stars": 267, + "updatedAt": "2024-05-26T06:03:23Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/81634877?v=4", + "accessible": true + } +} diff --git a/src/content/themes/firefox-compact-mode.json b/src/content/themes/firefox-compact-mode.json new file mode 100644 index 00000000..eecd18a5 --- /dev/null +++ b/src/content/themes/firefox-compact-mode.json @@ -0,0 +1,34 @@ +{ + "title": "Firefox Compact Mode", + "slug": "firefox-compact-mode", + "description": "A compact mode that follows Firefox 89 (known as Proton) design system while using the same vertical space as the compact mode in Firefox 88 (known as Photon). \n Compatibility: V91+", + "repository": "https://github.com/dannycolin/fx-compact-mode", + "screenshots": [ + { + "src": "/assets/img/themes/fx-compact-mode.webp", + "alt": "Firefox Compact Mode screenshot" + } + ], + "tags": [ + "compact", + "dannycolin", + "photon", + "proton", + "pure", + "v91" + ], + "submitterRole": "legacy", + "status": "archived", + "catalogIndex": 45, + "stats": { + "stars": 127, + "updatedAt": "2021-12-11T08:15:44Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/7339076?v=4", + "accessible": true + }, + "retirement": { + "reason": "repository-archived", + "checkedAt": "2026-04-25T20:04:49.167Z", + "details": "Repository is archived by its owner." + } +} diff --git a/src/content/themes/firefox-gnome-theme.json b/src/content/themes/firefox-gnome-theme.json new file mode 100644 index 00000000..453b414e --- /dev/null +++ b/src/content/themes/firefox-gnome-theme.json @@ -0,0 +1,29 @@ +{ + "title": "Firefox GNOME theme", + "slug": "firefox-gnome-theme", + "description": "A bunch of CSS code to make Firefox look closer to GNOME's native apps. \n Compatibility: V91+", + "repository": "https://github.com/rafaelmardojai/firefox-gnome-theme", + "screenshots": [ + { + "src": "/assets/img/themes/firefox-gnome-theme.webp", + "alt": "Firefox GNOME theme screenshot" + } + ], + "tags": [ + "dark", + "gnome", + "light", + "rafaelmardojai", + "rounded", + "v91" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 51, + "stats": { + "stars": 3865, + "updatedAt": "2026-04-14T03:15:06Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/6210397?v=4", + "accessible": true + } +} diff --git a/src/content/themes/firefox-gx.json b/src/content/themes/firefox-gx.json new file mode 100644 index 00000000..5019285a --- /dev/null +++ b/src/content/themes/firefox-gx.json @@ -0,0 +1,31 @@ +{ + "title": "Firefox-GX", + "slug": "firefox-gx", + "description": "Firefox Theme to Opera-GX skin Lovers.", + "repository": "https://github.com/Godiesc/firefox-gx", + "screenshots": [ + { + "src": "/assets/img/themes/firefox-gx.webp", + "alt": "Firefox-GX screenshot" + } + ], + "tags": [ + "adapted", + "dark", + "fuchsia", + "godiesc", + "gx", + "light", + "opera", + "theme" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 64, + "stats": { + "stars": 1057, + "updatedAt": "2026-04-23T15:06:55Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/22057609?v=4", + "accessible": true + } +} diff --git a/src/content/themes/firefox-halo.json b/src/content/themes/firefox-halo.json new file mode 100644 index 00000000..39ced36f --- /dev/null +++ b/src/content/themes/firefox-halo.json @@ -0,0 +1,24 @@ +{ + "title": "Firefox Halo", + "slug": "firefox-halo", + "description": "A mininmalist Firefox theme with a lot of about: pages edited to act as resources. Updates about every month.", + "repository": "https://github.com/seirin-blu/Firefox-Halo", + "screenshots": [ + { + "src": "/assets/img/themes/firefoxhalo.webp", + "alt": "Firefox Halo screenshot" + } + ], + "tags": [ + "toolkit" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 26, + "stats": { + "stars": 48, + "updatedAt": "2023-11-27T19:29:22Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/61664123?v=4", + "accessible": true + } +} diff --git a/src/content/themes/firefox-i3wm-theme.json b/src/content/themes/firefox-i3wm-theme.json new file mode 100644 index 00000000..0c8eb068 --- /dev/null +++ b/src/content/themes/firefox-i3wm-theme.json @@ -0,0 +1,27 @@ +{ + "title": "Firefox i3wm theme", + "slug": "firefox-i3wm-theme", + "description": "A theme for Firefox meant to emulate qutebrowser and integrate with the i3 window manager.", + "repository": "https://github.com/aadilayub/firefox-i3wm-theme", + "screenshots": [ + { + "src": "/assets/img/themes/ff-i3wm.webp", + "alt": "Firefox i3wm theme screenshot" + } + ], + "tags": [ + "i3", + "qt", + "qute", + "qutebrowser" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 21, + "stats": { + "stars": 164, + "updatedAt": "2023-07-27T09:02:57Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/31581044?v=4", + "accessible": true + } +} diff --git a/src/content/themes/firefox-mod-blur.json b/src/content/themes/firefox-mod-blur.json new file mode 100644 index 00000000..fd7794ab --- /dev/null +++ b/src/content/themes/firefox-mod-blur.json @@ -0,0 +1,28 @@ +{ + "title": "Firefox-Mod-Blur", + "slug": "firefox-mod-blur", + "description": "Tested 84.0.1 Windows 10 / Default Dark Theme", + "repository": "https://github.com/datguypiko/Firefox-Mod-Blur", + "screenshots": [ + { + "src": "/assets/img/themes/firefoxmodblur.webp", + "alt": "Firefox-Mod-Blur screenshot" + } + ], + "tags": [ + "blur", + "centre", + "dark", + "datguypiko", + "rounded" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 12, + "stats": { + "stars": 1685, + "updatedAt": "2026-04-24T15:34:30Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/61329159?v=4", + "accessible": true + } +} diff --git a/src/content/themes/firefox-moonlight-theme.json b/src/content/themes/firefox-moonlight-theme.json new file mode 100644 index 00000000..a80bba45 --- /dev/null +++ b/src/content/themes/firefox-moonlight-theme.json @@ -0,0 +1,28 @@ +{ + "title": "Firefox Moonlight Theme", + "slug": "firefox-moonlight-theme", + "description": "A sleek and modern dark blue Firefox theme with smooth, rounded elements for a refined browsing experience.", + "repository": "https://github.com/sinazadeh/Firefox-Moonlight-Theme", + "screenshots": [ + { + "src": "/assets/img/themes/remote-122-firefox-moonlight-theme.webp", + "alt": "Firefox Moonlight Theme screenshot" + } + ], + "tags": [ + "blue", + "cerulean", + "dark", + "round", + "sina" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 122, + "stats": { + "stars": 4, + "updatedAt": "2025-02-13T22:08:42Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/63080674?v=4", + "accessible": true + } +} diff --git a/src/content/themes/firefox-one.json b/src/content/themes/firefox-one.json new file mode 100644 index 00000000..d24e9792 --- /dev/null +++ b/src/content/themes/firefox-one.json @@ -0,0 +1,33 @@ +{ + "title": "Firefox-ONE", + "slug": "firefox-one", + "description": "Dress Firefox with the Opera One skin", + "repository": "https://github.com/Godiesc/firefox-one", + "screenshots": [ + { + "src": "/assets/img/themes/firefox-one.webp", + "alt": "Firefox-ONE screenshot" + } + ], + "tags": [ + "adaptive", + "firefox", + "firefox-one", + "godiesc", + "one", + "opera", + "opera-one", + "tabs", + "theme", + "tree" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 81, + "stats": { + "stars": 429, + "updatedAt": "2026-04-21T05:45:27Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/22057609?v=4", + "accessible": true + } +} diff --git a/src/content/themes/firefox-onebar.json b/src/content/themes/firefox-onebar.json new file mode 100644 index 00000000..d9079cd3 --- /dev/null +++ b/src/content/themes/firefox-onebar.json @@ -0,0 +1,28 @@ +{ + "title": "Firefox Onebar", + "slug": "firefox-onebar", + "description": "A single bar for Firefox's UI.", + "repository": "https://git.gay/freeplay/Firefox-Onebar", + "screenshots": [ + { + "src": "/assets/img/themes/onebar.webp", + "alt": "Firefox Onebar screenshot" + } + ], + "tags": [ + "compact", + "freeplay", + "minimal", + "onebar", + "oneline" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 73, + "stats": { + "stars": 8, + "updatedAt": "2026-03-25T20:23:19Z", + "ownerAvatar": "https://git.gay/avatars/25ef717d14080c74d7a215792ff28c5ba2590585985036074bf9c0723fd9c582?size=512", + "accessible": true + } +} diff --git a/src/content/themes/firefox-oneline-navbar.json b/src/content/themes/firefox-oneline-navbar.json new file mode 100644 index 00000000..c375f15e --- /dev/null +++ b/src/content/themes/firefox-oneline-navbar.json @@ -0,0 +1,30 @@ +{ + "title": "FireFox OneLine Navbar", + "slug": "firefox-oneline-navbar", + "description": "A compact oneliner navbar css theme.", + "repository": "https://github.com/FawazBinSaleem/FireFoxOneLinerCSS", + "screenshots": [ + { + "src": "/assets/img/themes/fireFoxOneLinerCSS.webp", + "alt": "FireFox OneLine Navbar screenshot" + } + ], + "tags": [ + "amoled", + "black color", + "compact", + "navbar", + "one line", + "oneline", + "oneliner" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 112, + "stats": { + "stars": 32, + "updatedAt": "2024-12-20T21:01:20Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/48177454?v=4", + "accessible": true + } +} diff --git a/src/content/themes/firefox-plus.json b/src/content/themes/firefox-plus.json new file mode 100644 index 00000000..b2360068 --- /dev/null +++ b/src/content/themes/firefox-plus.json @@ -0,0 +1,33 @@ +{ + "title": "Firefox Plus", + "slug": "firefox-plus", + "description": "Firefox Plus, CSS tweaks for Firefox", + "repository": "https://github.com/amnweb/firefox-plus", + "screenshots": [ + { + "src": "/assets/img/themes/6299firefox-26-11-2023.webp", + "alt": "Firefox Plus screenshot" + } + ], + "tags": [ + "dark", + "firefox", + "firefox-customization", + "firefox-theme", + "minimal" + ], + "submitterRole": "legacy", + "status": "archived", + "catalogIndex": 89, + "stats": { + "stars": 297, + "updatedAt": "2025-12-29T13:06:49Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/16545063?v=4", + "accessible": true + }, + "retirement": { + "reason": "repository-archived", + "checkedAt": "2026-04-25T20:04:49.167Z", + "details": "Repository is archived by its owner." + } +} diff --git a/src/content/themes/firefox-review.json b/src/content/themes/firefox-review.json new file mode 100644 index 00000000..cd96c9ad --- /dev/null +++ b/src/content/themes/firefox-review.json @@ -0,0 +1,33 @@ +{ + "title": "Firefox Review", + "slug": "firefox-review", + "description": "Firefox Review is a CSS redesign of the browser, changing the look of Firefox to match the color scheme and design language of Firefox Preview, the previous name of Mozilla's new mobile app.", + "repository": "https://github.com/fellowish/firefox-review", + "screenshots": [ + { + "src": "/assets/img/themes/firefoxreview.webp", + "alt": "Firefox Review screenshot" + } + ], + "tags": [ + "archived", + "colorscheme", + "dark", + "fellowish", + "light" + ], + "submitterRole": "legacy", + "status": "archived", + "catalogIndex": 9, + "stats": { + "stars": 137, + "updatedAt": "2021-04-22T18:14:52Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/28973978?v=4", + "accessible": true + }, + "retirement": { + "reason": "repository-archived", + "checkedAt": "2026-04-25T20:04:49.167Z", + "details": "Repository is archived by its owner." + } +} diff --git a/src/content/themes/firefox-uwp-style-theme-omars-edit.json b/src/content/themes/firefox-uwp-style-theme-omars-edit.json new file mode 100644 index 00000000..6c012cef --- /dev/null +++ b/src/content/themes/firefox-uwp-style-theme-omars-edit.json @@ -0,0 +1,28 @@ +{ + "title": "Firefox-UWP-Style-Theme-Omars-Edit", + "slug": "firefox-uwp-style-theme-omars-edit", + "description": "A minimalistic-retro theme based off the UWP interface", + "repository": "https://github.com/omarb737/Firefox-UWP-Style-Theme-Omars-Edit", + "screenshots": [ + { + "src": "/assets/img/themes/321608U0N6E.webp", + "alt": "Firefox-UWP-Style-Theme-Omars-Edit screenshot" + } + ], + "tags": [ + "dark", + "minimalist", + "omarb737", + "retro", + "uwp" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 69, + "stats": { + "stars": 4, + "updatedAt": "2022-07-31T05:44:56Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/41845164?v=4", + "accessible": true + } +} diff --git a/src/content/themes/firefox-uwp-style.json b/src/content/themes/firefox-uwp-style.json new file mode 100644 index 00000000..b005d1a7 --- /dev/null +++ b/src/content/themes/firefox-uwp-style.json @@ -0,0 +1,26 @@ +{ + "title": "Firefox UWP Style", + "slug": "firefox-uwp-style", + "description": "A theme that follows UWP styling. Featuring the original MDL2 design and Sun Valley refresh", + "repository": "https://github.com/Guerra24/Firefox-UWP-Style", + "screenshots": [ + { + "src": "/assets/img/themes/firefoxuwpstyle.webp", + "alt": "Firefox UWP Style screenshot" + } + ], + "tags": [ + "colorscheme", + "dark", + "guerra24" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 16, + "stats": { + "stars": 453, + "updatedAt": "2026-04-13T02:21:32Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/9023392?v=4", + "accessible": true + } +} diff --git a/src/content/themes/firefox-vertical-tabs-tst-ui.json b/src/content/themes/firefox-vertical-tabs-tst-ui.json new file mode 100644 index 00000000..74ddb617 --- /dev/null +++ b/src/content/themes/firefox-vertical-tabs-tst-ui.json @@ -0,0 +1,26 @@ +{ + "title": "Firefox vertical tabs (TST) UI", + "slug": "firefox-vertical-tabs-tst-ui", + "description": "Vertical tabs in Firefox using tree style tabs. Vibrant tab selectors, full dark mode, titlebar text in nav-bar and much more.\n Compatibility: V89+", + "repository": "https://github.com/sagars007/Firefox-vertical-tabs-customUI", + "screenshots": [ + { + "src": "/assets/img/themes/compact_verticaltabs_view.webp", + "alt": "Firefox vertical tabs (TST) UI screenshot" + } + ], + "tags": [ + "sidebar", + "sidetab", + "tree" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 34, + "stats": { + "stars": 33, + "updatedAt": "2021-09-04T19:49:09Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/56472130?v=4", + "accessible": true + } +} diff --git a/src/content/themes/firefox-xtra-compact.json b/src/content/themes/firefox-xtra-compact.json new file mode 100644 index 00000000..ee063a9f --- /dev/null +++ b/src/content/themes/firefox-xtra-compact.json @@ -0,0 +1,26 @@ +{ + "title": "Firefox Xtra Compact", + "slug": "firefox-xtra-compact", + "description": "Aims to make Firefox more compact and give a tiny bit more web view area for low-screen devices.", + "repository": "https://github.com/CarterSnich/firefox-xtra-compact", + "screenshots": [ + { + "src": "/assets/img/themes/xtracompact.webp", + "alt": "Firefox Xtra Compact screenshot" + } + ], + "tags": [ + "cartersnich", + "compact", + "themeless" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 103, + "stats": { + "stars": 25, + "updatedAt": "2025-09-21T00:00:31Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/52433531?v=4", + "accessible": true + } +} diff --git a/src/content/themes/firefoxcss.json b/src/content/themes/firefoxcss.json new file mode 100644 index 00000000..3bf59286 --- /dev/null +++ b/src/content/themes/firefoxcss.json @@ -0,0 +1,27 @@ +{ + "title": "FirefoxCss", + "slug": "firefoxcss", + "description": "Custom userChrome.css for firefox based on Material Fox and Flying Fox with few small changes.", + "repository": "https://github.com/h4wwk3ye/firefoxCSS", + "screenshots": [ + { + "src": "/assets/img/themes/firefoxcss.webp", + "alt": "FirefoxCss screenshot" + } + ], + "tags": [ + "h4wwk3ye", + "light", + "sidebar", + "tree style tab" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 4, + "stats": { + "stars": 24, + "updatedAt": "2021-01-25T11:22:25Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/24487030?v=4", + "accessible": true + } +} diff --git a/src/content/themes/firefoxw10contextmenus.json b/src/content/themes/firefoxw10contextmenus.json new file mode 100644 index 00000000..c6f15c24 --- /dev/null +++ b/src/content/themes/firefoxw10contextmenus.json @@ -0,0 +1,27 @@ +{ + "title": "FirefoxW10ContextMenus", + "slug": "firefoxw10contextmenus", + "description": "Emulates the Windows 10 context menus in Firefox.", + "repository": "https://github.com/M1ch431/FirefoxW10ContextMenus", + "screenshots": [ + { + "src": "/assets/img/themes/20.webp", + "alt": "FirefoxW10ContextMenus screenshot" + } + ], + "tags": [ + "context", + "menu", + "toolkit", + "windows" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 19, + "stats": { + "stars": 113, + "updatedAt": "2021-09-20T04:21:08Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/46256998?v=4", + "accessible": true + } +} diff --git a/src/content/themes/flexfox.json b/src/content/themes/flexfox.json new file mode 100644 index 00000000..2872b881 --- /dev/null +++ b/src/content/themes/flexfox.json @@ -0,0 +1,28 @@ +{ + "title": "FlexFox", + "slug": "flexfox", + "description": "A lightweight Firefox theme focused on usability, flexibility, and smooth performance.", + "repository": "https://github.com/yuuqilin/FlexFox", + "screenshots": [ + { + "src": "/assets/img/themes/remote-126-flexfox.webp", + "alt": "FlexFox screenshot" + } + ], + "tags": [ + "flexible", + "lightweight", + "mica", + "minimal", + "sidebery" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 126, + "stats": { + "stars": 244, + "updatedAt": "2026-03-22T09:21:39Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/154042945?v=4", + "accessible": true + } +} diff --git a/src/content/themes/flying-fox.json b/src/content/themes/flying-fox.json new file mode 100644 index 00000000..740e61c8 --- /dev/null +++ b/src/content/themes/flying-fox.json @@ -0,0 +1,31 @@ +{ + "title": "Flying Fox", + "slug": "flying-fox", + "description": "An opinionated set of configurations for firefox with Material Fox, github-moonlight userstyle", + "repository": "https://github.com/akshat46/FlyingFox", + "screenshots": [ + { + "src": "/assets/img/themes/flying.webp", + "alt": "Flying Fox screenshot" + } + ], + "tags": [ + "akshat46", + "material", + "moonlight" + ], + "submitterRole": "legacy", + "status": "archived", + "catalogIndex": 18, + "stats": { + "stars": 1604, + "updatedAt": "2023-04-11T07:11:04Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/7402043?v=4", + "accessible": true + }, + "retirement": { + "reason": "repository-archived", + "checkedAt": "2026-04-25T20:04:49.167Z", + "details": "Repository is archived by its owner." + } +} diff --git a/src/content/themes/frameui-for-firefox.json b/src/content/themes/frameui-for-firefox.json new file mode 100644 index 00000000..671d0c04 --- /dev/null +++ b/src/content/themes/frameui-for-firefox.json @@ -0,0 +1,31 @@ +{ + "title": "FrameUI for Firefox", + "slug": "frameui-for-firefox", + "description": "A new way to view your web content. Like looking at photos printed from an old Polaroid camera.", + "repository": "https://github.com/FineFuturity/FrameUIForFirefox/", + "screenshots": [ + { + "src": "/assets/img/themes/FrameUIScreenshot.webp", + "alt": "FrameUI for Firefox screenshot" + } + ], + "tags": [ + "finefuturity", + "immersive", + "minimal", + "one line", + "sidebery", + "tab center reborn", + "toolbars on bottom", + "vertical tabs" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 96, + "stats": { + "stars": 68, + "updatedAt": "2024-12-03T23:57:05Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/19298107?v=4", + "accessible": true + } +} diff --git a/src/content/themes/gale-for-firefox.json b/src/content/themes/gale-for-firefox.json new file mode 100644 index 00000000..1db4c127 --- /dev/null +++ b/src/content/themes/gale-for-firefox.json @@ -0,0 +1,35 @@ +{ + "title": "gale for Firefox", + "slug": "gale-for-firefox", + "description": "My CSS files to use with Firefox and Sidebery", + "repository": "https://github.com/mgastonportillo/gale-for-ff", + "screenshots": [ + { + "src": "/assets/img/themes/8988rjy7uTd.webp", + "alt": "gale for Firefox screenshot" + } + ], + "tags": [ + "adaptive", + "autohide", + "compact", + "dark", + "gale", + "minimalistic", + "sidebar" + ], + "submitterRole": "legacy", + "status": "archived", + "catalogIndex": 68, + "stats": { + "stars": 122, + "updatedAt": "2024-09-22T14:15:06Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/106234166?v=4", + "accessible": true + }, + "retirement": { + "reason": "repository-archived", + "checkedAt": "2026-04-25T20:04:49.167Z", + "details": "Repository is archived by its owner." + } +} diff --git a/src/content/themes/gentlefox.json b/src/content/themes/gentlefox.json new file mode 100644 index 00000000..f1bc8382 --- /dev/null +++ b/src/content/themes/gentlefox.json @@ -0,0 +1,29 @@ +{ + "title": "GentleFox", + "slug": "gentlefox", + "description": "A Firefox theme, which features gentle curves, transparency and a minimal interface. \n Compatibility: V91+", + "repository": "https://github.com/alfarexguy2019/gentlefox", + "screenshots": [ + { + "src": "/assets/img/themes/GentleFox.webp", + "alt": "GentleFox screenshot" + } + ], + "tags": [ + "alfarexguy2019", + "blur", + "dark", + "light", + "rounded", + "transparency" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 56, + "stats": { + "stars": 61, + "updatedAt": "2025-12-05T10:26:40Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/78948152?v=4", + "accessible": true + } +} diff --git a/src/content/themes/git-userchrome.json b/src/content/themes/git-userchrome.json new file mode 100644 index 00000000..c268fc54 --- /dev/null +++ b/src/content/themes/git-userchrome.json @@ -0,0 +1,28 @@ +{ + "title": "git userChrome", + "slug": "git-userchrome", + "description": "An automation tool for installing userChrome Themes", + "repository": "https://github.com/soulhotel/git-userChrome", + "screenshots": [ + { + "src": "/assets/img/themes/remote-127-git-userchrome.gif", + "alt": "git userChrome screenshot" + } + ], + "tags": [ + "automation", + "firefox", + "git", + "tool", + "userchrome" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 127, + "stats": { + "stars": 56, + "updatedAt": "2025-08-27T21:28:32Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/155501797?v=4", + "accessible": true + } +} diff --git a/src/content/themes/glassyfox.json b/src/content/themes/glassyfox.json new file mode 100644 index 00000000..a89ea465 --- /dev/null +++ b/src/content/themes/glassyfox.json @@ -0,0 +1,25 @@ +{ + "title": "GlassyFox", + "slug": "glassyfox", + "description": "Keeps the original new tab page layout while making it look as glassy as possible.", + "repository": "https://github.com/AnhNguyenlost13/GlassyFox", + "screenshots": [ + { + "src": "/assets/img/themes/glassyfox.webp", + "alt": "GlassyFox screenshot" + } + ], + "tags": [ + "anhnguyenlost13", + "blur" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 110, + "stats": { + "stars": 12, + "updatedAt": "2024-10-04T03:38:39Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/94160753?v=4", + "accessible": true + } +} diff --git a/src/content/themes/gradient-rounded-tabs-redesign-and-ultra-compact-mode-proton-ui.json b/src/content/themes/gradient-rounded-tabs-redesign-and-ultra-compact-mode-proton-ui.json new file mode 100644 index 00000000..609fec8a --- /dev/null +++ b/src/content/themes/gradient-rounded-tabs-redesign-and-ultra-compact-mode-proton-ui.json @@ -0,0 +1,24 @@ +{ + "title": "Gradient rounded tabs redesign and ultra compact mode [Proton UI]", + "slug": "gradient-rounded-tabs-redesign-and-ultra-compact-mode-proton-ui", + "description": "Firefox Proton UI minimal changes with nav-bar-connected rounded tabs, reduced compact mode, nightly color gradient accents etc.. \n Compatibility: V89+", + "repository": "https://github.com/sagars007/Proton-UI-connected-rounded-tabs-firefox-css", + "screenshots": [ + { + "src": "/assets/img/themes/proton-ui-gradient-rounded-tabs-display.webp", + "alt": "Gradient rounded tabs redesign and ultra compact mode [Proton UI] screenshot" + } + ], + "tags": [ + "uncategorized" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 38, + "stats": { + "stars": 36, + "updatedAt": "2023-05-14T06:24:23Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/56472130?v=4", + "accessible": true + } +} diff --git a/src/content/themes/greenyfox.json b/src/content/themes/greenyfox.json new file mode 100644 index 00000000..5b1f87cb --- /dev/null +++ b/src/content/themes/greenyfox.json @@ -0,0 +1,33 @@ +{ + "title": "greenyfox", + "slug": "greenyfox", + "description": "A modern dark theme with macos title bar buttons and Iosevka font", + "repository": "https://github.com/alan-ar1/greenyfox", + "screenshots": [ + { + "src": "/assets/img/themes/9037DGTAHYA.webp", + "alt": "greenyfox screenshot" + } + ], + "tags": [ + "alan-ar1", + "dark", + "iosevka", + "minimal", + "title-bar" + ], + "submitterRole": "legacy", + "status": "archived", + "catalogIndex": 93, + "stats": { + "stars": 5, + "updatedAt": "2025-01-02T18:59:22Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/110337684?v=4", + "accessible": true + }, + "retirement": { + "reason": "repository-archived", + "checkedAt": "2026-04-25T20:04:49.167Z", + "details": "Repository is archived by its owner." + } +} diff --git a/src/content/themes/gruvbox-gnomeish.json b/src/content/themes/gruvbox-gnomeish.json new file mode 100644 index 00000000..4ecb6e1f --- /dev/null +++ b/src/content/themes/gruvbox-gnomeish.json @@ -0,0 +1,27 @@ +{ + "title": "Gruvbox GNOMEish", + "slug": "gruvbox-gnomeish", + "description": "A minimal Firefox theme inspired by the aesthetics of Gruvbox and GNOME.", + "repository": "https://github.com/xslhub/gruvbox-gnomeish-firefox-theme", + "screenshots": [ + { + "src": "/assets/img/themes/remote-128-gruvbox-gnomeish.webp", + "alt": "Gruvbox GNOMEish screenshot" + } + ], + "tags": [ + "dark", + "gnome", + "gruvbox", + "xslhub" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 128, + "stats": { + "stars": 7, + "updatedAt": "2025-10-14T20:58:43Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/158527507?v=4", + "accessible": true + } +} diff --git a/src/content/themes/gruvfox-by-alfarex2019.json b/src/content/themes/gruvfox-by-alfarex2019.json new file mode 100644 index 00000000..f4823009 --- /dev/null +++ b/src/content/themes/gruvfox-by-alfarex2019.json @@ -0,0 +1,28 @@ +{ + "title": "GruvFox by Alfarex2019", + "slug": "gruvfox-by-alfarex2019", + "description": "GruvFox is a remix of dpcdpc11's theme, featuring the gruvbox color palette.\n Compatibility: V91+", + "repository": "https://github.com/FirefoxCSSThemers/GruvFox", + "screenshots": [ + { + "src": "/assets/img/themes/20930130265614-a7559ea7-70fd-44f9-a790-34c5c0e31493.webp", + "alt": "GruvFox by Alfarex2019 screenshot" + } + ], + "tags": [ + "alfarexguy2019", + "dark", + "gruv", + "pure", + "v91" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 46, + "stats": { + "stars": 22, + "updatedAt": "2021-08-31T02:33:56Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/84518514?v=4", + "accessible": true + } +} diff --git a/src/content/themes/impossiblefox.json b/src/content/themes/impossiblefox.json new file mode 100644 index 00000000..e49700da --- /dev/null +++ b/src/content/themes/impossiblefox.json @@ -0,0 +1,32 @@ +{ + "title": "ImpossibleFox", + "slug": "impossiblefox", + "description": "A simple and fast one-line theme for Firefox inspired by Safari's compact layout.", + "repository": "https://github.com/Naezr/ImpossibleFox", + "screenshots": [ + { + "src": "/assets/img/themes/ImpossibleFox.webp", + "alt": "ImpossibleFox screenshot" + } + ], + "tags": [ + "dark", + "light", + "naezr", + "oneline" + ], + "submitterRole": "legacy", + "status": "archived", + "catalogIndex": 87, + "stats": { + "stars": 25, + "updatedAt": "2024-05-24T15:24:49Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/95460152?v=4", + "accessible": true + }, + "retirement": { + "reason": "repository-archived", + "checkedAt": "2026-04-25T20:04:49.167Z", + "details": "Repository is archived by its owner." + } +} diff --git a/src/content/themes/keyfox-a-minimal-keyboard-centered-oneliner-css.json b/src/content/themes/keyfox-a-minimal-keyboard-centered-oneliner-css.json new file mode 100644 index 00000000..8c7497d6 --- /dev/null +++ b/src/content/themes/keyfox-a-minimal-keyboard-centered-oneliner-css.json @@ -0,0 +1,28 @@ +{ + "title": "KeyFox- A minimal, keyboard centered OneLiner CSS.", + "slug": "keyfox-a-minimal-keyboard-centered-oneliner-css", + "description": "KeyFox is A simple, minimal OneLiner Keyboard-centered CSS for Firefox.", + "repository": "https://github.com/alfarexguy2019/KeyFox", + "screenshots": [ + { + "src": "/assets/img/themes/13268136501706-accca691-b9c3-4841-acd7-6bb843d2f422.webp", + "alt": "KeyFox- A minimal, keyboard centered OneLiner CSS. screenshot" + } + ], + "tags": [ + "alfarexguy2019", + "black", + "dark", + "one-line", + "white" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 60, + "stats": { + "stars": 126, + "updatedAt": "2025-12-05T10:13:27Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/78948152?v=4", + "accessible": true + } +} diff --git a/src/content/themes/lepton-proton-fix-in-proton-ui.json b/src/content/themes/lepton-proton-fix-in-proton-ui.json new file mode 100644 index 00000000..54d7c749 --- /dev/null +++ b/src/content/themes/lepton-proton-fix-in-proton-ui.json @@ -0,0 +1,24 @@ +{ + "title": "Lepton(Proton Fix) in Proton UI", + "slug": "lepton-proton-fix-in-proton-ui", + "description": "🦊 I respect proton UI and aim to fix it. Icons, Padding, Tab Design...\n Compatibility: V89+", + "repository": "https://github.com/black7375/Firefox-UI-Fix", + "screenshots": [ + { + "src": "/assets/img/themes/Lepton.webp", + "alt": "Lepton(Proton Fix) in Proton UI screenshot" + } + ], + "tags": [ + "uncategorized" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 35, + "stats": { + "stars": 5805, + "updatedAt": "2026-02-06T00:06:12Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/25581533?v=4", + "accessible": true + } +} diff --git a/src/content/themes/lepton-s-photon-styled-in-proton-ui.json b/src/content/themes/lepton-s-photon-styled-in-proton-ui.json new file mode 100644 index 00000000..5c0d9386 --- /dev/null +++ b/src/content/themes/lepton-s-photon-styled-in-proton-ui.json @@ -0,0 +1,24 @@ +{ + "title": "Lepton's Photon-Styled in Proton UI", + "slug": "lepton-s-photon-styled-in-proton-ui", + "description": "🦊 I tried to preserve Proton’s feeling while preserving Photon’s strengths. Icons, Padding, Tab Design...\n Compatibility: V89+", + "repository": "https://github.com/black7375/Firefox-UI-Fix/tree/photon-style", + "screenshots": [ + { + "src": "/assets/img/themes/Lepton-PhotonStyle.webp", + "alt": "Lepton's Photon-Styled in Proton UI screenshot" + } + ], + "tags": [ + "uncategorized" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 36, + "stats": { + "stars": 5805, + "updatedAt": "2026-02-06T00:06:12Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/25581533?v=4", + "accessible": true + } +} diff --git a/src/content/themes/littlefox.json b/src/content/themes/littlefox.json new file mode 100644 index 00000000..ac4e016c --- /dev/null +++ b/src/content/themes/littlefox.json @@ -0,0 +1,27 @@ +{ + "title": "LittleFox", + "slug": "littlefox", + "description": "A minimalistic, mouse centered CSS theme for FireFox.", + "repository": "https://github.com/biglavis/LittleFox", + "screenshots": [ + { + "src": "/assets/img/themes/remote-125-littlefox.webp", + "alt": "LittleFox screenshot" + } + ], + "tags": [ + "compact", + "minimal", + "oneline", + "simple" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 125, + "stats": { + "stars": 34, + "updatedAt": "2026-04-23T01:39:12Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/105270868?v=4", + "accessible": true + } +} diff --git a/src/content/themes/macfox-theme.json b/src/content/themes/macfox-theme.json new file mode 100644 index 00000000..da4933c8 --- /dev/null +++ b/src/content/themes/macfox-theme.json @@ -0,0 +1,31 @@ +{ + "title": "MacFox-Theme", + "slug": "macfox-theme", + "description": "Safari-like minimalistic theme with system accent color", + "repository": "https://github.com/d0sse/macFox-theme", + "screenshots": [ + { + "src": "/assets/img/themes/d0sse_mac_fox_screen.webp", + "alt": "MacFox-Theme screenshot" + } + ], + "tags": [ + "accent", + "autocolor", + "dark", + "light", + "mac", + "macos", + "minimal", + "safari" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 100, + "stats": { + "stars": 40, + "updatedAt": "2026-04-20T09:06:29Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/16508608?v=4", + "accessible": true + } +} diff --git a/src/content/themes/macosvibrant.json b/src/content/themes/macosvibrant.json new file mode 100644 index 00000000..b53e3181 --- /dev/null +++ b/src/content/themes/macosvibrant.json @@ -0,0 +1,28 @@ +{ + "title": "MacOSVibrant", + "slug": "macosvibrant", + "description": "A theme that uses MacOS Vibrancy and is styled after other Apple Apps \n Compatibility: V91+", + "repository": "https://github.com/Tnings/MacosVibrant", + "screenshots": [ + { + "src": "/assets/img/themes/MacOSVibrant.webp", + "alt": "MacOSVibrant screenshot" + } + ], + "tags": [ + "dark", + "rounded", + "tnings", + "transparency", + "v91" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 49, + "stats": { + "stars": 47, + "updatedAt": "2023-09-16T17:32:42Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/55812511?v=4", + "accessible": true + } +} diff --git a/src/content/themes/martinfox.json b/src/content/themes/martinfox.json new file mode 100644 index 00000000..44a13e11 --- /dev/null +++ b/src/content/themes/martinfox.json @@ -0,0 +1,27 @@ +{ + "title": "MartinFox", + "slug": "martinfox", + "description": "Really simple userChrome.css to make the active tab stand out more; 61 lines. \n Compatibility: V89+", + "repository": "https://github.com/arp242/MartinFox", + "screenshots": [ + { + "src": "/assets/img/themes/martinfox.webp", + "alt": "MartinFox screenshot" + } + ], + "tags": [ + "arp242", + "compact", + "pure", + "v91" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 42, + "stats": { + "stars": 12, + "updatedAt": "2023-01-15T13:01:04Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/1032692?v=4", + "accessible": true + } +} diff --git a/src/content/themes/material-fox-updated.json b/src/content/themes/material-fox-updated.json new file mode 100644 index 00000000..92428f67 --- /dev/null +++ b/src/content/themes/material-fox-updated.json @@ -0,0 +1,32 @@ +{ + "title": "Material Fox Updated", + "slug": "material-fox-updated", + "description": "🦊 Firefox user CSS theme looks similar to Chrome.", + "repository": "https://github.com/edelvarden/material-fox-updated", + "screenshots": [ + { + "src": "/assets/img/themes/material-fox-updated-preview.webp", + "alt": "Material Fox Updated screenshot" + } + ], + "tags": [ + "customizable", + "dark", + "light", + "material", + "material-design", + "modern", + "refresh", + "rtl", + "updated" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 117, + "stats": { + "stars": 655, + "updatedAt": "2025-08-29T18:54:12Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/42596339?v=4", + "accessible": true + } +} diff --git a/src/content/themes/materialfox.json b/src/content/themes/materialfox.json new file mode 100644 index 00000000..847076b6 --- /dev/null +++ b/src/content/themes/materialfox.json @@ -0,0 +1,27 @@ +{ + "title": "MaterialFox", + "slug": "materialfox", + "description": "A Material Design-inspired userChrome.css theme for Firefox", + "repository": "https://github.com/muckSponge/MaterialFox", + "screenshots": [ + { + "src": "/assets/img/themes/materialfox.webp", + "alt": "MaterialFox screenshot" + } + ], + "tags": [ + "colorscheme", + "dark", + "light", + "mucksponge" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 15, + "stats": { + "stars": 1971, + "updatedAt": "2024-09-23T08:58:42Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/5405629?v=4", + "accessible": true + } +} diff --git a/src/content/themes/minimal-arc.json b/src/content/themes/minimal-arc.json new file mode 100644 index 00000000..7aca4ea6 --- /dev/null +++ b/src/content/themes/minimal-arc.json @@ -0,0 +1,29 @@ +{ + "title": "Minimal-Arc", + "slug": "minimal-arc", + "description": "Minimal light Firefox theme with Arc like design with vertical tabs", + "repository": "https://github.com/zayihu/Minimal-Arc", + "screenshots": [ + { + "src": "/assets/img/themes/minimal_arc.webp", + "alt": "Minimal-Arc screenshot" + } + ], + "tags": [ + "arc browser", + "compact", + "light", + "minimal", + "sidebery", + "vertical-tabs" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 106, + "stats": { + "stars": 63, + "updatedAt": "2024-09-07T06:13:59Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/167391787?v=4", + "accessible": true + } +} diff --git a/src/content/themes/minimal-functional-fox.json b/src/content/themes/minimal-functional-fox.json new file mode 100644 index 00000000..7011f84c --- /dev/null +++ b/src/content/themes/minimal-functional-fox.json @@ -0,0 +1,27 @@ +{ + "title": "minimal-functional-fox", + "slug": "minimal-functional-fox", + "description": "A minimal, yet functional configuration for Firefox!", + "repository": "https://github.com/mut-ex/minimal-functional-fox", + "screenshots": [ + { + "src": "/assets/img/themes/minimalfuntionalfox.webp", + "alt": "minimal-functional-fox screenshot" + } + ], + "tags": [ + "animations", + "centre", + "dark", + "minimal" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 14, + "stats": { + "stars": 725, + "updatedAt": "2023-05-19T00:16:56Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/21265981?v=4", + "accessible": true + } +} diff --git a/src/content/themes/minimal-one-line-firefox.json b/src/content/themes/minimal-one-line-firefox.json new file mode 100644 index 00000000..54b7e49a --- /dev/null +++ b/src/content/themes/minimal-one-line-firefox.json @@ -0,0 +1,29 @@ +{ + "title": "minimal-one-line-firefox", + "slug": "minimal-one-line-firefox", + "description": "A minimal oneliner, to minimizing the space used for url and tab bar", + "repository": "https://github.com/ttntm/minimal-one-line-firefox", + "screenshots": [ + { + "src": "/assets/img/themes/molff.webp", + "alt": "minimal-one-line-firefox screenshot" + } + ], + "tags": [ + "compact", + "dark", + "light", + "minimalistic", + "oneline", + "squared" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 83, + "stats": { + "stars": 46, + "updatedAt": "2024-06-15T16:07:30Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/41571384?v=4", + "accessible": true + } +} diff --git a/src/content/themes/minimalfox.json b/src/content/themes/minimalfox.json new file mode 100644 index 00000000..93b70c85 --- /dev/null +++ b/src/content/themes/minimalfox.json @@ -0,0 +1,29 @@ +{ + "title": "minimalFOX", + "slug": "minimalfox", + "description": "A compact & minimal Firefox theme built for macOS.", + "repository": "https://github.com/marmmaz/FirefoxCSS", + "screenshots": [ + { + "src": "/assets/img/themes/minimalfox.webp", + "alt": "minimalFOX screenshot" + } + ], + "tags": [ + "auto-hide", + "compact", + "dark", + "floating bar", + "macos", + "marmazz" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 3, + "stats": { + "stars": 77, + "updatedAt": "2021-10-13T19:11:07Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/71498246?v=4", + "accessible": true + } +} diff --git a/src/content/themes/minimalist-darkgreen.json b/src/content/themes/minimalist-darkgreen.json new file mode 100644 index 00000000..9850f610 --- /dev/null +++ b/src/content/themes/minimalist-darkgreen.json @@ -0,0 +1,27 @@ +{ + "title": "Minimalist-DarkGreen", + "slug": "minimalist-darkgreen", + "description": "A theme for firefox with dark green colors.", + "repository": "https://github.com/andev0x/Minimalist-DarkGreen", + "screenshots": [ + { + "src": "/assets/img/themes/Minimalist-DarkGreen.gif", + "alt": "Minimalist-DarkGreen screenshot" + } + ], + "tags": [ + "andev0x", + "dark", + "green", + "minimalist" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 116, + "stats": { + "stars": 3, + "updatedAt": "2025-08-13T05:32:28Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/152575252?v=4", + "accessible": true + } +} diff --git a/src/content/themes/minimalistest-oneliner.json b/src/content/themes/minimalistest-oneliner.json new file mode 100644 index 00000000..dfc27194 --- /dev/null +++ b/src/content/themes/minimalistest-oneliner.json @@ -0,0 +1,27 @@ +{ + "title": "minimalistest oneliner", + "slug": "minimalistest-oneliner", + "description": "buttons are for nerds.", + "repository": "https://github.com/yari-dog/minimalistest-oneliner-librewolf", + "screenshots": [ + { + "src": "/assets/img/themes/minimalist-oneliner.webp", + "alt": "minimalistest oneliner screenshot" + } + ], + "tags": [ + "compact", + "oneline", + "oneliner", + "simple" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 114, + "stats": { + "stars": 8, + "updatedAt": "2024-08-28T10:11:56Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/75224849?v=4", + "accessible": true + } +} diff --git a/src/content/themes/ministhetic-firefox.json b/src/content/themes/ministhetic-firefox.json new file mode 100644 index 00000000..3f88b225 --- /dev/null +++ b/src/content/themes/ministhetic-firefox.json @@ -0,0 +1,27 @@ +{ + "title": "MiniSthetic_Firefox", + "slug": "ministhetic-firefox", + "description": "Minimal Aesthetic Firefox CSS", + "repository": "https://github.com/ashish-kus/MiniSthetic_Firefox", + "screenshots": [ + { + "src": "/assets/img/themes/remote-118-ministhetic-firefox.gif", + "alt": "MiniSthetic_Firefox screenshot" + } + ], + "tags": [ + "aesthetic", + "dark", + "minimal", + "minimal aesthetic firefox css" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 118, + "stats": { + "stars": 19, + "updatedAt": "2025-01-12T05:02:51Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/78788195?v=4", + "accessible": true + } +} diff --git a/src/content/themes/modoki-firefox.json b/src/content/themes/modoki-firefox.json new file mode 100644 index 00000000..4884915f --- /dev/null +++ b/src/content/themes/modoki-firefox.json @@ -0,0 +1,29 @@ +{ + "title": "Modoki Firefox", + "slug": "modoki-firefox", + "description": "Bringing the classic Modern Modoki Netscape theme back", + "repository": "https://github.com/soup-bowl/Modoki-Firefox", + "screenshots": [ + { + "src": "/assets/img/themes/soupbowlmodoki.webp", + "alt": "Modoki Firefox screenshot" + } + ], + "tags": [ + "classic", + "light", + "netscape", + "retro", + "skeuomorphic", + "soup-bowl" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 70, + "stats": { + "stars": 96, + "updatedAt": "2026-04-25T22:39:53Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/11209477?v=4", + "accessible": true + } +} diff --git a/src/content/themes/monochrome-neubrutalism-firefox-simple.json b/src/content/themes/monochrome-neubrutalism-firefox-simple.json new file mode 100644 index 00000000..6dd15678 --- /dev/null +++ b/src/content/themes/monochrome-neubrutalism-firefox-simple.json @@ -0,0 +1,28 @@ +{ + "title": "Monochrome Neubrutalism Firefox Simple", + "slug": "monochrome-neubrutalism-firefox-simple", + "description": "A simple light theme I made to explore the world of Firefox theming.", + "repository": "https://github.com/Kaskapa/Monochrome-Neubrutalism-Firefox-Theme", + "screenshots": [ + { + "src": "/assets/img/themes/monochromeNeubrutalism.webp", + "alt": "Monochrome Neubrutalism Firefox Simple screenshot" + } + ], + "tags": [ + "kaskapa", + "light", + "monochrome", + "neubrutalislm", + "simple" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 113, + "stats": { + "stars": 24, + "updatedAt": "2024-06-02T13:53:52Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/100031511?v=4", + "accessible": true + } +} diff --git a/src/content/themes/monochrome-tree.json b/src/content/themes/monochrome-tree.json new file mode 100644 index 00000000..990c52c0 --- /dev/null +++ b/src/content/themes/monochrome-tree.json @@ -0,0 +1,29 @@ +{ + "title": "Monochrome Tree", + "slug": "monochrome-tree", + "description": "A custom minimalist theme for Firefox with Tree Style Tab support", + "repository": "https://github.com/MatejKafka/FirefoxTheme", + "screenshots": [ + { + "src": "/assets/img/themes/19.webp", + "alt": "Monochrome Tree screenshot" + } + ], + "tags": [ + "dark", + "light", + "matejkafka", + "monochrome", + "one-line", + "tree style" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 17, + "stats": { + "stars": 17, + "updatedAt": "2025-04-06T13:59:21Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/6414091?v=4", + "accessible": true + } +} diff --git a/src/content/themes/moonlight.json b/src/content/themes/moonlight.json new file mode 100644 index 00000000..d0428daa --- /dev/null +++ b/src/content/themes/moonlight.json @@ -0,0 +1,24 @@ +{ + "title": "Moonlight 🌌", + "slug": "moonlight", + "description": "A dark userstyle for Firefox inspired by moonlight-vscode-theme and github-moonlight", + "repository": "https://github.com/eduardhojbota/moonlight-userChrome", + "screenshots": [ + { + "src": "/assets/img/themes/moonlight.webp", + "alt": "Moonlight 🌌 screenshot" + } + ], + "tags": [ + "dark" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 25, + "stats": { + "stars": 144, + "updatedAt": "2023-11-25T14:46:00Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/2820538?v=4", + "accessible": true + } +} diff --git a/src/content/themes/natura-for-firefox.json b/src/content/themes/natura-for-firefox.json new file mode 100644 index 00000000..1a01eb2c --- /dev/null +++ b/src/content/themes/natura-for-firefox.json @@ -0,0 +1,29 @@ +{ + "title": "Natura for Firefox", + "slug": "natura-for-firefox", + "description": "Nature theme for Firefox \n Compatibility: V91+", + "repository": "https://github.com/firefoxcssthemers/natura-for-firefox", + "screenshots": [ + { + "src": "/assets/img/themes/natura.webp", + "alt": "Natura for Firefox screenshot" + } + ], + "tags": [ + "alfarexguy2019", + "firefoxcssthemers", + "green", + "pure", + "v91", + "yellow" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 48, + "stats": { + "stars": 4, + "updatedAt": "2021-09-01T06:34:05Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/84518514?v=4", + "accessible": true + } +} diff --git a/src/content/themes/newfox.json b/src/content/themes/newfox.json new file mode 100644 index 00000000..b04871c0 --- /dev/null +++ b/src/content/themes/newfox.json @@ -0,0 +1,29 @@ +{ + "title": "NewFox", + "slug": "newfox", + "description": "A minimal medieval animated theme for Firefox", + "repository": "https://github.com/Mr-the-beginner/NewFox", + "screenshots": [ + { + "src": "/assets/img/themes/remote-130-newfox.webp", + "alt": "NewFox screenshot" + } + ], + "tags": [ + "animated", + "auto", + "lightweight", + "medieval", + "minimal", + "mr-the-beginner" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 130, + "stats": { + "stars": 86, + "updatedAt": "2026-04-25T18:13:34Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/134204793?v=4", + "accessible": true + } +} diff --git a/src/content/themes/nicofox.json b/src/content/themes/nicofox.json new file mode 100644 index 00000000..f8b6de48 --- /dev/null +++ b/src/content/themes/nicofox.json @@ -0,0 +1,25 @@ +{ + "title": "NicoFox", + "slug": "nicofox", + "description": "A simple rounded theme", + "repository": "https://github.com/SlowNicoFish/NicoFox", + "screenshots": [ + { + "src": "/assets/img/themes/22381112138598-fe8cd400-8bd1-11eb-8eed-edcca2c689d8.webp", + "alt": "NicoFox screenshot" + } + ], + "tags": [ + "minimal", + "rounded" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 23, + "stats": { + "stars": 6, + "updatedAt": "2021-03-23T00:04:37Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/19305293?v=4", + "accessible": true + } +} diff --git a/src/content/themes/nord-firefox.json b/src/content/themes/nord-firefox.json new file mode 100644 index 00000000..60e2b161 --- /dev/null +++ b/src/content/themes/nord-firefox.json @@ -0,0 +1,26 @@ +{ + "title": "nord-firefox", + "slug": "nord-firefox", + "description": "Firefox userChrome.css theme, based on https://github.com/AnubisZ9/Global-Dark-Nordic-theme/.", + "repository": "https://github.com/daaniiieel/nord-firefox", + "screenshots": [ + { + "src": "/assets/img/themes/nord.webp", + "alt": "nord-firefox screenshot" + } + ], + "tags": [ + "colorscheme", + "daaniiieel", + "nord" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 10, + "stats": { + "stars": 29, + "updatedAt": "2020-04-18T08:08:07Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/41679054?v=4", + "accessible": true + } +} diff --git a/src/content/themes/not-holar-s-theme.json b/src/content/themes/not-holar-s-theme.json new file mode 100644 index 00000000..4cbfc288 --- /dev/null +++ b/src/content/themes/not-holar-s-theme.json @@ -0,0 +1,27 @@ +{ + "title": "not-holar's theme", + "slug": "not-holar-s-theme", + "description": "Welcome to the repo for my Firefox theme, a theme that aims to look nice and clean while not compromising functionality.\n Compatibility: V89+", + "repository": "https://github.com/not-holar/my_firefox_theme", + "screenshots": [ + { + "src": "/assets/img/themes/MyFirefoxThemenotholar.webp", + "alt": "not-holar's theme screenshot" + } + ], + "tags": [ + "dark", + "not-holar", + "stylus", + "tree style" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 11, + "stats": { + "stars": 88, + "updatedAt": "2022-10-17T13:05:29Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/58831297?v=4", + "accessible": true + } +} diff --git a/src/content/themes/onelineproton.json b/src/content/themes/onelineproton.json new file mode 100644 index 00000000..0fc87ae1 --- /dev/null +++ b/src/content/themes/onelineproton.json @@ -0,0 +1,30 @@ +{ + "title": "OnelineProton", + "slug": "onelineproton", + "description": "An oneline userChrome.css theme for Firefox, which aims to keep the Proton experience \n Compatibility: V89+", + "repository": "https://github.com/lr-tech/OnelineProton", + "screenshots": [ + { + "src": "/assets/img/themes/onelineproton.webp", + "alt": "OnelineProton screenshot" + } + ], + "tags": [ + "dark", + "light", + "lr-tech", + "minimal", + "one-line", + "proton", + "v89" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 44, + "stats": { + "stars": 136, + "updatedAt": "2024-06-27T04:03:42Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/75286649?v=4", + "accessible": true + } +} diff --git a/src/content/themes/oneliner-deluxe.json b/src/content/themes/oneliner-deluxe.json new file mode 100644 index 00000000..c5374fcc --- /dev/null +++ b/src/content/themes/oneliner-deluxe.json @@ -0,0 +1,31 @@ +{ + "title": "Oneliner Deluxe", + "slug": "oneliner-deluxe", + "description": "Minimal, customizable and theme compatible \n Compatibility: V91+", + "repository": "https://github.com/Doosty/Oneliner-Deluxe", + "screenshots": [ + { + "src": "/assets/img/themes/Oneliner_Deluxe.webp", + "alt": "Oneliner Deluxe screenshot" + } + ], + "tags": [ + "doosty", + "one-line", + "v91" + ], + "submitterRole": "legacy", + "status": "archived", + "catalogIndex": 54, + "stats": { + "stars": 18, + "updatedAt": "2022-01-18T22:09:39Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/747588?v=4", + "accessible": true + }, + "retirement": { + "reason": "repository-archived", + "checkedAt": "2026-04-25T20:04:49.167Z", + "details": "Repository is archived by its owner." + } +} diff --git a/src/content/themes/parfait.json b/src/content/themes/parfait.json new file mode 100644 index 00000000..1b8b318a --- /dev/null +++ b/src/content/themes/parfait.json @@ -0,0 +1,29 @@ +{ + "title": "Parfait", + "slug": "parfait", + "description": "A tasty theme modification for Firefox 🦊", + "repository": "https://github.com/reizumii/parfait", + "screenshots": [ + { + "src": "/assets/img/themes/parfait.webp", + "alt": "Parfait screenshot" + } + ], + "tags": [ + "compact", + "lightweight", + "minimal", + "reizumii", + "sidebar", + "vertical tabs" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 129, + "stats": { + "stars": 144, + "updatedAt": "2026-04-22T12:51:51Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/204603744?v=4", + "accessible": true + } +} diff --git a/src/content/themes/potatofox.json b/src/content/themes/potatofox.json new file mode 100644 index 00000000..59fd05be --- /dev/null +++ b/src/content/themes/potatofox.json @@ -0,0 +1,33 @@ +{ + "title": "PotatoFox", + "slug": "potatofox", + "description": "A compact and minimal firefox theme using Sidebery", + "repository": "https://codeberg.org/awwpotato/PotatoFox", + "screenshots": [ + { + "src": "/assets/img/themes/PotatoFox.webp", + "alt": "PotatoFox screenshot" + } + ], + "tags": [ + "arc", + "compact", + "minimal", + "sidebery", + "vertical tabs" + ], + "submitterRole": "legacy", + "status": "archived", + "catalogIndex": 105, + "stats": { + "stars": 41, + "updatedAt": "2025-12-09T18:34:10+01:00", + "ownerAvatar": "https://codeberg.org/avatars/bd252d906010a016f1fd29e68e873ea983c8491eb70820d838ef2fa255d8a703", + "accessible": true + }, + "retirement": { + "reason": "repository-archived", + "checkedAt": "2026-04-25T20:04:49.167Z", + "details": "Repository is archived by its owner." + } +} diff --git a/src/content/themes/pretofox.json b/src/content/themes/pretofox.json new file mode 100644 index 00000000..a025bf24 --- /dev/null +++ b/src/content/themes/pretofox.json @@ -0,0 +1,29 @@ +{ + "title": "PretoFox", + "slug": "pretofox", + "description": "A Black n White AMOLED theme for Firefox, inspired by the Preto color scheme. \n Compatibility: V91+", + "repository": "https://github.com/alfarexguy2019/pretofox", + "screenshots": [ + { + "src": "/assets/img/themes/PretoFox.webp", + "alt": "PretoFox screenshot" + } + ], + "tags": [ + "alfarexguy2019", + "black", + "dark", + "light", + "v91", + "white" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 52, + "stats": { + "stars": 12, + "updatedAt": "2025-12-05T10:28:59Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/78948152?v=4", + "accessible": true + } +} diff --git a/src/content/themes/pro-fox-enhanced-firefox-proton.json b/src/content/themes/pro-fox-enhanced-firefox-proton.json new file mode 100644 index 00000000..31b7a428 --- /dev/null +++ b/src/content/themes/pro-fox-enhanced-firefox-proton.json @@ -0,0 +1,30 @@ +{ + "title": "pro-fox: enhanced firefox proton", + "slug": "pro-fox-enhanced-firefox-proton", + "description": "a proton based theme to make it even better \n Compatibility: V89+", + "repository": "https://github.com/xmansyx/Pro-Fox", + "screenshots": [ + { + "src": "/assets/img/themes/pro-fox.webp", + "alt": "pro-fox: enhanced firefox proton screenshot" + } + ], + "tags": [ + "bigger", + "centered", + "dark", + "light", + "rounded", + "v89", + "xmansyx" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 41, + "stats": { + "stars": 27, + "updatedAt": "2021-06-16T17:19:03Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/23141127?v=4", + "accessible": true + } +} diff --git a/src/content/themes/proton-square.json b/src/content/themes/proton-square.json new file mode 100644 index 00000000..c73f9ee3 --- /dev/null +++ b/src/content/themes/proton-square.json @@ -0,0 +1,28 @@ +{ + "title": "Proton Square", + "slug": "proton-square", + "description": "Recreates the feel of Quantum with its squared tabs and menus. No rounded corners to be seen.\n Compatibility: V91+", + "repository": "https://github.com/leadweedy/Firefox-Proton-Square", + "screenshots": [ + { + "src": "/assets/img/themes/24535ff_protonbutquantum.webp", + "alt": "Proton Square screenshot" + } + ], + "tags": [ + "leadweedy", + "pure", + "quantum", + "squared", + "v91" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 47, + "stats": { + "stars": 135, + "updatedAt": "2025-03-12T09:23:50Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/72583854?v=4", + "accessible": true + } +} diff --git a/src/content/themes/protovibrant.json b/src/content/themes/protovibrant.json new file mode 100644 index 00000000..f902e7cd --- /dev/null +++ b/src/content/themes/protovibrant.json @@ -0,0 +1,29 @@ +{ + "title": "ProtoVibrant", + "slug": "protovibrant", + "description": "Add macOS vibrancy to the Proton titlebar. Supports dark and light mode. \n Compatibility: V89+", + "repository": "https://github.com/bpwned/protovibrant", + "screenshots": [ + { + "src": "/assets/img/themes/protovibrant.webp", + "alt": "ProtoVibrant screenshot" + } + ], + "tags": [ + "bpwned", + "macos", + "pure", + "transparency", + "v89", + "vibrancy" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 43, + "stats": { + "stars": 23, + "updatedAt": "2021-11-21T18:25:54Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/446744?v=4", + "accessible": true + } +} diff --git a/src/content/themes/pseudo-fullscreen-firefox.json b/src/content/themes/pseudo-fullscreen-firefox.json new file mode 100644 index 00000000..f28bba87 --- /dev/null +++ b/src/content/themes/pseudo-fullscreen-firefox.json @@ -0,0 +1,25 @@ +{ + "title": "Pseudo-fullscreen Firefox", + "slug": "pseudo-fullscreen-firefox", + "description": "Hides and improves interface Firefox and YouTube, giving maximum space for content and aiding concentration", + "repository": "https://github.com/ongots/pseudo-fullscreen-firefox", + "screenshots": [ + { + "src": "/assets/img/themes/always-fullscreen-firefox.webp", + "alt": "Pseudo-fullscreen Firefox screenshot" + } + ], + "tags": [ + "sidebar", + "toolkit" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 27, + "stats": { + "stars": 69, + "updatedAt": "2026-02-28T16:48:31Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/43604031?v=4", + "accessible": true + } +} diff --git a/src/content/themes/quietfox-reborn.json b/src/content/themes/quietfox-reborn.json new file mode 100644 index 00000000..d11a0d45 --- /dev/null +++ b/src/content/themes/quietfox-reborn.json @@ -0,0 +1,27 @@ +{ + "title": "Quietfox Reborn", + "slug": "quietfox-reborn", + "description": "Resurrecting a very Clean Firefox userChrome Mod", + "repository": "https://github.com/TheGITofTeo997/quietfoxReborn", + "screenshots": [ + { + "src": "/assets/img/themes/20053home.webp", + "alt": "Quietfox Reborn screenshot" + } + ], + "tags": [ + "minimal", + "quiet", + "sleek", + "teo" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 109, + "stats": { + "stars": 90, + "updatedAt": "2026-04-22T11:20:10Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/26879664?v=4", + "accessible": true + } +} diff --git a/src/content/themes/quietfox.json b/src/content/themes/quietfox.json new file mode 100644 index 00000000..1e87869d --- /dev/null +++ b/src/content/themes/quietfox.json @@ -0,0 +1,31 @@ +{ + "title": "quietfox", + "slug": "quietfox", + "description": "This userChrome mod was created to make the Firefox UI cleaner and more modern without sacrificing any of its original features. You can still use themes, and you can still use Compact Mode and Touch Mode. You can pretty much forget that you have a mod installed, it works quietly in the background.", + "repository": "https://github.com/coekuss/quietfox", + "screenshots": [ + { + "src": "/assets/img/themes/quietfox.webp", + "alt": "quietfox screenshot" + } + ], + "tags": [ + "coekuss", + "simple", + "toolkit" + ], + "submitterRole": "legacy", + "status": "archived", + "catalogIndex": 13, + "stats": { + "stars": 172, + "updatedAt": "2021-07-05T22:51:14Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/45906331?v=4", + "accessible": true + }, + "retirement": { + "reason": "repository-archived", + "checkedAt": "2026-04-25T20:04:49.167Z", + "details": "Repository is archived by its owner." + } +} diff --git a/src/content/themes/realfire.json b/src/content/themes/realfire.json new file mode 100644 index 00000000..6a32bb57 --- /dev/null +++ b/src/content/themes/realfire.json @@ -0,0 +1,37 @@ +{ + "title": "RealFire", + "slug": "realfire", + "description": "A minimalist animated oneliner theme for Firefox perfectly matching Real Dark", + "repository": "https://github.com/Hakanbaban53/RealFire", + "screenshots": [ + { + "src": "/assets/img/themes/RealFire-main.webp", + "alt": "RealFire screenshot" + } + ], + "tags": [ + "animation", + "black", + "compact", + "dark", + "light", + "minimalistic", + "oneline", + "responsive", + "rounded" + ], + "submitterRole": "legacy", + "status": "archived", + "catalogIndex": 84, + "stats": { + "stars": 32, + "updatedAt": "2025-03-06T06:27:34Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/93117749?v=4", + "accessible": true + }, + "retirement": { + "reason": "repository-archived", + "checkedAt": "2026-04-25T20:04:49.167Z", + "details": "Repository is archived by its owner." + } +} diff --git a/src/content/themes/rounded-fox.json b/src/content/themes/rounded-fox.json new file mode 100644 index 00000000..65665908 --- /dev/null +++ b/src/content/themes/rounded-fox.json @@ -0,0 +1,29 @@ +{ + "title": "rounded-fox", + "slug": "rounded-fox", + "description": "A minimalist theme that uses animation to hide visual clutter.", + "repository": "https://github.com/Etesam913/rounded-fox", + "screenshots": [ + { + "src": "/assets/img/themes/rounded_fox.webp", + "alt": "rounded-fox screenshot" + } + ], + "tags": [ + "animation", + "clean", + "compact", + "dark", + "light", + "minimalist" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 75, + "stats": { + "stars": 95, + "updatedAt": "2023-09-02T19:29:12Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/55665282?v=4", + "accessible": true + } +} diff --git a/src/content/themes/sakuras-simple-sidebar.json b/src/content/themes/sakuras-simple-sidebar.json new file mode 100644 index 00000000..f482dfb9 --- /dev/null +++ b/src/content/themes/sakuras-simple-sidebar.json @@ -0,0 +1,31 @@ +{ + "title": "Sakuras Simple Sidebar", + "slug": "sakuras-simple-sidebar", + "description": "A simple Firefox theme using Sidebery sidebar.", + "repository": "https://github.com/SakuraMeadows/Sakuras-Simple-Sidebar", + "screenshots": [ + { + "src": "/assets/img/themes/remote-124-sakuras-simple-sidebar.gif", + "alt": "Sakuras Simple Sidebar screenshot" + } + ], + "tags": [ + "catppuccin", + "dark", + "light", + "sakurameadows", + "sidebar", + "sidebery", + "simple", + "vertical" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 124, + "stats": { + "stars": 23, + "updatedAt": "2025-12-28T03:03:45Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/93335748?v=4", + "accessible": true + } +} diff --git a/src/content/themes/seal-mint.json b/src/content/themes/seal-mint.json new file mode 100644 index 00000000..fafa21af --- /dev/null +++ b/src/content/themes/seal-mint.json @@ -0,0 +1,28 @@ +{ + "title": "Seal mint", + "slug": "seal-mint", + "description": "Minimal mint&blue theme for Firefox", + "repository": "https://github.com/Kess-UwU/Seal-Mint", + "screenshots": [ + { + "src": "/assets/img/themes/seal-mint-1.png", + "alt": "Seal mint screenshot 1" + } + ], + "tags": [ + "blue", + "kess-uwu", + "minimal", + "mint" + ], + "submitterRole": "author", + "status": "published", + "catalogIndex": 135, + "submittedBy": "Neikon", + "stats": { + "stars": 0, + "updatedAt": "2026-04-09T11:08:17Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/273342409?v=4", + "accessible": true + } +} diff --git a/src/content/themes/shina-fox.json b/src/content/themes/shina-fox.json new file mode 100644 index 00000000..d056447b --- /dev/null +++ b/src/content/themes/shina-fox.json @@ -0,0 +1,30 @@ +{ + "title": "Shina Fox", + "slug": "shina-fox", + "description": "A Minimal, Cozy, Vertical Optimized Firefox Theme", + "repository": "https://github.com/Shina-SG/Shina-Fox", + "screenshots": [ + { + "src": "/assets/img/themes/Shina.webp", + "alt": "Shina Fox screenshot" + } + ], + "tags": [ + "adaptive", + "dark", + "light", + "minimal", + "shina", + "sidebery", + "vertical" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 90, + "stats": { + "stars": 480, + "updatedAt": "2024-05-24T23:41:47Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/135497382?v=4", + "accessible": true + } +} diff --git a/src/content/themes/shyfox.json b/src/content/themes/shyfox.json new file mode 100644 index 00000000..464ea246 --- /dev/null +++ b/src/content/themes/shyfox.json @@ -0,0 +1,25 @@ +{ + "title": "ShyFox", + "slug": "shyfox", + "description": "A very shy little theme that hides the entire browser interface in the window border", + "repository": "https://github.com/Naezr/ShyFox", + "screenshots": [ + { + "src": "/assets/img/themes/shyfox.webp", + "alt": "ShyFox screenshot" + } + ], + "tags": [ + "minimal", + "naezr" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 92, + "stats": { + "stars": 2125, + "updatedAt": "2025-01-21T07:39:15Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/95460152?v=4", + "accessible": true + } +} diff --git a/src/content/themes/sidefox.json b/src/content/themes/sidefox.json new file mode 100644 index 00000000..3d82d1f2 --- /dev/null +++ b/src/content/themes/sidefox.json @@ -0,0 +1,35 @@ +{ + "title": "SideFox", + "slug": "sidefox", + "description": "MS Edge style, sidebar, blur, and more.", + "repository": "https://github.com/rainbowflesh/Me-Personal-Firefox-Settup", + "screenshots": [ + { + "src": "/assets/img/themes/sidefox.webp", + "alt": "SideFox screenshot" + } + ], + "tags": [ + "animated", + "linux", + "macos", + "responsive", + "sidebar", + "simple", + "windows" + ], + "submitterRole": "legacy", + "status": "archived", + "catalogIndex": 88, + "stats": { + "stars": 23, + "updatedAt": "2025-04-04T15:38:29Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/20819692?v=4", + "accessible": true + }, + "retirement": { + "reason": "repository-archived", + "checkedAt": "2026-04-25T20:04:49.167Z", + "details": "Repository is archived by its owner." + } +} diff --git a/src/content/themes/simple-oneliner.json b/src/content/themes/simple-oneliner.json new file mode 100644 index 00000000..fa95a39d --- /dev/null +++ b/src/content/themes/simple-oneliner.json @@ -0,0 +1,30 @@ +{ + "title": "Simple Oneliner", + "slug": "simple-oneliner", + "description": "A simple theme to maximize the vertical space of your monitor \n Compatibility: V91+", + "repository": "https://github.com/hakan-demirli/Firefox_Custom_CSS", + "screenshots": [ + { + "src": "/assets/img/themes/Simple_Oneliner.webp", + "alt": "Simple Oneliner screenshot" + } + ], + "tags": [ + "dark", + "hakan-demirli", + "light", + "one-line", + "pdf", + "sidebery", + "v91" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 55, + "stats": { + "stars": 87, + "updatedAt": "2024-02-12T15:16:03Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/78746991?v=4", + "accessible": true + } +} diff --git a/src/content/themes/simplefox-feather-edition.json b/src/content/themes/simplefox-feather-edition.json new file mode 100644 index 00000000..32d582ed --- /dev/null +++ b/src/content/themes/simplefox-feather-edition.json @@ -0,0 +1,27 @@ +{ + "title": "SimpleFox Feather Edition", + "slug": "simplefox-feather-edition", + "description": "A fork of SimpleFox that uses feather icons!", + "repository": "https://github.com/BlueFalconHD/SimpleFox-Feather/", + "screenshots": [ + { + "src": "/assets/img/themes/simplefox-feather.webp", + "alt": "SimpleFox Feather Edition screenshot" + } + ], + "tags": [ + "bluefalconhd", + "fork", + "icons", + "simplefox" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 67, + "stats": { + "stars": 78, + "updatedAt": "2022-10-31T04:33:20Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/72631767?v=4", + "accessible": true + } +} diff --git a/src/content/themes/simplefox.json b/src/content/themes/simplefox.json new file mode 100644 index 00000000..ae1d11cf --- /dev/null +++ b/src/content/themes/simplefox.json @@ -0,0 +1,29 @@ +{ + "title": "SimpleFox", + "slug": "simplefox", + "description": "🦊 A Userstyle theme for Firefox minimalist and Keyboard centered.", + "repository": "https://github.com/migueravila/Simplefox", + "screenshots": [ + { + "src": "/assets/img/themes/simplefox.webp", + "alt": "SimpleFox screenshot" + } + ], + "tags": [ + "compact", + "dark", + "keyboard", + "linux", + "migueravila", + "minimal" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 7, + "stats": { + "stars": 1878, + "updatedAt": "2022-04-24T18:56:19Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/35583825?v=4", + "accessible": true + } +} diff --git a/src/content/themes/simplify-darkish-for-firefox.json b/src/content/themes/simplify-darkish-for-firefox.json new file mode 100644 index 00000000..a78bd7a8 --- /dev/null +++ b/src/content/themes/simplify-darkish-for-firefox.json @@ -0,0 +1,27 @@ +{ + "title": "Simplify Darkish for Firefox", + "slug": "simplify-darkish-for-firefox", + "description": "A minimal Firefox Theme for those who would like to properly enjoy my Simplify 10 Darkish - Windows 10 Themes\n Compatibility: V89+", + "repository": "https://github.com/CristianDragos/FirefoxThemes", + "homepage": "https://github.com/CristianDragos/FirefoxThemes/tree/master/Simplify%20Darkish", + "screenshots": [ + { + "src": "/assets/img/themes/simplify_darkish_for_firefox_preview.webp", + "alt": "Simplify Darkish for Firefox screenshot" + } + ], + "tags": [ + "cristiandragos", + "dark", + "windows 10" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 6, + "stats": { + "stars": 141, + "updatedAt": "2021-10-07T12:23:11Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/3705687?v=4", + "accessible": true + } +} diff --git a/src/content/themes/simplify-silver-peach-for-firefox.json b/src/content/themes/simplify-silver-peach-for-firefox.json new file mode 100644 index 00000000..2129260e --- /dev/null +++ b/src/content/themes/simplify-silver-peach-for-firefox.json @@ -0,0 +1,28 @@ +{ + "title": "Simplify Silver Peach for Firefox", + "slug": "simplify-silver-peach-for-firefox", + "description": "A minimal Firefox Theme for those who would like to properly enjoy my Simplify 10 Silver Peach - Windows 10 Themes\n Compatibility: V89+", + "repository": "https://github.com/CristianDragos/FirefoxThemes", + "homepage": "https://github.com/CristianDragos/FirefoxThemes/tree/master/Simplify%20Silver%20Peach", + "screenshots": [ + { + "src": "/assets/img/themes/simplify_silver_peach_for_firefox_preview.webp", + "alt": "Simplify Silver Peach for Firefox screenshot" + } + ], + "tags": [ + "cristiandragos", + "light", + "pastel", + "rounded" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 5, + "stats": { + "stars": 141, + "updatedAt": "2021-10-07T12:23:11Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/3705687?v=4", + "accessible": true + } +} diff --git a/src/content/themes/snowfox.json b/src/content/themes/snowfox.json new file mode 100644 index 00000000..11cf54ca --- /dev/null +++ b/src/content/themes/snowfox.json @@ -0,0 +1,27 @@ +{ + "title": "SnowFox", + "slug": "snowfox", + "description": "Modern blue glass theme with side bookmark bar", + "repository": "https://github.com/naveensagar765/SnowFox", + "screenshots": [ + { + "src": "/assets/img/themes/snowfox.webp", + "alt": "SnowFox screenshot" + } + ], + "tags": [ + "blue", + "home page", + "moder", + "side-bookmark-bar" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 107, + "stats": { + "stars": 12, + "updatedAt": "2025-02-09T13:37:31Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/155926112?v=4", + "accessible": true + } +} diff --git a/src/content/themes/starry-fox.json b/src/content/themes/starry-fox.json new file mode 100644 index 00000000..d80869db --- /dev/null +++ b/src/content/themes/starry-fox.json @@ -0,0 +1,31 @@ +{ + "title": "starry-fox", + "slug": "starry-fox", + "description": "Firefox CSS stylesheets for the Dark Space Theme. Matching more UI elements with the theme.", + "repository": "https://github.com/sagars007/starry-fox", + "screenshots": [ + { + "src": "/assets/img/themes/starry-fox-resize.webp", + "alt": "starry-fox screenshot" + } + ], + "tags": [ + "compact", + "dark", + "darkspace", + "gradient", + "nightsky", + "sagars007", + "stars", + "windows11" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 63, + "stats": { + "stars": 159, + "updatedAt": "2024-05-18T15:17:34Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/56472130?v=4", + "accessible": true + } +} diff --git a/src/content/themes/sweet-pop.json b/src/content/themes/sweet-pop.json new file mode 100644 index 00000000..11eb6277 --- /dev/null +++ b/src/content/themes/sweet-pop.json @@ -0,0 +1,30 @@ +{ + "title": "Sweet_Pop!", + "slug": "sweet-pop", + "description": "Sweet_Pop! Minimalist oneliner theme for Firefox perfectly matching Sweet Dark.", + "repository": "https://github.com/PROxZIMA/Sweet-Pop", + "screenshots": [ + { + "src": "/assets/img/themes/sweetpop.webp", + "alt": "Sweet_Pop! screenshot" + } + ], + "tags": [ + "auto-hide", + "blue", + "dark", + "floating bar", + "light", + "modern", + "proxzima" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 2, + "stats": { + "stars": 264, + "updatedAt": "2023-03-25T10:54:34Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/43103163?v=4", + "accessible": true + } +} diff --git a/src/content/themes/technetium.json b/src/content/themes/technetium.json new file mode 100644 index 00000000..675854c3 --- /dev/null +++ b/src/content/themes/technetium.json @@ -0,0 +1,35 @@ +{ + "title": "Technetium", + "slug": "technetium", + "description": "A focused approach to taming the new Firefox Proton interface, restituting some of the beloved elements retired alongside the old Photon UI - menu icons and much more \n Compatibility: V89+", + "repository": "https://github.com/edo0/Technetium", + "screenshots": [ + { + "src": "/assets/img/themes/Technetium.webp", + "alt": "Technetium screenshot" + } + ], + "tags": [ + "compact", + "dark", + "edo0", + "light", + "rounded", + "squared", + "v89" + ], + "submitterRole": "legacy", + "status": "archived", + "catalogIndex": 39, + "stats": { + "stars": 89, + "updatedAt": "2022-02-13T15:22:08Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/16632292?v=4", + "accessible": true + }, + "retirement": { + "reason": "repository-archived", + "checkedAt": "2026-04-25T20:04:49.167Z", + "details": "Repository is archived by its owner." + } +} diff --git a/src/content/themes/three-rows-simple-compact-clean-css.json b/src/content/themes/three-rows-simple-compact-clean-css.json new file mode 100644 index 00000000..abf9ca9f --- /dev/null +++ b/src/content/themes/three-rows-simple-compact-clean-css.json @@ -0,0 +1,27 @@ +{ + "title": "Three Rows Simple Compact Clean CSS", + "slug": "three-rows-simple-compact-clean-css", + "description": "A compact theme based on use multiple rows", + "repository": "https://github.com/hornster02/Firefox-Three-Rows-Simple-Compact-Clean-CSS", + "screenshots": [ + { + "src": "/assets/img/themes/Three_Rows.webp", + "alt": "Three Rows Simple Compact Clean CSS screenshot" + } + ], + "tags": [ + "compact", + "minimalist", + "rows", + "simple" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 76, + "stats": { + "stars": 24, + "updatedAt": "2026-02-01T16:39:27Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/127822397?v=4", + "accessible": true + } +} diff --git a/src/content/themes/tilefox.json b/src/content/themes/tilefox.json new file mode 100644 index 00000000..23c58a32 --- /dev/null +++ b/src/content/themes/tilefox.json @@ -0,0 +1,38 @@ +{ + "title": "TileFox", + "slug": "tilefox", + "description": "A minimalistic Firefox userChrome.css that integrates well with tiling window managers like i3", + "repository": "https://github.com/davquar/tilefox", + "screenshots": [ + { + "src": "/assets/img/themes/tilefox.webp", + "alt": "TileFox screenshot" + } + ], + "tags": [ + "brutalist", + "compact", + "dark", + "davquar", + "dwm", + "i3", + "keyboard", + "light", + "linux", + "minimal", + "minimalistic", + "sway", + "tile", + "tilefox", + "tiling" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 71, + "stats": { + "stars": 24, + "updatedAt": "2022-10-21T20:00:50Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/30431538?v=4", + "accessible": true + } +} diff --git a/src/content/themes/titlebar-button-fix.json b/src/content/themes/titlebar-button-fix.json new file mode 100644 index 00000000..b461b052 --- /dev/null +++ b/src/content/themes/titlebar-button-fix.json @@ -0,0 +1,26 @@ +{ + "title": "Titlebar-Button-Fix", + "slug": "titlebar-button-fix", + "description": "This theme fixes titlebar min max close buttons for Firefox in linux.", + "repository": "https://github.com/birbkeks/Firefox-Titlebar-Button-Fix", + "screenshots": [ + { + "src": "/assets/img/themes/titlebarfix.webp", + "alt": "Titlebar-Button-Fix screenshot" + } + ], + "tags": [ + "birbkeks", + "fix", + "titlebar" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 1, + "stats": { + "stars": 6, + "updatedAt": "2024-05-12T18:57:05Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/67545942?v=4", + "accessible": true + } +} diff --git a/src/content/themes/transparentfox.json b/src/content/themes/transparentfox.json new file mode 100644 index 00000000..f882af93 --- /dev/null +++ b/src/content/themes/transparentfox.json @@ -0,0 +1,28 @@ +{ + "title": "TransparentFox", + "slug": "transparentfox", + "description": "Simple transparent title bar theme for Firefox and Thunderbird", + "repository": "https://github.com/ScanuNicco/TransperentFox", + "screenshots": [ + { + "src": "/assets/img/themes/remote-131-transparentfox.webp", + "alt": "TransparentFox screenshot" + } + ], + "tags": [ + "dark", + "firefox", + "scanurag", + "thunderbird", + "transparent" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 131, + "stats": { + "stars": 4, + "updatedAt": "2026-01-22T04:35:52Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/30136040?v=4", + "accessible": true + } +} diff --git a/src/content/themes/tyh-fox.json b/src/content/themes/tyh-fox.json new file mode 100644 index 00000000..ff99b7c3 --- /dev/null +++ b/src/content/themes/tyh-fox.json @@ -0,0 +1,27 @@ +{ + "title": "TYH Fox", + "slug": "tyh-fox", + "description": "A firefox Theme CSS", + "repository": "https://github.com/tyuhao/TYHfox", + "screenshots": [ + { + "src": "/assets/img/themes/TYHFox.webp", + "alt": "TYH Fox screenshot" + } + ], + "tags": [ + "adaptive", + "dark", + "light", + "tyhfox" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 66, + "stats": { + "stars": 13, + "updatedAt": "2025-09-21T07:44:01Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/47909858?v=4", + "accessible": true + } +} diff --git a/src/content/themes/vicefox.json b/src/content/themes/vicefox.json new file mode 100644 index 00000000..895ee3dc --- /dev/null +++ b/src/content/themes/vicefox.json @@ -0,0 +1,34 @@ +{ + "title": "ViceFox", + "slug": "vicefox", + "description": "Don't ask why it's called 'ViceFox'", + "repository": "https://github.com/jtlw99/vicefox", + "homepage": "https://vicefox.vercel.app", + "screenshots": [ + { + "src": "/assets/img/themes/ViceFox.webp", + "alt": "ViceFox screenshot" + } + ], + "tags": [ + "clean", + "compact", + "macos", + "minimal", + "safari" + ], + "submitterRole": "legacy", + "status": "archived", + "catalogIndex": 78, + "stats": { + "stars": 47, + "updatedAt": "2026-03-15T08:16:51Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/93564256?v=4", + "accessible": true + }, + "retirement": { + "reason": "repository-archived", + "checkedAt": "2026-04-25T20:04:49.167Z", + "details": "Repository is archived by its owner." + } +} diff --git a/src/content/themes/vp-nightsky.json b/src/content/themes/vp-nightsky.json new file mode 100644 index 00000000..be0becd3 --- /dev/null +++ b/src/content/themes/vp-nightsky.json @@ -0,0 +1,26 @@ +{ + "title": "VP-NightSky", + "slug": "vp-nightsky", + "description": "Firefox reimagined", + "repository": "https://github.com/VertexProximity/VP_NightSky", + "screenshots": [ + { + "src": "/assets/img/themes/NightSky.webp", + "alt": "VP-NightSky screenshot" + } + ], + "tags": [ + "dark", + "purple", + "vertexproximity" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 119, + "stats": { + "stars": 2, + "updatedAt": "2025-10-22T05:03:17Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/121351756?v=4", + "accessible": true + } +} diff --git a/src/content/themes/waterfall.json b/src/content/themes/waterfall.json new file mode 100644 index 00000000..01126ebe --- /dev/null +++ b/src/content/themes/waterfall.json @@ -0,0 +1,27 @@ +{ + "title": "Waterfall", + "slug": "waterfall", + "description": "A minimalist one line theme", + "repository": "https://github.com/crambaud/waterfall", + "screenshots": [ + { + "src": "/assets/img/themes/waterfall.webp", + "alt": "Waterfall screenshot" + } + ], + "tags": [ + "crambaud", + "minimal", + "mouse", + "one-line" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 58, + "stats": { + "stars": 274, + "updatedAt": "2022-08-02T06:38:14Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/58910562?v=4", + "accessible": true + } +} diff --git a/src/content/themes/whitesur-safari-style-for-firefox.json b/src/content/themes/whitesur-safari-style-for-firefox.json new file mode 100644 index 00000000..778397b4 --- /dev/null +++ b/src/content/themes/whitesur-safari-style-for-firefox.json @@ -0,0 +1,26 @@ +{ + "title": "WhiteSur Safari style for Firefox", + "slug": "whitesur-safari-style-for-firefox", + "description": "Make your Firefox look like Safari. MacOS Big Sur inspired theme for Firefox on MacOS & Windows.\n Compatibility: V89+", + "repository": "https://github.com/adamxweb/WhiteSurFirefoxThemeMacOS", + "screenshots": [ + { + "src": "/assets/img/themes/whitesur.webp", + "alt": "WhiteSur Safari style for Firefox screenshot" + } + ], + "tags": [ + "apple", + "mac", + "safari" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 28, + "stats": { + "stars": 614, + "updatedAt": "2025-07-26T05:43:43Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/6800453?v=4", + "accessible": true + } +} diff --git a/src/content/themes/whitesur.json b/src/content/themes/whitesur.json new file mode 100644 index 00000000..af4729ba --- /dev/null +++ b/src/content/themes/whitesur.json @@ -0,0 +1,31 @@ +{ + "title": "WhiteSur", + "slug": "whitesur", + "description": "A MacOSX Safari theme for Firefox 80+", + "repository": "https://github.com/vinceliuice/WhiteSur-firefox-theme", + "screenshots": [ + { + "src": "/assets/img/themes/whitesur_vinceliuice.webp", + "alt": "WhiteSur screenshot" + } + ], + "tags": [ + "dark", + "light", + "mac", + "macosx", + "monterey", + "oneline", + "safari", + "vinceliuice" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 98, + "stats": { + "stars": 543, + "updatedAt": "2026-01-05T05:56:11Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/7604295?v=4", + "accessible": true + } +} diff --git a/src/content/themes/wmfox.json b/src/content/themes/wmfox.json new file mode 100644 index 00000000..20ae4492 --- /dev/null +++ b/src/content/themes/wmfox.json @@ -0,0 +1,31 @@ +{ + "title": "wmfox", + "slug": "wmfox", + "description": "Minimalist keyboard oriented theme with tab numbering for easier navigation.", + "repository": "https://github.com/cankurttekin/wmfox", + "screenshots": [ + { + "src": "/assets/img/themes/remote-132-wmfox.webp", + "alt": "wmfox screenshot" + } + ], + "tags": [ + "cankurttekin/wmfox", + "dark", + "i3", + "keyboard", + "light", + "sway", + "tab numbers", + "wm" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 132, + "stats": { + "stars": 2, + "updatedAt": "2026-04-11T15:47:45Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/29798399?v=4", + "accessible": true + } +} diff --git a/src/content/themes/zap-s-cool-photon-theme.json b/src/content/themes/zap-s-cool-photon-theme.json new file mode 100644 index 00000000..3cf9c681 --- /dev/null +++ b/src/content/themes/zap-s-cool-photon-theme.json @@ -0,0 +1,27 @@ +{ + "title": "zap's cool photon theme", + "slug": "zap-s-cool-photon-theme", + "description": "Party like it's Firefox 57-88!", + "repository": "https://github.com/zapSNH/zapsCoolPhotonTheme", + "screenshots": [ + { + "src": "/assets/img/themes/zaps-photon.webp", + "alt": "zap's cool photon theme screenshot" + } + ], + "tags": [ + "compact", + "photon", + "quantum", + "squared" + ], + "submitterRole": "legacy", + "status": "published", + "catalogIndex": 80, + "stats": { + "stars": 140, + "updatedAt": "2026-04-12T04:36:32Z", + "ownerAvatar": "https://avatars.githubusercontent.com/u/134786889?v=4", + "accessible": true + } +} diff --git a/src/layouts/BaseLayout.astro b/src/layouts/BaseLayout.astro new file mode 100644 index 00000000..56d2a690 --- /dev/null +++ b/src/layouts/BaseLayout.astro @@ -0,0 +1,43 @@ +--- +import '../styles/global.css' +import { withBasePath } from '../lib/themes' + +interface Props { + title?: string + description?: string +} + +const { + title = 'FirefoxCSS-Store', + description = 'A community hub for discovering and sharing Firefox userChrome.css themes.' +} = Astro.props +--- + + + + + + + + + {title} + + + + +
+

Community submissions point to their original repositories. Theme authors keep ownership of their work.

+
+ + diff --git a/src/lib/themes.ts b/src/lib/themes.ts new file mode 100644 index 00000000..26b61904 --- /dev/null +++ b/src/lib/themes.ts @@ -0,0 +1,64 @@ +import type { CollectionEntry } from 'astro:content' + +export type Theme = CollectionEntry<'themes'> + +export function isPublishedTheme(theme: Theme) { + return theme.data.status === 'published' +} + +export function isArchivedTheme(theme: Theme) { + return theme.data.status === 'archived' +} + +export function isVisibleTheme(theme: Theme) { + return theme.data.status === 'published' || theme.data.status === 'archived' +} + +export function byLatestCatalogEntry(a: Theme, b: Theme) { + return b.data.catalogIndex - a.data.catalogIndex +} + +export function formatDate(value: string | null) { + if (!value) return 'Unknown' + + return new Intl.DateTimeFormat('en', { + year: 'numeric', + month: 'short', + day: 'numeric' + }).format(new Date(value)) +} + +export function repositoryLabel(repository: string) { + const url = new URL(repository) + const path = url.pathname.replace(/^\/|\/$/g, '') + return `${url.hostname.replace(/^www\./, '')}/${path}` +} + +export function withBasePath(path: string) { + if (/^https?:\/\//.test(path)) return path + + const base = import.meta.env.BASE_URL + if (base === '/') return path + + return `${base.replace(/\/$/, '')}/${path.replace(/^\//, '')}` +} + +export function publicTheme(theme: Theme) { + const { data } = theme + + return { + title: data.title, + slug: data.slug, + description: data.description, + repository: data.repository, + homepage: data.homepage ?? null, + screenshots: data.screenshots.map((screenshot) => ({ + ...screenshot, + src: withBasePath(screenshot.src) + })), + tags: data.tags, + submitterRole: data.submitterRole, + status: data.status, + stats: data.stats + } +} diff --git a/src/pages/archive.astro b/src/pages/archive.astro new file mode 100644 index 00000000..3a5eb822 --- /dev/null +++ b/src/pages/archive.astro @@ -0,0 +1,69 @@ +--- +import { getCollection } from 'astro:content' +import BaseLayout from '../layouts/BaseLayout.astro' +import { byLatestCatalogEntry, formatDate, isArchivedTheme, repositoryLabel, withBasePath } from '../lib/themes' + +const themes = (await getCollection('themes')) + .filter(isArchivedTheme) + .sort(byLatestCatalogEntry) +--- + +
+
+
+

Archive

+

Unsupported themes preserved for discovery.

+
+
+ {themes.length} archived themes +
+
+ +
+

What archived means

+

These themes point to repositories that still exist but have been archived by their owners. They are kept here for reference, but they should be treated as unsupported.

+
+ + {themes.length === 0 ? ( +

No archived themes yet.

+ ) : ( +
+ {themes.map((theme) => { + const data = theme.data + const image = data.screenshots[0] + return ( +
+ + {image.alt} + +
+
+

Unsupported

+

{data.title}

+

{data.retirement?.details ?? data.description}

+
+
+ {data.tags.slice(0, 5).map((tag) => {tag})} +
+
+
+
Repository
+
{repositoryLabel(data.repository)}
+
+
+
Checked
+
{formatDate(data.retirement?.checkedAt ?? null)}
+
+
+ +
+
+ ) + })} +
+ )} +
+
diff --git a/src/pages/index.astro b/src/pages/index.astro new file mode 100644 index 00000000..9c98ded3 --- /dev/null +++ b/src/pages/index.astro @@ -0,0 +1,104 @@ +--- +import { getCollection } from 'astro:content' +import BaseLayout from '../layouts/BaseLayout.astro' +import { byLatestCatalogEntry, formatDate, isPublishedTheme, repositoryLabel, withBasePath } from '../lib/themes' + +const themes = (await getCollection('themes')) + .filter(isPublishedTheme) + .sort(byLatestCatalogEntry) + +const tags = Array.from(new Set(themes.flatMap((theme) => theme.data.tags))).sort((a, b) => a.localeCompare(b)) +const totalStars = themes.reduce((total, theme) => total + theme.data.stats.stars, 0) +--- + +
+
+
+

Community Firefox themes

+

Discover userChrome.css themes shared by the Firefox community.

+
+
+ {themes.length} themes + {tags.length} tags + {totalStars.toLocaleString('en')} stars across theme repos +
+
+ +
+ + + Submit a theme +
+ +
+ {tags.map((tag) => ( + + ))} +
+ +
+ {themes.length} themes + +
+ +
+ {themes.map((theme) => { + const data = theme.data + const image = data.screenshots[0] + return ( +
+ + {image.alt} + +
+
+

{data.title}

+

{data.description}

+
+
+ {data.tags.slice(0, 5).map((tag) => {tag})} +
+
+
+
Stars
+
{data.stats.stars.toLocaleString('en')}
+
+
+
Updated
+
{formatDate(data.stats.updatedAt)}
+
+
+ +
+
+ ) + })} +
+ + +
+ +
diff --git a/src/pages/submit.astro b/src/pages/submit.astro new file mode 100644 index 00000000..3eb523ec --- /dev/null +++ b/src/pages/submit.astro @@ -0,0 +1,32 @@ +--- +import BaseLayout from '../layouts/BaseLayout.astro' + +const themeSubmissionUrl = 'https://github.com/FirefoxCSS-Store/FirefoxCSS-Store.github.io/issues/new?template=theme-submission.yml' +--- + +
+
+

Community submissions

+

Share a Firefox theme repository with the hub.

+

Submissions start as GitHub issues. Automation turns complete reports into candidate pull requests, and entries become public only after maintainer review.

+ +
+ +
+
+

What to submit

+

Use the original repository URL, a short description, screenshots, and normalized tags. You can submit your own theme or recommend someone else's work.

+
+
+

What automation does

+

Automation creates a candidate JSON entry, stores submitted screenshots with the site assets, and opens a pull request for review. It does not publish themes directly.

+
+
+

Review status

+

Candidate themes are kept out of the public catalog until they are reviewed and switched to published.

+
+
+
+
diff --git a/src/pages/themes.json.ts b/src/pages/themes.json.ts new file mode 100644 index 00000000..434d82b9 --- /dev/null +++ b/src/pages/themes.json.ts @@ -0,0 +1,16 @@ +import { getCollection } from 'astro:content' +import { byLatestCatalogEntry, isPublishedTheme, publicTheme } from '../lib/themes' + +export async function GET() { + const themes = (await getCollection('themes')) + .filter(isPublishedTheme) + .sort(byLatestCatalogEntry) + .map(publicTheme) + + return new Response(JSON.stringify(themes, null, 2), { + headers: { + 'content-type': 'application/json; charset=utf-8', + 'cache-control': 'public, max-age=300' + } + }) +} diff --git a/src/pages/themes/[slug].astro b/src/pages/themes/[slug].astro new file mode 100644 index 00000000..067ea539 --- /dev/null +++ b/src/pages/themes/[slug].astro @@ -0,0 +1,94 @@ +--- +import { getCollection } from 'astro:content' +import BaseLayout from '../../layouts/BaseLayout.astro' +import { formatDate, isVisibleTheme, repositoryLabel, withBasePath } from '../../lib/themes' + +export async function getStaticPaths() { + const themes = (await getCollection('themes')).filter(isVisibleTheme) + + return themes.map((theme) => ({ + params: { slug: theme.data.slug }, + props: { theme } + })) +} + +const { theme } = Astro.props +const data = theme.data +const repoLabel = repositoryLabel(data.repository) +const isArchived = data.status === 'archived' +--- + +
+ + +
+
+

{isArchived ? 'Archived unsupported theme' : 'Published theme'}

+

{data.title}

+

{data.description}

+
+ Open original repository + {data.homepage && Theme homepage} +
+
+
+
+
Repository
+
{repoLabel}
+
+
+
Stars
+
{data.stats.stars.toLocaleString('en')}
+
+
+
Last update
+
{formatDate(data.stats.updatedAt)}
+
+
+
Submitted as
+
{data.submitterRole}
+
+
+
+ + {isArchived && ( +
+

This theme is preserved for discovery, but it is no longer supported.

+

{data.retirement?.details ?? 'The original repository was marked as archived by its owner.'}

+
+ )} + + + +
+
+

Tags

+
+ {data.tags.map((tag) => {tag})} +
+
+ +
+

Install overview

+
    +
  1. Open the original repository and read the maintainer's installation notes.
  2. +
  3. Enable toolkit.legacyUserProfileCustomizations.stylesheets in about:config.
  4. +
  5. Create or open the chrome folder in your Firefox profile.
  6. +
  7. Copy the theme files requested by the original repository and restart Firefox.
  8. +
+
+ +
+

Ownership note

+

FirefoxCSS-Store indexes this submission for discovery. The code, license, support, and installation details belong to the original repository.

+
+
+
+
diff --git a/src/scripts/hub.ts b/src/scripts/hub.ts new file mode 100644 index 00000000..18bdf695 --- /dev/null +++ b/src/scripts/hub.ts @@ -0,0 +1,99 @@ +const searchInput = document.querySelector('#theme-search') +const sortSelect = document.querySelector('#theme-sort') +const grid = document.querySelector('#theme-grid') +const count = document.querySelector('#theme-count') +const clearButton = document.querySelector('#clear-filters') +const emptyState = document.querySelector('#empty-state') +const tagButtons = Array.from(document.querySelectorAll('.tag-filter')) +const cards = Array.from(document.querySelectorAll('.theme-card')) +const activeTags = new Set() + +function cardText(card: HTMLElement) { + return [ + card.dataset.title, + card.dataset.description, + card.dataset.repository, + card.dataset.tags + ].join(' ') +} + +function matchesSearch(card: HTMLElement, query: string) { + if (!query) return true + return cardText(card).includes(query) +} + +function matchesTags(card: HTMLElement) { + if (activeTags.size === 0) return true + const cardTags = new Set((card.dataset.tags ?? '').split(' ').filter(Boolean)) + return Array.from(activeTags).every((tag) => cardTags.has(tag)) +} + +function sortCards(visibleCards: HTMLElement[]) { + const sort = sortSelect?.value ?? 'latest' + + return visibleCards.sort((a, b) => { + if (sort === 'name') { + return (a.dataset.title ?? '').localeCompare(b.dataset.title ?? '') + } + + if (sort === 'popular') { + return Number(b.dataset.stars ?? 0) - Number(a.dataset.stars ?? 0) + } + + if (sort === 'updated') { + return (b.dataset.updated ?? '').localeCompare(a.dataset.updated ?? '') + } + + return Number(b.dataset.index ?? 0) - Number(a.dataset.index ?? 0) + }) +} + +function render() { + if (!grid || !count || !emptyState) return + + const query = searchInput?.value.trim().toLowerCase() ?? '' + const visibleCards = sortCards(cards.filter((card) => matchesSearch(card, query) && matchesTags(card))) + const visibleSet = new Set(visibleCards) + + for (const card of cards) { + card.hidden = !visibleSet.has(card) + } + + for (const card of visibleCards) { + grid.append(card) + } + + count.textContent = `${visibleCards.length} ${visibleCards.length === 1 ? 'theme' : 'themes'}` + emptyState.hidden = visibleCards.length > 0 +} + +for (const button of tagButtons) { + button.addEventListener('click', () => { + const tag = button.dataset.tag + if (!tag) return + + if (activeTags.has(tag)) { + activeTags.delete(tag) + button.setAttribute('aria-pressed', 'false') + } else { + activeTags.add(tag) + button.setAttribute('aria-pressed', 'true') + } + + render() + }) +} + +searchInput?.addEventListener('input', render) +sortSelect?.addEventListener('change', render) +clearButton?.addEventListener('click', () => { + activeTags.clear() + if (searchInput) searchInput.value = '' + if (sortSelect) sortSelect.value = 'latest' + for (const button of tagButtons) { + button.setAttribute('aria-pressed', 'false') + } + render() +}) + +render() diff --git a/src/styles/global.css b/src/styles/global.css new file mode 100644 index 00000000..35527f42 --- /dev/null +++ b/src/styles/global.css @@ -0,0 +1,574 @@ +:root { + color-scheme: light dark; + --bg: #f5f7f8; + --surface: #ffffff; + --surface-strong: #101419; + --ink: #12161c; + --muted: #5d6673; + --line: #d7dde3; + --accent: #006c67; + --accent-strong: #004f4b; + --accent-warm: #b83f2f; + --archive: #8a4f00; + --archive-bg: #fff0d8; + --focus: #2f6fed; + --shadow: 0 12px 34px rgba(16, 20, 25, 0.09); + --code-bg: #e9eef2; + --code-ink: #1b3348; + --radius: 8px; + font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; +} + +@media (prefers-color-scheme: dark) { + :root { + --bg: #111417; + --surface: #1a1f24; + --surface-strong: #090b0d; + --ink: #eef3f6; + --muted: #a6b1ba; + --line: #313941; + --accent: #4fc2b5; + --accent-strong: #8be0d7; + --accent-warm: #ff927f; + --archive: #ffbf6e; + --archive-bg: #332719; + --focus: #7aa8ff; + --shadow: 0 16px 36px rgba(0, 0, 0, 0.32); + --code-bg: #26313a; + --code-ink: #e4f3ff; + } +} + +* { + box-sizing: border-box; +} + +body { + margin: 0; + background: var(--bg); + color: var(--ink); +} + +a { + color: inherit; +} + +img { + max-width: 100%; +} + +:focus-visible { + outline: 3px solid var(--focus); + outline-offset: 3px; +} + +.site-header, +.site-footer, +main { + width: min(1440px, calc(100% - 32px)); + margin-inline: auto; +} + +.site-header { + min-height: 72px; + display: flex; + align-items: center; + justify-content: space-between; + gap: 24px; +} + +.brand { + display: inline-flex; + align-items: center; + gap: 10px; + font-weight: 800; + text-decoration: none; +} + +.brand img { + border-radius: 6px; +} + +.site-nav { + display: flex; + align-items: center; + gap: 8px; +} + +.site-nav a, +.submit-link, +.theme-actions a, +.detail-actions a, +.catalog-summary button { + min-height: 40px; + display: inline-flex; + align-items: center; + justify-content: center; + padding: 0 14px; + border: 1px solid var(--line); + border-radius: var(--radius); + background: var(--surface); + color: var(--ink); + font-weight: 700; + text-decoration: none; +} + +.site-nav a:hover, +.submit-link:hover, +.theme-actions a:hover, +.detail-actions a:hover, +.catalog-summary button:hover { + border-color: var(--accent); + color: var(--accent-strong); +} + +.hub-intro, +.detail-hero, +.submit-hero { + display: grid; + grid-template-columns: minmax(0, 1fr) auto; + gap: 32px; + align-items: end; + padding: 56px 0 28px; + border-top: 1px solid var(--line); +} + +.eyebrow { + margin: 0 0 10px; + color: var(--accent); + font-size: 0.78rem; + font-weight: 800; + letter-spacing: 0; + text-transform: uppercase; +} + +.archived-label { + color: var(--archive); +} + +h1, +h2, +h3, +p { + margin-top: 0; +} + +h1 { + max-width: 980px; + margin-bottom: 0; + font-size: clamp(2.2rem, 7vw, 5.4rem); + line-height: 0.96; + letter-spacing: 0; +} + +.detail-hero h1, +.submit-hero h1 { + margin-bottom: 16px; +} + +.detail-hero p, +.submit-hero p { + max-width: 760px; + color: var(--muted); + font-size: 1.08rem; + line-height: 1.6; +} + +.intro-stats, +.detail-stats { + display: grid; + gap: 10px; + min-width: 260px; +} + +.intro-stats span, +.detail-stats div, +.submission-grid div, +.detail-section { + border: 1px solid var(--line); + border-radius: var(--radius); + background: var(--surface); + box-shadow: var(--shadow); +} + +.intro-stats span { + padding: 14px 16px; + color: var(--muted); +} + +.intro-stats strong { + display: block; + color: var(--ink); + font-size: 1.4rem; +} + +.catalog-tools { + position: sticky; + top: 0; + z-index: 2; + display: grid; + grid-template-columns: minmax(240px, 1fr) minmax(180px, 260px) auto; + gap: 12px; + align-items: end; + padding: 14px 0; + background: color-mix(in srgb, var(--bg) 92%, transparent); + backdrop-filter: blur(14px); +} + +.search-field, +.select-field { + display: grid; + gap: 6px; + color: var(--muted); + font-size: 0.82rem; + font-weight: 800; +} + +input, +select { + width: 100%; + min-height: 44px; + border: 1px solid var(--line); + border-radius: var(--radius); + background: var(--surface); + color: var(--ink); + font: inherit; + padding: 0 12px; +} + +.tag-strip { + display: flex; + gap: 8px; + padding: 8px 0 18px; + overflow-x: auto; +} + +.tag-filter { + border: 1px solid var(--line); + border-radius: 999px; + background: var(--surface); + color: var(--muted); + white-space: nowrap; +} + +.tag-filter { + min-height: 34px; + padding: 0 12px; + font: inherit; + font-size: 0.86rem; + font-weight: 700; + cursor: pointer; +} + +.tag-filter[aria-pressed="true"] { + border-color: var(--accent); + background: var(--accent); + color: var(--surface-strong); +} + +.catalog-summary { + display: flex; + align-items: center; + justify-content: space-between; + gap: 16px; + margin: 2px 0 18px; + color: var(--muted); + font-weight: 800; +} + +.catalog-summary button { + cursor: pointer; +} + +.theme-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); + gap: 18px; +} + +.theme-card { + display: grid; + grid-template-rows: auto 1fr; + min-height: 100%; + border: 1px solid var(--line); + border-radius: var(--radius); + background: var(--surface); + box-shadow: var(--shadow); + overflow: hidden; +} + +.theme-card[hidden] { + display: none; +} + +.theme-card-image { + display: block; + aspect-ratio: 16 / 10; + background: var(--surface-strong); + overflow: hidden; +} + +.theme-card-image img, +.screenshot-gallery img { + width: 100%; + height: 100%; + display: block; + object-fit: cover; +} + +.theme-card-body { + display: grid; + gap: 16px; + padding: 16px; +} + +.theme-card h2 { + margin-bottom: 8px; + font-size: 1.12rem; + line-height: 1.25; + letter-spacing: 0; +} + +.theme-card h2 a { + text-decoration: none; +} + +.theme-card p { + color: var(--muted); + line-height: 1.5; +} + +.theme-tags { + align-self: start; + display: flex; + flex-wrap: wrap; + gap: 6px; + align-items: center; +} + +.theme-tags span { + flex: 0 0 auto; + display: inline-flex; + align-items: center; + min-height: 24px; + padding: 2px 8px; + border: 1px solid var(--line); + border-radius: 999px; + background: color-mix(in srgb, var(--surface) 76%, var(--bg)); + color: var(--muted); + font-size: 0.74rem; + font-weight: 650; + line-height: 1.2; + white-space: nowrap; +} + +.theme-tags.large span { + min-height: 30px; + padding-inline: 10px; + font-size: 0.84rem; +} + +.theme-meta, +.detail-stats { + margin: 0; +} + +.theme-meta { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 10px; +} + +.theme-meta div, +.detail-stats div { + display: grid; + gap: 4px; +} + +.theme-meta dt, +.detail-stats dt { + color: var(--muted); + font-size: 0.74rem; + font-weight: 800; + text-transform: uppercase; +} + +.theme-meta dd, +.detail-stats dd { + margin: 0; + font-weight: 800; +} + +.theme-actions, +.detail-actions { + align-self: start; + display: flex; + flex-wrap: wrap; + gap: 10px; + align-items: center; +} + +.theme-actions a:first-child, +.detail-actions a:first-child { + border-color: var(--accent); + background: var(--accent); + color: var(--surface-strong); +} + +.empty-state { + padding: 48px 0; + color: var(--muted); + text-align: center; +} + +.breadcrumb { + display: flex; + gap: 10px; + padding: 24px 0 0; + color: var(--muted); + font-weight: 700; +} + +.detail-stats div { + padding: 14px; +} + +.screenshot-gallery { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); + gap: 18px; + margin: 12px 0 24px; +} + +.screenshot-gallery img { + aspect-ratio: 16 / 10; + border-radius: var(--radius); + background: var(--surface-strong); + box-shadow: var(--shadow); +} + +.detail-layout, +.submission-grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 18px; + margin-bottom: 48px; +} + +.detail-section, +.submission-grid div { + padding: 20px; +} + +.detail-section h2, +.submission-grid h2 { + font-size: 1.05rem; + letter-spacing: 0; +} + +.detail-section p, +.submission-grid p, +.install-list { + color: var(--muted); + line-height: 1.6; +} + +.install-list { + padding-left: 22px; +} + +.notice { + border-color: color-mix(in srgb, var(--accent-warm) 50%, var(--line)); +} + +.archive-warning { + margin: 0 0 24px; + padding: 18px 20px; + border: 1px solid color-mix(in srgb, var(--archive) 55%, var(--line)); + border-radius: var(--radius); + background: var(--archive-bg); +} + +.archive-warning h2 { + margin-bottom: 8px; + font-size: 1.05rem; +} + +.archive-warning p { + margin-bottom: 0; + color: var(--muted); + line-height: 1.6; +} + +.archived-card { + border-color: color-mix(in srgb, var(--archive) 45%, var(--line)); +} + +code { + border-radius: 5px; + background: var(--code-bg); + color: var(--code-ink); + padding: 2px 5px; +} + +.submit-page { + min-height: calc(100vh - 180px); +} + +.submit-hero { + grid-template-columns: 1fr; +} + +.site-footer { + padding: 34px 0 44px; + color: var(--muted); +} + +@media (max-width: 860px) { + .site-header, + .hub-intro, + .detail-hero, + .catalog-tools, + .detail-layout, + .submission-grid { + grid-template-columns: 1fr; + } + + .site-header { + align-items: flex-start; + flex-direction: column; + padding: 16px 0; + } + + .site-nav { + width: 100%; + overflow-x: auto; + } + + .hub-intro, + .detail-hero, + .submit-hero { + padding-top: 34px; + } + + .intro-stats { + min-width: 0; + } +} + +@media (max-width: 520px) { + .site-header, + .site-footer, + main { + width: min(100% - 20px, 1440px); + } + + h1 { + font-size: 2.35rem; + } + + .theme-grid, + .screenshot-gallery { + grid-template-columns: 1fr; + } +} diff --git a/tests/themes.check.js b/tests/themes.check.js deleted file mode 100644 index 05b1b153..00000000 --- a/tests/themes.check.js +++ /dev/null @@ -1,34 +0,0 @@ -const themes = require('../themes.json') - -const allBugs = [] - -themes.forEach((entry, index) => { - - const currentBugs = [] - - const keys = Object.keys(entry) - const objectKeys = keys[0] !== 'title' || - keys[1] !== 'link' || - keys[2] !== 'description' || - keys[3] !== 'image' || - keys[4] !== 'tags' || - keys[5] !== 'repository' - const objectTypes = typeof entry[keys[0]] !== 'string' || - typeof entry[keys[1]] !== 'string' || - typeof entry[keys[2]] !== 'string' || - typeof entry[keys[3]] !== 'string' || - typeof entry[keys[4]] !== 'object' || - typeof entry[keys[5]] !== 'string' - - if (typeof entry !== 'object') currentBugs.push('This theme is not an object.') - if (keys.length < 6) currentBugs.push(`Is expected to have at least 6 keys, but has ${keys.length}.`) - if (objectKeys) currentBugs.push('Verify name of object keys, respectively, it must be: title, link, description, image, tags') - if (objectTypes) currentBugs.push('All object entries must be strings with the exception of tags, which is an array!') - - if (currentBugs.length !== 0) allBugs.push(`Theme "${entry.title}" (index: ${index} has the following ${currentBugs.length} bug(s):\n${currentBugs.join('\n')}`) - -}) - -if (allBugs.length !== 0) { - throw allBugs.join('\n\n') -} diff --git a/themes.json b/themes.json deleted file mode 100644 index 41d5b911..00000000 --- a/themes.json +++ /dev/null @@ -1,2319 +0,0 @@ -[ - { - "title": "arcadia", - "link": "https://github.com/tyrohellion/arcadia", - "description": "Minimal Firefox theme and user.js focused on speed and design", - "image": "assets/img/themes/arcadia.webp", - "tags": [ - "tyro", - "dark", - "minimal", - "clean", - "hovercards", - "simple", - "compact", - "minimalistic" - ], - "repository": "https://github.com/tyrohellion/arcadia", - "pushed_at": "2026-01-28T10:47:31Z", - "stargazers_count": 20, - "avatar": "https://avatars.githubusercontent.com/u/51808054?v=4" - }, - { - "title": "Titlebar-Button-Fix", - "link": "https://github.com/birbkeks/Firefox-Titlebar-Button-Fix", - "description": "This theme fixes titlebar min max close buttons for Firefox in linux. ", - "image": "assets/img/themes/titlebarfix.webp", - "tags": [ - "birbkeks", - "fix", - "titlebar" - ], - "repository": "https://github.com/birbkeks/Firefox-Titlebar-Button-Fix", - "pushed_at": "2024-05-12T18:57:05Z", - "stargazers_count": 6, - "avatar": "https://avatars.githubusercontent.com/u/67545942?v=4" - }, - { - "title": "Sweet_Pop!", - "link": "https://github.com/PROxZIMA/Sweet-Pop", - "description": "Sweet_Pop! Minimalist oneliner theme for Firefox perfectly matching Sweet Dark.", - "image": "assets/img/themes/sweetpop.webp", - "tags": [ - "dark", - "light", - "modern", - "blue", - "auto-hide", - "floating bar", - "PROxZIMA" - ], - "repository": "https://github.com/PROxZIMA/Sweet-Pop", - "pushed_at": "2023-03-25T10:54:34Z", - "stargazers_count": 264, - "avatar": "https://avatars.githubusercontent.com/u/43103163?v=4" - }, - { - "title": "minimalFOX", - "link": "https://github.com/marmmaz/FirefoxCSS", - "description": "A compact & minimal Firefox theme built for macOS.", - "image": "assets/img/themes/minimalfox.webp", - "tags": [ - "dark", - "macos", - "marmazz", - "auto-hide", - "floating bar", - "compact" - ], - "repository": "https://github.com/marmmaz/FirefoxCSS", - "pushed_at": "2021-10-13T19:11:07Z", - "stargazers_count": 77, - "avatar": "https://avatars.githubusercontent.com/u/71498246?v=4" - }, - { - "title": "FirefoxCss", - "link": "https://github.com/h4wwk3ye/firefoxCSS", - "description": "Custom userChrome.css for firefox based on Material Fox and Flying Fox with few small changes.", - "image": "assets/img/themes/firefoxcss.webp", - "tags": [ - "light", - "h4wwk3ye", - "Tree Style Tab", - "sidebar" - ], - "repository": "https://github.com/h4wwk3ye/firefoxCSS", - "pushed_at": "2021-01-25T11:22:25Z", - "stargazers_count": 24, - "avatar": "https://avatars.githubusercontent.com/u/24487030?v=4" - }, - { - "title": "Simplify Silver Peach for Firefox", - "link": "https://github.com/CristianDragos/FirefoxThemes/tree/master/Simplify%20Silver%20Peach", - "description": "A minimal Firefox Theme for those who would like to properly enjoy my Simplify 10 Silver Peach - Windows 10 Themes\n Compatibility: V89+", - "image": "assets/img/themes/simplify_silver_peach_for_firefox_preview.webp", - "tags": [ - "light", - "pastel", - "CristianDragos", - "rounded" - ], - "repository": "https://github.com/CristianDragos/FirefoxThemes", - "pushed_at": "2021-10-07T12:23:11Z", - "stargazers_count": 141, - "avatar": "https://avatars.githubusercontent.com/u/3705687?v=4" - }, - { - "title": "Simplify Darkish for Firefox", - "link": "https://github.com/CristianDragos/FirefoxThemes/tree/master/Simplify%20Darkish", - "description": "A minimal Firefox Theme for those who would like to properly enjoy my Simplify 10 Darkish - Windows 10 Themes\n Compatibility: V89+", - "image": "assets/img/themes/simplify_darkish_for_firefox_preview.webp", - "tags": [ - "dark", - "CristianDragos", - "windows 10" - ], - "repository": "https://github.com/CristianDragos/FirefoxThemes", - "pushed_at": "2021-10-07T12:23:11Z", - "stargazers_count": 141, - "avatar": "https://avatars.githubusercontent.com/u/3705687?v=4" - }, - { - "title": "SimpleFox", - "link": "https://github.com/migueravila/Simplefox", - "description": "🦊 A Userstyle theme for Firefox minimalist and Keyboard centered.", - "image": "assets/img/themes/simplefox.webp", - "tags": [ - "migueravila", - "dark", - "minimal", - "keyboard", - "compact", - "linux" - ], - "repository": "https://github.com/migueravila/Simplefox", - "pushed_at": "2022-04-24T18:56:19Z", - "stargazers_count": 1875, - "avatar": "https://avatars.githubusercontent.com/u/35583825?v=4" - }, - { - "title": "blurredfox", - "link": "https://github.com/manilarome/blurredfox", - "description": "A modern Firefox CSS Theme", - "image": "assets/img/themes/blurred.webp", - "tags": [ - "manilarome", - "dark", - "light", - "blur", - "linux" - ], - "repository": "https://github.com/manilarome/blurredfox", - "pushed_at": "2023-06-27T10:12:27Z", - "stargazers_count": 923, - "avatar": "https://avatars.githubusercontent.com/u/40349590?v=4" - }, - { - "title": "Firefox Review", - "link": "https://github.com/fellowish/firefox-review", - "description": "Firefox Review is a CSS redesign of the browser, changing the look of Firefox to match the color scheme and design language of Firefox Preview, the previous name of Mozilla's new mobile app.", - "image": "assets/img/themes/firefoxreview.webp", - "tags": [ - "dark", - "light", - "fellowish", - "archived", - "colorscheme" - ], - "repository": "https://github.com/fellowish/firefox-review", - "pushed_at": "2021-04-22T18:14:52Z", - "stargazers_count": 138, - "avatar": "https://avatars.githubusercontent.com/u/28973978?v=4" - }, - { - "title": "nord-firefox", - "link": "https://github.com/daaniiieel/nord-firefox", - "description": "Firefox userChrome.css theme, based on https://github.com/AnubisZ9/Global-Dark-Nordic-theme/.", - "image": "assets/img/themes/nord.webp", - "tags": [ - "nord", - "daaniiieel", - "colorscheme" - ], - "repository": "https://github.com/daaniiieel/nord-firefox", - "pushed_at": "2020-04-18T08:08:07Z", - "stargazers_count": 29, - "avatar": "https://avatars.githubusercontent.com/u/41679054?v=4" - }, - { - "title": "not-holar's theme", - "link": "https://github.com/not-holar/my_firefox_theme", - "description": "Welcome to the repo for my Firefox theme, a theme that aims to look nice and clean while not compromising functionality.\n Compatibility: V89+", - "image": "assets/img/themes/MyFirefoxThemenotholar.webp", - "tags": [ - "not-holar", - "stylus", - "Tree Style", - "dark" - ], - "repository": "https://github.com/not-holar/my_firefox_theme", - "pushed_at": "2022-10-17T13:05:29Z", - "stargazers_count": 85, - "avatar": "https://avatars.githubusercontent.com/u/58831297?v=4" - }, - { - "title": "Firefox-Mod-Blur", - "link": "https://github.com/datguypiko/Firefox-Mod-Blur", - "description": "Tested 84.0.1 Windows 10 / Default Dark Theme ", - "image": "assets/img/themes/firefoxmodblur.webp", - "tags": [ - "blur", - "datguypiko", - "dark", - "centre", - "rounded" - ], - "repository": "https://github.com/datguypiko/Firefox-Mod-Blur", - "pushed_at": "2026-04-01T18:09:51Z", - "stargazers_count": 1685, - "avatar": "https://avatars.githubusercontent.com/u/61329159?v=4" - }, - { - "title": "quietfox", - "link": "https://github.com/coekuss/quietfox", - "description": "This userChrome mod was created to make the Firefox UI cleaner and more modern without sacrificing any of its original features. You can still use themes, and you can still use Compact Mode and Touch Mode. You can pretty much forget that you have a mod installed, it works quietly in the background.", - "image": "assets/img/themes/quietfox.webp", - "tags": [ - "coekuss", - "toolkit", - "simple" - ], - "repository": "https://github.com/coekuss/quietfox", - "pushed_at": "2021-07-05T22:51:14Z", - "stargazers_count": 172, - "avatar": "https://avatars.githubusercontent.com/u/45906331?v=4" - }, - { - "title": "minimal-functional-fox", - "link": "https://github.com/mut-ex/minimal-functional-fox", - "description": "A minimal, yet functional configuration for Firefox!", - "image": "assets/img/themes/minimalfuntionalfox.webp", - "tags": [ - "centre", - "minimal", - "dark", - "animations" - ], - "repository": "https://github.com/mut-ex/minimal-functional-fox", - "pushed_at": "2023-05-19T00:16:56Z", - "stargazers_count": 725, - "avatar": "https://avatars.githubusercontent.com/u/21265981?v=4" - }, - { - "title": "MaterialFox", - "link": "https://github.com/muckSponge/MaterialFox", - "description": "A Material Design-inspired userChrome.css theme for Firefox", - "image": "assets/img/themes/materialfox.webp", - "tags": [ - "muckSponge", - "dark", - "light", - "colorscheme" - ], - "repository": "https://github.com/muckSponge/MaterialFox", - "pushed_at": "2024-09-23T08:58:42Z", - "stargazers_count": 1971, - "avatar": "https://avatars.githubusercontent.com/u/5405629?v=4" - }, - { - "title": "Firefox UWP Style", - "link": "https://github.com/Guerra24/Firefox-UWP-Style", - "description": "A theme that follows UWP styling. Featuring the original MDL2 design and Sun Valley refresh", - "image": "assets/img/themes/firefoxuwpstyle.webp", - "tags": [ - "Guerra24", - "dark", - "colorscheme" - ], - "repository": "https://github.com/Guerra24/Firefox-UWP-Style", - "pushed_at": "2026-03-25T16:22:15Z", - "stargazers_count": 452, - "avatar": "https://avatars.githubusercontent.com/u/9023392?v=4" - }, - { - "title": "Monochrome Tree", - "link": "https://github.com/MatejKafka/FirefoxTheme", - "description": "A custom minimalist theme for Firefox with Tree Style Tab support", - "image": "assets/img/themes/19.webp", - "tags": [ - "dark", - "light", - "MatejKafka", - "monochrome", - "Tree Style", - "one-line" - ], - "repository": "https://github.com/MatejKafka/FirefoxTheme", - "pushed_at": "2025-04-06T13:59:21Z", - "stargazers_count": 17, - "avatar": "https://avatars.githubusercontent.com/u/6414091?v=4" - }, - { - "title": "Flying Fox", - "link": "https://github.com/akshat46/FlyingFox", - "description": "An opinionated set of configurations for firefox with Material Fox, github-moonlight userstyle", - "image": "assets/img/themes/flying.webp", - "tags": [ - "material", - "moonlight", - "akshat46" - ], - "repository": "https://github.com/akshat46/FlyingFox", - "pushed_at": "2023-04-11T07:11:04Z", - "stargazers_count": 1602, - "avatar": "https://avatars.githubusercontent.com/u/7402043?v=4" - }, - { - "title": "FirefoxW10ContextMenus", - "link": "https://github.com/M1ch431/FirefoxW10ContextMenus", - "description": "Emulates the Windows 10 context menus in Firefox.", - "image": "assets/img/themes/20.webp", - "tags": [ - "toolkit", - "context", - "menu", - "windows" - ], - "repository": "https://github.com/M1ch431/FirefoxW10ContextMenus", - "pushed_at": "2021-09-20T04:21:08Z", - "stargazers_count": 113, - "avatar": "https://avatars.githubusercontent.com/u/46256998?v=4" - }, - { - "title": "EdgeFox", - "link": "https://github.com/23Bluemaster23/EdgeFox", - "description": "Is a userchrome that imitates (or attempts to imitate) the style of Microsoft's Edge Chromiun browser.", - "image": "assets/img/themes/edgefox.webp", - "tags": [ - "windows", - "edge" - ], - "repository": "https://github.com/23Bluemaster23/EdgeFox", - "pushed_at": "2021-09-26T14:59:13Z", - "stargazers_count": 33, - "avatar": "https://avatars.githubusercontent.com/u/49736771?v=4" - }, - { - "title": "Firefox i3wm theme", - "link": "https://github.com/aadilayub/firefox-i3wm-theme", - "description": "A theme for Firefox meant to emulate qutebrowser and integrate with the i3 window manager.", - "image": "assets/img/themes/ff-i3wm.webp", - "tags": [ - "qt", - "qute", - "qutebrowser", - "i3" - ], - "repository": "https://github.com/aadilayub/firefox-i3wm-theme", - "pushed_at": "2023-07-27T09:02:57Z", - "stargazers_count": 162, - "avatar": "https://avatars.githubusercontent.com/u/31581044?v=4" - }, - { - "title": "Edge-Frfox", - "link": "https://github.com/bmFtZQ/Edge-FrFox", - "description": "A Firefox userChrome.css theme that aims to recreate the look and feel of Microsoft Edge.", - "image": "assets/img/themes/Edge-Frfox.webp", - "tags": [ - "light", - "dark", - "fluent", - "microsoft", - "bmFtZQ", - "windows", - "mac", - "linux" - ], - "repository": "https://github.com/bmFtZQ/Edge-FrFox", - "pushed_at": "2026-04-03T12:59:23Z", - "stargazers_count": 761, - "avatar": "https://avatars.githubusercontent.com/u/62812711?v=4" - }, - { - "title": "NicoFox", - "link": "https://github.com/SlowNicoFish/NicoFox", - "description": "A simple rounded theme", - "image": "assets/img/themes/22381112138598-fe8cd400-8bd1-11eb-8eed-edcca2c689d8.webp", - "tags": [ - "rounded", - "minimal" - ], - "repository": "https://github.com/SlowNicoFish/NicoFox", - "pushed_at": "2021-03-23T00:04:37Z", - "stargazers_count": 6, - "avatar": "https://avatars.githubusercontent.com/u/19305293?v=4" - }, - { - "title": "Elegant Nord Theme", - "link": "https://github.com/rafamadriz/Firefox-Elegant-NordTheme", - "description": "Elegant Nord Theme with material design", - "image": "assets/img/themes/Elegant-Nord-Theme.webp", - "tags": [ - "nord", - "material" - ], - "repository": "https://github.com/rafamadriz/Firefox-Elegant-NordTheme", - "pushed_at": "2023-04-28T01:47:55Z", - "stargazers_count": 24, - "avatar": "https://avatars.githubusercontent.com/u/67771985?v=4" - }, - { - "title": "Moonlight 🌌", - "link": "https://github.com/eduardhojbota/moonlight-userChrome", - "description": "A dark userstyle for Firefox inspired by moonlight-vscode-theme and github-moonlight", - "image": "assets/img/themes/moonlight.webp", - "tags": [ - "dark" - ], - "repository": "https://github.com/eduardhojbota/moonlight-userChrome", - "pushed_at": "2023-11-25T14:46:00Z", - "stargazers_count": 144, - "avatar": "https://avatars.githubusercontent.com/u/2820538?v=4" - }, - { - "title": "Firefox Halo", - "link": "https://github.com/seirin-blu/Firefox-Halo", - "description": "A mininmalist Firefox theme with a lot of about: pages edited to act as resources. Updates about every month.", - "image": "assets/img/themes/firefoxhalo.webp", - "tags": [ - "toolkit" - ], - "repository": "https://github.com/seirin-blu/Firefox-Halo", - "pushed_at": "2023-11-27T19:29:22Z", - "stargazers_count": 47, - "avatar": "https://avatars.githubusercontent.com/u/61664123?v=4" - }, - { - "title": "Pseudo-fullscreen Firefox", - "link": "https://github.com/ongots/pseudo-fullscreen-firefox", - "description": "Hides and improves interface Firefox and YouTube, giving maximum space for content and aiding concentration", - "image": "assets/img/themes/always-fullscreen-firefox.webp", - "tags": [ - "toolkit", - "sidebar" - ], - "repository": "https://github.com/ongots/pseudo-fullscreen-firefox", - "pushed_at": "2026-02-28T16:48:31Z", - "stargazers_count": 69, - "avatar": "https://avatars.githubusercontent.com/u/43604031?v=4" - }, - { - "title": "WhiteSur Safari style for Firefox", - "link": "https://github.com/adamxweb/WhiteSurFirefoxThemeMacOS", - "description": "Make your Firefox look like Safari. MacOS Big Sur inspired theme for Firefox on MacOS & Windows.\n Compatibility: V89+", - "image": "assets/img/themes/whitesur.webp", - "tags": [ - "apple", - "mac", - "safari" - ], - "repository": "https://github.com/adamxweb/WhiteSurFirefoxThemeMacOS", - "pushed_at": "2025-07-26T05:43:43Z", - "stargazers_count": 611, - "avatar": "https://avatars.githubusercontent.com/u/6800453?v=4" - }, - { - "title": "Alpen Blue to Firefox CSS", - "link": "https://github.com/Godiesc/AlpenBlue", - "description": "Theme to Blue and Alpenglow lovers\n Compatibility: V89+", - "image": "assets/img/themes/alpenblue.webp", - "tags": [ - "aplenblue", - "alpenglow", - "Godiesc" - ], - "repository": "https://github.com/Godiesc/AlpenBlue", - "pushed_at": "2022-06-19T19:00:45Z", - "stargazers_count": 67, - "avatar": "https://avatars.githubusercontent.com/u/22057609?v=4" - }, - { - "title": "duskFox", - "link": "https://github.com/aminomancer/uc.css.js", - "description": "A dark indigo theme integrated with extensive functional and visual scripts.\n Compatibility: V89+", - "image": "assets/img/themes/duskfox.webp", - "tags": [ - "dark", - "dusk" - ], - "repository": "https://github.com/aminomancer/uc.css.js", - "pushed_at": "2026-01-06T17:30:39Z", - "stargazers_count": 379, - "avatar": "https://avatars.githubusercontent.com/u/33384265?v=4" - }, - { - "title": "Compact Mode to Firefox Css", - "link": "https://github.com/Godiesc/compactmodefirefoxcss", - "description": "Theme to Make Firefox Compact and keep it's Beauty\n Compatibility: V89+", - "image": "assets/img/themes/splashcompact.webp", - "tags": [ - "toolkit", - "Godiesc" - ], - "repository": "https://github.com/Godiesc/compactmodefirefoxcss", - "pushed_at": "2021-08-27T17:47:51Z", - "stargazers_count": 18, - "avatar": "https://avatars.githubusercontent.com/u/22057609?v=4" - }, - { - "title": "DiamondFucsia Theme to Firefox Css", - "link": "https://github.com/Godiesc/DiamondFucsia", - "description": "Dark Theme to Firefox with Fuchsia Colors\n Compatibility: V89+", - "image": "assets/img/themes/diamondfucsia.webp", - "tags": [ - "Godiesc" - ], - "repository": "https://github.com/Godiesc/DiamondFucsia", - "pushed_at": "2023-11-25T12:46:57Z", - "stargazers_count": 6, - "avatar": "https://avatars.githubusercontent.com/u/22057609?v=4" - }, - { - "title": "Australis like tabs in Proton UI", - "link": "https://github.com/sagars007/Australis-like-tabs-FF-ProtonUI-changes", - "description": "Changes to make the new proton UI redesign in Firefox better; including changes to tabs, more compact-compact mode, proton gradient accents in elements and much more\n Compatibility: V89+", - "image": "assets/img/themes/custom_australistabs_protonUI.webp", - "tags": [ - "compact" - ], - "repository": "https://github.com/sagars007/Australis-like-tabs-FF-ProtonUI-changes", - "pushed_at": "2021-06-10T07:37:39Z", - "stargazers_count": 11, - "avatar": "https://avatars.githubusercontent.com/u/56472130?v=4" - }, - { - "title": "Firefox vertical tabs (TST) UI", - "link": "https://github.com/sagars007/Firefox-vertical-tabs-customUI", - "description": "Vertical tabs in Firefox using tree style tabs. Vibrant tab selectors, full dark mode, titlebar text in nav-bar and much more.\n Compatibility: V89+", - "image": "assets/img/themes/compact_verticaltabs_view.webp", - "tags": [ - "sidebar", - "sidetab", - "tree" - ], - "repository": "https://github.com/sagars007/Firefox-vertical-tabs-customUI", - "pushed_at": "2021-09-04T19:49:09Z", - "stargazers_count": 32, - "avatar": "https://avatars.githubusercontent.com/u/56472130?v=4" - }, - { - "title": "Lepton(Proton Fix) in Proton UI", - "link": "https://github.com/black7375/Firefox-UI-Fix", - "description": "🦊 I respect proton UI and aim to fix it. Icons, Padding, Tab Design...\n Compatibility: V89+", - "image": "assets/img/themes/Lepton.webp", - "tags": [ - "" - ], - "repository": "https://github.com/black7375/Firefox-UI-Fix", - "pushed_at": "2026-02-06T00:06:12Z", - "stargazers_count": 5805, - "avatar": "https://avatars.githubusercontent.com/u/25581533?v=4" - }, - { - "title": "Lepton's Photon-Styled in Proton UI", - "link": "https://github.com/black7375/Firefox-UI-Fix/tree/photon-style", - "description": "🦊 I tried to preserve Proton’s feeling while preserving Photon’s strengths. Icons, Padding, Tab Design...\n Compatibility: V89+", - "image": "assets/img/themes/Lepton-PhotonStyle.webp", - "tags": [ - "" - ], - "repository": "https://github.com/black7375/Firefox-UI-Fix/tree/photon-style", - "pushed_at": "2026-02-06T00:06:12Z", - "stargazers_count": 5805, - "avatar": "https://avatars.githubusercontent.com/u/25581533?v=4" - }, - { - "title": "[Firefox 90+] RainFox", - "link": "https://github.com/1280px/rainfox", - "description": "Restores Photon's look and feel but keeps Proton's clarity with some improvements and new features. \n Compatibility: V89+", - "image": "assets/img/themes/rainfox.webp", - "tags": [ - "" - ], - "repository": "https://github.com/1280px/rainfox", - "pushed_at": "2022-02-04T15:28:44Z", - "stargazers_count": 73, - "avatar": "https://avatars.githubusercontent.com/u/71165491?v=4" - }, - { - "title": "Gradient rounded tabs redesign and ultra compact mode [Proton UI]", - "link": "https://github.com/sagars007/Proton-UI-connected-rounded-tabs-firefox-css", - "description": "Firefox Proton UI minimal changes with nav-bar-connected rounded tabs, reduced compact mode, nightly color gradient accents etc.. \n Compatibility: V89+", - "image": "assets/img/themes/proton-ui-gradient-rounded-tabs-display.webp", - "tags": [ - "" - ], - "repository": "https://github.com/sagars007/Proton-UI-connected-rounded-tabs-firefox-css", - "pushed_at": "2023-05-14T06:24:23Z", - "stargazers_count": 35, - "avatar": "https://avatars.githubusercontent.com/u/56472130?v=4" - }, - { - "title": "Technetium", - "link": "https://github.com/edo0/Technetium", - "description": "A focused approach to taming the new Firefox Proton interface, restituting some of the beloved elements retired alongside the old Photon UI - menu icons and much more \n Compatibility: V89+", - "image": "assets/img/themes/Technetium.webp", - "tags": [ - "edo0", - "light", - "dark", - "rounded", - "squared", - "compact", - "v89" - ], - "repository": "https://github.com/edo0/Technetium", - "pushed_at": "2022-02-13T15:22:08Z", - "stargazers_count": 89, - "avatar": "https://avatars.githubusercontent.com/u/16632292?v=4" - }, - { - "title": "Chameleons-Beauty to Firefox CSS", - "link": "https://github.com/Godiesc/Chameleons-Beauty", - "description": "Adaptive Theme to Firefox Themes \n Compatibility: V89+", - "image": "assets/img/themes/Chameleons-Beauty.webp", - "tags": [ - "dark", - "Godiesc", - "colourful", - "dark", - "light", - "v89" - ], - "repository": "https://github.com/Godiesc/Chameleons-Beauty", - "pushed_at": "2025-10-09T23:05:40Z", - "stargazers_count": 116, - "avatar": "https://avatars.githubusercontent.com/u/22057609?v=4" - }, - { - "title": "pro-fox: enhanced firefox proton", - "link": "https://github.com/xmansyx/Pro-Fox", - "description": "a proton based theme to make it even better \n Compatibility: V89+", - "image": "assets/img/themes/pro-fox.webp", - "tags": [ - "xmansyx", - "centered", - "rounded", - "dark", - "light", - "bigger", - "v89" - ], - "repository": "https://github.com/xmansyx/Pro-Fox", - "pushed_at": "2021-06-16T17:19:03Z", - "stargazers_count": 27, - "avatar": "https://avatars.githubusercontent.com/u/23141127?v=4" - }, - { - "title": "MartinFox", - "link": "https://github.com/arp242/MartinFox", - "description": "Really simple userChrome.css to make the active tab stand out more; 61 lines. \n Compatibility: V89+", - "image": "assets/img/themes/martinfox.webp", - "tags": [ - "arp242", - "pure", - "compact", - "v91" - ], - "repository": "https://github.com/arp242/MartinFox", - "pushed_at": "2023-01-15T13:01:04Z", - "stargazers_count": 12, - "avatar": "https://avatars.githubusercontent.com/u/1032692?v=4" - }, - { - "title": "ProtoVibrant", - "link": "https://github.com/bpwned/protovibrant", - "description": "Add macOS vibrancy to the Proton titlebar. Supports dark and light mode. \n Compatibility: V89+", - "image": "assets/img/themes/protovibrant.webp", - "tags": [ - "vibrancy", - "macos", - "pure", - "transparency", - "bpwned", - "v89" - ], - "repository": "https://github.com/bpwned/protovibrant", - "pushed_at": "2021-11-21T18:25:54Z", - "stargazers_count": 23, - "avatar": "https://avatars.githubusercontent.com/u/446744?v=4" - }, - { - "title": "OnelineProton", - "link": "https://github.com/lr-tech/OnelineProton", - "description": "An oneline userChrome.css theme for Firefox, which aims to keep the Proton experience \n Compatibility: V89+", - "image": "assets/img/themes/onelineproton.webp", - "tags": [ - "one-line", - "proton", - "v89", - "minimal", - "dark", - "light", - "lr-tech", - "v89" - ], - "repository": "https://github.com/lr-tech/OnelineProton", - "pushed_at": "2024-06-27T04:03:42Z", - "stargazers_count": 135, - "avatar": "https://avatars.githubusercontent.com/u/75286649?v=4" - }, - { - "title": "Firefox Compact Mode", - "link": "https://github.com/dannycolin/fx-compact-mode", - "description": "A compact mode that follows Firefox 89 (known as Proton) design system while using the same vertical space as the compact mode in Firefox 88 (known as Photon). \n Compatibility: V91+", - "image": "assets/img/themes/fx-compact-mode.webp", - "tags": [ - "dannycolin", - "compact", - "proton", - "photon", - "v91", - "pure" - ], - "repository": "https://github.com/dannycolin/fx-compact-mode", - "pushed_at": "2021-12-11T08:15:44Z", - "stargazers_count": 127, - "avatar": "https://avatars.githubusercontent.com/u/7339076?v=4" - }, - { - "title": "GruvFox by Alfarex2019", - "link": "https://github.com/FirefoxCSSThemers/GruvFox", - "description": "GruvFox is a remix of dpcdpc11's theme, featuring the gruvbox color palette.\n Compatibility: V91+", - "image": "assets/img/themes/20930130265614-a7559ea7-70fd-44f9-a790-34c5c0e31493.webp", - "tags": [ - "alfarexguy2019", - "gruv", - "dark", - "pure", - "v91" - ], - "repository": "https://github.com/FirefoxCSSThemers/GruvFox", - "pushed_at": "2021-08-31T02:33:56Z", - "stargazers_count": 22, - "avatar": "https://avatars.githubusercontent.com/u/84518514?v=4" - }, - { - "title": "Proton Square", - "link": "https://github.com/leadweedy/Firefox-Proton-Square", - "description": "Recreates the feel of Quantum with its squared tabs and menus. No rounded corners to be seen.\n Compatibility: V91+", - "image": "assets/img/themes//24535ff_protonbutquantum.webp", - "tags": [ - "squared", - "v91", - "pure", - "quantum", - "leadweedy" - ], - "repository": "https://github.com/leadweedy/Firefox-Proton-Square", - "pushed_at": "2025-03-12T09:23:50Z", - "stargazers_count": 135, - "avatar": "https://avatars.githubusercontent.com/u/72583854?v=4" - }, - { - "title": "Natura for Firefox", - "link": "https://github.com/firefoxcssthemers/natura-for-firefox", - "description": "Nature theme for Firefox \n Compatibility: V91+", - "image": "assets/img/themes/natura.webp", - "tags": [ - "green", - "yellow", - "firefoxcssthemers", - "alfarexguy2019", - "v91", - "pure" - ], - "repository": "https://github.com/firefoxcssthemers/natura-for-firefox", - "pushed_at": "2021-09-01T06:34:05Z", - "stargazers_count": 4, - "avatar": "https://avatars.githubusercontent.com/u/84518514?v=4" - }, - { - "title": "MacOSVibrant", - "link": "https://github.com/Tnings/MacosVibrant", - "description": "A theme that uses MacOS Vibrancy and is styled after other Apple Apps \n Compatibility: V91+", - "image": "assets/img/themes/MacOSVibrant.webp", - "tags": [ - "Tnings", - "transparency", - "dark", - "rounded", - "v91" - ], - "repository": "https://github.com/Tnings/MacosVibrant", - "pushed_at": "2023-09-16T17:32:42Z", - "stargazers_count": 47, - "avatar": "https://avatars.githubusercontent.com/u/55812511?v=4" - }, - { - "title": "Cascade", - "link": "https://github.com/andreasgrafen/cascade", - "description": "A responsive \"One-Line\" theme based on SimpleFox for the new ProtonUI. \n Compatibility: V91+", - "image": "assets/img/themes/cascade.webp", - "tags": [ - "andreasgrafen", - "minial", - "oneline", - "responsive", - "one-line", - "proton", - "light", - "dark", - "v91" - ], - "repository": "https://github.com/andreasgrafen/cascade", - "pushed_at": "2025-10-02T01:05:43Z", - "stargazers_count": 1591, - "avatar": "https://avatars.githubusercontent.com/u/159644623?v=4" - }, - { - "title": "Firefox GNOME theme", - "link": "https://github.com/rafaelmardojai/firefox-gnome-theme", - "description": "A bunch of CSS code to make Firefox look closer to GNOME's native apps. \n Compatibility: V91+", - "image": "assets/img/themes/firefox-gnome-theme.webp", - "tags": [ - "rafaelmardojai", - "gnome", - "v91", - "rounded", - "light", - "dark", - "v91" - ], - "repository": "https://github.com/rafaelmardojai/firefox-gnome-theme", - "pushed_at": "2026-04-07T18:03:41Z", - "stargazers_count": 3855, - "avatar": "https://avatars.githubusercontent.com/u/6210397?v=4" - }, - { - "title": "PretoFox", - "link": "https://github.com/alfarexguy2019/pretofox", - "description": "A Black n White AMOLED theme for Firefox, inspired by the Preto color scheme. \n Compatibility: V91+", - "image": "assets/img/themes/PretoFox.webp", - "tags": [ - "alfarexguy2019", - "black", - "white", - "dark", - "light", - "v91" - ], - "repository": "https://github.com/alfarexguy2019/pretofox", - "pushed_at": "2025-12-05T10:28:59Z", - "stargazers_count": 12, - "avatar": "https://avatars.githubusercontent.com/u/78948152?v=4" - }, - { - "title": "Elementary OS Odin Firefox theme", - "link": "https://github.com/Zonnev/elementaryos-firefox-theme", - "description": "This theme supports all the window buttons layouts from Tweaks and it blends into the elementary OS Odin user interface. \n Compatibility: V91+", - "image": "assets/img/themes/firefox-eos6-theme.webp", - "tags": [ - "Zonnev", - "elementary-OS", - "OS", - "dark", - "light" - ], - "repository": "https://github.com/Zonnev/elementaryos-firefox-theme", - "pushed_at": "2026-03-04T18:57:14Z", - "stargazers_count": 443, - "avatar": "https://avatars.githubusercontent.com/u/32688765?v=4" - }, - { - "title": "Oneliner Deluxe", - "link": "https://github.com/Doosty/Oneliner-Deluxe", - "description": "Minimal, customizable and theme compatible \n Compatibility: V91+", - "image": "assets/img/themes/Oneliner_Deluxe.webp", - "tags": [ - "one-line", - "Doosty", - "v91" - ], - "repository": "https://github.com/Doosty/Oneliner-Deluxe", - "pushed_at": "2022-01-18T22:09:39Z", - "stargazers_count": 17, - "avatar": "https://avatars.githubusercontent.com/u/747588?v=4" - }, - { - "title": "Simple Oneliner", - "link": "https://github.com/hakan-demirli/Firefox_Custom_CSS", - "description": "A simple theme to maximize the vertical space of your monitor \n Compatibility: V91+", - "image": "assets/img/themes/Simple_Oneliner.webp", - "tags": [ - "Sidebery", - "dark", - "light", - "pdf", - "one-line", - "hakan-demirli", - "v91" - ], - "repository": "https://github.com/hakan-demirli/Firefox_Custom_CSS", - "pushed_at": "2024-02-12T15:16:03Z", - "stargazers_count": 87, - "avatar": "https://avatars.githubusercontent.com/u/78746991?v=4" - }, - { - "title": "GentleFox", - "link": "https://github.com/alfarexguy2019/gentlefox", - "description": "A Firefox theme, which features gentle curves, transparency and a minimal interface. \n Compatibility: V91+", - "image": "assets/img/themes/GentleFox.webp", - "tags": [ - "alfarexguy2019", - "blur", - "transparency", - "rounded", - "dark", - "light" - ], - "repository": "https://github.com/alfarexguy2019/gentlefox", - "pushed_at": "2025-12-05T10:26:40Z", - "stargazers_count": 61, - "avatar": "https://avatars.githubusercontent.com/u/78948152?v=4" - }, - { - "title": "Clean and Transparent", - "link": "https://github.com/Filip-Sutkowy/blurclean-firefox-theme", - "description": "Clean theme with as much transparency as Firefox lets you do \n Compatibility: V91+", - "image": "assets/img/themes/Clean_and_Transparent.webp", - "tags": [ - "Filip-Sutkowy", - "blur", - "pure", - "dark", - "light", - "transparency", - "v91" - ], - "repository": "https://github.com/Filip-Sutkowy/blurclean-firefox-theme", - "pushed_at": "2021-09-29T21:49:09Z", - "stargazers_count": 111, - "avatar": "https://avatars.githubusercontent.com/u/24491499?v=4" - }, - { - "title": "Waterfall", - "link": "https://github.com/crambaud/waterfall", - "description": "A minimalist one line theme", - "image": "assets/img/themes/waterfall.webp", - "tags": [ - "crambaud", - "minimal", - "one-line", - "mouse" - ], - "repository": "https://github.com/crambaud/waterfall", - "pushed_at": "2022-08-02T06:38:14Z", - "stargazers_count": 274, - "avatar": "https://avatars.githubusercontent.com/u/58910562?v=4" - }, - { - "title": "Brave-Fox: The Reimagined Browser, Reimagined", - "link": "https://github.com/Soft-Bred/Brave-Fox", - "description": "Brave-Fox is a Firefox Theme that brings Brave's design elements into Firefox.", - "image": "assets/img/themes//184007ilia7199au71.webp", - "tags": [ - "brave", - "pure", - "js", - "javascript", - "Soft-Bred" - ], - "repository": "https://github.com/Soft-Bred/Brave-Fox", - "pushed_at": "2022-11-22T08:47:02Z", - "stargazers_count": 145, - "avatar": "https://avatars.githubusercontent.com/u/60551230?v=4" - }, - { - "title": "KeyFox- A minimal, keyboard centered OneLiner CSS.", - "link": "https://github.com/alfarexguy2019/KeyFox", - "description": "KeyFox is A simple, minimal OneLiner Keyboard-centered CSS for Firefox.", - "image": "assets/img/themes//13268136501706-accca691-b9c3-4841-acd7-6bb843d2f422.webp", - "tags": [ - "black", - "dark", - "white", - "one-line", - "alfarexguy2019" - ], - "repository": "https://github.com/alfarexguy2019/KeyFox", - "pushed_at": "2025-12-05T10:13:27Z", - "stargazers_count": 126, - "avatar": "https://avatars.githubusercontent.com/u/78948152?v=4" - }, - { - "title": "CompactFox", - "link": "https://github.com/Tnings/CompactFox", - "description": "A simple theme that compacts a lot of the UI elements", - "image": "assets/img/themes/CompactFoxPreview.webp", - "tags": [ - "compact", - "dark", - "light", - "Tnings", - "pure" - ], - "repository": "https://github.com/Tnings/CompactFox", - "pushed_at": "2021-10-23T05:25:10Z", - "stargazers_count": 53, - "avatar": "https://avatars.githubusercontent.com/u/55812511?v=4" - }, - { - "title": "AuroraFox- Auroral Firefox", - "link": "https://github.com/alfarexguy2019/aurora-fox", - "description": "AuroraFox is a clean rounded Firefox theme, made using CSS, to match with the trendy 'Aurora' Colour Palette.", - "image": "assets/img/themes//18328141609919-befbc7f3-5199-4672-9ba1-8551d2a4e5a1.webp", - "tags": [ - "dark", - "minimal", - "purple", - "alfarexguy2019" - ], - "repository": "https://github.com/alfarexguy2019/aurora-fox", - "pushed_at": "2025-12-05T10:27:07Z", - "stargazers_count": 25, - "avatar": "https://avatars.githubusercontent.com/u/78948152?v=4" - }, - { - "title": "starry-fox", - "link": "https://github.com/sagars007/starry-fox", - "description": "Firefox CSS stylesheets for the Dark Space Theme. Matching more UI elements with the theme.", - "image": "assets/img/themes/starry-fox-resize.webp", - "tags": [ - "sagars007", - "dark", - "compact", - "darkspace", - "stars", - "nightsky", - "gradient", - "windows11" - ], - "repository": "https://github.com/sagars007/starry-fox", - "pushed_at": "2024-05-18T15:17:34Z", - "stargazers_count": 159, - "avatar": "https://avatars.githubusercontent.com/u/56472130?v=4" - }, - { - "title": "Firefox-GX", - "link": "https://github.com/Godiesc/firefox-gx", - "description": "Firefox Theme to Opera-GX skin Lovers.", - "image": "assets/img/themes/firefox-gx.webp", - "tags": [ - "Godiesc", - "dark", - "opera", - "gx", - "theme", - "adapted", - "light", - "fuchsia" - ], - "repository": "https://github.com/Godiesc/firefox-gx", - "pushed_at": "2026-04-10T00:53:43Z", - "stargazers_count": 1051, - "avatar": "https://avatars.githubusercontent.com/u/22057609?v=4" - }, - { - "title": "Elegant Fox", - "link": "https://github.com/ayushhroyy/elegantfox", - "description": "A firefox context menu theme and background wallpaper support with linux desktops being the main focus", - "image": "assets/img/themes/elegantfox.webp ", - "tags": [ - "ayushhroyy", - "nord", - "dark", - "light", - "adaptive" - ], - "repository": "https://github.com/ayushhroyy/elegantfox", - "pushed_at": "2025-01-31T15:10:20Z", - "stargazers_count": 35, - "avatar": "https://avatars.githubusercontent.com/u/77523847?v=4" - }, - { - "title": "TYH Fox", - "link": "https://github.com/tyuhao/TYHfox", - "description": "A firefox Theme CSS", - "image": "assets/img/themes/TYHFox.webp ", - "tags": [ - "TYHFox", - "dark", - "light", - "adaptive" - ], - "repository": "https://github.com/tyuhao/TYHfox", - "pushed_at": "2025-09-21T07:44:01Z", - "stargazers_count": 13, - "avatar": "https://avatars.githubusercontent.com/u/47909858?v=4" - }, - { - "title": "SimpleFox Feather Edition", - "link": "https://github.com/BlueFalconHD/SimpleFox-Feather/", - "description": "A fork of SimpleFox that uses feather icons!", - "image": "assets/img/themes/simplefox-feather.webp", - "tags": [ - "Simplefox", - "Fork", - "Icons", - "BlueFalconHD" - ], - "repository": "https://github.com/BlueFalconHD/SimpleFox-Feather/", - "pushed_at": "2022-10-31T04:33:20Z", - "stargazers_count": 78, - "avatar": "https://avatars.githubusercontent.com/u/72631767?v=4" - }, - { - "title": "gale for Firefox", - "link": "https://github.com/mgastonportillo/gale-for-ff", - "description": "My CSS files to use with Firefox and Sidebery", - "image": "assets/img/themes//8988rjy7uTd.webp", - "tags": [ - "gale", - "dark", - "minimalistic", - "adaptive", - "compact", - "autohide", - "sidebar" - ], - "repository": "https://github.com/mgastonportillo/gale-for-ff", - "pushed_at": "2024-09-22T14:15:06Z", - "stargazers_count": 122, - "avatar": "https://avatars.githubusercontent.com/u/106234166?v=4" - }, - { - "title": "Firefox-UWP-Style-Theme-Omars-Edit", - "link": "https://github.com/omarb737/Firefox-UWP-Style-Theme-Omars-Edit", - "description": "A minimalistic-retro theme based off the UWP interface", - "image": "assets/img/themes//321608U0N6E.webp", - "tags": [ - "omarb737", - "dark", - "retro", - "minimalist", - "UWP" - ], - "repository": "https://github.com/omarb737/Firefox-UWP-Style-Theme-Omars-Edit", - "pushed_at": "2022-07-31T05:44:56Z", - "stargazers_count": 4, - "avatar": "https://avatars.githubusercontent.com/u/41845164?v=4" - }, - { - "title": "Modoki Firefox", - "link": "https://github.com/soup-bowl/Modoki-Firefox", - "description": "Bringing the classic Modern Modoki Netscape theme back", - "image": "assets/img/themes/soupbowlmodoki.webp", - "tags": [ - "soup-bowl", - "classic", - "netscape", - "skeuomorphic", - "light", - "retro" - ], - "repository": "https://github.com/soup-bowl/Modoki-Firefox", - "pushed_at": "2026-01-24T20:06:16Z", - "stargazers_count": 94, - "avatar": "https://avatars.githubusercontent.com/u/11209477?v=4" - }, - { - "title": "TileFox", - "link": "https://github.com/davquar/tilefox", - "description": "A minimalistic Firefox userChrome.css that integrates well with tiling window managers like i3", - "image": "assets/img/themes/tilefox.webp", - "tags": [ - "davquar", - "light", - "dark", - "tile", - "tilefox", - "minimal", - "minimalistic", - "brutalist", - "compact", - "tiling", - "dwm", - "sway", - "i3", - "keyboard", - "linux" - ], - "repository": "https://github.com/davquar/tilefox", - "pushed_at": "2022-10-21T20:00:50Z", - "stargazers_count": 24, - "avatar": "https://avatars.githubusercontent.com/u/30431538?v=4" - }, - { - "title": "AestheticFox", - "link": "https://github.com/AidanMercer/AestheticFox", - "description": "A minamist and aesthetic userstyle theme for Firefox", - "image": "assets/img/themes/AestheticFox.webp", - "tags": [ - "clean", - "compact", - "aestheticfox", - "minimal", - "minimalistic", - "aesthetic" - ], - "repository": "https://github.com/AidanMercer/AestheticFox", - "pushed_at": "2023-05-22T18:16:55Z", - "stargazers_count": 30, - "avatar": "https://avatars.githubusercontent.com/u/96552673?v=4" - }, - { - "title": "Firefox Onebar", - "link": "https://git.gay/freeplay/Firefox-Onebar", - "description": "A single bar for Firefox's UI.", - "image": "assets/img/themes/onebar.webp", - "tags": [ - "Freeplay", - "oneline", - "onebar", - "compact", - "minimal" - ], - "repository": "https://git.gay/freeplay/Firefox-Onebar", - "pushed_at": "2026-03-25T20:23:19Z", - "stargazers_count": 8, - "avatar": "https://git.gay/avatars/25ef717d14080c74d7a215792ff28c5ba2590585985036074bf9c0723fd9c582?size=512" - }, - { - "title": "Dracula", - "link": "https://github.com/jannikbuscha/firefox-dracula", - "description": "A Firefox CSS Theme that aims to recreate the look and feel of the Chromium version of Microsoft Edge in the style of Dracula.", - "image": "assets/img/themes/dracula.webp", - "tags": [ - "edge", - "dark", - "microsoft", - "dracula" - ], - "repository": "https://github.com/jannikbuscha/firefox-dracula", - "pushed_at": "2024-07-10T07:08:42Z", - "stargazers_count": 20, - "avatar": "https://avatars.githubusercontent.com/u/74017697?v=4" - }, - { - "title": "rounded-fox", - "link": "https://github.com/Etesam913/rounded-fox", - "description": "A minimalist theme that uses animation to hide visual clutter.", - "image": "assets/img/themes/rounded_fox.webp", - "tags": [ - "clean", - "compact", - "minimalist", - "dark", - "light", - "animation" - ], - "repository": "https://github.com/Etesam913/rounded-fox", - "pushed_at": "2023-09-02T19:29:12Z", - "stargazers_count": 95, - "avatar": "https://avatars.githubusercontent.com/u/55665282?v=4" - }, - { - "title": "Three Rows Simple Compact Clean CSS", - "link": "https://github.com/hornster02/Firefox-Three-Rows-Simple-Compact-Clean-CSS", - "description": "A compact theme based on use multiple rows", - "image": "assets/img/themes/Three_Rows.webp", - "tags": [ - "simple", - "compact", - "minimalist", - "rows" - ], - "repository": "https://github.com/hornster02/Firefox-Three-Rows-Simple-Compact-Clean-CSS", - "pushed_at": "2026-02-01T16:39:27Z", - "stargazers_count": 24, - "avatar": "https://avatars.githubusercontent.com/u/127822397?v=4" - }, - { - "title": "Bali10050's theme", - "link": "https://github.com/Bali10050/FirefoxCSS", - "description": "A minimal looking oneliner, with modular code for easy editing", - "image": "assets/img/themes/Bali10050sPreview.webp", - "tags": [ - "Bali10050", - "oneline", - "light", - "dark", - "linux", - "windows", - "rounded", - "proton", - "responsive", - "minimalistic" - ], - "repository": "https://github.com/Bali10050/FirefoxCSS", - "pushed_at": "2026-01-22T13:30:49Z", - "stargazers_count": 380, - "avatar": "https://avatars.githubusercontent.com/u/110120798?v=4" - }, - { - "title": "ViceFox", - "link": "https://vicefox.vercel.app", - "description": "Don't ask why it's called 'ViceFox'", - "image": "assets/img/themes/ViceFox.webp", - "tags": [ - "clean", - "compact", - "safari", - "minimal", - "macos" - ], - "repository": "https://github.com/jtlw99/vicefox", - "pushed_at": "2026-03-15T08:16:51Z", - "stargazers_count": 47, - "avatar": "https://avatars.githubusercontent.com/u/93564256?v=4" - }, - { - "title": "DarkMatter", - "link": "https://github.com/BloodyHell619/Firefox-Theme-DarkMatter", - "description": "An intensively worked on, and highly customized dark theme made for Firefox Proton, stretching darkness into every corner of the browser and perfecting even the tiniest details ", - "image": "assets/img/themes/darkmatter.webp", - "tags": [ - "dark", - "Vertical", - "squared", - "proton" - ], - "repository": "https://github.com/BloodyHell619/Firefox-Theme-DarkMatter", - "pushed_at": "2024-10-13T06:44:57Z", - "stargazers_count": 75, - "avatar": "https://avatars.githubusercontent.com/u/65298540?v=4" - }, - { - "title": "zap's cool photon theme", - "link": "https://github.com/zapSNH/zapsCoolPhotonTheme", - "description": "Party like it's Firefox 57-88!", - "image": "assets/img/themes/zaps-photon.webp", - "tags": [ - "photon", - "compact", - "squared", - "quantum" - ], - "repository": "https://github.com/zapSNH/zapsCoolPhotonTheme", - "pushed_at": "2026-03-20T01:02:26Z", - "stargazers_count": 138, - "avatar": "https://avatars.githubusercontent.com/u/134786889?v=4" - }, - { - "title": "Firefox-ONE", - "link": "https://github.com/Godiesc/firefox-one", - "description": "Dress Firefox with the Opera One skin", - "image": "assets/img/themes/firefox-one.webp", - "tags": [ - "Godiesc", - "opera", - "one", - "opera-one", - "firefox", - "firefox-one", - "theme", - "adaptive", - "tree", - "tabs" - ], - "repository": "https://github.com/Godiesc/firefox-one", - "pushed_at": "2025-10-09T23:00:16Z", - "stargazers_count": 415, - "avatar": "https://avatars.githubusercontent.com/u/22057609?v=4" - }, - { - "title": "Essence", - "link": "https://github.com/JarnotMaciej/Essence", - "description": "Compact, beautiful and minimalistic theme for the Firefox web browser.", - "image": "assets/img/themes/essence.webp", - "tags": [ - "compact", - "minimal", - "light", - "modern", - "oneline", - "rounded", - "clean" - ], - "repository": "https://github.com/JarnotMaciej/Essence", - "pushed_at": "2024-07-08T10:58:01Z", - "stargazers_count": 42, - "avatar": "https://avatars.githubusercontent.com/u/92025751?v=4" - }, - { - "title": "minimal-one-line-firefox", - "link": "https://github.com/ttntm/minimal-one-line-firefox", - "description": "A minimal oneliner, to minimizing the space used for url and tab bar", - "image": "assets/img/themes/molff.webp", - "tags": [ - "oneline", - "light", - "dark", - "squared", - "compact", - "minimalistic" - ], - "repository": "https://github.com/ttntm/minimal-one-line-firefox", - "pushed_at": "2024-06-15T16:07:30Z", - "stargazers_count": 46, - "avatar": "https://avatars.githubusercontent.com/u/41571384?v=4" - }, - { - "title": "RealFire", - "link": "https://github.com/Hakanbaban53/RealFire", - "description": "A minimalist animated oneliner theme for Firefox perfectly matching Real Dark", - "image": "assets/img/themes/RealFire-main.webp", - "tags": [ - "oneline", - "responsive", - "light", - "dark", - "animation", - "rounded", - "compact", - "minimalistic", - "black" - ], - "repository": "https://github.com/Hakanbaban53/RealFire", - "pushed_at": "2025-03-06T06:27:34Z", - "stargazers_count": 31, - "avatar": "https://avatars.githubusercontent.com/u/93117749?v=4" - }, - { - "title": "Firefox-Alpha", - "link": "https://github.com/Tagggar/Firefox-Alpha", - "description": "Super clear desktop browser with zero buttons and gesture controls", - "image": "assets/img/themes/Firefox-Alpha.webp", - "tags": [ - "Tagggar", - "alpha", - "responsive", - "light", - "dark", - "animation", - "rounded", - "compact", - "clear", - "clean", - "minimalistic", - "minimal", - "simple", - "gestures" - ], - "repository": "https://github.com/Tagggar/Firefox-Alpha", - "pushed_at": "2024-05-26T06:03:23Z", - "stargazers_count": 268, - "avatar": "https://avatars.githubusercontent.com/u/81634877?v=4" - }, - { - "title": "Dark Star", - "link": "https://gitlab.com/ivelieu/dark-star-firefox-skin", - "description": "A color-customizable, zero navbar padding skin, modified from Starry Fox", - "image": "assets/img/themes//11608darkstar_3.webp", - "tags": [ - "Ivelieu", - "dark", - "minimal", - "zeropadding", - "customizable" - ], - "repository": "https://gitlab.com/ivelieu/dark-star-firefox-skin", - "pushed_at": "2023-11-19T00:38:22.034Z", - "stargazers_count": 3, - "avatar": "/uploads/-/system/user/avatar/18385334/avatar.png" - }, - { - "title": "ImpossibleFox", - "link": "https://github.com/Naezr/ImpossibleFox", - "description": "A simple and fast one-line theme for Firefox inspired by Safari's compact layout. ", - "image": "assets/img/themes/ImpossibleFox.webp", - "tags": [ - "Naezr", - "dark", - "light", - "oneline" - ], - "repository": "https://github.com/Naezr/ImpossibleFox", - "pushed_at": "2024-05-24T15:24:49Z", - "stargazers_count": 25, - "avatar": "https://avatars.githubusercontent.com/u/95460152?v=4" - }, - { - "title": "SideFox", - "link": "https://github.com/rainbowflesh/Me-Personal-Firefox-Settup", - "description": "MS Edge style, sidebar, blur, and more.", - "image": "assets/img/themes/sidefox.webp", - "tags": [ - "sidebar", - "animated", - "simple", - "responsive", - "linux", - "windows", - "macos" - ], - "repository": "https://github.com/rainbowflesh/Me-Personal-Firefox-Settup", - "pushed_at": "2025-04-04T15:38:29Z", - "stargazers_count": 23, - "avatar": "https://avatars.githubusercontent.com/u/20819692?v=4" - }, - { - "title": "Firefox Plus", - "link": "https://github.com/amnweb/firefox-plus", - "description": "Firefox Plus, CSS tweaks for Firefox ", - "image": "assets/img/themes//6299firefox-26-11-2023.webp", - "tags": [ - "firefox", - "firefox-customization", - "minimal", - "firefox-theme", - "dark" - ], - "repository": "https://github.com/amnweb/firefox-plus", - "pushed_at": "2025-12-29T13:06:49Z", - "stargazers_count": 296, - "avatar": "https://avatars.githubusercontent.com/u/16545063?v=4" - }, - { - "title": "Shina Fox", - "link": "https://github.com/Shina-SG/Shina-Fox", - "description": "A Minimal, Cozy, Vertical Optimized Firefox Theme", - "image": "assets/img/themes/Shina.webp", - "tags": [ - "Shina", - "Vertical", - "Sidebery", - "Minimal", - "Dark", - "Light", - "Adaptive" - ], - "repository": "https://github.com/Shina-SG/Shina-Fox", - "pushed_at": "2024-05-24T23:41:47Z", - "stargazers_count": 480, - "avatar": "https://avatars.githubusercontent.com/u/135497382?v=4" - }, - { - "title": "ArnimFox", - "link": "https://github.com/SecondMikasa/ArnimFox", - "description": "A Minimalist Dark Themed Firefox enabling vertical tabs support and modern URL Bar", - "image": "assets/img/themes/ArnimFox.webp", - "tags": [ - "Minimalistic", - "Vertical", - "Sidebery", - "Dark", - "Sidebar" - ], - "repository": "https://github.com/SecondMikasa/ArnimFox", - "pushed_at": "2024-01-28T10:20:05Z", - "stargazers_count": 6, - "avatar": "https://avatars.githubusercontent.com/u/129872339?v=4" - }, - { - "title": "ShyFox", - "link": "https://github.com/Naezr/ShyFox", - "description": "A very shy little theme that hides the entire browser interface in the window border", - "image": "assets/img/themes/shyfox.webp", - "tags": [ - "Naezr", - "minimal" - ], - "repository": "https://github.com/Naezr/ShyFox", - "pushed_at": "2025-01-21T07:39:15Z", - "stargazers_count": 2117, - "avatar": "https://avatars.githubusercontent.com/u/95460152?v=4" - }, - { - "title": "greenyfox", - "link": "https://github.com/alan-ar1/greenyfox", - "description": "A modern dark theme with macos title bar buttons and Iosevka font", - "image": "assets/img/themes//9037DGTAHYA.webp", - "tags": [ - "alan-ar1", - "Dark", - "title-bar", - "minimal", - "Iosevka" - ], - "repository": "https://github.com/alan-ar1/greenyfox", - "pushed_at": "2025-01-02T18:59:22Z", - "stargazers_count": 5, - "avatar": "https://avatars.githubusercontent.com/u/110337684?v=4" - }, - { - "title": "98/95fox", - "link": "https://github.com/osem598/Firefox-98", - "description": "Chicago 95 & Windows95/98-like theme for firefox", - "image": "assets/img/themes/ff95.webp", - "tags": [ - "osem598", - "Light", - "Retro", - "Chicago", - "98", - "95" - ], - "repository": "https://github.com/osem598/Firefox-98", - "pushed_at": "2026-04-04T18:10:09Z", - "stargazers_count": 43, - "avatar": "https://avatars.githubusercontent.com/u/67332812?v=4" - }, - { - "title": "ArcWTF", - "link": "https://github.com/KiKaraage/ArcWTF/", - "description": "UserChrome.css theme to bring Arc Browser look from Windows to Firefox! ", - "image": "assets/img/themes/arcwtf.webp", - "tags": [ - "KiKaraage", - "dark", - "light", - "Arc Browser", - "Sidebery", - "vertical tabs", - "autohide", - "minimal" - ], - "repository": "https://github.com/KiKaraage/ArcWTF/", - "pushed_at": "2025-11-14T07:18:17Z", - "stargazers_count": 1730, - "avatar": "https://avatars.githubusercontent.com/u/10529881?v=4" - }, - { - "title": "FrameUI for Firefox", - "link": "https://github.com/FineFuturity/FrameUIForFirefox/", - "description": "A new way to view your web content. Like looking at photos printed from an old Polaroid camera.", - "image": "assets/img/themes/FrameUIScreenshot.webp", - "tags": [ - "FineFuturity", - "one line", - "vertical tabs", - "Sidebery", - "Tab Center Reborn", - "toolbars on bottom", - "immersive", - "minimal" - ], - "repository": "https://github.com/FineFuturity/FrameUIForFirefox/", - "pushed_at": "2024-12-03T23:57:05Z", - "stargazers_count": 67, - "avatar": "https://avatars.githubusercontent.com/u/19298107?v=4" - }, - { - "title": "arcfox", - "link": "https://github.com/betterbrowser/arcfox", - "description": "make firefox flow like arc", - "image": "assets/img/themes/arcfox.webp", - "tags": [ - "nikollesan", - "dark", - "light", - "luanderfarias", - "bettterbrowser" - ], - "repository": "https://github.com/betterbrowser/arcfox", - "pushed_at": "2025-06-01T21:38:03Z", - "stargazers_count": 1245, - "avatar": "https://avatars.githubusercontent.com/u/126220586?v=4" - }, - { - "title": "WhiteSur", - "link": "https://github.com/vinceliuice/WhiteSur-firefox-theme", - "description": "A MacOSX Safari theme for Firefox 80+", - "image": "assets/img/themes/whitesur_vinceliuice.webp", - "tags": [ - "vinceliuice", - "dark", - "light", - "MacOSX ", - "Monterey", - "safari", - "mac", - "oneline" - ], - "repository": "https://github.com/vinceliuice/WhiteSur-firefox-theme", - "pushed_at": "2026-01-05T05:56:11Z", - "stargazers_count": 538, - "avatar": "https://avatars.githubusercontent.com/u/7604295?v=4" - }, - { - "title": "Another Oneline", - "link": "https://github.com/mimipile/firefoxCSS", - "description": "Another simple, oneline, minimal, keyboard-centered Firefox CSS theme.", - "image": "assets/img/themes/screenshot-site.webp", - "tags": [ - "mimipile", - "dark", - "light", - "adaptative", - "onebar", - "oneline", - "minimal", - "keyboard", - "keyboard centered" - ], - "repository": "https://github.com/mimipile/firefoxCSS", - "pushed_at": "2024-08-26T09:06:51Z", - "stargazers_count": 135, - "avatar": "https://avatars.githubusercontent.com/u/74282993?v=4" - }, - { - "title": "MacFox-Theme", - "link": "https://github.com/d0sse/macFox-theme", - "description": "Safari-like minimalistic theme with system accent color", - "image": "assets/img/themes/d0sse_mac_fox_screen.webp", - "tags": [ - "dark", - "light", - "accent", - "minimal", - "macos", - "safari", - "mac", - "autocolor" - ], - "repository": "https://github.com/d0sse/macFox-theme", - "pushed_at": "2026-04-01T15:13:26Z", - "stargazers_count": 38, - "avatar": "https://avatars.githubusercontent.com/u/16508608?v=4" - }, - { - "title": "EdgyArc Fr", - "link": "https://github.com/artsyfriedchicken/EdgyArc-fr/", - "description": "Combining the sleekness of Microsoft Edge and the aesthetics of the Arc browser", - "image": "assets/img/themes/edgyarc-fr.webp", - "tags": [ - "artsyFriedChicken", - "dark", - "light", - "macOS", - "mac", - "arc", - "edge", - "translucent", - "blur", - "sidebery", - "Vertical Tabs" - ], - "repository": "https://github.com/artsyfriedchicken/EdgyArc-fr/", - "pushed_at": "2024-06-29T17:41:05Z", - "stargazers_count": 703, - "avatar": "https://avatars.githubusercontent.com/u/100123017?v=4" - }, - { - "title": "FF Ultima", - "link": "https://github.com/soulhotel/FF-ULTIMA", - "description": "The Firefox theme with too many options", - "image": "assets/img/themes/remote-102-ff-ultima.gif", - "tags": [ - "modern", - "adaptive", - "customizable", - "multiple layouts" - ], - "repository": "https://github.com/soulhotel/FF-ULTIMA", - "pushed_at": "2026-02-16T22:41:35Z", - "stargazers_count": 1160, - "avatar": "https://avatars.githubusercontent.com/u/155501797?v=4" - }, - { - "title": "Firefox Xtra Compact", - "link": "https://github.com/CarterSnich/firefox-xtra-compact", - "description": "Aims to make Firefox more compact and give a tiny bit more web view area for low-screen devices.", - "image": "assets/img/themes/xtracompact.webp", - "tags": [ - "CarterSnich", - "compact", - "themeless" - ], - "repository": "https://github.com/CarterSnich/firefox-xtra-compact", - "pushed_at": "2025-09-21T00:00:31Z", - "stargazers_count": 25, - "avatar": "https://avatars.githubusercontent.com/u/52433531?v=4" - }, - { - "title": "Aero Firefox", - "link": "https://github.com/SandTechStuff/AeroFirefox", - "description": "Brings the Windows 7 titlebar buttons to modern versions of Firefox", - "image": "assets/img/themes/aeroFirefox.webp", - "tags": [ - "aero", - "dark", - "light", - "lightweight", - "windows7", - "minimal" - ], - "repository": "https://github.com/SandTechStuff/AeroFirefox", - "pushed_at": "2025-10-03T04:53:38Z", - "stargazers_count": 31, - "avatar": "https://avatars.githubusercontent.com/u/164842290?v=4" - }, - { - "title": "PotatoFox", - "link": "https://codeberg.org/awwpotato/PotatoFox", - "description": "A compact and minimal firefox theme using Sidebery", - "image": "assets/img/themes/PotatoFox.webp", - "tags": [ - "minimal", - "compact", - "vertical tabs", - "Sidebery", - "arc" - ], - "repository": "https://codeberg.org/awwpotato/PotatoFox", - "pushed_at": "2025-12-09T18:34:10+01:00", - "stargazers_count": 41, - "avatar": "https://codeberg.org/avatars/bd252d906010a016f1fd29e68e873ea983c8491eb70820d838ef2fa255d8a703" - }, - { - "title": "Minimal-Arc", - "link": "https://github.com/zayihu/Minimal-Arc", - "description": "Minimal light Firefox theme with Arc like design with vertical tabs", - "image": "assets/img/themes/minimal_arc.webp", - "tags": [ - "minimal", - "compact", - "vertical-tabs", - "Sidebery", - "light", - "Arc Browser" - ], - "repository": "https://github.com/zayihu/Minimal-Arc", - "pushed_at": "2024-09-07T06:13:59Z", - "stargazers_count": 63, - "avatar": "https://avatars.githubusercontent.com/u/167391787?v=4" - }, - { - "title": "SnowFox", - "link": "https://github.com/naveensagar765/SnowFox", - "description": "Modern blue glass theme with side bookmark bar", - "image": "assets/img/themes/snowfox.webp", - "tags": [ - "moder", - "blue", - "side-bookmark-bar", - "home page" - ], - "repository": "https://github.com/naveensagar765/SnowFox", - "pushed_at": "2025-02-09T13:37:31Z", - "stargazers_count": 12, - "avatar": "https://avatars.githubusercontent.com/u/155926112?v=4" - }, - { - "title": "AnimatedFox", - "link": "https://github.com/RemyIsCool/AnimatedFox", - "description": "A minimal Firefox/LibreWolf theme with satisfying animations and a hidden URL bar.", - "image": "assets/img/themes/animatedfox.webp", - "tags": [ - "RemyIsCool", - "dark", - "minimal", - "hidden url bar", - "animations" - ], - "repository": "https://github.com/RemyIsCool/AnimatedFox", - "pushed_at": "2024-07-16T13:55:19Z", - "stargazers_count": 195, - "avatar": "https://avatars.githubusercontent.com/u/97812130?v=4" - }, - { - "title": "Quietfox Reborn", - "link": "https://github.com/TheGITofTeo997/quietfoxReborn", - "description": "Resurrecting a very Clean Firefox userChrome Mod ", - "image": "assets/img/themes/20053home.webp", - "tags": [ - "Teo", - "sleek", - "minimal", - "quiet" - ], - "repository": "https://github.com/TheGITofTeo997/quietfoxReborn", - "pushed_at": "2026-04-04T14:38:07Z", - "stargazers_count": 90, - "avatar": "https://avatars.githubusercontent.com/u/26879664?v=4" - }, - { - "title": "GlassyFox", - "link": "https://github.com/AnhNguyenlost13/GlassyFox", - "description": "Keeps the original new tab page layout while making it look as glassy as possible.", - "image": "assets/img/themes/glassyfox.webp", - "tags": [ - "blur", - "AnhNguyenlost13" - ], - "repository": "https://github.com/AnhNguyenlost13/GlassyFox", - "pushed_at": "2024-10-04T03:38:39Z", - "stargazers_count": 12, - "avatar": "https://avatars.githubusercontent.com/u/94160753?v=4" - }, - { - "title": "98/95fox Xtra Compact", - "link": "https://github.com/vintnarni/Firefox-98-Xtra-Compact", - "description": "The mix of nostalgia and compact.", - "image": "assets/img/themes/ff95xtracompact.webp", - "tags": [ - "Programneer", - "Light", - "Retro", - "Chicago", - "98", - "95", - "compact", - "xtra" - ], - "repository": "https://github.com/vintnarni/Firefox-98-Xtra-Compact", - "pushed_at": "2024-11-02T17:56:51Z", - "stargazers_count": 13, - "avatar": "https://avatars.githubusercontent.com/u/132811907?v=4" - }, - { - "title": "FireFox OneLine Navbar", - "link": "https://github.com/FawazBinSaleem/FireFoxOneLinerCSS", - "description": "A compact oneliner navbar css theme.", - "image": "assets/img/themes/fireFoxOneLinerCSS.webp", - "tags": [ - "oneline", - "black color", - "amoled", - "oneliner", - "navbar", - "One Line", - "compact" - ], - "repository": "https://github.com/FawazBinSaleem/FireFoxOneLinerCSS", - "pushed_at": "2024-12-20T21:01:20Z", - "stargazers_count": 33, - "avatar": "https://avatars.githubusercontent.com/u/48177454?v=4" - }, - { - "title": "Monochrome Neubrutalism Firefox Simple", - "link": "https://github.com/Kaskapa/Monochrome-Neubrutalism-Firefox-Theme", - "description": "A simple light theme I made to explore the world of Firefox theming.", - "image": "assets/img/themes/monochromeNeubrutalism.webp", - "tags": [ - "light", - "neubrutalislm", - "monochrome", - "simple", - "Kaskapa" - ], - "repository": "https://github.com/Kaskapa/Monochrome-Neubrutalism-Firefox-Theme", - "pushed_at": "2024-06-02T13:53:52Z", - "stargazers_count": 24, - "avatar": "https://avatars.githubusercontent.com/u/100031511?v=4" - }, - { - "title": "minimalistest oneliner", - "link": "https://github.com/yari-dog/minimalistest-oneliner-librewolf", - "description": "buttons are for nerds.", - "image": "assets/img/themes/minimalist-oneliner.webp", - "tags": [ - "simple", - "oneliner", - "oneline", - "compact" - ], - "repository": "https://github.com/yari-dog/minimalistest-oneliner-librewolf", - "pushed_at": "2024-08-28T10:11:56Z", - "stargazers_count": 8, - "avatar": "https://avatars.githubusercontent.com/u/75224849?v=4" - }, - { - "title": "Arc UI", - "link": "https://github.com/dxdotdev/arc-ui", - "description": "Make your Firefox like the Arc Browser.", - "image": "assets/img/themes/29957ui.webp", - "tags": [ - "dxdotdev", - "arc browser", - "compact", - "modern" - ], - "repository": "https://github.com/dxdotdev/arc-ui", - "pushed_at": "2025-01-05T13:34:56Z", - "stargazers_count": 74, - "avatar": "https://avatars.githubusercontent.com/u/157044645?v=4" - }, - { - "title": "Minimalist-DarkGreen", - "link": "https://github.com/andev0x/Minimalist-DarkGreen", - "description": "A theme for firefox with dark green colors.", - "image": "assets/img/themes/Minimalist-DarkGreen.gif", - "tags": [ - "andev0x", - "dark", - "green", - "minimalist" - ], - "repository": "https://github.com/andev0x/Minimalist-DarkGreen", - "pushed_at": "2025-08-13T05:32:28Z", - "stargazers_count": 3, - "avatar": "https://avatars.githubusercontent.com/u/152575252?v=4" - }, - { - "title": "Material Fox Updated", - "link": "https://github.com/edelvarden/material-fox-updated", - "description": "🦊 Firefox user CSS theme looks similar to Chrome.", - "image": "assets/img/themes/material-fox-updated-preview.webp", - "tags": [ - "dark", - "light", - "rtl", - "customizable", - "material", - "material-design", - "refresh", - "modern", - "updated" - ], - "repository": "https://github.com/edelvarden/material-fox-updated", - "pushed_at": "2025-08-29T18:54:12Z", - "stargazers_count": 652, - "avatar": "https://avatars.githubusercontent.com/u/42596339?v=4" - }, - { - "title": "MiniSthetic_Firefox", - "link": "https://github.com/ashish-kus/MiniSthetic_Firefox", - "description": "Minimal Aesthetic Firefox CSS", - "image": "assets/img/themes/remote-118-ministhetic-firefox.gif", - "tags": [ - "Minimal Aesthetic Firefox CSS", - "theme type: dark", - "Minimal", - "Aesthetic" - ], - "repository": "https://github.com/ashish-kus/MiniSthetic_Firefox", - "pushed_at": "2025-01-12T05:02:51Z", - "stargazers_count": 18, - "avatar": "https://avatars.githubusercontent.com/u/78788195?v=4" - }, - { - "title": "VP-NightSky", - "link": "https://github.com/VertexProximity/VP_NightSky", - "description": "Firefox reimagined", - "image": "assets/img/themes/NightSky.webp", - "tags": [ - "VertexProximity", - "theme type: dark", - "theme type: Purple" - ], - "repository": "https://github.com/VertexProximity/VP_NightSky", - "pushed_at": "2025-10-22T05:03:17Z", - "stargazers_count": 2, - "avatar": "https://avatars.githubusercontent.com/u/121351756?v=4" - }, - { - "title": "cyanmatrx", - "link": "https://github.com/Barnacl437/cyanmatrx", - "description": "a simple, cool-esque, cyan monospace theme.", - "image": "assets/img/themes/cyanmatrx.webp", - "tags": [ - "cyanmatrx", - "theme type: dark", - "theme type: cyan", - "minimal" - ], - "repository": "https://github.com/Barnacl437/cyanmatrx", - "pushed_at": "2025-06-13T15:42:36Z", - "stargazers_count": 1, - "avatar": "https://avatars.githubusercontent.com/u/87983017?v=4" - }, - { - "title": "DownToneUI", - "link": "https://github.com/oviung/DownToneUI-Firefox", - "description": "A modular UI customization for Firefox, using Sidebery for vertical tabs.", - "image": "assets/img/themes/remote-121-downtoneui.gif", - "tags": [ - "theme type: dark", - "vertical", - "sidebery" - ], - "repository": "https://github.com/oviung/DownToneUI-Firefox", - "pushed_at": "2026-03-09T16:39:58Z", - "stargazers_count": 63, - "avatar": "https://avatars.githubusercontent.com/u/8101674?v=4" - }, - { - "title": "Firefox Moonlight Theme", - "link": "https://github.com/sinazadeh/Firefox-Moonlight-Theme", - "description": "A sleek and modern dark blue Firefox theme with smooth, rounded elements for a refined browsing experience.", - "image": "assets/img/themes/remote-122-firefox-moonlight-theme.webp", - "tags": [ - "Sina", - "dark", - "blue", - "round", - "cerulean" - ], - "repository": "https://github.com/sinazadeh/Firefox-Moonlight-Theme", - "pushed_at": "2025-02-13T22:08:42Z", - "stargazers_count": 4, - "avatar": "https://avatars.githubusercontent.com/u/63080674?v=4" - }, - { - "title": "Elegant Floorp", - "link": "https://github.com/Mingo-coder/Elegant-Floorp/releases/download/v1.0/Elegant_Floorp.zip", - "description": "Default Floorp Fluential UI modded", - "image": "assets/img/themes/elegant_floorp.webp", - "tags": [ - "Mingo-coder", - "theme type: dark", - "theme type: light", - "Floorp" - ], - "repository": "https://github.com/Mingo-coder/Elegant-Floorp", - "pushed_at": "2025-04-06T03:53:06Z", - "stargazers_count": 0, - "avatar": "https://avatars.githubusercontent.com/u/177513443?v=4" - }, - { - "title": "Sakuras Simple Sidebar", - "link": "https://github.com/SakuraMeadows/Sakuras-Simple-Sidebar", - "description": "A simple Firefox theme using Sidebery sidebar.", - "image": "assets/img/themes/remote-124-sakuras-simple-sidebar.gif", - "tags": [ - "SakuraMeadows", - "theme type: dark", - "theme type: light", - "vertical", - "sidebery", - "catppuccin", - "simple", - "sidebar" - ], - "repository": "https://github.com/SakuraMeadows/Sakuras-Simple-Sidebar", - "pushed_at": "2025-12-28T03:03:45Z", - "stargazers_count": 22, - "avatar": "https://avatars.githubusercontent.com/u/93335748?v=4" - }, - { - "title": "LittleFox", - "link": "https://github.com/biglavis/LittleFox", - "description": "A minimalistic, mouse centered CSS theme for FireFox.", - "image": "assets/img/themes/remote-125-littlefox.webp", - "tags": [ - "simple", - "compact", - "minimal", - "oneline" - ], - "repository": "https://github.com/biglavis/LittleFox", - "pushed_at": "2026-04-04T02:42:51Z", - "stargazers_count": 31, - "avatar": "https://avatars.githubusercontent.com/u/105270868?v=4" - }, - { - "title": "FlexFox", - "link": "https://github.com/yuuqilin/FlexFox", - "description": "A lightweight Firefox theme focused on usability, flexibility, and smooth performance.", - "image": "assets/img/themes/remote-126-flexfox.webp", - "tags": [ - "lightweight", - "minimal", - "Sidebery", - "Mica", - "flexible" - ], - "repository": "https://github.com/yuuqilin/FlexFox", - "pushed_at": "2026-03-22T09:21:39Z", - "stargazers_count": 240, - "avatar": "https://avatars.githubusercontent.com/u/154042945?v=4" - }, - { - "title": "git userChrome", - "link": "https://github.com/soulhotel/git-userChrome", - "description": "An automation tool for installing userChrome Themes", - "image": "assets/img/themes/remote-127-git-userchrome.gif", - "tags": [ - "git", - "tool", - "firefox", - "userChrome", - "automation" - ], - "repository": "https://github.com/soulhotel/git-userChrome", - "pushed_at": "2025-08-27T21:28:32Z", - "stargazers_count": 51, - "avatar": "https://avatars.githubusercontent.com/u/155501797?v=4" - }, - { - "title": "Gruvbox GNOMEish", - "link": "https://github.com/xslhub/gruvbox-gnomeish-firefox-theme", - "description": "A minimal Firefox theme inspired by the aesthetics of Gruvbox and GNOME. ", - "image": "assets/img/themes/remote-128-gruvbox-gnomeish.webp", - "tags": [ - "xslhub", - "theme type: dark", - "gruvbox", - "GNOME" - ], - "repository": "https://github.com/xslhub/gruvbox-gnomeish-firefox-theme", - "pushed_at": "2025-10-14T20:58:43Z", - "stargazers_count": 6, - "avatar": "https://avatars.githubusercontent.com/u/158527507?v=4" - }, - { - "title": "Parfait", - "link": "https://github.com/reizumii/parfait", - "description": "A tasty theme modification for Firefox 🦊", - "image": "assets/img/themes/parfait.webp", - "tags": [ - "reizumii", - "sidebar", - "vertical tabs", - "minimal", - "lightweight", - "compact" - ], - "repository": "https://github.com/reizumii/parfait", - "pushed_at": "2026-04-08T10:34:11Z", - "stargazers_count": 106, - "avatar": "https://avatars.githubusercontent.com/u/204603744?v=4" - }, - { - "title": "NewFox", - "link": "https://github.com/Mr-the-beginner/NewFox", - "description": "A minimal medieval animated theme for Firefox", - "image": "assets/img/themes/remote-130-newfox.webp", - "tags": [ - "Mr-the-beginner", - "theme type: Auto", - "minimal", - "medieval", - "animated", - "lightweight" - ], - "repository": "https://github.com/Mr-the-beginner/NewFox", - "pushed_at": "2026-04-08T19:55:52Z", - "stargazers_count": 83, - "avatar": "https://avatars.githubusercontent.com/u/134204793?v=4" - }, - { - "title": "TransparentFox", - "link": "https://github.com/ScanuNicco/TransperentFox", - "description": "Simple transparent title bar theme for Firefox and Thunderbird", - "image": "assets/img/themes/remote-131-transparentfox.webp", - "tags": [ - "ScanuRag", - "theme type: dark", - "transparent", - "firefox", - "thunderbird" - ], - "repository": "https://github.com/ScanuNicco/TransperentFox", - "avatar": "https://avatars.githubusercontent.com/u/30136040?v=4", - "pushed_at": "2026-01-22T04:35:52Z", - "stargazers_count": 4 - }, - { - "title": "wmfox", - "link": "https://github.com/cankurttekin/wmfox", - "description": "Minimalist keyboard oriented theme with tab numbering for easier navigation.", - "image": "assets/img/themes/remote-132-wmfox.webp", - "tags": [ - "cankurttekin/wmfox", - "theme type: dark", - "theme type: light", - "sway", - "i3", - "tab numbers", - "wm", - "keyboard" - ], - "repository": "https://github.com/cankurttekin/wmfox", - "pushed_at": "2026-03-11T16:19:30Z", - "stargazers_count": 2, - "avatar": "https://avatars.githubusercontent.com/u/29798399?v=4" - }, - { - "title": "Fennec", - "link": "https://github.com/tompassarelli/fennec", - "description": "Minimal, customizable Firefox/LibreWolf setup with Zen-style sidebar workflow — no fork, no build.", - "image": "assets/img/themes/remote-133-fennec.webp", - "tags": [ - "tompassarelli", - "dark", - "light", - "minimal", - "sidebar", - "Sidebery", - "vertical tabs", - "keyboard", - "LibreWolf", - "lightweight" - ], - "repository": "https://github.com/tompassarelli/fennec", - "pushed_at": "2026-04-10T17:22:48Z", - "stargazers_count": 53, - "avatar": "https://avatars.githubusercontent.com/u/6378995?v=4" - }, - { - "title": "Dynamic Color", - "link": "https://github.com/zachvlat/Dynamic-Color-Firefox-Theme", - "description": "Dark, dynamic (based on the system's accent color), theme for Firefox ", - "image": "assets/img/themes/remote-134-dynamic-color.webp", - "tags": [ - "zachvlat", - "dark", - "lightweight", - "dynamic", - "accent" - ], - "repository": "https://github.com/zachvlat/Dynamic-Color-Firefox-Theme", - "pushed_at": "2026-04-10T13:47:54Z", - "stargazers_count": 7, - "avatar": "https://avatars.githubusercontent.com/u/28532979?v=4" - } -] diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..801d1ab1 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,6 @@ +{ + "extends": "astro/tsconfigs/strict", + "compilerOptions": { + "baseUrl": "." + } +}