[
  {
    "path": ".changeset/README.md",
    "content": "# Changesets\n\nHello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works\nwith multi-package repos, or single-package repos to help you version and publish your code. You can\nfind the full documentation for it [in our repository](https://github.com/changesets/changesets)\n\nWe have a quick list of common questions to get you started engaging with this project in\n[our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md)\n"
  },
  {
    "path": ".changeset/config.json",
    "content": "{\n  \"$schema\": \"https://unpkg.com/@changesets/config@1.6.1/schema.json\",\n  \"changelog\": [\"@changesets/changelog-github\", {\"repo\": \"primer/octicons\"}],\n  \"commit\": false,\n  \"linked\": [],\n  \"access\": \"public\",\n  \"baseBranch\": \"main\",\n  \"updateInternalDependencies\": \"patch\",\n  \"ignore\": []\n}\n"
  },
  {
    "path": ".github/CODEOWNERS",
    "content": "*        @primer/engineer-reviewers\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug-report.md",
    "content": "---\nname: 🐞 Bug report\nabout: Report a bug in Octicons \ntitle: \"[Bug] \"\nlabels: \"bug, octicon\"\nassignees: ''\n\n---\n\n<!-- Note: When including screenshots, images, and other visual media, please include alt text or, if there are several of them, a higher level written explanation of what's represented in the images. -->\n\n### Describe the bug\n_Include a clear and concise description of what the bug is._\n\n\n### Steps to reproduce\nSteps to reproduce the behavior:\n1. Go to '...'\n2. Click on '....'\n3. Scroll down to '....'\n4. See error\n\n### Expected behavior\n_Include a clear and concise description of what you expected to happen if there was no bug._\n\n### Screenshots\n_Please add screenshots to help explain the problem._\n\n### Device details\n\n**Desktop (please complete the following information):**\n - OS: [e.g. iOS]\n - Browser [e.g. chrome, safari]\n - Version [e.g. 22]\n\n**Smartphone (please complete the following information):**\n - Device: [e.g. iPhone6]\n - OS: [e.g. iOS8.1]\n - Browser [e.g. stock browser, safari]\n - Version [e.g. 22]\n\n### Additional info\n_Add any other information relevant to the problem here._\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "content": "blank_issues_enabled: true\n\ncontact_links:\n    - name: Add to the Octicon library?\n      url: https://github.com/github/primer\n      about: Open an issue in github/primer (for GitHub staff only!)\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feedback.md",
    "content": "---\nname: 💬 Feedback and ideas\nabout: Suggest improvements or give feedback on icon designs\ntitle: \"[Feedback] \"\nlabels: \"octicon, type: feedback\"\nassignees: ''\n\n---\n\n<!-- Note: When including screenshots, images, and other visual media, please include alt text or, if there are several of them, a higher level written explanation of what's represented in the images. -->\n\n### Describe the topic\n\n_You have an idea, feedback or suggestion for icons to add to Octicons, tell us all about it! Add as much detail as you can: what is your idea, why is it relevant, what should change, how will it improve the Octicons library?_\n\n\n### Anything else?\n\n_Include anything else you think may be relevant to understand the issue._\n"
  },
  {
    "path": ".github/actions/build_node/Dockerfile",
    "content": "FROM node:24-slim\n\nRUN apt-get update && \\\n    apt-get install --no-install-recommends -y \\\n        jq && \\\n        apt-get clean -y && \\\n    rm -rf /var/lib/apt/lists/*\n\nADD entrypoint.sh /entrypoint.sh\nENTRYPOINT [\"/entrypoint.sh\"]\n"
  },
  {
    "path": ".github/actions/build_node/entrypoint.sh",
    "content": "#!/bin/bash -l\n\nset -e\n\nPACKAGE_VERSION=$(jq '.version' --raw-output ./package.json)\n\necho \"************* Building v$PACKAGE_VERSION *************\"\n\nPUBLISH_TAG=latest\nif [[ \"$PACKAGE_VERSION\" =~ ^0\\.0\\.0\\- ]]\nthen\n  PUBLISH_TAG=canary\nelif [[ \"$PACKAGE_VERSION\" =~ \\-rc ]]\nthen\n  PUBLISH_TAG=next\nfi\n\ncd ./lib/\"$*\"\n\necho \"**************** Copying assets files to build directory ****************\"\ncp -R ../build/ .\n\necho \"**************** Installing ****************\"\nnpm install --legacy-peer-deps\n\necho \"**************** Building ****************\"\nnpm run build\n\n{\n  echo \"**************** Publishing ****************\"\n  npm version --allow-same-version \"$PACKAGE_VERSION\" && npm publish --tag $PUBLISH_TAG --access public\n} || {\n  # Bail out of publishing\n  exit 0\n}\n"
  },
  {
    "path": ".github/actions/build_ruby/Dockerfile",
    "content": "FROM ruby:3.0\n\nRUN apt-get update && \\\n    apt-get install --no-install-recommends -y \\\n        jq && \\\n        apt-get clean -y && \\\n    rm -rf /var/lib/apt/lists/*\n\nADD entrypoint.sh /entrypoint.sh\nENTRYPOINT [\"/entrypoint.sh\"]\n"
  },
  {
    "path": ".github/actions/build_ruby/entrypoint.sh",
    "content": "#!/bin/bash -l\n\nset -e\n\nPACKAGE_VERSION=$(jq '.version' --raw-output ./package.json)\n\nPACKAGE_VERSION=$(echo $PACKAGE_VERSION | sed -e 's/^0\\.0\\.0./0.0.0.pre./g')\nPACKAGE_VERSION=$(echo $PACKAGE_VERSION | sed -e 's/-rc/.pre/g')\n\necho \"************* Building v$PACKAGE_VERSION *************\"\n\n# Setup rubygems creds\nmkdir -p ~/.gem\ncat << EOF > ~/.gem/credentials\n---\n:rubygems_api_key: ${RUBYGEMS_TOKEN}\nEOF\nchmod 0600 ~/.gem/credentials\n\ncd ./lib/$*\n\necho \"**************** Copying assets files to build directory ****************\"\ncp -R ../build lib/\n\nperl -pi -e \"s/\\\"octicons\\\", \\\"[^\\\"]+\\\"/\\\"octicons\\\", \\\"${PACKAGE_VERSION}\\\"/\" ./Gemfile ./*.gemspec\n\necho \"**************** Installing ****************\"\nbundle install\n\necho \"**************** Versioning ****************\"\nbundle exec rake version\\[\"$PACKAGE_VERSION\"\\]\n\nbundle update\n\necho \"**************** Building ****************\"\nbundle exec rake build\nGEM_PUSH_OUTPUT=$(gem push pkg/*.gem 2>&1) || {\n  echo \"$GEM_PUSH_OUTPUT\"\n  echo \"$GEM_PUSH_OUTPUT\" | grep -q \"Repushing of gem versions is not allowed\" || exit 1\n}\n"
  },
  {
    "path": ".github/actions/python/requirements.txt",
    "content": "picosvg~=0.20.6"
  },
  {
    "path": ".github/actions/version/Dockerfile",
    "content": "FROM node:10-slim\n\nWORKDIR /\nCOPY . /\nRUN npm install\n\nENTRYPOINT [ \"node\", \"/entrypoint.js\" ]\n"
  },
  {
    "path": ".github/actions/version/entrypoint.js",
    "content": "const fs = require('fs')\nconst {\n  resolve\n} = require('path')\n const {\n  GITHUB_REF,\n  GITHUB_SHA\n} = process.env\n\n// Octicons package\nconst pkg = require(resolve(process.cwd(), 'package.json'))\n\n// GitHub info\nconst branchName = GITHUB_REF.replace('refs/heads/', '')\nconst shortSha = GITHUB_SHA.slice(0,7)\nlet releaseMatch = null\n\nconst writePackageJson = () => {\n  fs.writeFileSync('package.json', JSON.stringify(pkg, null, 2), 'utf8')\n}\n\n// If it's a release branch\nif (releaseMatch = branchName.match(/^release-([\\d\\.]+)/i)) {\n  console.log('Versioning release candidate')\n  console.log(`${pkg.version} => ${releaseMatch[1]}`)\n  pkg.version = `${releaseMatch[1]}-rc.${shortSha}`\n  writePackageJson()\n}\n\n // Otherwise\nelse if (branchName != 'main') {\n  const newVersion = `0.0.0-${shortSha}`\n  console.log('Versioning prerelease')\n  console.log(`${pkg.version} => ${newVersion}`)\n  pkg.version = newVersion\n  writePackageJson()\n}\n"
  },
  {
    "path": ".github/dependabot.yml",
    "content": "# To get started with Dependabot version updates, you'll need to specify which\n# package ecosystems to update and where the package manifests are located.\n# Please see the documentation for all configuration options:\n# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates\n\nversion: 2\nupdates:\n  - package-ecosystem: \"npm\" # See documentation for possible values\n    directory: \"/docs\" # Location of package manifests\n    schedule:\n      interval: \"daily\"\n    allow:\n      - dependency-name: \"@primer/gatsby-theme-doctocat\"\n"
  },
  {
    "path": ".github/workflows/add-to-inbox.yml",
    "content": "name: Add to Inbox 📥\non:\n  issues:\n    types: [opened, reopened]\n\njobs:\n  add-to-inbox:\n    if: ${{ github.repository == 'primer/behaviors' }}\n    runs-on: ubuntu-latest\n    env:\n      ISSUE_URL: ${{ github.event.issue.html_url }}\n      PROJECT_ID: 4503\n    steps:\n      - id: get-primer-access-token\n        uses: actions/create-github-app-token@v1\n        with:\n          app-id: ${{ vars.PRIMER_ISSUE_TRIAGE_APP_ID }}\n          private-key: ${{ secrets.PRIMER_ISSUE_TRIAGE_APP_PRIVATE_KEY }}\n      - name: Add labels to issue\n        run: |\n          gh issue edit $ISSUE_URL --add-label 'rails,react'\n        env:\n          GH_TOKEN: ${{ steps.get-primer-access-token.outputs.token }}\n      - id: get-github-access-token\n        uses: actions/create-github-app-token@v1\n        with:\n          app-id: ${{ vars.PRIMER_ISSUE_TRIAGE_APP_ID_FOR_GITHUB }}\n          private-key: ${{ secrets.PRIMER_ISSUE_TRIAGE_APP_PRIVATE_KEY_FOR_GITHUB }}\n          owner: github\n      - name: Add issue to project\n        run: gh project item-add $PROJECT_ID --url $ISSUE_URL --owner github\n        env:\n          GH_TOKEN: ${{ steps.get-github-access-token.outputs.token }}\n"
  },
  {
    "path": ".github/workflows/check_for_changeset.yml",
    "content": "name: Check for changeset\n\non:\n  pull_request:\n    types:\n      # On by default if you specify no types.\n      - 'opened'\n      - 'reopened'\n      - 'synchronize'\n      # For `skip-label` only.\n      - 'labeled'\n      - 'unlabeled'\n\njobs:\n  check-for-changeset:\n    name: Check for changeset\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v3\n      - name: 'Check for changeset'\n        uses: brettcannon/check-for-changed-files@v1\n        with:\n          file-pattern: '.changeset/*.md'\n          skip-label: 'skip-changeset'\n          failure-message: 'No changeset found. If these changes should not result in a new version, apply the ${skip-label} label to this pull request. If these changes should result in a version bump, please add a changeset https://git.io/J6QvQ'\n"
  },
  {
    "path": ".github/workflows/ci.yml",
    "content": "name: CI\non:\n  push:\n    branches:\n      - main\n  pull_request:\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v3\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 20\n      - run: yarn\n      - name: Building\n        run: yarn build\n      - run: cp -r icons lib/build/svg\n      - uses: actions/upload-artifact@v4\n        with:\n          name: octicons-build\n          path: ./lib/build\n\n  main:\n    name: Main project\n    needs: build\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v3\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 20\n      - uses: actions/download-artifact@v4\n        with:\n          name: octicons-build\n          path: ./lib/build\n      - run: yarn\n      - name: Lint\n        run: yarn lint\n      - name: Test\n        run: yarn test\n\n  octicons_node:\n    name: 'npm:@primer/octicons'\n    needs: build\n    runs-on: ubuntu-latest\n    defaults:\n      run:\n        working-directory: ./lib/octicons_node\n    steps:\n      - uses: actions/checkout@v3\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 20\n      - uses: actions/download-artifact@v4\n        with:\n          name: octicons-build\n          path: ./lib/build\n      - run: yarn\n      - name: Building\n        run: yarn build\n      - name: Lint\n        run: yarn lint\n      - name: Test\n        run: yarn test\n\n  octicons_react:\n    name: 'npm:@primer/octicons-react'\n    needs: build\n    runs-on: ubuntu-latest\n    defaults:\n      run:\n        working-directory: ./lib/octicons_react\n    steps:\n      - uses: actions/checkout@v3\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 20\n      - uses: actions/download-artifact@v4\n        with:\n          name: octicons-build\n          path: ./lib/build\n      - run: yarn\n      - name: Building\n        run: yarn build\n      - name: Lint\n        run: yarn lint\n      - name: Test\n        run: yarn test\n      - name: Types\n        run: |\n          # Run @arethetypeswrong/cli\n          npx @arethetypeswrong/cli --pack .\n\n          # Run publint\n          npx publint@0.2.12 . --strict\n\n  octicons_gem:\n    name: 'gem:octicons'\n    needs: build\n    runs-on: ubuntu-latest\n    defaults:\n      run:\n        working-directory: ./lib/octicons_gem\n    steps:\n      - uses: actions/checkout@v3\n      - name: Setup Ruby\n        uses: ruby/setup-ruby@v1\n        with:\n          ruby-version: 3.3\n          bundler-cache: true\n      - uses: actions/download-artifact@v4\n        with:\n          name: octicons-build\n          path: ./lib/octicons_gem/lib/build\n      - run: bundle install\n      - name: Linting\n        run: bundle exec rake lint\n      - name: Testing\n        run: bundle exec rake test\n      - name: Build\n        run: bundle exec rake build\n      - uses: actions/upload-artifact@v4\n        with:\n          name: octicons-gem\n          path: ./lib/octicons_gem/pkg\n\n  octicons_helper:\n    name: 'gem:octicons_helper'\n    needs: octicons_gem\n    runs-on: ubuntu-latest\n    defaults:\n      run:\n        working-directory: ./lib/octicons_helper\n    steps:\n      - uses: actions/checkout@v3\n      - name: Setup Ruby\n        uses: ruby/setup-ruby@v1\n        with:\n          ruby-version: 3.3\n          bundler-cache: true\n      - uses: actions/download-artifact@v4\n        with:\n          name: octicons-gem\n          path: ./lib/octicons_helper/vendor/cache\n      - name: Run bundle install\n        run: bundle config set --local disable_checksum_validation true && bundle install\n      - name: Linting\n        run: bundle exec rake lint\n      - name: Testing\n        run: bundle exec rake test\n\n  octicons_jekyll:\n    name: 'gem:octicons_jekyll'\n    needs: octicons_gem\n    runs-on: ubuntu-latest\n    defaults:\n      run:\n        working-directory: ./lib/octicons_jekyll\n    steps:\n      - uses: actions/checkout@v3\n      - name: Setup Ruby\n        uses: ruby/setup-ruby@v1\n        with:\n          ruby-version: 3.3\n          bundler-cache: true\n      - uses: actions/download-artifact@v4\n        with:\n          name: octicons-gem\n          path: ./lib/octicons_jekyll/vendor/cache\n      - name: Run bundle install\n        run: bundle config set --local disable_checksum_validation true && bundle install\n      - name: Linting\n        run: bundle exec rake lint\n      - name: Testing\n        run: bundle exec rake test\n"
  },
  {
    "path": ".github/workflows/codeql.yml",
    "content": "# For most projects, this workflow file will not need changing; you simply need\n# to commit it to your repository.\n#\n# You may wish to alter this file to override the set of languages analyzed,\n# or to provide custom queries or build logic.\n#\n# ******** NOTE ********\n# We have attempted to detect the languages in your repository. Please check\n# the `language` matrix defined below to confirm you have the correct set of\n# supported CodeQL languages.\n#\nname: \"CodeQL\"\n\non:\n  push:\n    branches: [ \"main\" ]\n  pull_request:\n    # The branches below must be a subset of the branches above\n    branches: [ \"main\" ]\n  schedule:\n    - cron: '28 7 * * 3'\n\njobs:\n  analyze:\n    name: Analyze\n    runs-on: ubuntu-latest\n    permissions:\n      actions: read\n      contents: read\n      security-events: write\n\n    strategy:\n      fail-fast: false\n      matrix:\n        language: [ 'javascript', 'ruby' ]\n        # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]\n        # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support\n\n    steps:\n    - name: Checkout repository\n      uses: actions/checkout@v3\n\n    # Initializes the CodeQL tools for scanning.\n    - name: Initialize CodeQL\n      uses: github/codeql-action/init@v2\n      with:\n        languages: ${{ matrix.language }}\n        # If you wish to specify custom queries, you can do so here or in a config file.\n        # By default, queries listed here will override any specified in a config file.\n        # Prefix the list here with \"+\" to use these queries and those in the config file.\n        \n        # Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs\n        # queries: security-extended,security-and-quality\n\n        \n    # Autobuild attempts to build any compiled languages  (C/C++, C#, or Java).\n    # If this step fails, then you should remove it and run the build manually (see below)\n    - name: Autobuild\n      uses: github/codeql-action/autobuild@v2\n\n    # ℹ️ Command-line programs to run using the OS shell.\n    # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun\n\n    #   If the Autobuild fails above, remove it and uncomment the following three lines. \n    #   modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance.\n\n    # - run: |\n    #   echo \"Run, Build Application using script\"\n    #   ./location_of_script_within_repo/buildscript.sh\n\n    - name: Perform CodeQL Analysis\n      uses: github/codeql-action/analyze@v2\n"
  },
  {
    "path": ".github/workflows/optimize.yml",
    "content": "on: \n  push:\n    paths:\n      - 'icons/**'\n      - '.github/workflows/optimize.yml'\n      - '.github/actions/python/requirements.txt'\n  pull_request:\n    paths:\n      - 'icons/**'\n      - '.github/workflows/optimize.yml'\n      - '.github/actions/python/requirements.txt'\nname: Optimize SVGs\njobs:\n  optimize:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@master\n\n      - uses: actions/setup-python@v4\n        with:\n          python-version: '3.10' \n          cache: 'pip'\n      - run: pip install -r .github/actions/python/requirements.txt\n      - run: for icon in icons/*; do picosvg $icon --output_file $icon; done\n\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 18\n      - run: npm install\n      - run: npm run svgo\n\n      - uses: EndBug/add-and-commit@v4\n        with:\n          add: 'icons'\n          message: 'Optimize SVGs'\n          author_email: actions@github.com\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n"
  },
  {
    "path": ".github/workflows/publish.yml",
    "content": "on:\n  release:\n    types: [published]\n  workflow_dispatch:\n\npermissions:\n  id-token: write # Required for OIDC\n  contents: read\n  checks: write\n  statuses: write\n\nname: Octicons Publish\njobs:\n  setup:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@master\n      - uses: actions/setup-node@v6\n        with:\n          node-version: 24\n      - run: npm install\n      - run: npm run build\n      - run: cp -r icons lib/build/svg\n      - uses: actions/upload-artifact@v4\n        with:\n          name: octicons\n          path: ./lib/build\n  gem:\n    runs-on: ubuntu-latest\n    needs: setup\n    steps:\n      - uses: actions/checkout@master\n      - uses: actions/download-artifact@v4\n        with:\n          name: octicons\n          path: ./lib/build\n      - uses: ./.github/actions/build_ruby\n        env:\n          RUBYGEMS_TOKEN: ${{ secrets.RUBYGEMS_TOKEN }}\n        with:\n          args: octicons_gem\n      - run: ls ./lib/octicons_gem/pkg\n      - uses: actions/upload-artifact@v4\n        with:\n          name: octicons_gem\n          path: ./lib/octicons_gem/pkg\n  helper:\n    runs-on: ubuntu-latest\n    needs: gem\n    steps:\n      - uses: actions/checkout@master\n      - uses: actions/download-artifact@v4\n        with:\n          name: octicons\n          path: ./lib/build\n      - uses: actions/download-artifact@v4\n        with:\n          name: octicons_gem\n          path: ./lib/octicons_helper/vendor/cache\n      - uses: ./.github/actions/build_ruby\n        env:\n          RUBYGEMS_TOKEN: ${{ secrets.RUBYGEMS_TOKEN }}\n        with:\n          args: octicons_helper\n  jekyll:\n    runs-on: ubuntu-latest\n    needs: gem\n    steps:\n      - uses: actions/checkout@master\n      - uses: actions/download-artifact@v4\n        with:\n          name: octicons\n          path: ./lib/build\n      - uses: actions/download-artifact@v4\n        with:\n          name: octicons_gem\n          path: ./lib/octicons_jekyll/vendor/cache\n      - uses: ./.github/actions/build_ruby\n        env:\n          RUBYGEMS_TOKEN: ${{ secrets.RUBYGEMS_TOKEN }}\n        with:\n          args: octicons_jekyll\n  node:\n    runs-on: ubuntu-latest\n    needs: setup\n    steps:\n      - uses: actions/checkout@master\n      - uses: actions/download-artifact@v4\n        with:\n          name: octicons\n          path: ./lib/build\n      - uses: ./.github/actions/build_node\n        with:\n          args: octicons_node\n  react:\n    runs-on: ubuntu-latest\n    needs: setup\n    steps:\n      - uses: actions/checkout@master\n      - uses: actions/download-artifact@v4\n        with:\n          name: octicons\n          path: ./lib/build\n      - name: Build @primer/octicons-react\n        uses: ./.github/actions/build_node\n        with:\n          args: octicons_react\n      - name: Build @primer/styled-octicons\n        uses: ./.github/actions/build_node\n        with:\n          args: octicons_styled\n"
  },
  {
    "path": ".github/workflows/release.yml",
    "content": "name: Release\non:\n  push:\n    branches:\n      - \"main\"\n      - \"next_major\"\njobs:\n  release:\n    name: Final\n    if: ${{ github.repository == 'primer/octicons' }}\n\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout repository\n        uses: actions/checkout@v3\n        with:\n          # This makes Actions fetch all Git history so that Changesets can generate changelogs with the correct commits\n          fetch-depth: 0\n          persist-credentials: false\n\n      - name: Set up Node.js\n        uses: actions/setup-node@v6\n        with:\n          node-version: 24\n\n      - name: Setup Ruby\n        uses: ruby/setup-ruby@v1\n        with:\n          ruby-version: 3.2\n          bundler-cache: true\n\n      - name: Install dependencies\n        run: |\n          yarn\n          bundle install\n\n      - id: get-access-token\n        uses: camertron/github-app-installation-auth-action@v1\n        with:\n          app-id: ${{ vars.PRIMER_APP_ID_SHARED }}\n          private-key: ${{ secrets.PRIMER_APP_PRIVATE_KEY_SHARED }}\n          client-id: ${{ vars.PRIMER_APP_CLIENT_ID_SHARED }}\n          client-secret: ${{ secrets.PRIMER_APP_CLIENT_SECRET_SHARED }}\n          installation-id: ${{ vars.PRIMER_APP_INSTALLATION_ID_SHARED }}\n\n      - name: Create release pull request or publish to npm\n        id: changesets\n        uses: changesets/action@master\n        with:\n          title: Release Tracking\n          version: yarn changeset:version\n          publish: script/changeset-publish\n        env:\n          GITHUB_TOKEN: ${{ steps.get-access-token.outputs.access-token }}\n"
  },
  {
    "path": ".github/workflows/stale.yml",
    "content": "name: Stale\non:\n  schedule:\n    - cron: '0 * * * *'\n\njobs:\n  stale:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/stale@v4\n        with:\n\n          # General settings\n          days-before-stale: 60\n          days-before-close: 7\n          enable-statistics: true\n          operations-per-run: 100\n          remove-stale-when-updated: true\n\n          # PR specific settings\n          delete-branch: true\n          stale-pr-message: \"Hi! This pull request has been marked as stale because it has been open with no activity for 60 days. You can comment on the pull request or remove the stale label to keep it open. If you do nothing, this pull request will be closed in 7 days.\"\n\n          # Issue specific settings\n          days-before-issue-stale: 180\n          stale-issue-message: \"Hi! This issue has been marked as stale because it has been open with no activity for 180 days. You can comment on the issue or remove the stale label to keep it open. If you do nothing, this issue will be closed in 7 days.\"\n"
  },
  {
    "path": ".gitignore",
    "content": "*.gem\n/package-lock.json\n*.log\n.DS_Store\n.bundle\n.env\nnode_modules\nvendor\nGemfile.lock\n\n# Ignore build/export artifacts\nlib/**/build/\n\n# Gatsby\npublic\n.cache\n\n# Now\n.now\n"
  },
  {
    "path": ".npmrc",
    "content": "save-exact=true\npackage-lock=false\n"
  },
  {
    "path": ".rubocop.yml",
    "content": "inherit_gem:\n  rubocop-github:\n    - config/default.yml\n    - config/rails.yml\nAllCops:\n  NewCops: enable\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "# Changelog\n\n## 19.23.1\n\n### Patch Changes\n\n- [#1175](https://github.com/primer/octicons/pull/1175) [`ea8e6bb7`](https://github.com/primer/octicons/commit/ea8e6bb79894cc7e85564ee9b53d86b418738d04) Thanks [@kylewaynebenson](https://github.com/kylewaynebenson)! - - Remove set fill from svgs\n\n## 19.23.0\n\n### Minor Changes\n\n- [#1165](https://github.com/primer/octicons/pull/1165) [`63bc8d01`](https://github.com/primer/octicons/commit/63bc8d01e4c51ebc34abdac1bdb861cf209f7cf0) Thanks [@kylewaynebenson](https://github.com/kylewaynebenson)! - - Addition of lockup icon\n  - adjustments to logo and mark\n\n## 19.22.1\n\n### Patch Changes\n\n- [#1169](https://github.com/primer/octicons/pull/1169) [`6567d755`](https://github.com/primer/octicons/commit/6567d755f30c18e44d8fd069abb974cf078bd2d4) Thanks [@francinelucca](https://github.com/francinelucca)! - various dep updates\n\n## 19.22.0\n\n### Minor Changes\n\n- [#1157](https://github.com/primer/octicons/pull/1157) [`18e3b9fd`](https://github.com/primer/octicons/commit/18e3b9fd74c4bc85b1add3624a082fc0f6fd36c2) Thanks [@janmaarten-a11y](https://github.com/janmaarten-a11y)! - Add book-locked icon\n  Add comment-locked icon\n  Add issue-locked icon\n  Add git-pull-request-locked icon\n\n## 19.21.2\n\n### Patch Changes\n\n- [#1146](https://github.com/primer/octicons/pull/1146) [`41c78057`](https://github.com/primer/octicons/commit/41c780575654fe4fef3fc4e91a46c8c0e91b233b) Thanks [@rezrah](https://github.com/rezrah)! - Updated GitHub brand logos (`mark-github` and `logo-github`) to 2026 versions.\n\n## 19.21.1\n\n### Patch Changes\n\n- [#1137](https://github.com/primer/octicons/pull/1137) [`97cefc9f`](https://github.com/primer/octicons/commit/97cefc9fcb19f91133cffd557cc1f308e384ffb2) Thanks [@dependabot](https://github.com/apps/dependabot)! - Bump js-yaml from 3.13.1 to 4.1.1\n\n## 19.21.0\n\n### Minor Changes\n\n- [#1132](https://github.com/primer/octicons/pull/1132) [`c5411b04`](https://github.com/primer/octicons/commit/c5411b048090e13a0e6ffafaa10efdc24a8e05b5) Thanks [@mperrotti](https://github.com/mperrotti)! - Adds icons used for Copilot Loops\n\n* [#1134](https://github.com/primer/octicons/pull/1134) [`131fbedc`](https://github.com/primer/octicons/commit/131fbedc579b6ebc07716dc02ed947a168c560f2) Thanks [@mperrotti](https://github.com/mperrotti)! - Adds icons used for Copilot Markdown text wrapping options\n\n- [#1133](https://github.com/primer/octicons/pull/1133) [`94ceabb7`](https://github.com/primer/octicons/commit/94ceabb7e1371eefd8ba26ec8eb59cf6149e7a29) Thanks [@mperrotti](https://github.com/mperrotti)! - Adds icons used for feedback dialogs\n\n### Patch Changes\n\n- [#1135](https://github.com/primer/octicons/pull/1135) [`be5df35d`](https://github.com/primer/octicons/commit/be5df35d390439f972af3adbd9ec59d38ec4c624) Thanks [@mperrotti](https://github.com/mperrotti)! - Updates VS Code icon to closer match the real app icon\n\n## 19.20.0\n\n### Minor Changes\n\n- [#1129](https://github.com/primer/octicons/pull/1129) [`68ebe53b`](https://github.com/primer/octicons/commit/68ebe53ba972e391fa2b60458e37348636e202ad) Thanks [@lukasoppermann](https://github.com/lukasoppermann)! - Added InboxFill icon\n\n## 19.19.0\n\n### Minor Changes\n\n- [#1123](https://github.com/primer/octicons/pull/1123) [`1d346555`](https://github.com/primer/octicons/commit/1d34655547b0ae59211967af830d30ae919e0257) Thanks [@mperrotti](https://github.com/mperrotti)! - Adds an icon for AI chat\n\n## 19.18.1\n\n### Patch Changes\n\n- [#1120](https://github.com/primer/octicons/pull/1120) [`370c72c8`](https://github.com/primer/octicons/commit/370c72c8cb511bceb4e096891ff2393e81f87fa3) Thanks [@langermank](https://github.com/langermank)! - Add vscode-32.svg, vscode-48.svg\n\n* [#1122](https://github.com/primer/octicons/pull/1122) [`dcf14c81`](https://github.com/primer/octicons/commit/dcf14c81ca32e4f1cee017a2815c66458a26b2fa) Thanks [@langermank](https://github.com/langermank)! - Add 16 vscode\n\n## 19.18.0\n\n### Minor Changes\n\n- [#1117](https://github.com/primer/octicons/pull/1117) [`13014409`](https://github.com/primer/octicons/commit/13014409ff2cc07191a0d98629d088a5f994a49a) Thanks [@arisacoba](https://github.com/arisacoba)! - Add checkbox-fill-16.svg and checkbox-fill-24.svg\n\n## 19.17.0\n\n### Minor Changes\n\n- [#1115](https://github.com/primer/octicons/pull/1115) [`59a4abf4`](https://github.com/primer/octicons/commit/59a4abf40334cbab7ec76e323255b44fd4ea4a95) Thanks [@CameronFoxly](https://github.com/CameronFoxly)! - Save mcp-16.svg, mcp-24.svg\n\n## 19.16.0\n\n### Minor Changes\n\n- [#1107](https://github.com/primer/octicons/pull/1107) [`4073a521`](https://github.com/primer/octicons/commit/4073a52102527e8e894501314c38c6e100d4f5d0) Thanks [@CameronFoxly](https://github.com/CameronFoxly)! - Add minimize-16.svg, maximize-16.svg, maximize-24.svg, minimize-24.svg\n\n### Patch Changes\n\n- [#1112](https://github.com/primer/octicons/pull/1112) [`36fd097f`](https://github.com/primer/octicons/commit/36fd097f885eb22118417458b6d7b5f4c8e8566c) Thanks [@lukasoppermann](https://github.com/lukasoppermann)! - Adjusted alignment of repo delete, locked and push icon in 16px and 24px\n\n## 19.15.5\n\n### Patch Changes\n\n- [#1102](https://github.com/primer/octicons/pull/1102) [`02cdd0c2`](https://github.com/primer/octicons/commit/02cdd0c2229c5148380e64ae6fe9957efc9e06a2) Thanks [@CameronFoxly](https://github.com/CameronFoxly)! - Update Loop icon for visual alignment\n\n## 19.15.4\n\n### Patch Changes\n\n- [#1099](https://github.com/primer/octicons/pull/1099) [`239cdee1`](https://github.com/primer/octicons/commit/239cdee1b6a2b3ada569aa25e260bf5862b52621) Thanks [@CameronFoxly](https://github.com/CameronFoxly)! - Add spaces, agents, loops, and adjust mention\n\n## 19.15.3\n\n### Patch Changes\n\n- [#1097](https://github.com/primer/octicons/pull/1097) [`ce04eca0`](https://github.com/primer/octicons/commit/ce04eca0b9c33cbc3586abd57386e63d97bff7fa) Thanks [@TylerJDev](https://github.com/TylerJDev)! - Add outlined sparkle icon\n\n## 19.15.2\n\n### Patch Changes\n\n- [#1070](https://github.com/primer/octicons/pull/1070) [`795101e3`](https://github.com/primer/octicons/commit/795101e3a46d6835fb2e091384033d8962ab08d1) Thanks [@smockle](https://github.com/smockle)! - Add `pause` icon\n\n## 19.15.1\n\n### Patch Changes\n\n- [#1078](https://github.com/primer/octicons/pull/1078) [`8c9b6112`](https://github.com/primer/octicons/commit/8c9b611271805a436b306beebd8400b502f4f386) Thanks [@francinelucca](https://github.com/francinelucca)! - fix 24px id-badge asset [#1048](https://github.com/primer/octicons/pull/1048)\n\n* [`818a40c5`](https://github.com/primer/octicons/commit/818a40c5d5dec81ad048f3257f092f660b7c8ee5) Thanks [@jonrohan](https://github.com/jonrohan)! - Update mark-github-24 sizing [#1050](https://github.com/primer/octicons/pull/1050)\n\n## 19.15.0\n\n### Minor Changes\n\n- [#1063](https://github.com/primer/octicons/pull/1063) [`6481783a`](https://github.com/primer/octicons/commit/6481783a5a7258cc4d7981a0510de56be05a2dc3) Thanks [@dylanatsmith](https://github.com/dylanatsmith)! - Add square-circle icon\n\n## 19.14.0\n\n### Minor Changes\n\n- [#1037](https://github.com/primer/octicons/pull/1037) [`7402e69c`](https://github.com/primer/octicons/commit/7402e69c4d928b12340cb2430bb942ae7d96c6ba) Thanks [@jonrohan](https://github.com/jonrohan)! - Update octicons-react to use presentational attributes over inline styles for base styles\n\n* [#1047](https://github.com/primer/octicons/pull/1047) [`48198033`](https://github.com/primer/octicons/commit/481980330efce92501df9a388b27314a3f86f182) Thanks [@joshblack](https://github.com/joshblack)! - Add support for SVG props to base icons\n\n## 19.13.0\n\n### Minor Changes\n\n- [#1041](https://github.com/primer/octicons/pull/1041) [`ef89a78f`](https://github.com/primer/octicons/commit/ef89a78f9c0b92a32b7476b5680c327bcd8a6d64) Thanks [@lukasoppermann](https://github.com/lukasoppermann)! - Adds sparkles icon (3 sparkles)\n\n* [#1027](https://github.com/primer/octicons/pull/1027) [`12c6fb00`](https://github.com/primer/octicons/commit/12c6fb0033c8f9dd22b5e8f93ddf3dff9bb7acb1) Thanks [@joshblack](https://github.com/joshblack)! - Update the build output to reduce number of generated assets included in the package on npm\n\n## 19.12.0\n\n### Minor Changes\n\n- [#1033](https://github.com/primer/octicons/pull/1033) [`7a5ac858`](https://github.com/primer/octicons/commit/7a5ac85800359eb1ee6c98c90533c5f344e6532d) Thanks [@colebemis](https://github.com/colebemis)! - Update `thumbsup` and `thumbsdown` icons\n\n## 19.11.0\n\n### Minor Changes\n\n- [#1028](https://github.com/primer/octicons/pull/1028) [`d27ea2f6`](https://github.com/primer/octicons/commit/d27ea2f6b52c5d26d4118259c86e4c91e58cfd56) Thanks [@CameronFoxly](https://github.com/CameronFoxly)! - Adding ai-model icon at 16 & 24px\n\n## 19.10.0\n\n### Minor Changes\n\n- [#983](https://github.com/primer/octicons/pull/983) [`30be326a`](https://github.com/primer/octicons/commit/30be326ae23b108fd31decfd7823171150421bc4) Thanks [@lukasoppermann](https://github.com/lukasoppermann)! - Add multiple missing icons\n\n### Patch Changes\n\n- [#1020](https://github.com/primer/octicons/pull/1020) [`449d81f1`](https://github.com/primer/octicons/commit/449d81f1b09bcbc0752ebc35d175a8b729022b55) Thanks [@joshblack](https://github.com/joshblack)! - Update types for @primer/octicons-react to explicitly include extensions for different moduleResolution settings\n\n## 19.9.0\n\n### Minor Changes\n\n- [#1008](https://github.com/primer/octicons/pull/1008) [`c5786ff2`](https://github.com/primer/octicons/commit/c5786ff2f3fb9ebca2405bb8d6cc53268b12674f) Thanks [@joshblack](https://github.com/joshblack)! - Update ESM import to use mjs extension when in parent CommonJS module\n\n### Patch Changes\n\n- [#1007](https://github.com/primer/octicons/pull/1007) [`79b93954`](https://github.com/primer/octicons/commit/79b93954c6857e81a685066c1b1205893e7161c5) Thanks [@joshblack](https://github.com/joshblack)! - Update octicons in React to no longer set `role=\"img\"` if the icon is aria-hidden.\n\n## 19.8.0\n\n### Minor Changes\n\n- [#976](https://github.com/primer/octicons/pull/976) [`15ea1e43`](https://github.com/primer/octicons/commit/15ea1e43510a55a5f77d4f4bc76f5033d6655997) Thanks [@UnicodeRogue](https://github.com/UnicodeRogue)! - Adds filter remove octicon\n\n## 19.7.0\n\n### Minor Changes\n\n- [#980](https://github.com/primer/octicons/pull/980) [`5c207929`](https://github.com/primer/octicons/commit/5c207929bdda29e910f2c5b2f6df9de6ef902b84) Thanks [@gavinmn](https://github.com/gavinmn)! - Fix Feed icon alignment issue and name collision\n\n## 19.6.0\n\n### Minor Changes\n\n- [#977](https://github.com/primer/octicons/pull/977) [`e2a0cbdb`](https://github.com/primer/octicons/commit/e2a0cbdbd0566301e295ea38ffb4367c4650c656) Thanks [@gavinmn](https://github.com/gavinmn)! - Add new Feed icons\n\n## 19.5.0\n\n### Minor Changes\n\n- [#970](https://github.com/primer/octicons/pull/970) [`640441ee`](https://github.com/primer/octicons/commit/640441ee2935c85bb3e22022d4fb946be9b8d5c6) Thanks [@CameronFoxly](https://github.com/CameronFoxly)! - Update repo-clone and repo-pull, add 24px versions\n\n### Patch Changes\n\n- [#966](https://github.com/primer/octicons/pull/966) [`b8a4b4dc`](https://github.com/primer/octicons/commit/b8a4b4dc47f734db7893fe50e93703f2b1d07a2a) Thanks [@gavinmn](https://github.com/gavinmn)! - Fix `pin-slash` bug\n\n## 19.4.0\n\n### Minor Changes\n\n- [#962](https://github.com/primer/octicons/pull/962) [`5805622c`](https://github.com/primer/octicons/commit/5805622c1f9005a4c81a7e7fb09225f2a0e31af4) Thanks [@CameronFoxly](https://github.com/CameronFoxly)! - Edited small details on `copilot-warning` and `copilot-error` to maintain consistency with the rest of the copilot icon set.\n\n* [#961](https://github.com/primer/octicons/pull/961) [`e92cb36a`](https://github.com/primer/octicons/commit/e92cb36aedc3a9c28b8502733e8c30d01d716bb6) Thanks [@gavinmn](https://github.com/gavinmn)! - Save file-directory-symlink-16.svg, file-directory-symlink-24.svg\n\n## 19.3.0\n\n### Minor Changes\n\n- [#953](https://github.com/primer/octicons/pull/953) [`d3cb9cd8`](https://github.com/primer/octicons/commit/d3cb9cd8b5186a05eb26159f9c97754bef9ea127) Thanks [@gavinmn](https://github.com/gavinmn)! - Add Tracked By states\n\n## 19.2.0\n\n### Minor Changes\n\n- [#959](https://github.com/primer/octicons/pull/959) [`268b2021`](https://github.com/primer/octicons/commit/268b2021bed7b12ff878e999d8b532534b1e2dcc) Thanks [@CameronFoxly](https://github.com/CameronFoxly)! - Add pivot-column icon\n\n* [#932](https://github.com/primer/octicons/pull/932) [`ea81ec17`](https://github.com/primer/octicons/commit/ea81ec17f0d3d8e74d53e484f551166339af3a17) Thanks [@green6erry](https://github.com/green6erry)! - Add `id`, `title`, and `aria-labelledby` props to icon components\n\n- [#957](https://github.com/primer/octicons/pull/957) [`ab786838`](https://github.com/primer/octicons/commit/ab786838f7ec93523b82c2905e37b9e0c8639e43) Thanks [@CameronFoxly](https://github.com/CameronFoxly)! - Update copilot octicons for consistency\n\n* [#956](https://github.com/primer/octicons/pull/956) [`16318b6b`](https://github.com/primer/octicons/commit/16318b6b7ba9abcf75c8a17f8ea2204128f9541a) Thanks [@gavinmn](https://github.com/gavinmn)! - Add undo / redo icons\n\n## 19.1.0\n\n### Minor Changes\n\n- [#933](https://github.com/primer/octicons/pull/933) [`af6edab9`](https://github.com/primer/octicons/commit/af6edab99d51f31eac23395b016dd988e34ef05d) Thanks [@stvehayes](https://github.com/stvehayes)! - Add `devices` icon\n\n* [#950](https://github.com/primer/octicons/pull/950) [`8f0edd9e`](https://github.com/primer/octicons/commit/8f0edd9e3aade3901a10d133e14f0561919c945d) Thanks [@CameronFoxly](https://github.com/CameronFoxly)! - Updates the `pin` icon with a flipped composition, and adds `pin-slash`\n\n- [#949](https://github.com/primer/octicons/pull/949) [`f6796914`](https://github.com/primer/octicons/commit/f6796914732ef96052585adbd8dcccb554bfb2d6) Thanks [@CameronFoxly](https://github.com/CameronFoxly)! - Updating `move-to-top` and `move-to-bottom` to fix logic and alignment issues.\n\n## 19.0.0\n\n### Major Changes\n\n- [#943](https://github.com/primer/octicons/pull/943) [`a38ae2d2`](https://github.com/primer/octicons/commit/a38ae2d2cf0b51259be0ab9bc19052c4ddc64a09) Thanks [@broccolinisoup](https://github.com/broccolinisoup)! - Remove support for `Octicon`\n  Update peer dependency React version to support >=16.3\n  Update icons to use React.forwardRef\n\n### Minor Changes\n\n- [#937](https://github.com/primer/octicons/pull/937) [`6c94e0e8`](https://github.com/primer/octicons/commit/6c94e0e851c5c5b30cb7ddf73899cde54bf8e205) Thanks [@gavinmn](https://github.com/gavinmn)! - Add 12px `×` icon\n\n## 18.3.0\n\n### Minor Changes\n\n- [#934](https://github.com/primer/octicons/pull/934) [`3707c091`](https://github.com/primer/octicons/commit/3707c0917c53eb862457673ba5aa0dfc544be434) Thanks [@gavinmn](https://github.com/gavinmn)! - Add project-template-24.svg, project-template-16.svg\n\n## 18.2.0\n\n### Minor Changes\n\n- [#928](https://github.com/primer/octicons/pull/928) [`4135bc38`](https://github.com/primer/octicons/commit/4135bc38f8592906cfbe2ac6f6772aae1fe049cf) Thanks [@gavinmn](https://github.com/gavinmn)! - Add discussion state Octicons\n\n## 18.1.0\n\n### Minor Changes\n\n- [#927](https://github.com/primer/octicons/pull/927) [`ffd32dd6`](https://github.com/primer/octicons/commit/ffd32dd67e7599041e3e49867e16282e486b8f36) Thanks [@gavinmn](https://github.com/gavinmn)! - Add passkey-fill-24 and passkey-fill-16 octicons\n\n## 18.0.0\n\n### Major Changes\n\n- [#914](https://github.com/primer/octicons/pull/914) [`4d558ed9`](https://github.com/primer/octicons/commit/4d558ed962593dedde3d294194dce7c9419ee355) Thanks [@omerbensaadon](https://github.com/omerbensaadon)! - Update icon naming conventions for Tracks and Tracked By:\n\n  - `issue-tracked-by` → `issue-tracks`\n  - `issue-tracked-in` → `issue-tracked-by`\n\n### Minor Changes\n\n- [#924](https://github.com/primer/octicons/pull/924) [`6b494dfe`](https://github.com/primer/octicons/commit/6b494dfe07735fd343889678bfb0d13561396dc8) Thanks [@CameronFoxly](https://github.com/CameronFoxly)! - Added missing 24px version of shield-slash-24.svg\n\n## 17.12.0\n\n### Minor Changes\n\n- [#904](https://github.com/primer/octicons/pull/904) [`ad0eb569`](https://github.com/primer/octicons/commit/ad0eb5699661138ee04baf8938fbb6f291f9f060) Thanks [@CameronFoxly](https://github.com/CameronFoxly)! - Edit: Upload and download icons\n  Add: Move to start, end, top, and bottom icons\n\n* [#918](https://github.com/primer/octicons/pull/918) [`082f722d`](https://github.com/primer/octicons/commit/082f722d1b49ce148830f0e396a5f0933afaaf2a) Thanks [@gavinmn](https://github.com/gavinmn)! - Add 24pt merge queue icon\n\n- [#919](https://github.com/primer/octicons/pull/919) [`bbff0d13`](https://github.com/primer/octicons/commit/bbff0d13c08a0cebafed32d7787ae216c9b26778) Thanks [@CameronFoxly](https://github.com/CameronFoxly)! - Save zoom-in-24.svg, zoom-out-24.svg, zoom-out-16.svg, zoom-in-16.svg\n\n## 17.11.1\n\n### Patch Changes\n\n- [#905](https://github.com/primer/octicons/pull/905) [`cbbc519f`](https://github.com/primer/octicons/commit/cbbc519ffd31eaf38d5d5b1e068ad4506d0d1e27) Thanks [@gr2m](https://github.com/gr2m)! - prefix relative paths with `./` in ESM exports paths\n\n## 17.11.0\n\n### Minor Changes\n\n- [#895](https://github.com/primer/octicons/pull/895) [`ce11fb3b`](https://github.com/primer/octicons/commit/ce11fb3b3c67b9c0f4f69bec14e5a962b189cba2) Thanks [@joshblack](https://github.com/joshblack)! - Update the npm package for `@primer/octicons-react` to include the `exports` field and explicitly list out files in `package.json`\n\n* [#902](https://github.com/primer/octicons/pull/902) [`4cbc043a`](https://github.com/primer/octicons/commit/4cbc043a81f81ad23f5e5bbb5dc687fe9f550877) Thanks [@gavinmn](https://github.com/gavinmn)! - Save sparkle-fill-16.svg\n\n- [#903](https://github.com/primer/octicons/pull/903) [`caf958be`](https://github.com/primer/octicons/commit/caf958be9c695ff9ee4381328a555f12b0d830fa) Thanks [@gavinmn](https://github.com/gavinmn)! - Save fiscal-host-16.svg\n\n### Patch Changes\n\n- [#894](https://github.com/primer/octicons/pull/894) [`410831bc`](https://github.com/primer/octicons/commit/410831bc3d3aee3b816fb4172031a470b7b1e38e) Thanks [@langermank](https://github.com/langermank)! - [Bug] up/down chevron alignment fix\n\n## 17.10.2\n\n### Patch Changes\n\n- [#886](https://github.com/primer/octicons/pull/886) [`b5a1530f`](https://github.com/primer/octicons/commit/b5a1530f441e5b2f7b3c874fe669c5d0d1838d9c) Thanks [@eliperkins](https://github.com/eliperkins)! - Upgrade to latest version of SVG Optimizer to remove invalid SVG paths on iOS, macOS and other native Apple target platforms.\n\n## 17.10.1\n\n### Patch Changes\n\n- [#882](https://github.com/primer/octicons/pull/882) [`503bafb9`](https://github.com/primer/octicons/commit/503bafb9578ea307fed3b261a1f8f9cbaea1c346) Thanks [@manuelpuyol](https://github.com/manuelpuyol)! - Use parameter defaults instead of defaultProps\n\n* [#883](https://github.com/primer/octicons/pull/883) [`8a039a7b`](https://github.com/primer/octicons/commit/8a039a7befa6b542404f416fac3f5c9ec99099cc) Thanks [@eliperkins](https://github.com/eliperkins)! - Remove fill-rule from SVGs using picosvg as an optimization step\n\n## 17.10.0\n\n### Minor Changes\n\n- [#874](https://github.com/primer/octicons/pull/874) [`3ff5aa6`](https://github.com/primer/octicons/commit/3ff5aa669d33a88048825d229656abfa459e4d64) Thanks [@gavinmn](https://github.com/gavinmn)! - Add rel-file-path-16.svg, rel-file-path-24.svg\n\n* [#878](https://github.com/primer/octicons/pull/878) [`5797f85`](https://github.com/primer/octicons/commit/5797f859859df31cd769e102fbf518ccaf9a976f) Thanks [@CameronFoxly](https://github.com/CameronFoxly)! - Save unlink-16.svg, unlink-24.svg\n\n- [#879](https://github.com/primer/octicons/pull/879) [`2fa8425`](https://github.com/primer/octicons/commit/2fa8425dab93346cd5d8b44bfc3709f0126e19fb) Thanks [@gavinmn](https://github.com/gavinmn)! - Save read-32.svg, unread-32.svg, read-48.svg, unread-48.svg\n\n* [#873](https://github.com/primer/octicons/pull/873) [`0d1b1ff`](https://github.com/primer/octicons/commit/0d1b1ffca5334c6207cf975f69459153f1d1cbfd) Thanks [@gavinmn](https://github.com/gavinmn)! - Add Goal icons\n\n- [#877](https://github.com/primer/octicons/pull/877) [`3916b29`](https://github.com/primer/octicons/commit/3916b29935d9845eec8726cc389b98281bc42b02) Thanks [@gavinmn](https://github.com/gavinmn)! - Save sponsor-tiers-16.svg, sponsor-tiers-24.svg\n\n## 17.9.0\n\n### Minor Changes\n\n- [#862](https://github.com/primer/octicons/pull/862) [`e15fe00`](https://github.com/primer/octicons/commit/e15fe007224d2785878b78dec36821373c75cbf7) Thanks [@ashygee](https://github.com/ashygee)! - Add project-roadmap icons. Thanks @ohiosveryown and @gavinmn!\n\n* [#861](https://github.com/primer/octicons/pull/861) [`1a6887d`](https://github.com/primer/octicons/commit/1a6887df3423ff539f6959d0fe8bb23c17dafa70) Thanks [@ashygee](https://github.com/ashygee)! - Add project-symlink icons. Thanks @peterloveland!\n\n- [#860](https://github.com/primer/octicons/pull/860) [`8a98d2b`](https://github.com/primer/octicons/commit/8a98d2b727623aa089912721513a68e8d4c0fc3f) Thanks [@ashygee](https://github.com/ashygee)! - Save clock-fill-16.svg, clock-fill-24.svg, skip-fill-16.svg, skip-fil… Thanks @dylanatsmith!\n\n## 17.8.0\n\n### Minor Changes\n\n- [#858](https://github.com/primer/octicons/pull/858) [`199f00e`](https://github.com/primer/octicons/commit/199f00e99e0fc3c5abb6e78f2255393a67c08fc6) Thanks [@heyamie](https://github.com/heyamie)! - Add diagonal arrows as 16px\n\n* [#857](https://github.com/primer/octicons/pull/857) [`da2c78f`](https://github.com/primer/octicons/commit/da2c78f103bbfd65aa046ea763325380592581a7) Thanks [@gavinmn](https://github.com/gavinmn)! - Add `issue-tracked-in` and `issue-tracked-by` icons\n\n## 17.7.0\n\n### Minor Changes\n\n- [#849](https://github.com/primer/octicons/pull/849) [`f6c8d2b`](https://github.com/primer/octicons/commit/f6c8d2b37a4f38d99d5f9279f793a88a020933cf) Thanks [@broccolinisoup](https://github.com/broccolinisoup)! - Add `tabIndex` prop to React icon components\n\n## 17.6.0\n\n### Minor Changes\n\n- [#848](https://github.com/primer/octicons/pull/848) [`ed25e50`](https://github.com/primer/octicons/commit/ed25e501f614afe1b43aa09c11f344d8b47a233d) Thanks [@ashygee](https://github.com/ashygee)! - Add filled alert icons\n  - alert-fill-16\n  - alert-fill-24\n\n* [#847](https://github.com/primer/octicons/pull/847) [`2f9b32e`](https://github.com/primer/octicons/commit/2f9b32e6b48cb58adac95552d6e7ddb2bf405a94) Thanks [@ashygee](https://github.com/ashygee)! - - add log-24.svg (TY @edokoa!)\n\n### Patch Changes\n\n- [#831](https://github.com/primer/octicons/pull/831) [`57f364a`](https://github.com/primer/octicons/commit/57f364a7e234080781355cd57fcf3bdd75b05af4) Thanks [@josepmartins](https://github.com/josepmartins)! - Adjust flex wrap in UI examples.Fixes #731\n\n## 17.5.0\n\n### Minor Changes\n\n- [#827](https://github.com/primer/octicons/pull/827) [`f186ad3`](https://github.com/primer/octicons/commit/f186ad3a07bd30954088e9e63936f81dc735bbcd) Thanks [@edokoa](https://github.com/edokoa)! - Save `accessibility-inset` 16px icon\n\n* [#828](https://github.com/primer/octicons/pull/828) [`6c0d207`](https://github.com/primer/octicons/commit/6c0d20761f62dad118db48e72d6e0b20210c38cb) Thanks [@edokoa](https://github.com/edokoa)! - Save `shield-slash` 16px icon\n\n## 17.4.1\n\n### Patch Changes\n\n- [#815](https://github.com/primer/octicons/pull/815) [`41c088e`](https://github.com/primer/octicons/commit/41c088e11862a2f693c7670deb3a12daa7a04089) Thanks [@ashygee](https://github.com/ashygee)! - Correct alignment for search-24\n\n## 17.4.0\n\n### Minor Changes\n\n- [#810](https://github.com/primer/octicons/pull/810) [`840f4eb`](https://github.com/primer/octicons/commit/840f4eb7d89020c36a8f8eeaa6f69042c67adc8e) Thanks [@ashygee](https://github.com/ashygee)! - - modifies tasklist icon proposed in https://github.com/github/primer/issues/746\n  - adds a new checkbox icon using metaphor from previous tasklist metaphor\n\n* [#807](https://github.com/primer/octicons/pull/807) [`d280148`](https://github.com/primer/octicons/commit/d280148ffaa43f3260b06ed723a059f72fc0ee3b) Thanks [@edokoa](https://github.com/edokoa)! - Add `cache` 16px icon\n\n- [#801](https://github.com/primer/octicons/pull/801) [`8e5dcfc`](https://github.com/primer/octicons/commit/8e5dcfcac8dda5c9d41ba8fb3d5b7d5d14ca3943) Thanks [@gavinmn](https://github.com/gavinmn)! - Save paperclip-16.svg, paperclip-24.svg\n\n* [#806](https://github.com/primer/octicons/pull/806) [`27575d0`](https://github.com/primer/octicons/commit/27575d0e67eb0e6557856d18535b75550a364e66) Thanks [@ashygee](https://github.com/ashygee)! - Save git-merge-queue-16.svg\n\n- [#811](https://github.com/primer/octicons/pull/811) [`a005869`](https://github.com/primer/octicons/commit/a0058690fc56e5740817e6f5060ecf0473c6fc46) Thanks [@ashygee](https://github.com/ashygee)! - Save command-palette-24.svg, command-palette-16.svg\n\n### Patch Changes\n\n- [#803](https://github.com/primer/octicons/pull/803) [`5090b7a`](https://github.com/primer/octicons/commit/5090b7acab73dc3f0f25936fceefdeb16bc19d2f) Thanks [@ashygee](https://github.com/ashygee)! - fix table icon\n\n## 17.3.0\n\n### Minor Changes\n\n- [#794](https://github.com/primer/octicons/pull/794) [`608d639`](https://github.com/primer/octicons/commit/608d6399af450f8eda444c73069b59d7fc10eaa4) Thanks [@gavinmn](https://github.com/gavinmn)! - Add `copilot` icons\n\n* [#766](https://github.com/primer/octicons/pull/766) [`8df01b5`](https://github.com/primer/octicons/commit/8df01b5031dac3bd1f11071bac9d7d699e69e4b5) Thanks [@edokoa](https://github.com/edokoa)! - Add 24px `repo-locked` icon\n\n## 17.2.0\n\n### Minor Changes\n\n- [#789](https://github.com/primer/octicons/pull/789) [`d59a5e2`](https://github.com/primer/octicons/commit/d59a5e2095495c9f8a2d9ad10072782df3714522) Thanks [@ashygee](https://github.com/ashygee)! - Add file-added, file-removed, file-moved\n  Update file to be consistent in height with other file icons\n\n### Patch Changes\n\n- [#786](https://github.com/primer/octicons/pull/786) [`0dede7f`](https://github.com/primer/octicons/commit/0dede7f202645bde2294b354284ce0592c248815) Thanks [@ashygee](https://github.com/ashygee)! - recenter org icon\n\n## 17.1.0\n\n### Minor Changes\n\n- [#756](https://github.com/primer/octicons/pull/756) [`2993d47`](https://github.com/primer/octicons/commit/2993d4733cbf3acdaf4286a1a5c17e0ced762967) Thanks [@Juliusschaeper](https://github.com/Juliusschaeper)! - Added `cloud` and `cloud-offline` icons\n\n* [#762](https://github.com/primer/octicons/pull/762) [`57105bb`](https://github.com/primer/octicons/commit/57105bbaffeb38de1bb5f8bc33e125bb3968a554) Thanks [@edokoa](https://github.com/edokoa)! - Add 16px `file-directory-open-fill` icon\n\n- [#783](https://github.com/primer/octicons/pull/783) [`47d3018`](https://github.com/primer/octicons/commit/47d30183a944383e1fb28651fe70e01f3a5dbe59) Thanks [@ashygee](https://github.com/ashygee)! - Save sliders-16.svg\n\n## 17.0.0\n\n### Major Changes\n\n- [#736](https://github.com/primer/octicons/pull/736) [`ec8cab8`](https://github.com/primer/octicons/commit/ec8cab891426f759fe665a781e3129241d83de8a) Thanks [@edokoa](https://github.com/edokoa)! - This patch fixes two problems:\n\n  - We're adding a non-filled `file-directory` icon to the set.\n  - We're fixing a problem where the 16px and 24px versions of the `file-directory` icons were mismatched between `fill` and `non-fill` versions of the icon.\n\n  **THIS IS A BREAKING CHANGE** and will require re-linking all the `file-directory` icon references to `file-directory-fill`\n\n### Minor Changes\n\n- [#754](https://github.com/primer/octicons/pull/754) [`7a51cb7`](https://github.com/primer/octicons/commit/7a51cb71b108b21aeb9a1716d443df3f23deba28) Thanks [@edokoa](https://github.com/edokoa)! - Add trophy-16.svg, trophy-24.svg\n\n* [#758](https://github.com/primer/octicons/pull/758) [`0d9000c`](https://github.com/primer/octicons/commit/0d9000c50255bac736eb0fbbc1ffee839130a708) Thanks [@edokoa](https://github.com/edokoa)! - Save repo-locked-16.svg\n\n- [#755](https://github.com/primer/octicons/pull/755) [`a520a37`](https://github.com/primer/octicons/commit/a520a374a0a29f47504e1a758e5cbfa0a4033721) Thanks [@Juliusschaeper](https://github.com/Juliusschaeper)! - Second batch of feed icons: merged, forked and achievement\n\n### Patch Changes\n\n- [#751](https://github.com/primer/octicons/pull/751) [`4e768a5`](https://github.com/primer/octicons/commit/4e768a5e427684cd92c87c6b6a0ff5a5dab1e0a4) Thanks [@Crayon2000](https://github.com/Crayon2000)! - Fix typos in build.js\n\n* [#734](https://github.com/primer/octicons/pull/734) [`afde0dd`](https://github.com/primer/octicons/commit/afde0dd4ee74ec32e6babde240b49e27d96f4d30) Thanks [@ashygee](https://github.com/ashygee)! - Modify upload-24.svg to mirror 16px version\n\n## 16.3.1\n\n### Patch Changes\n\n- [#733](https://github.com/primer/octicons/pull/733) [`a57b9ca`](https://github.com/primer/octicons/commit/a57b9ca1361cde081ce2c84f15ca8999639e5792) Thanks [@edokoa](https://github.com/edokoa)! - Modify upload-24.svg to mirror 16px version\n\n## 16.3.0\n\n### Minor Changes\n\n- [#715](https://github.com/primer/octicons/pull/715) [`ab991ab`](https://github.com/primer/octicons/commit/ab991ab318488efc3c02b747168a34e356fad059) Thanks [@edokoa](https://github.com/edokoa)! - Added new icons for:\n  - `accessibility`\n  - `apps`\n  - `id-badge`\n  - `log`\n  - `repo-deleted`\n  - `tab-external`\n  - `webhook`\n\n* [#708](https://github.com/primer/octicons/pull/708) [`6933ac3`](https://github.com/primer/octicons/commit/6933ac32f87a2cb5efda4fb74b39d1e6199134ce) Thanks [@Juliusschaeper](https://github.com/Juliusschaeper)! - Added first batch of 16px feed icons:\n  - `feed-discussion`\n  - `feed-heart`\n  - `feed-person`\n  - `feed-repo`\n  - `feed-rocket`\n  - `feed-star`\n  - `feed-tag`\n\n## 16.2.0\n\n### Minor Changes\n\n- [#706](https://github.com/primer/octicons/pull/706) [`2c43706`](https://github.com/primer/octicons/commit/2c4370658663817a216895ee7831a00d413f7d4e) Thanks [@Juliusschaeper](https://github.com/Juliusschaeper)! - Add `code-of-conduct` icon\n\n### Patch Changes\n\n- [#685](https://github.com/primer/octicons/pull/685) [`c59c097`](https://github.com/primer/octicons/commit/c59c097c23ccea6409c9e2f235b64a50b4d580dd) Thanks [@jonrohan](https://github.com/jonrohan)! - Formatting changes to the main readme file, including dark mode support.\n\n## 16.1.1\n\n### Patch Changes\n\n- [#681](https://github.com/primer/octicons/pull/681) [`c394d9a`](https://github.com/primer/octicons/commit/c394d9a556666beed4912797fb78f34190796511) Thanks [@jonrohan](https://github.com/jonrohan)! - Adding changesets workflow to octicons for releasing.\n\n* [#684](https://github.com/primer/octicons/pull/684) [`9ed6154`](https://github.com/primer/octicons/commit/9ed615464cc405d9264cb933d4fe5f05ff14a219) Thanks [@ashygee](https://github.com/ashygee)! - Add 12px usage guidelines\n\n- [#677](https://github.com/primer/octicons/pull/677) [`777f229`](https://github.com/primer/octicons/commit/777f2290b4662f2d769096ac3c121e61e92a0ff2) Thanks [@benkoshy](https://github.com/benkoshy)! - update: installation instructions\n\n## 16.1.0\n\n### 🚀 New features\n\n- Added first set of 12px filled icons https://github.com/primer/octicons/pull/676\n\n### 🐛 Bug fix\n\n- Adjusted 'no-entry' size to match other circle icons https://github.com/primer/octicons/pull/673\n\n## 16.0.0\n\n### 💥 Breaking changes\n\n- Rename 16px `select-single` icon to `single-select` https://github.com/primer/octicons/pull/665\n\n### 🚀 New features\n\n- `iterations` https://github.com/primer/octicons/pull/667\n\n### 🧽 Chores\n\n- Bump dependencies\n\n## 15.2.0\n\n### 🚀 New features\n\n- Add `stack` icons https://github.com/primer/octicons/pull/659\n- Add `person-fill` and `telescope-fill` icons https://github.com/primer/octicons/pull/660\n\n## 15.1.0\n\n### 🚀 New features\n\n- `bell-fill-16` https://github.com/primer/octicons/pull/657\n\n## 15.0.1\n\n### 🐛 Bug fix\n\n- Modify `duplicate` icon to differentiate from `copy` https://github.com/primer/octicons/pull/647\n\n## 15.0.0\n\n### 💥 Breaking changes\n\n- Rename `duplicate` icon to `copy` https://github.com/primer/octicons/pull/643\n- Rename `clippy` icon to `paste` https://github.com/primer/octicons/pull/643\n\n## 14.2.2\n\n### 🐛 Bug fix\n\n- Update `issue-reopened` https://github.com/primer/octicons/pull/633\n\n## 14.2.1\n\n### 🐛 Bug fix\n\n- fix vectors for 24px sort icons https://github.com/primer/octicons/pull/627 (🙏 @metonym)\n\n## 14.2.0\n\n### 🚀 New features\n\n- `key-asterisk-16` https://github.com/primer/octicons/pull/623\n- `sort-asc` https://github.com/primer/octicons/pull/619\n- `sort-desc` https://github.com/primer/octicons/pull/619\n\n### 🧽 Chores\n\n- Remove unused dependency on nokogiri https://github.com/primer/octicons/pull/609 (🙏 @cschlack)\n\n## 14.1.0\n\n### 🚀 New features\n\n- `git-pull-request-draft` https://github.com/primer/octicons/pull/613\n- `git-pull-request-closed` https://github.com/primer/octicons/pull/613\n\n## 14.0.0\n\n### 💥 Breaking changes\n\n- Remove `octoface` https://github.com/primer/octicons/pull/611\n- Rename `git-fork-24` to `repo-forked-24` https://github.com/primer/octicons/pull/593\n\n### 🚀 New features\n\n- `number` https://github.com/primer/octicons/pull/592\n- `hash` (previously `number`) https://github.com/primer/octicons/pull/592\n- `diamond` https://github.com/primer/octicons/pull/616\n- `single-select` https://github.com/primer/octicons/pull/612\n- `rows` https://github.com/primer/octicons/pull/617\n- `columns` https://github.com/primer/octicons/pull/617\n- `issue-draft` https://github.com/primer/octicons/pull/614\n\n### 💅 Enhancements\n\n- `issue-opened` https://github.com/primer/octicons/pull/614\n- `issue-closed` https://github.com/primer/octicons/pull/614\n\n### 🐛 Fixes\n\n- Fix 24px `arrow-up` icon https://github.com/primer/octicons/pull/594\n- Prevent clipping using `overflow: visible` https://github.com/primer/octicons/pull/607\n\n## 13.0.0\n\n### 🚀 New features\n\n- `table` https://github.com/primer/octicons/pull/564\n- `person-add` https://github.com/primer/octicons/pull/573\n- `blocked` https://github.com/primer/octicons/pull/576\n- `duplicate` https://github.com/primer/octicons/pull/576\n- `dependabot`https://github.com/primer/octicons/pull/585\n- `codescan` https://github.com/primer/octicons/pull/588\n- `browser` https://github.com/primer/octicons/pull/575\n- `sidebar` icons https://github.com/primer/octicons/pull/569\n- `codespaces` https://github.com/primer/octicons/pull/587\n\n### 💥 Breaking changes\n\n- Remove 24px `insights` icon https://github.com/primer/octicons/pull/574\n- Remove 24px `copy` icon https://github.com/primer/octicons/pull/586\n\n### 💅 Enhancements\n\n- Use more explicit dependencies for Rails helper https://github.com/primer/octicons/pull/565\n\n### 🐛 Fixes\n\n- Fix `megaphone-16` https://github.com/primer/octicons/pull/554\n- Fix `circle` icon https://github.com/primer/octicons/pull/584\n\n## 12.1.0\n\n### React\n\n### 💅 Enhancements\n\n- Add icon-specific class names to each icon component https://github.com/primer/octicons/pull/453 @FloEdelmann\n- Add `fill` prop to each icon component https://github.com/primer/octicons/pull/551 @macno\n\n## 12.0.0\n\n### 🚀 New features\n\n- `bug` (https://github.com/primer/octicons/pull/543)\n- `multi-select` (https://github.com/primer/octicons/pull/534)\n\n### 💅 Enhancements\n\n- Make octicon helper slightly faster (@jhawthorn & @seejohnrun) (#536)\n\n### 💥 Breaking changes\n\n- Rename 16px `trashcan` icon to `trash` (@fermion 🙇) (https://github.com/primer/octicons/pull/538)\n\n### 🧽Chores\n\n- Dependency updates (#525, #524, #523, #522, #520)\n\n## 11.3.0\n\n### 🚀 New features\n\n- `number` (https://github.com/primer/octicons/pull/541)\n- `video` (https://github.com/primer/octicons/pull/540)\n\n### 🐛 Fixes\n\n- Fix rendering of arrows in Safari (@aaronshekey https://github.com/primer/octicons/pull/527)\n\n## 11.2.0\n\n### 🚀 New features\n\n- `strikethrough` (https://github.com/primer/octicons/pull/518)\n\n### 🐛 Fixes\n\n- Align `plus` and `dash` icon (https://github.com/primer/octicons/pull/447)\n- Small edits in JS documentation (https://github.com/primer/octicons/pull/499)\n\n### 🧽Chores\n\n- Dependency updates\n\n## 11.1.0\n\n### 🚀 New features\n\n- `container` (https://github.com/primer/octicons/pull/507)\n- `squirrel` 24px icon (https://github.com/primer/octicons/pull/508)\n\n### 🐛 Fixes\n\n- Corrected stroke for 24px `smiley` (https://github.com/primer/octicons/pull/509)\n\n## 11.0.0\n\n### 💅 Enhancements\n\n- Cache retrieval of Octicon SVG paths (https://github.com/primer/octicons/pull/491)\n\n### 💥 Breaking changes\n\n- Fix 24px icon names https://github.com/primer/octicons/pull/465 (@BenJetson 🙇)\n  - `unverifed-24.svg` → `unverified-24.svg`\n  - `file-symlink-24.svg` → `file-symlink-file-24.svg`\n  - `fire-24.svg` → `flame-24.svg`\n  - `eye-slash-24.svg` → `eye-closed-24.svg`\n- Remove 24px `settings` icon. Use `gear` instead https://github.com/primer/octicons/pull/493\n\n## 10.1.0\n\n### 🚀 New features\n\n- [`arrow-switch`](https://github.com/primer/octicons/pull/486)\n- [`file-badge`](https://github.com/primer/octicons/pull/464)\n- [`x-circle`, `x-circle-fill`, `circle`](https://github.com/primer/octicons/pull/455)\n\n### 🐛 Fixes\n\n- Corrected positioning for `triangle-down` [#459](https://github.com/primer/octicons/pull/459)\n\n### 🧽Chores\n\n- Dependency updates\n\n## 10.0.0\n\n### All packages\n\n- We've given Octicons a new look ✨ Some icons have new names and some icons haven't been redesigned yet. The following table documents those changes. If you're using an octicon in v9.x that doesn't have an equivalent in v10.0 yet, let us know by [opening an issue](https://github.com/primer/octicons/issues/new?assignees=&labels=icon+request&template=icon-request.md&title=%5BIcon+request%5D).\n\n| v9.x                     | v10.0                     | Notes                                                                                                                                               |\n| ------------------------ | ------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `arrow-small-down`       | `arrow-down`              |                                                                                                                                                     |\n| `arrow-small-left`       | `arrow-left`              |                                                                                                                                                     |\n| `arrow-small-right`      | `arrow-right`             |                                                                                                                                                     |\n| `arrow-small-up`         | `arrow-up`                |                                                                                                                                                     |\n| `browser`                |                           | [Request this icon](https://github.com/primer/octicons/issues/new?assignees=&labels=icon+request&template=icon-request.md&title=%5BIcon+request%5D) |\n| `bug`                    |                           | [Request this icon](https://github.com/primer/octicons/issues/new?assignees=&labels=icon+request&template=icon-request.md&title=%5BIcon+request%5D) |\n| `circuit-board`          | `cpu`                     |                                                                                                                                                     |\n| `cloud-download`         | `download`                |                                                                                                                                                     |\n| `cloud-upload`           | `upload`                  |                                                                                                                                                     |\n| `dashboard`              | `meter`                   |                                                                                                                                                     |\n| `dependent`              | `package-dependents`      |                                                                                                                                                     |\n| `device-camera`          |                           | [Request this icon](https://github.com/primer/octicons/issues/new?assignees=&labels=icon+request&template=icon-request.md&title=%5BIcon+request%5D) |\n| `file-pdf`               | `file`                    |                                                                                                                                                     |\n| `file-symlink-directory` | `file-submodule`          |                                                                                                                                                     |\n| `gist-secret`            | `lock`                    |                                                                                                                                                     |\n| `gist`                   | `code-square`             |                                                                                                                                                     |\n| `github-action`          |                           | [Request this icon](https://github.com/primer/octicons/issues/new?assignees=&labels=icon+request&template=icon-request.md&title=%5BIcon+request%5D) |\n| `heart-outline`          | `heart`                   |                                                                                                                                                     |\n| `internal-repo`          | `repo`                    |                                                                                                                                                     |\n| `jersey`                 | `people`                  |                                                                                                                                                     |\n| `keyboard`               |                           | [Request this icon](https://github.com/primer/octicons/issues/new?assignees=&labels=icon+request&template=icon-request.md&title=%5BIcon+request%5D) |\n| `line-arrow-down`        | `arrow-down`              |                                                                                                                                                     |\n| `line-arrow-left`        | `arrow-left`              |                                                                                                                                                     |\n| `line-arrow-right`       | `arrow-right`             |                                                                                                                                                     |\n| `line-arrow-up`          | `arrow-up`                |                                                                                                                                                     |\n| `mail-read`              | `mail`                    |                                                                                                                                                     |\n| `no-newline`             | `no-entry`                |                                                                                                                                                     |\n| `paintcan`               | `paintbrush`              |                                                                                                                                                     |\n| `plus-small`             | `plus`                    |                                                                                                                                                     |\n| `primitive-dot-stroke`   | `dot`                     |                                                                                                                                                     |\n| `primitive-dot`          | `dot-fill`                |                                                                                                                                                     |\n| `primitive-square`       | `square-fill`             |                                                                                                                                                     |\n| `radio-tower`            | `broadcast`               |                                                                                                                                                     |\n| `repo-clone`             |                           | [Request this icon](https://github.com/primer/octicons/issues/new?assignees=&labels=icon+request&template=icon-request.md&title=%5BIcon+request%5D) |\n| `repo-force-push`        | `repo-push`               |                                                                                                                                                     |\n| `repo-pull`              |                           | [Request this icon](https://github.com/primer/octicons/issues/new?assignees=&labels=icon+request&template=icon-request.md&title=%5BIcon+request%5D) |\n| `repo-template-private`  |                           | [Request this icon](https://github.com/primer/octicons/issues/new?assignees=&labels=icon+request&template=icon-request.md&title=%5BIcon+request%5D) |\n| `request-changes`        | `diff`                    |                                                                                                                                                     |\n| `saved`                  | `bookmark`                |                                                                                                                                                     |\n| `text-size`              | `heading` or `typography` |                                                                                                                                                     |\n| `unsaved`                | `bookmark-slash`          |                                                                                                                                                     |\n| `watch`                  | `hourglass`               |                                                                                                                                                     |\n| `workflow-all`           |                           | [Request this icon](https://github.com/primer/octicons/issues/new?assignees=&labels=icon+request&template=icon-request.md&title=%5BIcon+request%5D) |\n\n- We designed a set of 24px icons—as well as 16px icons—to accommodate interfaces that need larger icons. All package implementations now choose which SVG to render based on the size passed in.\n\n### React (@primer/octicons-react)\n\n- Icon components (e.g. `AlertIcon`, `ArrowRightIcon`, etc.) now accept `size`, `ariaLabel`, `verticalAlign`, and `className` props and can be used on their own. No need to pass them to the `Octicon` component.\n\n  ```jsx\n  <AlertIcon size={24} />\n  ```\n\n- Icon components will now choose the best SVG icon to render based on the `size` passed in.\n\n- The `Octicon` component is deprecated. Use icon components on their own instead:\n\n  ```diff\n  - <Octicon icon={AlertIcon} />\n  + <AlertIcon />\n  ```\n\n#### BREAKING CHANGES 💥\n\n- All icon component names now include `Icon` at the end (e.g. `Alert` → `AlertIcon`).\n\n- In order to enable tree-shaking, we removed the `iconsByName` and `getIconByName` exports.\n\n- `Octicon` no longer accepts `width` or `height` props. Use the `size` prop instead. In cases where the width and height of an icon are not equal (e.g. logos), the height will be set to the value of the `size` prop and the `width` will be scaled proportionally.\n\n- We renamed the `ariaLabel` prop to `aria-label` to be consistent with React: https://reactjs.org/docs/accessibility.html#wai-aria\n\n  ```diff\n  - <AlertIcon ariaLabel=\"alert\">\n  + <AlertIcon aria-label=\"alert\">\n  ```\n\n- Setting `verticalAlign=\"top\"` on the `Octicon` component or any icon component will now apply a `vertical-align: top;` style to the `<svg>`. Previously, we were translating \"top\" to \"text-top.\" So setting `verticalAlign=\"top\"` would apply a `vertical-align: text-top;` style to the `<svg>`. If you want a vertical alignment of \"text-top,\" set the `verticalAlign` prop to `\"text-top\"`.\n\n- Custom icon components passed to the `Octicon` component now need to render the entire `<svg>`, not just the `<path>`.\n\n```diff\nfunction CirclesIcon() {\n  return (\n-   <React.Fragment>\n+   <svg viewBox=\"0 0 30 10\" width=\"30\" height=\"10\">\n      <circle r={5} cx={5} cy={5}/>\n      <circle r={5} cx={15} cy={5}/>\n      <circle r={5} cx={25} cy={5}/>\n-   </React.Fragment>\n+   </svg>\n  )\n}\n\n- CirclesIcon.size = [30, 10]\n```\n\n### JavaScript (@primer/octicons)\n\n#### BREAKING CHANGES 💥\n\n- The structure of each icon object has been updated to allow support multiple SVGs per icon:\n\n##### Before\n\n```js\nocticons.alert\n// {\n//     symbol: 'alert',\n//     keywords: ['warning', 'triangle', 'exclamation', 'point'],\n//     toSVG: [Function],\n//     width: 16,\n//     height: 16,\n//     path: '<path d=\"M8.865 1.52c-.18-.31-.51-.5-.87-.5s-.69.19-.87.5L.275 13.5c-.18.31-.18.69 0 1 .19.31.52.5.87.5h13.7c.36 0 .69-.19.86-.5.17-.31.18-.69.01-1L8.865 1.52zM8.995 13h-2v-2h2v2zm0-3h-2V6h2v4z\"/>',\n//     options: {\n//         version: '1.1',\n//         width: '16',\n//         height: '16',\n//         viewBox: '0 0 16 16',\n//         class: 'octicon octicon-alert',\n//         'aria-hidden': 'true'\n//     },\n// }\n```\n\n#### After\n\n```js\nocticons.alert\n// {\n//     symbol: 'alert',\n//     keywords: ['warning', 'triangle', 'exclamation', 'point'],\n//     toSVG: [Function]\n//     heights: {\n//         16: {\n//             width: 16,\n//             path: '<path d=\"M8.865 1.52c-.18-.31-.51-.5-.87-.5s-.69.19-.87.5L.275 13.5c-.18.31-.18.69 0 1 .19.31.52.5.87.5h13.7c.36 0 .69-.19.86-.5.17-.31.18-.69.01-1L8.865 1.52zM8.995 13h-2v-2h2v2zm0-3h-2V6h2v4z\"/>',\n//             options: {\n//                 version: '1.1',\n//                 width: '16',\n//                 height: '16',\n//                 viewBox: '0 0 16 16',\n//                 class: 'octicon octicon-alert',\n//                 'aria-hidden': 'true'\n//             },\n//         },\n//         24: ...\n//     }\n// }\n```\n\n## 9.6.0\n\n### features\n\n- New icon `north-star` https://github.com/primer/octicons/pull/380\n\n## 9.5.0\n\n### features\n\n- New icon `internal-repo` https://github.com/primer/octicons/pull/375\n\n## 9.4.0\n\n### features\n\n- New icons `heart-outline` `infinity` `line-arrow-up` `line-arrow-down` `line-arrow-right` `line-arrow-left` https://github.com/primer/octicons/pull/365\n\n### Chores\n\n- Contributing docs updates and issue template updates #367\n\n### Bugs\n\n- Update `heart` glyphs removing extra points https://github.com/primer/octicons/pull/365\n\n## 9.3.1\n\n### Bugfix\n\n- Workflow icon had a cutoff edge.\n\n## 9.3.0\n\n### 🚀 New features\n\n- Workflow icons https://github.com/primer/octicons/pull/356 @ashygee\n- Allow 'unset' value for verticalAlign property https://github.com/primer/octicons/pull/354 @Fs00\n\n## 9.2.0\n\n### 🚀 New features\n\n- [x] New icons for save/unsave and primitive dot stroke https://github.com/primer/octicons/pull/351 @ashygee @colinkeany\n\n### 🧽 Chores\n\n- [x] Migrating to new yml actions syntax https://github.com/primer/octicons/pull/332 @max & @jonrohan\n- [x] Update jekyll gemspec to support Jekyll 4.0 https://github.com/primer/octicons/pull/347 @ntotten\n\n### 🐛 Bugs\n\n- [x] Octicons react isn't including className https://github.com/primer/octicons/pull/271 @pocke\n\n## 9.1.1\n\n### 🐛 Bug Fix\n\n- [x] renamed the original shield icon to `shield-lock` https://github.com/primer/octicons/issues/323 @ashygee\n- [x] test for duplicate icons https://github.com/primer/octicons/pull/322 @jonrohan\n\n## 9.1.0\n\n### 🚀 New features\n\n- [x] Adding skip icon https://github.com/primer/octicons/pull/318 @ashygee\n\n## 9.0.0\n\n### 💥 Breaking changes\n\n- [x] Rename `octicons` to `@primer/octicons` https://github.com/primer/octicons/pull/311\n- [x] Rename `@githubprimer/octicons-react` to `@primer/octicons-react` https://github.com/primer/octicons/pull/311\n\n### 🚀 New features\n\n- [x] Adding a shield icon https://github.com/primer/octicons/pull/310 @ashygee @donokuda\n- [x] Adding new repo icons https://github.com/primer/octicons/issues/316 @superbryntendo\n\n## 8.5.0\n\n- a11y aria-hidden update from @muan https://github.com/primer/octicons/pull/295\n- Verified icons poor rendering. @ashygee https://github.com/primer/octicons/pull/297\n- Docs update for contributing @ashygee https://github.com/primer/octicons/pull/298\n\n## 8.4.2\n\n### 💅🏼 Enhancement\n\n- Thumbs up/down icons needed some vector improvements. https://github.com/primer/octicons/pull/287\n\n### 🐛 Bug Fix\n\n- Node package missing `build/build.css` file. https://github.com/primer/octicons/pull/292\n\n## 8.4.1\n\n### 🐛 Bug Fix\n\n- Rollup files missing from octicons react package https://github.com/primer/octicons/issues/282\n\n## 8.4.0\n\n### 🏠 Internal\n\n- Using Actions to build and deploy Octicons https://github.com/primer/octicons/pull/276\n\n#### Committers: 1\n\n- Jon Rohan ([jonrohan](https://github.com/jonrohan))\n\n## 8.3.0\n\n- New \"changes requested\" icon https://github.com/primer/octicons/pull/267\n- Contrib Doc Updates https://github.com/primer/octicons/pull/256\n- Updating licenses to 2019 https://github.com/primer/octicons/pull/272\n\n## 8.2.0\n\n- Add `fold-up` and `fold-down` icons, courtesy of @pmarsceill\n\n## 8.1.3\n\n- Add `eye-closed` icon, courtesy of @colinkeany\n\n## 8.1.2\n\n- Patch release for failed 8.1.1 release\n\n## 8.1.1\n\n- Fix for `list-ordered` icon https://github.com/primer/octicons/pull/252\n- In React Octicons, we set aria-hidden to false if there's an aria-label provided\n\n## 8.1.0\n\n- Add the `arrow-both` icon courtesy of @venetucci\n- TypeScript types are now available thanks to @j-f1!\n- Fix CI builds for outside contributors (as long as they aren't changing octicons)\n- Fix typo in README\n- Update README with `@githubprimer/octicons-react scope`\n- Publish release candidates from any branch beginning with `release`\n\n## 8.0.0\n\n- Breaking changes in `octicons_react` [#225](https://github.com/primer/octicons/pull/225)\n- After the initial release of octicons_react https://github.com/primer/octicons/releases/tag/v7.4.0, we needed to rename the scope of the package. Due to some deployment conflicts in our pipelines.\n\n## 7.4.0\n\n- This release marks the first official version of Octicons for React! Check out the `@github/octicons-react` package on npm for more info, or peruse the long-running PR [#222](https://github.com/primer/octicons/pull/222).\n- CI status is now reported to the `#design-ops` Slack channel\n- Jekyll Octicons has moved in this repo from `lib/jekyll-octicons` to `lib/octicons_jekyll`\n\n## 7.3.0\n\n- Fix for heart icon https://github.com/primer/octicons/pull/211\n- Adding an archive icon created by @colinkeany\n- Fixes https://github.com/primer/octicons/issues/182\n- Fixed versioning strategy https://github.com/primer/octicons/pull/#208\n\n## Archived releases\n\n### Octicons_node 7.0.0\n\n- Removing `file-text` and `mail-reply` icons. Use `file` and `reply` respectively.\n- Removing spritesheet calls and `toSVGUse` method.\n\n### Octicons_gem 5.0.4\n\n- Removing `file-text` and `mail-reply` icons. Use `file` and `reply` respectively.\n- Removing spritesheet calls and `to_svg_use` method.\n\n### 6.0.1\n\nFixes:\n\n- Typo `kebab-veritcal` becomes `kebab-vertical`\n\n### 6.0.0\n\nAdded:\n\n- `kebab-horizontal` and `kebab-vertical` icons\n- Polyfill for the `Object.assign` function\n\nRemoves:\n\n- Removing a duplicate `ellipses` icon from the set. Use `ellipsis` instead.\n\n### 5.0.1\n\nFixes:\n\n- projects icon renders as a block, using `fill-rule` fixes it\n\n### 5.0.0\n\nAdds:\n\n- `project`\n- `note`\n- `screen-full`\n- `screen-normal`\n- More node.js api endpoints for accessing icons https://github.com/primer/octicons/pull/120\n- Creating a spritesheet demo https://github.com/primer/octicons/pull/121\n\nRemoves:\n\n- Deprecating support for the webfont https://github.com/primer/octicons/pull/117\n- Stop checking `/build/` directory into repository https://github.com/primer/octicons/pull/118\n- Removing sass as a dependency https://github.com/primer/octicons/pull/119\n\n### 4.4.0\n\nAdds:\n\n- svg.json file that is accessible from node require\n\n### 4.3.0\n\nFixes:\n\n- Vertical alignment on `italic`\n\nModifies:\n\n- `person`\n- `organization`\n\n### 4.2.1\n\nFixes:\n\n- Removing inline sourcemap from `min` versions of css.\n\n### 4.2.0\n\nAdds:\n\n- Keywords.json file that has an index of all octicons with alias names\n\n### 4.1.1 (June 16, 2016)\n\nFixes:\n\n- Putting the `$octicons-font-path` back in the scss file.\n\n### 4.1.0 (June 6, 2016)\n\nAdds:\n\n- Installation docs https://github.com/primer/octicons/pull/94\n- `grabber`\n- `plus-small`\n\nModifies:\n\n- `smiley`\n\nRefines:\n\n- Renames `mail-reply` to `reply` and refines its shape.\n\nFixes:\n\n- Revert license back to SPDX standard\n\n### 4.0.0 (June 6, 2016)\n\nAdds:\n\n- Whole new grunt build system including svg sprite sheet.\n- adding css min https://github.com/primer/octicons/pull/60\n- adding woff2 format https://github.com/primer/octicons/issues/3\n- creates spritesheet of svg files https://github.com/primer/octicons/issues/88\n\nRemoves:\n\n- Bower support\n\nFixes:\n\n- all svg icons include viewBox https://github.com/primer/octicons/issues/87\n- license in package.json https://github.com/primer/octicons/issues/85\n\n### 3.5.0 (February 12, 2016)\n\nAdds:\n\n- `unverified`\n\nRefines:\n\n- `verified`\n\n### 3.4.1 (January 24, 2016)\n\nThis includes various SVG viewport refinements.\n\nRefines:\n\n- `thumbs-down`\n- `logo-github`\n\n### 3.4.0 (January 22, 2016)\n\nAdds:\n\n- `verified`\n- `smiley`\n\nRemoves:\n\n- `color-mode`\n\nRefines:\n\n- `primitive-dot`\n- `horizontal-rule`\n- `triangle-down`\n- `triangle-up`\n- `triangle-left`\n- `triangle-right`\n- `globe`\n- `flame`\n- `comment-discussion`\n\n### 3.3.0 (November 12, 2015)\n\nAdds:\n\n- `logo-gist`\n\nResizes all our SVG to be 16x16 instead of 1024x1024\n\n### 3.2.0 (November 6, 2015)\n\nAdds:\n\n- `bold`\n- `text-size`\n- `italic`\n- `tasklist`\n\nIt also normalizes some styling in:\n\n- `list-unordered`\n- `list-ordered`\n- `quote`\n- `mention`\n- `bookmark`\n- `threebars`\n\nRemoves\n\n- `screen-normal`\n- `screen-full`\n\n### 3.1.0 (August 13, 2015)\n\nAdds\n\n- `shield`\n\nThis thickens stroke widths slightly on the following icons:\n\n- `circle-slash`\n- `clock`\n- `cloud-upload`\n- `cloud-download`\n- `dashboard`\n- `info`\n- `issue-closed`\n- `issue`\n- `issue-reopened`\n- `history`\n- `question`\n- `search`\n\nFills `comment-discussion`\n\nThickens `x` to match `checkmark`\n\n### 3.0.1 (August 10, 2015)\n\nSome files were missing in `3.0.0`\n\n### 3.0.0 (August 10, 2015)\n\nRemoves\n\n- `microscope`\n- `beer`\n- `split`\n- `puzzle`\n- `steps`\n- `podium`\n- `timer`\n- all `alignment` icons\n- all `move` icons\n- all `playback` icons\n- all `jump` icons\n\nAdds\n\n- `beaker`\n- `bell`\n- `desktop-download`\n- `watch`\n\nLine-weight changes, sizing normalization, and new drawings\n\n- `circle-slash`\n- `lock`\n- `cloud-upload`\n- `cloud-download`\n- `plus`\n- `✕`\n- `broadcast`\n- `lock`\n- all `repo` icons\n- organization\n- person\n- all `chevrons` & `triangles`\n- all `diff` icons\n- `clippy`\n- all `issue` and circular icons\n- `rss`\n- `ruby`\n- `cancel`\n- `settings`\n- `mirror`\n- `external-link`\n- `history`\n- `gear`\n- `settings`\n- `info`\n- `history`\n- `package`\n- `gist-secret`\n- `rocket`\n- `law`\n- `telescope`\n- `search`\n- `tag`\n- `normal-screen`\n- `iphone`\n- `no-new-line`\n- `desktop`\n- all `git` icons\n- `circuit-board`\n- `heart`\n- `home`\n- `briefcase`\n- `wiki`\n- `bookmark`\n- `briefcase`\n- `calendar`\n- `color-mode`\n- `comment`\n- `discussions`\n- `credit-card`\n- `dashboard`\n- `camera`\n- `video`\n- `bug`\n- `desktop`\n- `ellipses`\n- `eye`\n- all `files` & `folders`\n- `fold`\n- `unfold`\n- `gift`\n- `graph`\n- `hubot`\n- `inbox`\n- `jersey`\n- `keyboard`\n- `light-bulb`\n- `link`\n- `location`\n- `mail`\n- `mail-read`\n- `marker`\n- `plug`\n- `mute`\n- `pencil`\n- `push-pin`\n- `fullscreen`\n- `unfullscreen`\n- `server`\n- `sign-in`\n- `sign-out`\n- `tag`\n- `terminal`\n- `thumbs-up`\n- `thumbs-down`\n- `trash`\n- `unmute`\n- `versions`\n- `gist`\n- `key`\n- `megaphone`\n- `checklist`\n\n## 2.4.1 (June 2, 2015)\n\n- Add the scss file I forgot to include\n\n## 2.4.0 (June 2, 2015)\n\n- Add `octicons.scss`\n- Revert path changes to `sprockets-octicons.scss`, as they broke octicons in sprockets.\n\n## 2.3.0 (May 28, 2015)\n\n- Add a path variable to `sprockets-octicons.scss` to be consistent with octicons.less`\n\n## 2.2.3 (May 21, 2015)\n\n- Use SPDX license identifiers in package.json\n\n## 2.2.2 (April 1, 2015)\n\nFixes file icons for\n\n- `file-binary`\n- `file-code`\n- `file-media`\n- `file-pdf`\n- `file-symlink-file`\n- `file-text`\n- `file-zip`\n\n## 2.2.1 (March 30, 2015)\n\n- Fix vector artifact and smooth curves in `mark-github`\n\n## 2.2.0 (Feb 18, 2015)\n\n- Add two new icons: `thumbsup` and `thumbsdown`\n\n## 2.0.1 (June 16, 2014)\n\n- Add mention of github.com/logos to the license\n\n## 2.0.0 (June 16, 2014)\n\n- Hello world\n"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, we as\ncontributors and maintainers pledge to making participation in our project and\nour community a harassment-free experience for everyone, regardless of age, body\nsize, disability, ethnicity, sex characteristics, gender identity and expression,\nlevel of experience, education, socio-economic status, nationality, personal\nappearance, race, religion, or sexual identity and orientation.\n\n## Our Standards\n\nExamples of behavior that contributes to creating a positive environment\ninclude:\n\n* Using welcoming and inclusive language\n* Being respectful of differing viewpoints and experiences\n* Gracefully accepting constructive criticism\n* Focusing on what is best for the community\n* Showing empathy towards other community members\n\nExamples of unacceptable behavior by participants include:\n\n* The use of sexualized language or imagery and unwelcome sexual attention or\n advances\n* Trolling, insulting/derogatory comments, and personal or political attacks\n* Public or private harassment\n* Publishing others' private information, such as a physical or electronic\n address, without explicit permission\n* Other conduct which could reasonably be considered inappropriate in a\n professional setting\n\n## Our Responsibilities\n\nProject maintainers are responsible for clarifying the standards of acceptable\nbehavior and are expected to take appropriate and fair corrective action in\nresponse to any instances of unacceptable behavior.\n\nProject maintainers have the right and responsibility to remove, edit, or\nreject comments, commits, code, wiki edits, issues, and other contributions\nthat are not aligned to this Code of Conduct, or to ban temporarily or\npermanently any contributor for other behaviors that they deem inappropriate,\nthreatening, offensive, or harmful.\n\n## Scope\n\nThis Code of Conduct applies both within project spaces and in public spaces\nwhen an individual is representing the project or its community. Examples of\nrepresenting a project or community include using an official project e-mail\naddress, posting via an official social media account, or acting as an appointed\nrepresentative at an online or offline event. Representation of a project may be\nfurther defined and clarified by project maintainers.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be\nreported by contacting the project team at design-systems@github.com. All\ncomplaints will be reviewed and investigated and will result in a response that\nis deemed necessary and appropriate to the circumstances. The project team is\nobligated to maintain confidentiality with regard to the reporter of an incident.\nFurther details of specific enforcement policies may be posted separately.\n\nProject maintainers who do not follow or enforce the Code of Conduct in good\nfaith may face temporary or permanent repercussions as determined by other\nmembers of the project's leadership.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,\navailable at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html\n\n[homepage]: https://www.contributor-covenant.org\n\nFor answers to common questions about this code of conduct, see\nhttps://www.contributor-covenant.org/faq\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Octicons Contribution Guidelines (Currently GitHub Staff only)\n\nThank you for your interest in contributing to Octicons! We are currently only accepting submissions from GitHub staff and only include icons that are used in the GitHub UI. If you'd like to submit feedback, a bug, or an idea for improvement, please open a new issue in this repo using the appropriate [issue template](https://github.com/primer/octicons/issues/new/choose).\n\n## Icon request and review process\n\n### 1. Icon review request is made\n\n- Icon review requests are made using the [icon request template](https://github.com/github/primer/issues/new?assignees=&labels=octicon%2C+request%2C+needs+triage&template=02-icon-request.md&title=%5BIcon+request%5D+) in the github/primer repo (visible to GitHub staff only).\n- Icons in the Primer Roadmap inbox will be triaged by a maintainer from the Octicons team. Maintainers should reply with a comment on the issue and then move the issue to Primer Teams Backlog.\n\n### 2. Working on icons\n\n- If an icon recommendation can be made async, we will discuss it in #primer-octicons or directly in the issue.\n- Icon review requests require a working session, we will send an invitation. \n  - Once an icon has been assigned, it's up to assigned designer to be responsible for communicating the icon's status and drive the work forward.\n\n### 3. Icon design, review, and communication\n\n- Once design has been started on an icon, the request issue will be moved to the **Design in Progress** column of the Primer Teams Backlog.\n- Designers should design the icon in Figma and when ready for review, use the [Octicons Push plugin](https://www.figma.com/community/plugin/825432045044458754/Octicons-Push) to create a PR\n  - After a PR is created link to the PR in the icon request issue. PRs need approval from the icon requestor (stakeholder) and at least one designer on the octicons maintainer team.\n\n### 4. Icon request completed\n- When an icon request PR has been approved, communicate that in the issue.\n- After the Octicons release, the new icons that were added will have their request issues moved to the **Done** column\n\n\n## Adding or updating an icon\n\nFollow these steps to add or update an icon.\n\n### Manually with SVG files\n\n#### 1. Clone the repository\n\n```shell\n# Clone the repository\ngit clone https://github.com/primer/octicons\n\n# Navigate to the newly cloned directory\ncd octicons\n```\n\nIf you don't have [`write`](https://help.github.com/en/github/getting-started-with-github/access-permissions-on-github) access to the [primer/octicons](https://github.com/primer/octicons) repository, instead of cloning the repository directly, you'll need to [fork](http://help.github.com/fork-a-repo/) the project, clone your fork, and configure the remotes:\n\n```shell\n# Clone your fork of the repository\ngit clone https://github.com/<your-username>/octicons\n\n# Navigate to the newly cloned directory\ncd octicons\n\n# Assign the original repo to a remote called \"upstream\"\ngit remote add upstream https://github.com/primer/octicons\n```\n\n#### 2. Create a new feature branch\n\n```shell\ngit checkout -b <branch-name>\n```\n\n#### 3. Add or update SVG files in the `/icons` directory\n\n#### 4. Add or update keywords in `keywords.json`\n\n```diff\n{\n  \"mark-github\": [\"octocat\", \"brand\", \"github\", \"logo\"],\n+ \"your-icon\": [\"foo\", \"bar\"]\n}\n```\n\n#### 5. Commit and push changes\n\n```shell\ngit add .\ngit commit -m <message>\ngit push\n```\n\n#### 6. Create a pull request\n\nUse GitHub to [create a pull request](https://help.github.com/en/desktop/contributing-to-projects/creating-a-pull-request) for your branch. In your pull request description, be sure to mention where the icon will be used and any relevant timeline information.\n\nIf everything looks good, a maintainer will approve and merge the pull request when appropriate. After the pull request is merged, your icon will be available in the next Octicons release.\n\n### Using the Octicons Push Figma plugin\n\nIf you work at GitHub, you can use the [Octicons Push](https://www.figma.com/community/plugin/825432045044458754/Octicons-Push) Figma plugin to start an Octicons pull request from Figma.\n\nHere's how it works:\n\n1. Select the icon frames you want to commit. Make sure the frames are either 16x16 or 24x24 and that you've outlined all strokes.\n2. Open the Octicons Push plugin.\n3. Select the branch you want to commit to. You can choose an existing branch or create a new branch.\n4. Press \"Commit.\" The plugin will then export, commit, and push the selected icons to the branch you chose. If you chose to create a new branch, the plugin will give you a link to where you can start a new pull request with your branch.\n\nAfter you create a pull request, a member of the Design Infrastructure team will triage and review your contribution.\n\n![demo showing how to create a pull request using the Octicons Push Figma plugin](https://user-images.githubusercontent.com/4608155/77948730-b1a24600-727a-11ea-9c39-040be9a12963.gif)\n\n## How changes are reviewed\n\nHere are a few questions we'll ask when reviewing new octicons. Keep these in mind as you're designing:\n\n- Where will this icon be used in the context of GitHub UI?\n- Is an icon necessary in that context?\n- Could we use an existing icon?\n- Is the icon trying to represent too many ideas?\n- Does it follow the design guidelines?\n\n## Releasing changes\n\nOnce submitted changes have been agreed upon, these instructions will guide maintainers through releasing changes.\n\nReleases are managed by 🦋 [Changesets](https://github.com/atlassian/changesets#documentation) which is a great tool for managing major/minor/patch bumps and changelogs. More info can be found in our [how we work docs](https://github.com/github/design-infrastructure/blob/main/how-we-work/engineering/changesets.md#using-changesets-to-prepare-and-publish-a-release).\n\nWe have the [changeset-bot comment on new pull requests](https://github.com/changesets/bot#readme) asking contributors or maintainers to add a changeset file, which will become the markdown supported changelog entry for the change.\n\nWhen creating the changeset always commit into the working branch (pull request branch), not `main`.\n\nWhen a pull request is approved merge it into the `main` branch. The changeset action will then create a Release pull request that includes this new pull request.\n\nOnce maintainers have agreed and are satisfied with the release. Merge the Release pull request. Changesets will then publish a new GitHub release to the repository with the changelog and new version number. A second action will be triggered by this release and publish the new versions to npm and rubygems.\n\n🎉 Congratulations! The new release has been published.\n\n## Other contributions\n\nWhen contributing to Octicons outside of adding a new icon or release-dependent contribution, be sure to add the `skip-changeset` label to the pull request. This will allow for the pull request to skip the changeset check and have the ability to be merged into the main branch. \n\nExamples of other contributions include adding documentation or improving a GitHub Actions workflows.\n"
  },
  {
    "path": "Gemfile",
    "content": "# frozen_string_literal: true\n\nsource \"https://rubygems.org\"\n\ngroup :development, :test do\n  gem \"minitest\"\n  gem \"rake\"\n  gem \"rubocop-github\", \"0.20.0\"\nend\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2026 GitHub Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "![octicons cover light](https://user-images.githubusercontent.com/54012/138925195-5779c51d-ff8c-4264-a914-e64f4843893d.png#gh-light-mode-only)\n![octicons cover dark](https://user-images.githubusercontent.com/54012/138925203-80e1afa1-ba54-4731-9525-3c41186663f9.png#gh-dark-mode-only)\n<br>\n<br>\n<h1 align=\"center\">Primer Octicons</h1>\n\n<p align=\"center\">Octicons are a set of SVG icons built by GitHub for GitHub.</p>\n\n<p align=\"center\">\n  <a aria-label=\"build status\" href=\"https://github.com/primer/octicons/actions/workflows/ci.yml\">\n    <img alt=\"\" src=\"https://github.com/primer/octicons/actions/workflows/ci.yml/badge.svg?branch=main&event=push\">\n  </a>\n  <a aria-label=\"publish status\" href=\"https://github.com/primer/octicons/actions/workflows/publish.yml\">\n    <img alt=\"\" src=\"https://github.com/primer/octicons/actions/workflows/publish.yml/badge.svg\">\n  </a>\n</p>\n\n## Libraries\n\nThis repository contains several libraries. Each of them is in the `lib/` folder and gives access to Octicons on a different platform/language.\n\n### JavaScript\n\nThe octicons node.js library is the main JavaScript library. With [a JavaScript API](/lib/octicons_node/README.md) that can be used in a variety of applications.\n\n| Package                                                                              | Version                                                                                                                         |\n| ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------- |\n| **[@primer/octicons](/lib/octicons_node)** <br />Node.js package with JavaScript API | [![npm version](https://img.shields.io/npm/v/@primer/octicons.svg)](https://www.npmjs.org/package/@primer/octicons)             |\n| **[@primer/octicons-react](/lib/octicons_react)** <br />React Octicons components    | [![npm version](https://img.shields.io/npm/v/@primer/octicons-react.svg)](https://www.npmjs.org/package/@primer/octicons-react) |\n| **[@primer/styled-octicons](/lib/octicons_styled)** <br />React Octicons components with Styled System props    | [![npm version](https://img.shields.io/npm/v/@primer/styled-octicons.svg)](https://www.npmjs.org/package/@primer/styled-octicons) |\n\n\n### Ruby\n\n| Package                                                                       | Version                                                                                                       |\n| ----------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- |\n| **[octicons](/lib/octicons_gem)** <br />Ruby gem with Ruby API                | [![Gem version](https://img.shields.io/gem/v/octicons.svg)](https://rubygems.org/gems/octicons)               |\n| [octicons_helper](/lib/octicons_helper)<br />Rails helper for using octicons  | [![Gem version](https://img.shields.io/gem/v/octicons_helper.svg)](https://rubygems.org/gems/octicons_helper) |\n| [jekyll-octicons](/lib/octicons_jekyll)<br />Jekyll plugin for using octicons | [![Gem version](https://img.shields.io/gem/v/jekyll-octicons.svg)](https://rubygems.org/gems/jekyll-octicons) |\n\n## Contributing\n\n### Feedback, ideas, and bug reports\n\nIf you found a bug, have feedback about our Octicon Library, or an idea on how to improve it, please open a new issue in this repo using the appropriate [issue template](https://github.com/primer/octicons/issues/new/choose).\n\n### Request an Icon Review (GitHub staff only)\n\nTo request an icon review for inclusion in the Octicons Library, open an issue using the [icon review request](https://github.com/github/primer/issues/new?assignees=&labels=octicon%2C+request%2C+needs+triage&template=03-icon-request.md&title=%5BIcon+request%5D+) template in github/primer.\n\n### Adding or updating an icon\n\nRead through our [contributing guide](./CONTRIBUTING.md#adding-or-updating-icons) if you want to add or update icons.\n\n## License\n\n(c) GitHub, Inc.\n\nWhen using the GitHub logos, be sure to follow the [GitHub logo guidelines](https://github.com/logos).\n\n_Code License:_ [MIT](./LICENSE)\nApplies to all other files\n"
  },
  {
    "path": "add-octicon-checklist.md",
    "content": "# Add an octicon\n\nUse this checklist to add a new/updated octicon to the Figma library and the Octicons package. Read the [contributing guidelines](/CONTRIBUTING.md) for more information on the entire contribution process.\n\n## Figma\n- [ ] Remove white background from icon frame\n- [ ] Outline all strokes of vector shape\n- [ ] Union shapes\n- [ ] Merge/flatten vector (cmd+e)\n- [ ] Remove any unused points\n- [ ] Rename vector layer \"Icon\"\n- [ ] Vector layer color set to `text/primary`\n- [ ] Name the icon frame to the correct icon name\n  - Note: Octicon names should be written lower case and use `-` to separate descriptors\n  - Note: If the icon is related to another icon or is part of a set, check the naming convention of the other icons to be consistent. (e.g. the issue icons are all prefixed as `issue-(something)`, `issue-opened`/`issue-closed`)\n  - Note: 24px icons will end with `-24` (e.g. `issue-opened-24`)\n- [ ] Copy/paste into [Octicons library file](https://www.figma.com/file/1ljgTFkT5NKNRfq5hw07JQ/Octicons?node-id=0%3A1)\n- [ ] Convert the icons into components\n- [ ] Set constraints of vectors to Scale/Scale\n  - Note: If adding multiple icons, use the [\"All Constraints\" plugin](https://www.figma.com/community/plugin/847224511609531534/All-Constraints) for bulk editing\n- [ ] Add keywords to icon component\n  - Note: All keywords begin with the search flag `icon: `\n  - Note: Keywords should describe other metaphors that the icon can represent when searching\n  - Example: The `bookmark` icon's keywords are \"icon: favorite, save, bookmark\"\n\n## Octicons package\n- [ ] Use the [Octicons Push plugin](https://www.figma.com/community/plugin/825432045044458754/Octicons-Push) to create a pull request from Figma\n- [ ] Open created pull request in the browser and add details\n  - Pull request should include\n    - [ ] Small description with the names of the new icons\n    - [ ] Screenshot\n    - [ ] Link to icon request issue for tracking\n- [ ] Request reviewers\n  - [ ] Original requestor (from issue)\n  - [ ] Member of octicons team (@ashygee, @colebemis, @edokoa, @juliusschaeper)\n- [ ] Submit pull request\n"
  },
  {
    "path": "keywords.json",
    "content": "{\n  \"agent\": [\"agents\", \"ai\", \"cloud\", \"cloudecode\", \"code\"],\n  \"ai-model\": [\"ai\", \"model\", \"llm\", \"models\", \"copilot\"],\n  \"alert\": [\"warning\", \"triangle\", \"exclamation\", \"point\"],\n  \"archive\": [\"box\", \"catalog\"],\n  \"arrow-both\": [\"point\", \"direction\", \"left\", \"right\"],\n  \"arrow-down\": [\"point\", \"direction\"],\n  \"arrow-left\": [\"point\", \"direction\"],\n  \"arrow-right\": [\"point\", \"direction\"],\n  \"arrow-small-down\": [\"point\", \"direction\", \"little\", \"tiny\"],\n  \"arrow-small-left\": [\"point\", \"direction\", \"little\", \"tiny\"],\n  \"arrow-small-right\": [\"point\", \"direction\", \"little\", \"tiny\"],\n  \"arrow-small-up\": [\"point\", \"direction\", \"little\", \"tiny\"],\n  \"arrow-up\": [\"point\", \"direction\"],\n  \"beaker\": [\n    \"experiment\",\n    \"labs\",\n    \"experimental\",\n    \"feature\",\n    \"test\",\n    \"science\",\n    \"education\",\n    \"study\",\n    \"development\",\n    \"testing\"\n  ],\n  \"bell\": [\"notification\"],\n  \"bold\": [\"markdown\", \"bold\", \"text\"],\n  \"book\": [\"book\", \"journal\", \"wiki\", \"readme\"],\n  \"book-locked\": [\"book\", \"journal\", \"wiki\", \"readme\", \"lock\"],\n  \"bookmark\": [\"tab\", \"star\"],\n  \"boolean-off\": [\"bool\", \"off\", \"false\", \"no\", \"0\"],\n  \"boolean-on\": [\"bool\", \"on\", \"true\", \"yes\", \"1\"],\n  \"briefcase\": [\"suitcase\", \"business\"],\n  \"broadcast\": [\"rss\", \"radio\", \"signal\"],\n  \"browser\": [\"window\", \"web\"],\n  \"bug\": [\"insect\", \"issue\"],\n  \"calendar\": [\"time\", \"day\", \"month\", \"year\", \"date\", \"appointment\"],\n  \"check\": [\"mark\", \"yes\", \"confirm\", \"accept\", \"ok\", \"success\"],\n  \"checkbox\": [\"box\", \"checkbox\", \"check\"],\n  \"checkbox-fill\": [\"box\", \"checkbox\", \"check\"],\n  \"checklist\": [\"todo\", \"tasks\"],\n  \"chevron-down\": [\"triangle\", \"arrow\"],\n  \"chevron-left\": [\"triangle\", \"arrow\"],\n  \"chevron-right\": [\"triangle\", \"arrow\"],\n  \"chevron-up\": [\"triangle\", \"arrow\"],\n  \"circle-slash\": [\"no\", \"deny\", \"fail\", \"failure\", \"error\", \"bad\"],\n  \"circuit-board\": [\"developer\", \"hardware\", \"electricity\"],\n  \"clippy\": [\"copy\", \"paste\", \"save\", \"capture\", \"clipboard\"],\n  \"clock\": [\"time\", \"hour\", \"minute\", \"second\", \"watch\"],\n  \"cloud-download\": [\"save\", \"install\", \"get\"],\n  \"cloud-upload\": [\"put\", \"export\"],\n  \"code\": [\"brackets\"],\n  \"comment\": [\"speak\", \"bubble\", \"chat\"],\n  \"comment-ai\": [\"ai\", \"speak\", \"bubble\", \"chat\"],\n  \"comment-discussion\": [\"converse\", \"talk\", \"chat\"],\n  \"comment-locked\": [\"comment\", \"discussion\", \"conversation\", \"bubbles\", \"lock\"],\n  \"compose\": [\"write\", \"new\", \"create\", \"pencil\", \"post\"],\n  \"credit-card\": [\"money\", \"billing\", \"payments\", \"transactions\"],\n  \"crosshairs\": [\"target\", \"focus\", \"center\", \"trigger\", \"aim\"],\n  \"dash\": [\"hyphen\", \"range\"],\n  \"dashboard\": [\"speed\", \"dial\"],\n  \"database\": [\"disks\", \"data\"],\n  \"dependent\": [\"dependency\", \"dependent\", \"file\"],\n  \"desktop-download\": [\"clone\", \"download\"],\n  \"device-camera\": [\"photo\", \"picture\", \"image\", \"snapshot\"],\n  \"device-camera-video\": [\"watch\", \"view\", \"media\", \"stream\"],\n  \"device-desktop\": [\"computer\", \"monitor\"],\n  \"device-mobile\": [\"phone\", \"iphone\", \"cellphone\"],\n  \"dice\": [\"lucky\", \"chance\", \"random\"],\n  \"diff\": [\"difference\", \"changes\", \"compare\"],\n  \"diff-added\": [\"new\", \"addition\", \"plus\"],\n  \"diff-ignored\": [\"slash\"],\n  \"diff-modified\": [\"dot\", \"changed\", \"updated\"],\n  \"diff-removed\": [\"deleted\", \"subtracted\", \"dash\"],\n  \"diff-renamed\": [\"moved\", \"arrow\"],\n  \"ellipsis\": [\"dot\", \"read\", \"more\", \"hidden\", \"expand\"],\n  \"exclamation\": [\"warning\", \"alert\", \"emphasis\"],\n  \"eye\": [\"look\", \"watch\", \"see\"],\n  \"eye-closed\": [\"hidden\", \"invisible\", \"concealed\", \"\"],\n  \"file\": [\"file\", \"text\", \"words\"],\n  \"file-binary\": [\"image\", \"video\", \"word\", \"powerpoint\", \"excel\"],\n  \"file-check\": [\"file\", \"done\", \"complete\", \"check\", \"checked\", \"selected\"],\n  \"file-code\": [\"text\", \"javascript\", \"html\", \"css\", \"php\", \"ruby\", \"coffeescript\", \"sass\", \"scss\"],\n  \"file-directory\": [\"folder\"],\n  \"file-media\": [\"image\", \"video\", \"audio\"],\n  \"file-pdf\": [\"adobe\"],\n  \"file-submodule\": [\"folder\"],\n  \"file-symlink-directory\": [\"folder\", \"subfolder\", \"link\", \"alias\"],\n  \"file-symlink-file\": [\"link\", \"alias\"],\n  \"file-zip\": [\"compress\", \"archive\"],\n  \"filter-remove\": [\"funnel\", \"filter\", \"remove\", \"delete\"],\n  \"fiscal-host\": [\"safe\", \"money\"],\n  \"flame\": [\"fire\", \"hot\", \"burn\", \"trending\"],\n  \"flowchart\": [\"diagram\", \"chart\", \"process\", \"workflow\", \"loop\", \"nodes\", \"flow\"],\n  \"focus-center\": [\"target\", \"focus\", \"center\"],\n  \"fold\": [\"unfold\", \"hide\", \"collapse\"],\n  \"fold-down\": [\"unfold\", \"hide\", \"collapse\", \"down\"],\n  \"fold-up\": [\"unfold\", \"hide\", \"collapse\", \"up\"],\n  \"gear\": [\"settings\"],\n  \"gift\": [\"package\", \"present\", \"skill\", \"craft\", \"freebie\"],\n  \"gist\": [\"gist\", \"github\"],\n  \"gist-secret\": [\"gist\", \"secret\", \"private\"],\n  \"git-branch\": [\"fork\", \"branch\", \"git\", \"duplicate\"],\n  \"git-branch-check\": [\"git\", \"branch\", \"check\", \"checked\", \"selected\"],\n  \"git-commit\": [\"save\"],\n  \"git-compare\": [\"difference\", \"changes\"],\n  \"git-merge\": [\"join\"],\n  \"git-pull-request\": [\"review\"],\n  \"git-pull-request-locked\": [\"pr\", \"pull\", \"git\", \"lock\"],\n  \"github-action\": [\"board\", \"workflow\", \"action\", \"automation\"],\n  \"globe\": [\"world\", \"earth\", \"planet\", \"enterprise\"],\n  \"grabber\": [\"mover\", \"drag\", \"drop\", \"sort\"],\n  \"graph\": [\"chart\", \"trend\", \"stats\", \"statistics\"],\n  \"graph-bar-horizontal\": [\"chart\", \"barchart\", \"horizontal\", \"axis\", \"x-axis\", \"stats\", \"statistics\"],\n  \"graph-bar-vertical\": [\"chart\", \"barchart\", \"vertical\", \"axis\", \"y-axis\", \"stats\", \"statistics\"],\n  \"heart\": [\"love\", \"beat\"],\n  \"heart-outline\": [\"love\", \"beat\"],\n  \"history\": [\"time\", \"past\", \"revert\", \"back\"],\n  \"home\": [\"welcome\", \"index\", \"house\", \"building\"],\n  \"horizontal-rule\": [\"hr\"],\n  \"hubot\": [\"robot\", \"bot\"],\n  \"inbox\": [\"mail\", \"todo\", \"new\", \"messages\"],\n  \"inbox-fill\": [\"mail\", \"todo\", \"new\", \"messages\"],\n  \"infinity\": [\"unlimited\", \"infinite\"],\n  \"info\": [\"help\"],\n  \"internal-repo\": [\"internal, repo, repository\"],\n  \"issue-closed\": [\"done\", \"complete\"],\n  \"issue-locked\": [\"issue\", \"open\", \"new\", \"lock\"],\n  \"issue-opened\": [\"new\"],\n  \"issue-reopened\": [\"regression\"],\n  \"italic\": [\"font\", \"italic\", \"style\"],\n  \"jersey\": [\"team\", \"game\", \"basketball\"],\n  \"kebab-horizontal\": [\"kebab\", \"dot\", \"menu\", \"more\"],\n  \"kebab-vertical\": [\"kebab\", \"dot\", \"menu\", \"more\"],\n  \"key\": [\"key\", \"lock\", \"secure\", \"safe\"],\n  \"keyboard\": [\"type\", \"keys\", \"write\", \"shortcuts\"],\n  \"law\": [\"legal\", \"bill\"],\n  \"light-bulb\": [\"idea\"],\n  \"line-arrow-down\": [\"arrow\", \"point\", \"direction\", \"down\"],\n  \"line-arrow-left\": [\"arrow\", \"point\", \"direction\", \"left\"],\n  \"line-arrow-right\": [\"arrow\", \"point\", \"direction\", \"right\"],\n  \"line-arrow-up\": [\"arrow\", \"point\", \"direction\", \"up\"],\n  \"link\": [\"connect\", \"hyperlink\"],\n  \"link-external\": [\"out\", \"see\", \"more\", \"go\", \"to\"],\n  \"list-ordered\": [\"numbers\", \"tasks\", \"todo\", \"items\"],\n  \"list-unordered\": [\"bullet\", \"point\", \"tasks\", \"todo\", \"items\"],\n  \"location\": [\"here\", \"marker\"],\n  \"lock\": [\"secure\", \"safe\", \"protected\"],\n  \"lockup-github\": [\"brand\", \"github\", \"logo\"],\n  \"logo-gist\": [\"brand\", \"github\", \"logo\"],\n  \"logo-github\": [\"brand\", \"github\", \"logo\"],\n  \"loop\": [\"loops\", \"automation\", \"repeat\", \"node\", \"actions\", \"copilot\"],\n  \"mail\": [\"email\", \"unread\"],\n  \"mail-read\": [\"email\", \"open\"],\n  \"mark-github\": [\"octocat\", \"brand\", \"github\", \"logo\"],\n  \"markdown\": [\"markup\", \"style\"],\n  \"maximize\": [\"expand\", \"enlarge\", \"arrow\"],\n  \"mcp\": [\"model\", \"context\", \"protocol\"],\n  \"megaphone\": [\"bullhorn\", \"loud\", \"shout\", \"broadcast\"],\n  \"mention\": [\"at\", \"ping\"],\n  \"milestone\": [\"marker\"],\n  \"minimize\": [\"smaller\", \"shrink\", \"arrow\"],\n  \"mirror\": [\"reflect\"],\n  \"mortar-board\": [\"education\", \"learn\", \"teach\"],\n  \"move-to-bottom\": [\"terminal\", \"end\", \"down\", \"end\"],\n  \"move-to-end\": [\"terminal\", \"right\", \"finish\"],\n  \"move-to-start\": [\"terminal\", \"left\", \"beginning\"],\n  \"move-to-top\": [\"terminal\", \"up\", \"start\", \"beginning\"],\n  \"mute\": [\"quiet\", \"sound\", \"audio\", \"turn\", \"off\"],\n  \"no-newline\": [\"return\"],\n  \"north-star\": [\"star\", \"snowflake\", \"asterisk\"],\n  \"node\": [\"circle\", \"dot\", \"point\", \"loop\", \"loops\"],\n  \"note\": [\"card\", \"paper\", \"ticket\"],\n  \"octoface\": [\"octocat\", \"brand\"],\n  \"organization\": [\"people\", \"group\", \"team\"],\n  \"package\": [\"box\", \"ship\"],\n  \"paintcan\": [\"style\", \"theme\", \"art\", \"color\"],\n  \"pause\": [\"stop\", \"interupt\", \"block\", \"pause\"],\n  \"pencil\": [\"edit\", \"change\", \"update\", \"write\"],\n  \"pencil-ai\": [\"ai\", \"copilot\", \"edit\", \"change\", \"update\", \"write\"],\n  \"person\": [\"people\", \"man\", \"woman\", \"human\"],\n  \"pin\": [\"save\", \"star\", \"bookmark\"],\n  \"pin-slash\": [\"unpin\", \"unsave\", \"unstar\", \"unbookmark\"],\n  \"pivot-column\": [\"pivot\", \"column\", \"table\", \"project\", \"filter\"],\n  \"play\": [\"play\", \"start\", \"begin\", \"action\"],\n  \"plug\": [\"hook\", \"webhook\"],\n  \"plus\": [\"add\", \"new\", \"more\"],\n  \"plus-small\": [\"add\", \"new\", \"more\", \"small\"],\n  \"primitive-dot\": [\"circle\"],\n  \"primitive-dot-stroke\": [\"circle\", \"dot\", \"unread\"],\n  \"primitive-square\": [\"box\"],\n  \"project\": [\"board\", \"kanban\", \"columns\", \"scrum\"],\n  \"pulse\": [\"graph\", \"trend\", \"line\", \"activity\"],\n  \"question\": [\"help\", \"explain\"],\n  \"quote\": [\"quotation\"],\n  \"radio-tower\": [\"broadcast\"],\n  \"reply\": [\"reply all\", \"back\"],\n  \"repo\": [\"book\", \"journal\", \"repository\"],\n  \"repo-clone\": [\"book\", \"journal\", \"repository\"],\n  \"repo-force-push\": [\"book\", \"journal\", \"put\"],\n  \"repo-forked\": [\"book\", \"journal\", \"copy\"],\n  \"repo-pull\": [\"book\", \"journal\", \"get\"],\n  \"repo-push\": [\"book\", \"journal\", \"repository\", \"put\"],\n  \"repo-template\": [\"book\", \"new\", \"add\", \"template\"],\n  \"repo-template-private\": [\"book\", \"new\", \"template\"],\n  \"report\": [\"report\", \"abuse\", \"flag\"],\n  \"request-changes\": [\"diff\", \"changes\", \"request\"],\n  \"rocket\": [\"staff\", \"stafftools\", \"blast\", \"off\", \"space\", \"launch\", \"ship\"],\n  \"rss\": [\"broadcast\", \"feed\", \"atom\"],\n  \"ruby\": [\"code\", \"language\"],\n  \"saved\": [\"saved\", \"bookmark\"],\n  \"screen-full\": [\"fullscreen\", \"expand\"],\n  \"screen-normal\": [\"fullscreen\", \"expand\", \"exit\"],\n  \"search\": [\"magnifying\", \"glass\"],\n  \"server\": [\"computers\", \"racks\", \"ops\"],\n  \"settings\": [\"sliders\", \"filters\", \"controls\", \"levels\"],\n  \"shield\": [\"security\", \"shield\", \"protection\"],\n  \"shield-check\": [\"security\", \"shield\", \"protection\", \"check\", \"success\"],\n  \"shield-lock\": [\"protect\", \"shield\", \"lock\"],\n  \"shield-slash\": [\"shield\", \"slash\", \"protect\", \"unsafe\", \"unprotected\", \"security\"],\n  \"shield-x\": [\"security\", \"shield\", \"protection\", \"fail\"],\n  \"sign-in\": [\"door\", \"arrow\", \"direction\", \"enter\", \"log in\"],\n  \"sign-out\": [\"door\", \"arrow\", \"direction\", \"leave\", \"log out\"],\n  \"skip\": [\"skip\", \"slash\"],\n  \"smiley\": [\"emoji\", \"smile\", \"mood\", \"emotion\", \"feedback\", \"happy\", \"4\"],\n  \"smiley-frown\": [\"emoji\", \"frown\", \"sad\", \"negative\", \"unhappy\", \"mood\", \"emotion\", \"feedback\", \"2\"],\n  \"smiley-frustrated\": [\"emoji\", \"frustrated\", \"negative\", \"angry\", \"mad\", \"pain\", \"mood\", \"emotion\", \"feedback\", \"1\"],\n  \"smiley-grin\": [\"emoji\", \"grin\", \"mood\", \"ecstatic\", \"elated\", \"thrilled\", \"happy\", \"emotion\", \"feedback\", \"5\"],\n  \"smiley-neutral\": [\"emoji\", \"neutral\", \"meh\", \"expressionless\", \"mood\", \"emotion\", \"feedback\", \"3\"],\n  \"space\": [\"spaces\", \"context\", \"copilot\", \"attachment\", \"folder\", \"ai\"],\n  \"spacing-small\": [\"spacing\", \"density\", \"padding\", \"small\"],\n  \"spacing-medium\": [\"spacing\", \"density\", \"padding\", \"medium\"],\n  \"spacing-large\": [\"spacing\", \"density\", \"padding\", \"large\"],\n  \"sparkle\": [\"spark\", \"ai\", \"generate\", \"shine\"],\n  \"split-view\": [\"columns\", \"split\", \"view\", \"panes\", \"sidebar\"],\n  \"square-circle\": [\"stop\", \"interupt\", \"block\", \"pause\"],\n  \"squirrel\": [\"ship\", \"shipit\", \"launch\"],\n  \"star\": [\"save\", \"remember\", \"like\"],\n  \"stop\": [\"block\", \"spam\", \"report\"],\n  \"sync\": [\"cycle\", \"refresh\", \"loop\"],\n  \"tag\": [\"release\"],\n  \"tasklist\": [\"todo\"],\n  \"telescope\": [\"science\", \"space\", \"look\", \"view\", \"explore\"],\n  \"terminal\": [\"code\", \"ops\", \"shell\"],\n  \"text-size\": [\"font\", \"size\", \"text\"],\n  \"three-bars\": [\"hamburger\", \"menu\", \"dropdown\"],\n  \"thumbsdown\": [\"thumb\", \"thumbsdown\", \"rejected\", \"dislike\"],\n  \"thumbsup\": [\"thumb\", \"thumbsup\", \"prop\", \"ship\", \"like\"],\n  \"tools\": [\"screwdriver\", \"wrench\", \"settings\"],\n  \"trashcan\": [\"garbage\", \"rubbish\", \"recycle\", \"delete\"],\n  \"triangle-down\": [\"arrow\", \"point\", \"direction\"],\n  \"triangle-left\": [\"arrow\", \"point\", \"direction\"],\n  \"triangle-right\": [\"arrow\", \"point\", \"direction\"],\n  \"triangle-up\": [\"arrow\", \"point\", \"direction\"],\n  \"unfold\": [\"expand\", \"open\", \"reveal\"],\n  \"unmute\": [\"loud\", \"volume\", \"audio\", \"sound\", \"play\"],\n  \"unsaved\": [\"unsaved\", \"bookmark\"],\n  \"unverified\": [\"insecure\", \"untrusted\", \"signed\"],\n  \"unwrap\": [\"lines\", \"text\", \"paragraph\", \"wordwrap\", \"wrap\", \"flow\"],\n  \"verified\": [\"trusted\", \"secure\", \"trustworthy\", \"signed\"],\n  \"versions\": [\"history\", \"commits\"],\n  \"watch\": [\"wait\", \"hourglass\", \"time\", \"date\"],\n  \"workflow\": [\"workflow\", \"actions\"],\n  \"workflow-all\": [\"workflow\", \"actions\"],\n  \"wrap\": [\"lines\", \"text\", \"paragraph\", \"wordwrap\", \"wrap\", \"flow\"],\n  \"x\": [\"remove\", \"close\", \"delete\"],\n  \"zap\": [\"electricity\", \"lightning\", \"props\", \"like\", \"star\", \"save\"],\n  \"zoom-in\": [\"zoom\", \"in\", \"plus\", \"bigger\"],\n  \"zoom-out\": [\"zoom\", \"out\", \"minus\", \"smaller\"]\n}\n"
  },
  {
    "path": "lib/octicons_gem/.npmignore",
    "content": "*\n"
  },
  {
    "path": "lib/octicons_gem/Gemfile",
    "content": "# frozen_string_literal: true\n\nsource \"https://rubygems.org\"\n\ngemspec\n\ngroup :development, :test do\n  gem \"minitest\"\n  gem \"rake\"\n  gem \"rubocop\", \"~> 1.0\"\n  gem \"rubocop-github\", \"0.20.0\"\nend\n"
  },
  {
    "path": "lib/octicons_gem/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2026 GitHub Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "lib/octicons_gem/README.md",
    "content": "# octicons \n\n[![Gem version](https://img.shields.io/gem/v/octicons.svg)](https://rubygems.org/gems/octicons)\n\n## Install\n\nAdd this to your `Gemfile`\n\n```rb\ngem 'octicons'\n```\n\nThen `bundle install`.\n\nIf using a framework like Rails, please follow the [installation instructions](https://primer.style/view-components/#installation) in the [Primer ViewComponents](https://primer.style/view-components) documentation. \n\n## Usage\n\n```rb\nrequire 'octicons'\nicon = Octicons::Octicon.new(\"x\")\nicon.to_svg\n# <svg class=\"octicon octicon-x\" viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" version=\"1.1\" \"aria-hidden\"=\"true\"><path d=\"M7.48 8l3.75 3.75-1.48 1.48L6 9.48l-3.75 3.75-1.48-1.48L4.52 8 .77 4.25l1.48-1.48L6 6.52l3.75-3.75 1.48 1.48z\"></path></svg>\n```\n\n## Documentation\n\nThe `Octicon` class takes two arguments. The first is the symbol of the icon, and the second is a hash of arguments representing html attributes\n\n### `symbol` _(required)_\n\nThis is the name of the octicon you want to use. For example `alert`. [Full list of icons](/)\n\n### Options\n\n* `:height` - When setting the height to a number, the icon will scale to that size. For example, passing `32`, will calculate the width based on the icon's natural size.\n* `:width` - When setting the width to a number, the icon will scale to that size. For example, passing `32`, will calculate the width based on the icon's natural size.\n\nIf both `:width, :height` are passed into the options hash, then the icon will be sized exactly at those dimensions.\n\n### Attributes\n\nOnce initialized, you can read a few properties from the icon.\n\n#### `symbol`\n\nReturns the string of the symbol name\n\n```rb\nicon = Octicons::Octicon.new(\"x\")\nicon.symbol\n# \"x\"\n```\n\n#### `path`\n\nPath returns the string representation of the path of the icon.\n\n```rb\nicon = Octicons::Octicon.new(\"x\")\nicon.path\n# <path d=\"M7.48 8l3.75 3.75-1.48 1.48L6 9.48l-3.75 3.75-1.48-1.48L4.52 8 .77 4.25l1.48-1.48L6 6.52l3.75-3.75 1.48 1.48z\"></path>\n```\n\n#### `options`\n\nThis is a hash of all the `options` that will be added to the output tag.\n\n```rb\nicon = Octicons::Octicon.new(\"x\")\nicon.options\n# {:class=>\"octicon octicon-x\", :viewBox=>\"0 0 12 16\", :version=>\"1.1\", :width=>12, :height=>16, :\"aria-hidden\"=>\"true\"}\n```\n\n#### `width`\n\nWidth is the icon's true width. Based on the svg view box width. _Note, this doesn't change if you scale it up with size options, it only is the natural width of the icon_\n\n#### `height`\n\nHeight is the icon's true height. Based on the svg view box height. _Note, this doesn't change if you scale it up with size options, it only is the natural height of the icon_\n\n#### `keywords`\n\nReturns an array of keywords for the icon. The data comes from the [data file in lib](../data.json). Consider contributing more aliases for the icons.\n\n```rb\nicon = Octicons::Octicon.new(\"x\")\nicon.keywords\n# [\"remove\", \"close\", \"delete\"]\n```\n\n### Methods\n\n#### `to_svg`\n\nReturns a string of the svg tag\n\n```rb\nicon = Octicons::Octicon.new(\"x\")\nicon.to_svg\n# <svg class=\"octicon octicon-x\" viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" version=\"1.1\" \"aria-hidden\"=\"true\"><path d=\"M7.48 8l3.75 3.75-1.48 1.48L6 9.48l-3.75 3.75-1.48-1.48L4.52 8 .77 4.25l1.48-1.48L6 6.52l3.75-3.75 1.48 1.48z\"></path></svg>\n```\n"
  },
  {
    "path": "lib/octicons_gem/Rakefile",
    "content": "# frozen_string_literal: true\n\nrequire \"rake/testtask\"\nrequire \"rubocop/rake_task\"\nrequire \"bundler/gem_tasks\"\n\nRuboCop::RakeTask.new(:lint) do |t|\n  t.options = [\"--display-cop-names\"]\nend\n\nRake::TestTask.new do |t|\n  t.libs = [\"lib\", \"test\"]\n  t.test_files = FileList[\"test/*_test.rb\"]\nend\n\ntask :version, [:v] do |t, args|\n  out = \"# frozen_string_literal: true\\n\\nmodule Octicons\\n\"\\\n    \"  VERSION = \\\"#{args[:v]}\\\".freeze\\n\"\\\n    \"end\"\n  File.open(File.expand_path(\"../lib/octicons/version.rb\", __FILE__), \"w\") { |file| file.puts out }\nend\n\ndesc \"Run tests\"\ntask default: :test\n"
  },
  {
    "path": "lib/octicons_gem/lib/octicons/octicon.rb",
    "content": "# frozen_string_literal: true\n\nmodule Octicons\n  class Octicon\n    DEFAULT_HEIGHT = 16\n\n    attr_reader :path, :options, :width, :height, :symbol, :keywords\n\n    def initialize(symbol, options = {})\n      @symbol = symbol.to_s\n      if octicon = get_octicon(@symbol, options)\n        @path = octicon[\"path\"]\n        @width = octicon[\"width\"]\n        @height = octicon[\"height\"]\n        @keywords = octicon[\"keywords\"]\n        @options = options.dup\n        @options.merge!({\n          class:   classes,\n          viewBox: viewbox,\n          version: \"1.1\"\n        })\n        @options.merge!(size)\n        @options.merge!(a11y)\n      else\n        raise \"Couldn't find octicon symbol for #{@symbol.inspect}\"\n      end\n    end\n\n    # Returns an string representing a <svg> tag\n    def to_svg\n      \"<svg #{html_attributes}>#{@path}</svg>\"\n    end\n\n    private\n\n    def html_attributes\n      attrs = \"\"\n      @options.each { |attr, value| attrs += \"#{attr}=\\\"#{value}\\\" \" }\n      attrs.strip\n    end\n\n    # add some accessibility features to svg\n    def a11y\n      accessible = {}\n\n      if @options[:\"aria-label\"].nil? && @options[\"aria-label\"].nil?\n        accessible[:\"aria-hidden\"] = \"true\"\n      else\n        accessible[:role] = \"img\"\n      end\n\n      accessible\n    end\n\n    # prepare the octicon class\n    def classes\n      \"octicon octicon-#{@symbol} #{@options[:class]} \".strip\n    end\n\n    def viewbox\n      \"0 0 #{@width} #{@height}\"\n    end\n\n    # determine the height and width of the octicon based on :size option\n    def size\n      size = {\n        width:  @width,\n        height: @height\n      }\n\n      # Specific size\n      unless @options[:width].nil? && @options[:height].nil?\n        size[:width]  = @options[:width].nil?  ? calculate_width(@options[:height]) : @options[:width]\n        size[:height] = @options[:height].nil? ? calculate_height(@options[:width]) : @options[:height]\n      end\n\n      size\n    end\n\n    def calculate_width(height)\n      (height.to_i * @width) / @height\n    end\n\n    def calculate_height(width)\n      (width.to_i * @height) / @width\n    end\n\n    def get_octicon(symbol, options = {})\n      if octicon = Octicons::OCTICON_SYMBOLS[symbol]\n        # We're using width as an approximation for height if the height option is not passed in\n        height = options[:height] || options[:width] || DEFAULT_HEIGHT\n        natural_height = closest_natural_height(octicon[\"heights\"].keys, height)\n        return {\n          \"name\" => octicon[\"name\"],\n          \"keywords\" => octicon[\"keywords\"],\n          \"width\" => octicon[\"heights\"][natural_height.to_s][\"width\"].to_i,\n          \"height\" => natural_height,\n          \"path\" => octicon[\"heights\"][natural_height.to_s][\"path\"]\n        }\n      end\n    end\n\n    def closest_natural_height(natural_heights, height)\n      return natural_heights.reduce(natural_heights[0].to_i) do |acc, natural_height|\n        natural_height.to_i <= height.to_i ? natural_height.to_i : acc\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "lib/octicons_gem/lib/octicons/version.rb",
    "content": "# frozen_string_literal: true\n\nmodule Octicons\n  VERSION = \"19.9.0\".freeze\nend\n"
  },
  {
    "path": "lib/octicons_gem/lib/octicons.rb",
    "content": "# frozen_string_literal: true\n\nrequire \"octicons/version\"\nrequire \"octicons/octicon\"\nrequire \"json\"\n\nmodule Octicons\n  file_data = File.read(File.join(File.dirname(__FILE__), \"./build/data.json\"))\n  OCTICON_SYMBOLS = JSON.parse(file_data).freeze\nend\n"
  },
  {
    "path": "lib/octicons_gem/octicons.gemspec",
    "content": "# frozen_string_literal: true\n\nrequire File.expand_path(\"../lib/octicons/version\", __FILE__)\n\nGem::Specification.new do |s|\n  s.name        = \"octicons\"\n  s.version     = Octicons::VERSION\n  s.summary     = \"GitHub's octicons gem\"\n  s.platform    = Gem::Platform::RUBY\n  s.description = \"A package that distributes Octicons in a gem\"\n  s.authors     = [\"GitHub Inc.\"]\n  s.email       = [\"support@github.com\"]\n  s.files       = Dir[\"{lib}/**/*\"] + [\"LICENSE\", \"README.md\"]\n  s.homepage    = \"https://github.com/primer/octicons\"\n  s.license     = \"MIT\"\nend\n"
  },
  {
    "path": "lib/octicons_gem/test/helper.rb",
    "content": "# frozen_string_literal: true\n\nrequire \"minitest/autorun\"\nrequire \"octicons\"\n\ndef octicon(symbol, options = {})\n  Octicons::Octicon.new(symbol, options)\nend\n"
  },
  {
    "path": "lib/octicons_gem/test/octicon_test.rb",
    "content": "# frozen_string_literal: true\n\nrequire_relative \"helper\"\n\ndescribe Octicons::Octicon do\n  it \"fails when the octicon doesn't exist\" do\n    assert_raises(RuntimeError) do\n      octicon(\"octicon\")\n    end\n  end\n\n  it \"initialize accepts a string for an icon\" do\n    icon = octicon(\"x\")\n    assert icon\n  end\n\n  it \"initialize accepts a symbol for an icon\" do\n    icon = octicon(:x)\n    assert icon\n  end\n\n  it \"gets keywords for the icon\" do\n    icon = octicon(\"mark-github\")\n    assert_equal [\"octocat\", \"brand\", \"github\", \"logo\"], icon.keywords\n  end\n\n  it \"the attributes are readable\" do\n    icon = octicon(\"x\")\n    assert icon.path\n    assert icon.options\n    assert_equal \"x\", icon.symbol\n    assert_equal 16, icon.width\n    assert_equal 16, icon.height\n  end\n\n  describe \"viewBox\" do\n    it \"always has a viewBox\" do\n      icon = octicon(\"x\")\n      assert_includes icon.to_svg, \"viewBox=\\\"0 0 16 16\\\"\"\n    end\n  end\n\n  describe \"html_attributes\" do\n    it \"includes other html attributes\" do\n      icon = octicon(\"x\", foo: \"bar\", disabled: \"true\")\n      assert_includes icon.to_svg, \"disabled=\\\"true\\\"\"\n      assert_includes icon.to_svg, \"foo=\\\"bar\\\"\"\n    end\n  end\n\n  describe \"classes\" do\n    it \"includes classes passed in\" do\n      icon = octicon(\"x\", class: \"text-closed\")\n      assert_includes icon.to_svg, \"class=\\\"octicon octicon-x text-closed\\\"\"\n    end\n  end\n\n  describe \"size\" do\n    it \"always has width and height\" do\n      icon = octicon(\"x\")\n      assert_includes icon.to_svg, \"height=\\\"16\\\"\"\n      assert_includes icon.to_svg, \"width=\\\"16\\\"\"\n    end\n\n    it \"converts number string height to integer\" do\n      icon = octicon(\"x\", height: \"60\")\n      assert_includes icon.to_svg, \"height=\\\"60\\\"\"\n      assert_includes icon.to_svg, \"width=\\\"60\\\"\"\n    end\n\n    it \"converts number height to integer\" do\n      icon = octicon(\"x\", height: 60)\n      assert_includes icon.to_svg, \"height=\\\"60\\\"\"\n      assert_includes icon.to_svg, \"width=\\\"60\\\"\"\n    end\n\n    it \"converts number string width to integer\" do\n      icon = octicon(\"x\", width: \"45\")\n      assert_includes icon.to_svg, \"height=\\\"45\\\"\"\n      assert_includes icon.to_svg, \"width=\\\"45\\\"\"\n    end\n\n    it \"converts number width to integer\" do\n      icon = octicon(\"x\", width: 45)\n      assert_includes icon.to_svg, \"height=\\\"45\\\"\"\n      assert_includes icon.to_svg, \"width=\\\"45\\\"\"\n    end\n\n    it \"with height and width passed in\" do\n      icon = octicon(\"x\", width: 60, height: 60)\n      assert_includes icon.to_svg, \"width=\\\"60\\\"\"\n      assert_includes icon.to_svg, \"height=\\\"60\\\"\"\n    end\n\n    it \"chooses the correct svg given a height\" do\n      icon = octicon(\"x\", height: 32)\n      assert_includes icon.to_svg, \"width=\\\"32\\\"\"\n      assert_includes icon.to_svg, \"height=\\\"32\\\"\"\n      assert_includes icon.to_svg, \"viewBox=\\\"0 0 24 24\\\"\"\n    end\n\n    it \"chooses the correct svg given a width\" do\n      icon = octicon(\"x\", width: 24)\n      assert_includes icon.to_svg, \"width=\\\"24\\\"\"\n      assert_includes icon.to_svg, \"height=\\\"24\\\"\"\n      assert_includes icon.to_svg, \"viewBox=\\\"0 0 24 24\\\"\"\n    end\n\n    it \"chooses the correct svg given a height and width\" do\n      icon = octicon(\"x\", height: 24, width: 16)\n      assert_includes icon.to_svg, \"width=\\\"16\\\"\"\n      assert_includes icon.to_svg, \"height=\\\"24\\\"\"\n      assert_includes icon.to_svg, \"viewBox=\\\"0 0 24 24\\\"\"\n    end\n  end\n\n  describe \"a11y\" do\n    it \"includes attributes for symbol keys\" do\n      icon = octicon(\"x\", \"aria-label\": \"Close\")\n      assert_includes icon.to_svg, \"role=\\\"img\\\"\"\n      assert_includes icon.to_svg, \"aria-label=\\\"Close\\\"\"\n      refute_includes icon.to_svg, \"aria-hidden\"\n    end\n\n    it \"includes attributes for string keys\" do\n      icon = octicon(\"x\", \"aria-label\" => \"Close\")\n      assert_includes icon.to_svg, \"role=\\\"img\\\"\"\n      assert_includes icon.to_svg, \"aria-label=\\\"Close\\\"\"\n      refute_includes icon.to_svg, \"aria-hidden\"\n    end\n\n    it \"has aria-hidden when no label is passed in\" do\n      icon = octicon(\"x\")\n      assert_includes icon.to_svg, \"aria-hidden=\\\"true\\\"\"\n    end\n  end\nend\n"
  },
  {
    "path": "lib/octicons_gem/test/octicons_test.rb",
    "content": "# frozen_string_literal: true\n\nrequire_relative \"helper\"\n\ndescribe Octicons do\n  it \"loads all icons on initialization\" do\n    refute_equal 0, Octicons::OCTICON_SYMBOLS.length\n    x_icon = Octicons::OCTICON_SYMBOLS[\"x\"]\n    assert x_icon[\"name\"]\n    assert x_icon[\"keywords\"]\n    assert x_icon[\"heights\"]\n    assert x_icon[\"heights\"][\"16\"]\n    assert x_icon[\"heights\"][\"16\"][\"width\"]\n    assert x_icon[\"heights\"][\"16\"][\"path\"]\n  end\nend\n"
  },
  {
    "path": "lib/octicons_helper/.npmignore",
    "content": "*\n"
  },
  {
    "path": "lib/octicons_helper/Gemfile",
    "content": "# frozen_string_literal: true\n\nsource \"https://rubygems.org\"\n\ngemspec\n\ngem \"octicons\", \"19.9.0\"\ngem \"rails\"\n\ngroup :development, :test do\n  gem \"minitest\", \"~> 5.0\"\n  gem \"rake\"\n  gem \"rubocop\", \"~> 1.0\"\n  gem \"rubocop-github\", \"0.20.0\"\nend\n"
  },
  {
    "path": "lib/octicons_helper/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2026 GitHub Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "lib/octicons_helper/README.md",
    "content": "# octicons_helper\n\n[![Gem version](https://img.shields.io/gem/v/octicons_helper.svg)](https://rubygems.org/gems/octicons_helper)\n\n\nThis rails helper lets you easily include svg octicons in your rails apps.\n\n## Install\n\n1. Add this to your `Gemfile`\n\n    ```rb\n    gem 'octicons_helper'\n    ```\n\n3. Use this tag in your erbs\n\n    ```rb\n    <%= octicon \"alert\", :height => 32,  :class => \"right left\", :\"aria-label\" => \"hi\" %>\n    ```\nWe recommend including the CSS in the [`@primer/octicons`](/packages/javascript) npm module. You can also npm install that package and include `build/build.css` in your styles."
  },
  {
    "path": "lib/octicons_helper/Rakefile",
    "content": "# frozen_string_literal: true\n\nrequire \"rake/testtask\"\nrequire \"rubocop/rake_task\"\nrequire \"bundler/gem_tasks\"\n\nRuboCop::RakeTask.new(:lint) do |t|\n  t.options = [\"--display-cop-names\"]\nend\n\ntask :version, [:v] do |t, args|\n  out = \"# frozen_string_literal: true\\n\\nmodule OcticonsHelper\\n\"\\\n    \"  VERSION = \\\"#{args[:v]}\\\".freeze\\n\"\\\n    \"end\"\n  File.open(File.expand_path(\"../lib/octicons_helper/version.rb\", __FILE__), \"w\") do |file|\n    file.puts out\n  end\n\n  [\"octicons_helper.gemspec\", \"Gemfile\"].each do |filename|\n    gs = File.read(File.expand_path(\"../#{filename}\", __FILE__))\n    File.open(File.expand_path(\"../#{filename}\", __FILE__), \"w\") do |file|\n      file.puts gs.gsub(/\"octicons\", \"[^\"]+\"/, \"\\\"octicons\\\", \\\"#{args[:v]}\\\"\")\n    end\n  end\nend\n\nRake::TestTask.new do |t|\n  t.libs = [\"lib\", \"test\"]\n  t.test_files = FileList[\"test/*_test.rb\"]\n  t.warning = false\nend\n\ndesc \"Run tests\"\ntask default: :test\n"
  },
  {
    "path": "lib/octicons_helper/lib/octicons_helper/helper.rb",
    "content": "# frozen_string_literal: true\n\nrequire \"octicons\"\nrequire \"action_view\"\n\nmodule OcticonsHelper\n  include ActionView::Helpers::TagHelper\n\n  mattr_accessor :octicons_helper_cache, default: {}\n\n  def octicon(symbol, options = {})\n    return \"\" if symbol.nil?\n\n    cache_key = [symbol, options]\n\n    if tag = octicons_helper_cache[cache_key]\n      tag\n    else\n      icon = Octicons::Octicon.new(symbol, options)\n\n      tag = content_tag(:svg, icon.path.html_safe, icon.options).freeze # rubocop:disable Rails/OutputSafety\n      octicons_helper_cache[cache_key] = tag\n      tag\n    end\n  end\nend\n"
  },
  {
    "path": "lib/octicons_helper/lib/octicons_helper/railtie.rb",
    "content": "# frozen_string_literal: true\n\nrequire \"rails\"\n\nmodule OcticonsHelper\n  class Railtie < Rails::Railtie\n    initializer \"octicons_helper.helper\" do\n      ActionView::Base.send :include, OcticonsHelper\n    end\n  end\nend\n"
  },
  {
    "path": "lib/octicons_helper/lib/octicons_helper/version.rb",
    "content": "# frozen_string_literal: true\n\nmodule OcticonsHelper\n  VERSION = \"19.9.0\".freeze\nend\n"
  },
  {
    "path": "lib/octicons_helper/lib/octicons_helper.rb",
    "content": "# frozen_string_literal: true\n\nrequire \"octicons_helper/version\"\nrequire \"octicons_helper/helper\"\nrequire \"octicons_helper/railtie\" if defined?(Rails)\n"
  },
  {
    "path": "lib/octicons_helper/octicons_helper.gemspec",
    "content": "# frozen_string_literal: true\n\nrequire File.expand_path(\"../lib/octicons_helper/version\", __FILE__)\n\nGem::Specification.new do |s|\n  s.name        = \"octicons_helper\"\n  s.version     = OcticonsHelper::VERSION\n  s.summary     = \"Octicons rails helper\"\n  s.description = \"A rails helper that makes including svg Octicons simple.\"\n  s.authors     = [\"GitHub Inc.\"]\n  s.email       = [\"support@github.com\"]\n  s.files       = Dir[\"{lib}/**/*\"] + [\"LICENSE\", \"README.md\"]\n  s.homepage    = \"https://github.com/primer/octicons\"\n  s.license     = \"MIT\"\n\n  s.require_paths = [\"lib\"]\n\n  s.add_dependency \"octicons\", \"19.9.0\"\n  s.add_dependency \"railties\"\n  s.add_dependency \"actionview\"\nend\n"
  },
  {
    "path": "lib/octicons_helper/test/helper.rb",
    "content": "# frozen_string_literal: true\n\nrequire \"minitest/autorun\"\nrequire \"minitest/mock\"\nrequire \"octicons_helper\"\n\ninclude OcticonsHelper\n"
  },
  {
    "path": "lib/octicons_helper/test/octicons_helper_test.rb",
    "content": "# frozen_string_literal: true\n\nrequire_relative \"helper\"\n\ndescribe OcticonsHelper do\n  describe \"rendering\" do\n    it \"renders nothing when no symbol is passed in\" do\n      assert_equal \"\", octicon(nil)\n    end\n\n    it \"renders the svg\" do\n      assert_match /<svg.*octicon-x.*>.*<\\/svg>/, octicon(\"x\")\n    end\n\n    it \"has a path\" do\n      assert_match /<path/, octicon(\"alert\")\n    end\n\n    it \"adds html attributes to output\" do\n      assert_match /foo=\"bar\"/, octicon(\"alert\", foo: \"bar\")\n    end\n\n    it \"caches SVGs for two calls with the same arguments\" do\n      OcticonsHelper.octicons_helper_cache = {}\n\n      mock = Minitest::Mock.new\n      def mock.path\n        @call_count ||= 0\n        @call_count += 1\n\n        raise \"Octicon library called twice\" if @call_count > 1\n\n        \"foo\"\n      end\n      def mock.options; end\n\n      Octicons::Octicon.stub :new, mock do\n        octicon(\"alert\")\n        octicon(\"alert\")\n      end\n\n      OcticonsHelper.octicons_helper_cache = {}\n    end\n  end\nend\n"
  },
  {
    "path": "lib/octicons_jekyll/.npmignore",
    "content": "*\n"
  },
  {
    "path": "lib/octicons_jekyll/.rubocop.yml",
    "content": "inherit_gem:\n  rubocop-github:\n    - config/default.yml\n\nNaming/FileName:\n  Enabled: false\n\nStyle/OneClassPerFile:\n  Exclude:\n    - \"lib/jekyll-octicons/version.rb\"\n\nAllCops:\n  NewCops: enable\n"
  },
  {
    "path": "lib/octicons_jekyll/Gemfile",
    "content": "# frozen_string_literal: true\n\nsource \"https://rubygems.org\"\n\ngemspec\n\ngem \"octicons\", \"19.8.0\"\n\ngroup :development, :test do\n  gem \"minitest\"\n  gem \"rake\"\n  gem \"rubocop\", \"~> 1.0\"\n  gem \"rubocop-github\", \"0.20.0\"\nend\n"
  },
  {
    "path": "lib/octicons_jekyll/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2026 GitHub Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "lib/octicons_jekyll/README.md",
    "content": "# jekyll-octicons\n\n[![Gem version](https://img.shields.io/gem/v/jekyll-octicons.svg)](https://rubygems.org/gems/jekyll-octicons)\n\nThe Jekyll liquid tag is a plugin that lets you include octicons in your Jekyll sites.\n\n## Install\n\n1. Add this to your `Gemfile`\n\n    ```rb\n    gem 'jekyll-octicons'\n    ```\n\n2. Add this to your jekyll `_config.yml`\n\n    ```yml\n    plugins:\n      - jekyll-octicons\n    ```\n\n3. Use this tag in your jekyll templates\n\n    ```\n    {% octicon alert height:32 class:\"right left\" aria-label:hi %}\n    ```\n\nWe recommend including the CSS in the [`@primer/octicons`](/packages/javascript) npm module. You can also npm install that package and include `build/build.css` in your styles.\n"
  },
  {
    "path": "lib/octicons_jekyll/Rakefile",
    "content": "# frozen_string_literal: true\n\nrequire \"rake/testtask\"\nrequire \"rubocop/rake_task\"\nrequire \"bundler/gem_tasks\"\n\nRuboCop::RakeTask.new(:lint) do |t|\n  t.options = [\"--display-cop-names\"]\nend\n\ntask :version, [:v] => :environment do |t, args|\n  out = \"# frozen_string_literal: true\\n\\n# Prevent bundler errors\\n\"\\\n  \"module Liquid; class Tag; end; end\\n\\n\"\\\n  \"module Jekyll\\n\"\\\n  \"  class Octicons < Liquid::Tag\\n\"\\\n  \"    VERSION = \\\"#{args[:v]}\\\".freeze\\n\"\\\n  \"  end\\n\"\\\n  \"end\"\n  File.open(File.expand_path(\"../lib/jekyll-octicons/version.rb\", __FILE__), \"w\") do |file|\n    file.puts out\n  end\n\n  [\"jekyll-octicons.gemspec\", \"Gemfile\"].each do |filename|\n    gs = File.read(File.expand_path(\"../#{filename}\", __FILE__))\n    File.open(File.expand_path(\"../#{filename}\", __FILE__), \"w\") do |file|\n      file.puts gs.gsub(/\"octicons\", \"[^\"]+\"/, \"\\\"octicons\\\", \\\"#{args[:v]}\\\"\")\n    end\n  end\nend\n\nRake::TestTask.new do |t|\n  t.libs = [\"lib\", \"test\"]\n  t.test_files = FileList[\"test/*_test.rb\"]\n  t.warning = false\nend\n\ndesc \"Run tests\"\ntask default: :test\n"
  },
  {
    "path": "lib/octicons_jekyll/jekyll-octicons.gemspec",
    "content": "# frozen_string_literal: true\n\nrequire File.expand_path(\"../lib/jekyll-octicons/version\", __FILE__)\n\nGem::Specification.new do |s|\n  s.name        = \"jekyll-octicons\"\n  s.version     = Jekyll::Octicons::VERSION\n  s.summary     = \"Octicons jekyll liquid tag\"\n  s.description = \"A jekyll liquid plugin that makes including svg Octicons simple.\"\n  s.authors     = [\"GitHub Inc.\"]\n  s.email       = [\"support@github.com\"]\n  s.files       = Dir[\"{lib}/**/*\"] + [\"LICENSE\", \"README.md\"]\n  s.homepage    = \"https://github.com/primer/octicons\"\n  s.license     = \"MIT\"\n\n  s.require_paths = [\"lib\"]\n\n  s.add_dependency \"jekyll\", \">= 3.6\", \"< 5.0\"\n  s.add_dependency \"octicons\", \"19.8.0\"\nend\n"
  },
  {
    "path": "lib/octicons_jekyll/lib/jekyll-octicons/version.rb",
    "content": "# frozen_string_literal: true\n\n# Prevent bundler errors\nmodule Liquid; class Tag; end; end\n\nmodule Jekyll\n  class Octicons < Liquid::Tag\n    VERSION = \"19.8.0\".freeze\n  end\nend\n"
  },
  {
    "path": "lib/octicons_jekyll/lib/jekyll-octicons.rb",
    "content": "# frozen_string_literal: true\n\nrequire \"octicons\"\nrequire \"jekyll-octicons/version\"\nrequire \"liquid\"\nrequire \"jekyll/liquid_extensions\"\n\nmodule Jekyll\n  class Octicons < Liquid::Tag\n    include Jekyll::LiquidExtensions\n\n    # Syntax for the octicon symbol\n    Syntax = /\\A(#{Liquid::VariableSignature}+)/\n\n    # For interpolation, look for liquid variables\n    Variable = /\\{\\{\\s*([\\w]+\\.?[\\w]*)\\s*\\}\\}/i\n\n    # Copied from Liquid::TagAttributes to allow dashes in tag names:\n    #\n    #   {% octicon alert area-label:\"Hello World!\" %}\n    #\n    TagAttributes = /([\\w-]+)\\s*\\:\\s*(#{Liquid::QuotedFragment})/o\n\n    def initialize(tag_name, markup, options)\n      super\n      @markup = markup\n\n      # If there's interpolation going on, we need to do this in render\n      prepare(markup) unless match = markup.match(Variable)\n    end\n\n    def render(context)\n      prepare(interpolate(@markup, context)) if match = @markup.match(Variable)\n\n      return nil if @symbol.nil?\n      ::Octicons::Octicon.new(@symbol, @options).to_svg\n    end\n\n    private\n\n    def interpolate(markup, context)\n      markup.scan Variable do |variable|\n        markup = markup.gsub(Variable, lookup_variable(context, variable.first))\n      end\n      markup\n    end\n\n    def prepare(markup)\n      @symbol = symbol(markup)\n      @options = string_to_hash(markup)\n    end\n\n    def symbol(markup)\n      if match = markup.match(Syntax)\n        match[1]\n      end\n    end\n\n    # Create a ruby hash from a string passed by the jekyll tag\n    def string_to_hash(markup)\n      options = {}\n\n      if match = markup.match(Syntax)\n        markup.scan(TagAttributes) do |key, value|\n          options[key.to_sym] = value.gsub(/\\A\"|\"\\z/, \"\")\n        end\n      end\n\n      options\n    end\n  end\nend\n\nLiquid::Template.register_tag(\"octicon\", Jekyll::Octicons)\n"
  },
  {
    "path": "lib/octicons_jekyll/test/helper.rb",
    "content": "# frozen_string_literal: true\n\nrequire \"minitest/autorun\"\nrequire \"jekyll-octicons\"\n\n# Parse a string into a liquid template\n# rubocop:disable Rails/Delegate\ndef parse(string)\n  Liquid::Template.parse(string)\nend\n# rubocop:enable Rails/Delegate\n\n# Parse and render a string\ndef render(string, assigns = {})\n  parse(string).render!(assigns)\nend\n"
  },
  {
    "path": "lib/octicons_jekyll/test/octicon_tag_test.rb",
    "content": "# frozen_string_literal: true\n\nrequire_relative \"helper\"\n\ndescribe Jekyll::Octicons do\n  describe \"parsing\" do\n    it \"parses the tag options\" do\n      output = render(\"{% octicon mark-github height:32 class:\\\"left right\\\" aria-label:hi %}\")\n      assert_match /height=\"32\"/, output\n      assert_match /class=\"[^\"]+ left right/, output\n      assert_match /aria-label=\"hi\"/, output\n    end\n\n    it \"parses interpolation of variables\" do\n      template = render(\"{% assign symbol = \\\"mark-github\\\" %}{% octicon {{ symbol }} %}\")\n      assert_match /<svg.*octicon-mark-github.*/, template\n    end\n  end\n\n  describe \"rendering\" do\n    it \"renders the svg\" do\n      output = render(\"{% octicon mark-github height:32 %}\")\n      assert_match /<svg.*octicon-mark-github.*/, output\n      assert_match /<svg.*width=\"32\".*/, output\n    end\n\n    it \"renders nothing without a symbol\" do\n      assert_equal \"\", render(\"{% octicon %}\")\n    end\n  end\nend\n"
  },
  {
    "path": "lib/octicons_node/.npmignore",
    "content": "script\n"
  },
  {
    "path": "lib/octicons_node/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2026 GitHub Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "lib/octicons_node/README.md",
    "content": "# @primer/octicons\n\n\n[![npm version](https://img.shields.io/npm/v/@primer/octicons.svg)](https://www.npmjs.org/package/@primer/octicons)\n\n## Install\n\nThis package is distributed with [npm][npm]. After [installing npm][install-npm], you can install `@primer/octicons` with this command:\n\n```shell\nnpm install @primer/octicons\n```\n\n## Usage\n\nFor all the usages, we recommend using the CSS located in [`build/build.css`](https://unpkg.com/@primer/octicons/build/build.css). This is some simple CSS to normalize the icons and inherit colors.\n\nAfter installing `@primer/octicons` you can access the icons like this:\n\n```js\nvar octicons = require(\"@primer/octicons\")\nocticons.alert\n// {\n//     symbol: 'alert',\n//     keywords: ['warning', 'triangle', 'exclamation', 'point'],\n//     toSVG: [Function]\n//     heights: {\n//         16: {\n//             width: 16,\n//             path: '<path d=\"M8.865 1.52c-.18-.31-.51-.5-.87-.5s-.69.19-.87.5L.275 13.5c-.18.31-.18.69 0 1 .19.31.52.5.87.5h13.7c.36 0 .69-.19.86-.5.17-.31.18-.69.01-1L8.865 1.52zM8.995 13h-2v-2h2v2zm0-3h-2V6h2v4z\"/>',\n//             options: {\n//                 version: '1.1',\n//                 width: '16',\n//                 height: '16',\n//                 viewBox: '0 0 16 16',\n//                 class: 'octicon octicon-alert',\n//                 'aria-hidden': 'true'\n//             },\n//         },\n//         24: ...\n//     }\n// }\n```\n\nThere will be a key for every icon, with [`toSVG`](#octiconsnametosvg) and other properties.\n\n_Note: `alert` in the above example can be replaced with any valid icon name. Icons with multi-word names (e.g. `arrow-right`) **cannot** be accessed using dot notation (e.g. `octicons.alert`). Instead, use bracket notation (e.g. `octicons['arrow-right']`)._\n\n### `octicons[name].symbol`\n\nReturns the string of the symbol name, same as the key for that icon.\n\n```js\nocticons.x.symbol\n// \"x\"\n```\n\n### `octicons[name].keywords`\n\nReturns an array of keywords for the icon. The data comes from [keywords.json](https://github.com/primer/octicons/blob/main/keywords.json). Consider contributing more aliases for the icons.\n\n```js\nocticons.x.keywords\n// [\"remove\", \"close\", \"delete\"]\n```\n\n### `octicons[name].heights`\n\nEach icon can have multiple SVGs that are designed for different sizes. The `heights` property allows you to access all the SVGs for an icon using the natural height of the SVG.\n\n\n```js\nocticons.x.heights\n// {\n//     16: {\n//         width: 16,\n//         path: '<path d=\"...\"/>',\n//         options: {\n//             version: '1.1',\n//             width: '16',\n//             height: '16',\n//             viewBox: '0 0 16 16',\n//             class: 'octicon octicon-alert',\n//             'aria-hidden': 'true'\n//         },\n//     },\n//     24: {\n//         width: 24,\n//         path: '<path d=\"...\"/>',\n//         options: {\n//             version: '1.1',\n//             width: '24',\n//             height: '24',\n//             viewBox: '0 0 24 24',\n//             class: 'octicon octicon-alert',\n//             'aria-hidden': 'true'\n//         },\n//     },\n// }\n```\n\n\n### `octicons[name].heights[height].width`\n\nReturns the icon's true width, based on the SVG view box width. _Note, this doesn't change if you scale it up with size options, it only is the natural width of the icon._\n\n### `octicons[name].heights[height].path`\n\nReturns the string representation of the path of the icon.\n\n```js\nocticons.x.heights[16].path\n// <path d=\"M7.48 8l3.75 3.75-1.48 1.48L6 9.48l-3.75 3.75-1.48-1.48L4.52 8 .77 4.25l1.48-1.48L6 6.52l3.75-3.75 1.48 1.48z\"></path>\n```\n\n### `octicons[name].heights[height].options`\n\nThis is an object of all the attributes that will be added to the output tag.\n\n```js\nocticons.x.heights[16].options\n// { version: '1.1', width: '12', height: '16', viewBox: '0 0 12 16', class: 'octicon octicon-x', 'aria-hidden': 'true' }\n```\n\n### `octicons[name].toSVG()`\n\nReturns a string of the `<svg>` tag.\n\n```js\nocticons.x.toSVG()\n// <svg version=\"1.1\" width=\"12\" height=\"16\" viewBox=\"0 0 12 16\" class=\"octicon octicon-x\" aria-hidden=\"true\"><path d=\"M7.48 8l3.75 3.75-1.48 1.48L6 9.48l-3.75 3.75-1.48-1.48L4.52 8 .77 4.25l1.48-1.48L6 6.52l3.75-3.75 1.48 1.48z\"/></svg>\n```\n\nThe `.toSVG()` method accepts an optional `options` object. This is used to add CSS class names, accessibility options, and sizes.\n\n#### class\n\nAdd more CSS classes to the `<svg>` tag.\n\n```js\nocticons.x.toSVG({ \"class\": \"close\" })\n// <svg version=\"1.1\" width=\"12\" height=\"16\" viewBox=\"0 0 12 16\" class=\"octicon octicon-x close\" aria-hidden=\"true\"><path d=\"M7.48 8l3.75 3.75-1.48 1.48L6 9.48l-3.75 3.75-1.48-1.48L4.52 8 .77 4.25l1.48-1.48L6 6.52l3.75-3.75 1.48 1.48z\"/></svg>\n```\n\n#### aria-label\n\nAdd accessibility `aria-label` to the icon.\n\n```js\nocticons.x.toSVG({ \"aria-label\": \"Close the window\" })\n// <svg version=\"1.1\" width=\"12\" height=\"16\" viewBox=\"0 0 12 16\" class=\"octicon octicon-x\" aria-label=\"Close the window\" role=\"img\"><path d=\"M7.48 8l3.75 3.75-1.48 1.48L6 9.48l-3.75 3.75-1.48-1.48L4.52 8 .77 4.25l1.48-1.48L6 6.52l3.75-3.75 1.48 1.48z\"/></svg>\n```\n\n#### width and height\n\nSize the SVG icon larger using `width` and `height` independently or together. `.toSVG()` will automatically choose the best SVG to render based on the width or height passed in.\n\n```js\nocticons.x.toSVG({ \"width\": 45 })\n// <svg version=\"1.1\" width=\"45\" height=\"45\" viewBox=\"0 0 24 24\" class=\"octicon octicon-x\" aria-hidden=\"true\"><path d=\"M7.48 8l3.75 3.75-1.48 1.48L6 9.48l-3.75 3.75-1.48-1.48L4.52 8 .77 4.25l1.48-1.48L6 6.52l3.75-3.75 1.48 1.48z\"/></svg>\n```\n\n[primer]: https://github.com/primer/primer\n[docs]: http://primercss.io/\n[npm]: https://www.npmjs.com/\n[install-npm]: https://docs.npmjs.com/getting-started/installing-node\n[sass]: http://sass-lang.com/\n"
  },
  {
    "path": "lib/octicons_node/index.js",
    "content": "const data = require('./build/data.json')\nconst objectAssign = require('object-assign')\n\nconst DEFAULT_HEIGHT = 16\n\nfor (const key of Object.keys(data)) {\n  // Returns a string representation of html attributes\n  const htmlAttributes = (icon, defaultOptions, options) => {\n    const attributes = []\n    const attrObj = objectAssign({}, defaultOptions, options)\n\n    // If the user passed in options\n    if (options) {\n      // If any of the width or height is passed in\n      if (options['width'] || options['height']) {\n        attrObj['width'] = options['width']\n          ? options['width']\n          : (parseInt(options['height']) * defaultOptions['width']) / defaultOptions['height']\n        attrObj['height'] = options['height']\n          ? options['height']\n          : (parseInt(options['width']) * defaultOptions['height']) / defaultOptions['width']\n      }\n\n      // If the user passed in class\n      if (options['class']) {\n        attrObj['class'] = `octicon octicon-${key} ${options['class']}`\n        attrObj['class'].trim()\n      }\n\n      // If the user passed in aria-label\n      if (options['aria-label']) {\n        attrObj['aria-label'] = options['aria-label']\n        attrObj['role'] = 'img'\n\n        // Un-hide the icon\n        delete attrObj['aria-hidden']\n      }\n    }\n\n    for (const option of Object.keys(attrObj)) {\n      attributes.push(`${option}=\"${attrObj[option]}\"`)\n    }\n\n    return attributes.join(' ').trim()\n  }\n\n  // Set the symbol for easy access\n  data[key].symbol = key\n\n  // Set options for each icon height\n  for (const height of Object.keys(data[key].heights)) {\n    data[key].heights[height].options = {\n      version: '1.1',\n      width: data[key].heights[height].width,\n      height: parseInt(height),\n      viewBox: `0 0 ${data[key].heights[height].width} ${height}`,\n      class: `octicon octicon-${key}`,\n      'aria-hidden': 'true'\n    }\n  }\n\n  // Function to return an SVG object\n  data[key].toSVG = function (options = {}) {\n    const {height, width} = options\n    const naturalHeight = closestNaturalHeight(Object.keys(data[key].heights), height || width || DEFAULT_HEIGHT)\n    return `<svg ${htmlAttributes(data[key], data[key].heights[naturalHeight].options, options)}>${\n      data[key].heights[naturalHeight].path\n    }</svg>`\n  }\n}\n\n// Import data into exports\nmodule.exports = data\n\nfunction closestNaturalHeight(naturalHeights, height) {\n  return naturalHeights\n    .map(naturalHeight => parseInt(naturalHeight, 10))\n    .reduce((acc, naturalHeight) => (naturalHeight <= height ? naturalHeight : acc), naturalHeights[0])\n}\n"
  },
  {
    "path": "lib/octicons_node/index.scss",
    "content": ".octicon {\n  display: inline-block;\n  vertical-align: text-top;\n  fill: currentColor;\n  overflow: visible;\n}\n"
  },
  {
    "path": "lib/octicons_node/package.json",
    "content": "{\n  \"name\": \"@primer/octicons\",\n  \"version\": \"19.23.1\",\n  \"description\": \"A scalable set of icons handcrafted with <3 by GitHub.\",\n  \"homepage\": \"https://primer.style/octicons\",\n  \"author\": \"GitHub Inc.\",\n  \"license\": \"MIT\",\n  \"style\": \"index.scss\",\n  \"main\": \"index.js\",\n  \"files\": [\n    \"index.js\",\n    \"index.scss\",\n    \"build\"\n  ],\n  \"repository\": \"https://github.com/primer/octicons.git\",\n  \"bugs\": {\n    \"url\": \"https://github.com/primer/octicons/issues\"\n  },\n  \"scripts\": {\n    \"build\": \"\\\\cp -r ../build/. ./build && \\\\cp index.scss ./build/build.css\",\n    \"lint\": \"eslint index.js tests/*.js\",\n    \"test\": \"ava --verbose 'tests/*.js'\"\n  },\n  \"keywords\": [\n    \"GitHub\",\n    \"icons\",\n    \"svg\",\n    \"octicons\"\n  ],\n  \"dependencies\": {\n    \"object-assign\": \"^4.1.1\"\n  },\n  \"devDependencies\": {\n    \"@github/prettier-config\": \"0.0.4\",\n    \"ava\": \"^0.22.0\",\n    \"eslint\": \"^6.5.1\",\n    \"eslint-plugin-github\": \"4.1.3\"\n  },\n  \"eslintConfig\": {\n    \"extends\": [\n      \"plugin:github/internal\",\n      \"plugin:github/recommended\"\n    ],\n    \"env\": {\n      \"es6\": true,\n      \"node\": true\n    },\n    \"parserOptions\": {\n      \"ecmaVersion\": 2017,\n      \"requireConfigFile\": false\n    },\n    \"rules\": {\n      \"github/no-then\": 0\n    }\n  }\n}\n"
  },
  {
    "path": "lib/octicons_node/prettier.config.js",
    "content": "module.exports = require('@github/prettier-config')\n"
  },
  {
    "path": "lib/octicons_node/tests/index.js",
    "content": "import test from 'ava'\nimport octicons from '../'\n\ntest('Octicons are loaded', t => {\n  t.truthy(octicons, \"Didn't find any octicons.\")\n  t.not(Object.keys(octicons).length, 0, \"Didn't find any octicons.\")\n})\n\ntest('Octicons have svg', t => {\n  t.truthy(octicons, \"Didn't find any octicons.\")\n  for (const point of Object.keys(octicons)) {\n    t.truthy(octicons[point].toSVG(), `The octicon \"${point}\" doesn't have svg`)\n  }\n})\n\ntest('Octicons have default html attributes', t => {\n  t.truthy(octicons, \"Didn't find any octicons.\")\n  for (const point of Object.keys(octicons)) {\n    const svg = octicons[point].toSVG()\n    t.regex(svg, /version=\"1\\.1\"/, `The octicon \"${point}\" doesn't have the version attribute`)\n    t.regex(svg, /aria-hidden=\"true\"/, `The octicon \"${point}\" doesn't have the aria-hidden attribute`)\n    t.regex(svg, new RegExp(`width=`), `The octicon \"${point}\" doesn't have the width attribute`)\n    t.regex(svg, new RegExp(`height=`), `The octicon \"${point}\" doesn't have the height attribute`)\n    t.regex(svg, new RegExp(`viewBox=`), `The octicon \"${point}\" doesn't have the viewBox attribute`)\n    t.regex(\n      svg,\n      new RegExp(`class=\"octicon octicon-${octicons[point].symbol}\"`),\n      `The octicon \"${point}\" doesn't have the class attribute`\n    )\n  }\n})\n\ntest('Passing in classnames will be included in output', t => {\n  t.truthy(octicons, \"Didn't find any octicons.\")\n  for (const point of Object.keys(octicons)) {\n    const svg = octicons[point].toSVG({class: 'new-class another-class'})\n    t.regex(\n      svg,\n      new RegExp(`class=\"octicon octicon-${octicons[point].symbol} new-class another-class\"`),\n      `The octicon \"${point}\" doesn't have the class attribute`\n    )\n  }\n})\n\ntest('Passing in aria-label will update the a11y options', t => {\n  t.truthy(octicons, \"Didn't find any octicons.\")\n  for (const point of Object.keys(octicons)) {\n    const svg = octicons[point].toSVG({'aria-label': 'This is an icon'})\n    t.regex(\n      svg,\n      new RegExp('aria-label=\"This is an icon\"'),\n      `The octicon \"${point}\" doesn't have the aria-label attribute`\n    )\n  }\n})\n\ntest('Passing in width will size properly', t => {\n  const svg = octicons['x'].toSVG({height: 60})\n  t.regex(svg, new RegExp('width=\"60\"'), 'The octicon \"x\" doesn\\'t have the width attribute scaled properly')\n})\n\ntest('Passing in height will size properly', t => {\n  const svg = octicons['x'].toSVG({width: 45})\n  t.regex(svg, new RegExp('height=\"45\"'), 'The octicon \"x\" doesn\\'t have the height attribute scaled properly')\n})\n\ntest('Passing in height will size properly', t => {\n  const svg = octicons['x'].toSVG({width: 45})\n  t.regex(svg, new RegExp('height=\"45\"'), 'The octicon \"x\" doesn\\'t have the height attribute scaled properly')\n})\n\ntest('Chooses the correct svg given a height', t => {\n  const svg = octicons['x'].toSVG({height: 32})\n  t.regex(svg, new RegExp('width=\"32\"'))\n  t.regex(svg, new RegExp('height=\"32\"'))\n  t.regex(svg, new RegExp('viewBox=\"0 0 24 24\"'))\n})\n\ntest('Chooses the correct svg given a width', t => {\n  const svg = octicons['x'].toSVG({width: 24})\n  t.regex(svg, new RegExp('width=\"24\"'))\n  t.regex(svg, new RegExp('height=\"24\"'))\n  t.regex(svg, new RegExp('viewBox=\"0 0 24 24\"'))\n})\n\ntest('Chooses the correct svg given a width and height', t => {\n  const svg = octicons['x'].toSVG({width: 16, height: 24})\n  t.regex(svg, new RegExp('width=\"16\"'))\n  t.regex(svg, new RegExp('height=\"24\"'))\n  t.regex(svg, new RegExp('viewBox=\"0 0 24 24\"'))\n})\n"
  },
  {
    "path": "lib/octicons_react/.eslintignore",
    "content": "src/__generated__/\n"
  },
  {
    "path": "lib/octicons_react/.eslintrc.json",
    "content": "{\n  \"parser\": \"@typescript-eslint/parser\",\n  \"parserOptions\": {\n    \"ecmaFeatures\": {\n      \"jsx\": true\n    }\n  },\n  \"extends\": [\n    \"plugin:react/recommended\",\n    \"plugin:jsx-a11y/recommended\",\n    \"plugin:prettier/recommended\",\n    \"plugin:github/recommended\",\n    \"plugin:github/browser\"\n  ],\n  \"rules\": {\n    \"github/no-then\": 0,\n    \"import/named\": 0,\n    \"react/prop-types\": 0\n  },\n  \"env\": {\n    \"browser\": true,\n    \"commonjs\": true,\n    \"es6\": true,\n    \"jest\": true,\n    \"node\": true\n  },\n  \"settings\": {\n    \"react\": {\n      \"version\": \"16\"\n    }\n  }\n}\n"
  },
  {
    "path": "lib/octicons_react/.gitignore",
    "content": ".cache\n.next\ndist/\nsrc/__generated__/\n.tool-versions\n"
  },
  {
    "path": "lib/octicons_react/.npmignore",
    "content": "*.config.js\n.*.sw?\n.*rc\n.cache\n.eslint*\n.gitignore\n.next\nscript\nsrc\n**/pages/**\n**/__tests__/**\n**/ts-tests/**\n"
  },
  {
    "path": "lib/octicons_react/.nvmrc",
    "content": "8\n"
  },
  {
    "path": "lib/octicons_react/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2026 GitHub Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "lib/octicons_react/README.md",
    "content": "# @primer/octicons-react\n\n[![npm version](https://img.shields.io/npm/v/@primer/octicons-react.svg)](https://www.npmjs.org/package/@primer/octicons-react)\n\n## Install\n\n```shell\nnpm install @primer/octicons-react\n```\n\n## Usage\n\n### Icons\n\nThe `@primer/octicons-react` module exports individual icons as [named\nexports](https://ponyfoo.com/articles/es6-modules-in-depth#named-exports). This\nallows you to import only the icons that you need without blowing up your\nbundle:\n\n```jsx\nimport React from 'react'\nimport {BeakerIcon, ZapIcon} from '@primer/octicons-react'\n\nexport default function Icon({boom}) {\n  return boom ? <ZapIcon /> : <BeakerIcon />\n}\n```\n\nIf you were to compile this example with a tool that supports [tree-shaking][]\n(such as Webpack, Rollup, or Parcel) the resulting bundle would only include\nthe \"zap\" and \"beaker\" icons.\n\n### Vertical alignment\n\nBy default the octicons have `vertical-align: text-bottom;` applied as inline\nstyles. You can change the alignment via the `verticalAlign` prop, which can be\neither `middle`, `text-bottom`, `text-top`, or `top`.\n\n```js\nimport {RepoIcon} from '@primer/octicons-react'\n\nexport default () => (\n  <h1>\n    <RepoIcon verticalAlign=\"middle\" /> github/github\n  </h1>\n)\n```\n\n### `aria-label`\n\nYou have the option of adding accessibility information to the icon with the\n[`aria-label` attribute][aria-label] via the `aria-label` prop.\n\n```js\n// Example usage\nimport {PlusIcon} from '@primer/octicons-react'\n\nexport default () => (\n  <button>\n    <PlusIcon aria-label=\"Add new item\" /> New\n  </button>\n)\n```\n\n### `aria-labelledby`\n\nYou have the option of adding accessibility information to the icon with the\n[`aria-labelledby` attribute][aria-labelledby] via the `aria-labelledby` prop. Using aria-labelledby referencing the id values of the title element provides the accessible name.\n\n```js\n// Example usage\nimport {PlusIcon} from '@primer/octicons-react'\n\nexport default () => (\n  <button>\n    <PlusIcon aria-labelledby=\"title\" title=\"Add new item\" /> New\n  </button>\n)\n```\n\n### `title`\n\nYou have the option of adding accessibility information to the icon with the\n[`title` attribute][title] via the `title` prop.\n\n### `id`\n\nYou have the option of adding information to the icon with the\n[`id` attribute][id] via the `id` prop.\n\n```js\n// Example usage\nimport {PlusIcon} from '@primer/octicons-react'\n\nexport default () => (\n  <button>\n    <PlusIcon id=\"unique-plus-icon\" /> New\n  </button>\n)\n```\n\n### `tabIndex`\n\nYou can add the `tabindex` attribute to an SVG element via the `tabIndex` prop if the SVG element is intended to be interactive.\n`tabIndex` prop also controls the `focusable` attribute of the SVG element which is defined by SVG Tiny 1.2 and only implemented in\nInternet Explorer and Microsoft Edge.\n\nIf there is no `tabIndex` prop is present (default behavior), it will set the `focusable` attribute to `false`. This is helpful\nfor preventing the decorative SVG from being announced by some specialized assistive technology browsing modes which can get delayed\nwhile trying to parse the SVG markup.\n\n```js\n// Example usage\nimport {PlusIcon} from '@primer/octicons-react'\nexport default () => (\n  <PlusIcon aria-label=\"Interactive Plus Icon\" tabIndex={0} /> New Item\n)\n```\n\n### Sizes\n\nThe `size` prop takes `small`, `medium`, and `large` values that can be used to\nrender octicons at standard sizes:\n\n| Prop            | Rendered Size                   |\n| :-------------- | :------------------------------ |\n| `size='small'`  | 16px height by `computed` width |\n| `size='medium'` | 32px height by `computed` width |\n| `size='large'`  | 64px height by `computed` width |\n\n```js\n// Example usage\nimport {LogoGithubIcon} from '@primer/octicons-react'\n\nexport default () => (\n  <h1>\n    <a href=\"https://github.com\">\n      <LogoGithubIcon size=\"large\" aria-label=\"GitHub\" />\n    </a>\n  </h1>\n)\n```\n\n### Fill\n\nThe `fill` prop takes a string value that can be used to set the color of the icon.\nBy default, `fill` is set to [`currentColor`](https://css-tricks.com/currentcolor/).\n\n```js\n// Example usage\nimport {LogoGithub} from '@primer/octicons-react'\nexport default () => (\n  <h1>\n    <a href=\"https://github.com\">\n      <LogoGithubIcon fill=\"#f00\" />\n    </a>\n  </h1>\n)\n```\n\n[octicons]: https://primer.style/octicons/\n[primer]: https://github.com/primer/primer\n[docs]: http://primercss.io/\n[npm]: https://www.npmjs.com/\n[install-npm]: https://docs.npmjs.com/getting-started/installing-node\n[tree-shaking]: https://developer.mozilla.org/en-US/docs/Glossary/Tree_shaking\n[aria-label]: https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-label\n[aria-labelledby]: https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-labelledby\n[title]: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/title\n[id]: https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/id\n"
  },
  {
    "path": "lib/octicons_react/__tests__/__snapshots__/public-api.test.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`@primer/octicons-react should not update exports without a semver change 1`] = `\n[\n  \"AccessibilityIcon\",\n  \"AccessibilityInsetIcon\",\n  \"AgentIcon\",\n  \"AiModelIcon\",\n  \"AlertFillIcon\",\n  \"AlertIcon\",\n  \"AppsIcon\",\n  \"ArchiveIcon\",\n  \"ArrowBothIcon\",\n  \"ArrowDownIcon\",\n  \"ArrowDownLeftIcon\",\n  \"ArrowDownRightIcon\",\n  \"ArrowLeftIcon\",\n  \"ArrowRightIcon\",\n  \"ArrowSwitchIcon\",\n  \"ArrowUpIcon\",\n  \"ArrowUpLeftIcon\",\n  \"ArrowUpRightIcon\",\n  \"BeakerIcon\",\n  \"BellFillIcon\",\n  \"BellIcon\",\n  \"BellSlashIcon\",\n  \"BlockedIcon\",\n  \"BoldIcon\",\n  \"BookIcon\",\n  \"BookLockedIcon\",\n  \"BookmarkFillIcon\",\n  \"BookmarkFilledIcon\",\n  \"BookmarkIcon\",\n  \"BookmarkSlashFillIcon\",\n  \"BookmarkSlashIcon\",\n  \"BooleanOffIcon\",\n  \"BooleanOnIcon\",\n  \"BriefcaseIcon\",\n  \"BroadcastIcon\",\n  \"BrowserIcon\",\n  \"BugIcon\",\n  \"CacheIcon\",\n  \"CalendarIcon\",\n  \"CheckCircleFillIcon\",\n  \"CheckCircleIcon\",\n  \"CheckIcon\",\n  \"CheckboxFillIcon\",\n  \"CheckboxIcon\",\n  \"ChecklistIcon\",\n  \"ChevronDownIcon\",\n  \"ChevronLeftIcon\",\n  \"ChevronRightIcon\",\n  \"ChevronUpIcon\",\n  \"CircleIcon\",\n  \"CircleSlashIcon\",\n  \"ClockFillIcon\",\n  \"ClockIcon\",\n  \"CloudIcon\",\n  \"CloudOfflineIcon\",\n  \"CodeIcon\",\n  \"CodeOfConductIcon\",\n  \"CodeReviewIcon\",\n  \"CodeSquareIcon\",\n  \"CodescanCheckmarkIcon\",\n  \"CodescanIcon\",\n  \"CodespacesIcon\",\n  \"ColumnsIcon\",\n  \"CommandPaletteIcon\",\n  \"CommentAiIcon\",\n  \"CommentDiscussionIcon\",\n  \"CommentIcon\",\n  \"CommentLockedIcon\",\n  \"ComposeIcon\",\n  \"ContainerIcon\",\n  \"CopilotErrorIcon\",\n  \"CopilotIcon\",\n  \"CopilotWarningIcon\",\n  \"CopyIcon\",\n  \"CpuIcon\",\n  \"CreditCardIcon\",\n  \"CrossReferenceIcon\",\n  \"CrosshairsIcon\",\n  \"DashIcon\",\n  \"DatabaseIcon\",\n  \"DependabotIcon\",\n  \"DesktopDownloadIcon\",\n  \"DeviceCameraIcon\",\n  \"DeviceCameraVideoIcon\",\n  \"DeviceDesktopIcon\",\n  \"DeviceMobileIcon\",\n  \"DevicesIcon\",\n  \"DiamondIcon\",\n  \"DiceIcon\",\n  \"DiffAddedIcon\",\n  \"DiffIcon\",\n  \"DiffIgnoredIcon\",\n  \"DiffModifiedIcon\",\n  \"DiffRemovedIcon\",\n  \"DiffRenamedIcon\",\n  \"DiscussionClosedIcon\",\n  \"DiscussionDuplicateIcon\",\n  \"DiscussionOutdatedIcon\",\n  \"DotFillIcon\",\n  \"DotIcon\",\n  \"DownloadIcon\",\n  \"DuplicateIcon\",\n  \"EllipsisIcon\",\n  \"ExclamationIcon\",\n  \"EyeClosedIcon\",\n  \"EyeIcon\",\n  \"FeedDiscussionIcon\",\n  \"FeedForkedIcon\",\n  \"FeedHeartIcon\",\n  \"FeedIssueClosedIcon\",\n  \"FeedIssueDraftIcon\",\n  \"FeedIssueOpenIcon\",\n  \"FeedIssueReopenIcon\",\n  \"FeedMergedIcon\",\n  \"FeedPersonIcon\",\n  \"FeedPlusIcon\",\n  \"FeedPublicIcon\",\n  \"FeedPullRequestClosedIcon\",\n  \"FeedPullRequestDraftIcon\",\n  \"FeedPullRequestOpenIcon\",\n  \"FeedRepoIcon\",\n  \"FeedRocketIcon\",\n  \"FeedStarIcon\",\n  \"FeedTagIcon\",\n  \"FeedTrophyIcon\",\n  \"FileAddedIcon\",\n  \"FileBadgeIcon\",\n  \"FileBinaryIcon\",\n  \"FileCheckIcon\",\n  \"FileCodeIcon\",\n  \"FileDiffIcon\",\n  \"FileDirectoryFillIcon\",\n  \"FileDirectoryIcon\",\n  \"FileDirectoryOpenFillIcon\",\n  \"FileDirectorySymlinkIcon\",\n  \"FileIcon\",\n  \"FileMediaIcon\",\n  \"FileMovedIcon\",\n  \"FileRemovedIcon\",\n  \"FileSubmoduleIcon\",\n  \"FileSymlinkFileIcon\",\n  \"FileZipIcon\",\n  \"FilterIcon\",\n  \"FilterRemoveIcon\",\n  \"FiscalHostIcon\",\n  \"FlameIcon\",\n  \"FlowchartIcon\",\n  \"FocusCenterIcon\",\n  \"FoldDownIcon\",\n  \"FoldIcon\",\n  \"FoldUpIcon\",\n  \"GearIcon\",\n  \"GiftIcon\",\n  \"GitBranchCheckIcon\",\n  \"GitBranchIcon\",\n  \"GitCommitIcon\",\n  \"GitCompareIcon\",\n  \"GitMergeIcon\",\n  \"GitMergeQueueIcon\",\n  \"GitPullRequestClosedIcon\",\n  \"GitPullRequestDraftIcon\",\n  \"GitPullRequestIcon\",\n  \"GitPullRequestLockedIcon\",\n  \"GlobeIcon\",\n  \"GoalIcon\",\n  \"GrabberIcon\",\n  \"GraphBarHorizontalIcon\",\n  \"GraphBarVerticalIcon\",\n  \"GraphIcon\",\n  \"HashIcon\",\n  \"HeadingIcon\",\n  \"HeartFillIcon\",\n  \"HeartIcon\",\n  \"HistoryIcon\",\n  \"HomeFillIcon\",\n  \"HomeIcon\",\n  \"HorizontalRuleIcon\",\n  \"HourglassIcon\",\n  \"HubotIcon\",\n  \"IdBadgeIcon\",\n  \"ImageIcon\",\n  \"InboxFillIcon\",\n  \"InboxIcon\",\n  \"InfinityIcon\",\n  \"InfoIcon\",\n  \"IssueClosedIcon\",\n  \"IssueDraftIcon\",\n  \"IssueLockedIcon\",\n  \"IssueOpenedIcon\",\n  \"IssueReopenedIcon\",\n  \"IssueTrackedByIcon\",\n  \"IssueTracksIcon\",\n  \"ItalicIcon\",\n  \"IterationsIcon\",\n  \"KebabHorizontalIcon\",\n  \"KeyAsteriskIcon\",\n  \"KeyIcon\",\n  \"LawIcon\",\n  \"LightBulbIcon\",\n  \"LinkExternalIcon\",\n  \"LinkIcon\",\n  \"ListOrderedIcon\",\n  \"ListUnorderedIcon\",\n  \"LocationIcon\",\n  \"LockIcon\",\n  \"LockupGithubIcon\",\n  \"LogIcon\",\n  \"LogoGistIcon\",\n  \"LogoGithubIcon\",\n  \"LoopIcon\",\n  \"MailIcon\",\n  \"MarkGithubIcon\",\n  \"MarkdownIcon\",\n  \"MaximizeIcon\",\n  \"McpIcon\",\n  \"MegaphoneIcon\",\n  \"MentionIcon\",\n  \"MeterIcon\",\n  \"MilestoneIcon\",\n  \"MinimizeIcon\",\n  \"MirrorIcon\",\n  \"MoonIcon\",\n  \"MortarBoardIcon\",\n  \"MoveToBottomIcon\",\n  \"MoveToEndIcon\",\n  \"MoveToStartIcon\",\n  \"MoveToTopIcon\",\n  \"MultiSelectIcon\",\n  \"MuteIcon\",\n  \"NoEntryFillIcon\",\n  \"NoEntryIcon\",\n  \"NodeIcon\",\n  \"NorthStarIcon\",\n  \"NoteIcon\",\n  \"NumberIcon\",\n  \"OrganizationIcon\",\n  \"PackageDependenciesIcon\",\n  \"PackageDependentsIcon\",\n  \"PackageIcon\",\n  \"PaintbrushIcon\",\n  \"PaperAirplaneIcon\",\n  \"PaperclipIcon\",\n  \"PasskeyFillIcon\",\n  \"PasteIcon\",\n  \"PauseIcon\",\n  \"PencilAiIcon\",\n  \"PencilIcon\",\n  \"PeopleIcon\",\n  \"PersonAddIcon\",\n  \"PersonFillIcon\",\n  \"PersonIcon\",\n  \"PinIcon\",\n  \"PinSlashIcon\",\n  \"PivotColumnIcon\",\n  \"PlayIcon\",\n  \"PlugIcon\",\n  \"PlusCircleIcon\",\n  \"PlusIcon\",\n  \"ProjectIcon\",\n  \"ProjectRoadmapIcon\",\n  \"ProjectSymlinkIcon\",\n  \"ProjectTemplateIcon\",\n  \"PulseIcon\",\n  \"QuestionIcon\",\n  \"QuoteIcon\",\n  \"ReadIcon\",\n  \"RedoIcon\",\n  \"RelFilePathIcon\",\n  \"ReplyIcon\",\n  \"RepoCloneIcon\",\n  \"RepoDeleteIcon\",\n  \"RepoDeletedIcon\",\n  \"RepoForkedIcon\",\n  \"RepoIcon\",\n  \"RepoLockedIcon\",\n  \"RepoPullIcon\",\n  \"RepoPushIcon\",\n  \"RepoTemplateIcon\",\n  \"ReportIcon\",\n  \"RocketIcon\",\n  \"RowsIcon\",\n  \"RssIcon\",\n  \"RubyIcon\",\n  \"ScreenFullIcon\",\n  \"ScreenNormalIcon\",\n  \"SearchIcon\",\n  \"ServerIcon\",\n  \"ShareAndroidIcon\",\n  \"ShareIcon\",\n  \"ShieldCheckIcon\",\n  \"ShieldIcon\",\n  \"ShieldLockIcon\",\n  \"ShieldSlashIcon\",\n  \"ShieldXIcon\",\n  \"SidebarCollapseIcon\",\n  \"SidebarExpandIcon\",\n  \"SignInIcon\",\n  \"SignOutIcon\",\n  \"SingleSelectIcon\",\n  \"SkipFillIcon\",\n  \"SkipIcon\",\n  \"SlidersIcon\",\n  \"SmileyFrownIcon\",\n  \"SmileyFrustratedIcon\",\n  \"SmileyGrinIcon\",\n  \"SmileyIcon\",\n  \"SmileyNeutralIcon\",\n  \"SortAscIcon\",\n  \"SortDescIcon\",\n  \"SpaceIcon\",\n  \"SpacingLargeIcon\",\n  \"SpacingMediumIcon\",\n  \"SpacingSmallIcon\",\n  \"SparkleFillIcon\",\n  \"SparkleIcon\",\n  \"SparklesFillIcon\",\n  \"SplitViewIcon\",\n  \"SponsorTiersIcon\",\n  \"SquareCircleIcon\",\n  \"SquareFillIcon\",\n  \"SquareIcon\",\n  \"SquirrelIcon\",\n  \"StackIcon\",\n  \"StarFillIcon\",\n  \"StarIcon\",\n  \"StopIcon\",\n  \"StopwatchIcon\",\n  \"StrikethroughIcon\",\n  \"SunIcon\",\n  \"SyncIcon\",\n  \"TabExternalIcon\",\n  \"TabIcon\",\n  \"TableIcon\",\n  \"TagIcon\",\n  \"TasklistIcon\",\n  \"TelescopeFillIcon\",\n  \"TelescopeIcon\",\n  \"TerminalIcon\",\n  \"ThreeBarsIcon\",\n  \"ThumbsdownIcon\",\n  \"ThumbsupIcon\",\n  \"ToolsIcon\",\n  \"TrackedByClosedCompletedIcon\",\n  \"TrackedByClosedNotPlannedIcon\",\n  \"TrashIcon\",\n  \"TriangleDownIcon\",\n  \"TriangleLeftIcon\",\n  \"TriangleRightIcon\",\n  \"TriangleUpIcon\",\n  \"TrophyIcon\",\n  \"TypographyIcon\",\n  \"UndoIcon\",\n  \"UnfoldIcon\",\n  \"UnlinkIcon\",\n  \"UnlockIcon\",\n  \"UnmuteIcon\",\n  \"UnreadIcon\",\n  \"UnverifiedIcon\",\n  \"UnwrapIcon\",\n  \"UploadIcon\",\n  \"VerifiedIcon\",\n  \"VersionsIcon\",\n  \"VideoIcon\",\n  \"VscodeIcon\",\n  \"WebhookIcon\",\n  \"WorkflowIcon\",\n  \"WrapIcon\",\n  \"XCircleFillIcon\",\n  \"XCircleIcon\",\n  \"XIcon\",\n  \"ZapIcon\",\n  \"ZoomInIcon\",\n  \"ZoomOutIcon\",\n]\n`;\n"
  },
  {
    "path": "lib/octicons_react/__tests__/public-api.test.js",
    "content": "import * as Octicons from '../'\n\ndescribe('@primer/octicons-react', () => {\n  it('should not update exports without a semver change', () => {\n    expect(Object.keys(Octicons).sort()).toMatchSnapshot()\n  })\n})\n"
  },
  {
    "path": "lib/octicons_react/__tests__/tree-shaking.test.js",
    "content": "const path = require('node:path')\nconst commonjs = require('@rollup/plugin-commonjs')\nconst {nodeResolve} = require('@rollup/plugin-node-resolve')\nconst {rollup} = require('rollup')\nconst virtual = require('@rollup/plugin-virtual')\n\nconst packageImport = path.resolve(__dirname, '..')\n\ntest('tree shaking', async () => {\n  const bundle = await rollup({\n    input: '__entrypoint__',\n    external: [],\n    plugins: [\n      nodeResolve(),\n      commonjs(),\n      virtual({\n        __entrypoint__: `import { AlertIcon } from '${packageImport}'`\n      })\n    ],\n\n    onwarn: ({code, message}) => {\n      if (code !== 'EMPTY_BUNDLE') {\n        throw new Error(message)\n      }\n    }\n  })\n  const {output} = await bundle.generate({\n    format: 'esm'\n  })\n\n  for (const {code} of output) {\n    expect(code.trim()).toBe('')\n  }\n})\n\ntest('tree shaking single export', async () => {\n  const bundle = await rollup({\n    input: '__entrypoint__',\n    external: ['react'],\n    plugins: [\n      nodeResolve(),\n      commonjs(),\n      virtual({\n        __entrypoint__: `export { XIcon } from '${packageImport}'`\n      })\n    ]\n  })\n  const {output} = await bundle.generate({\n    format: 'esm'\n  })\n\n  const bundleSize = Buffer.byteLength(output[0].code.trim()) / 1000\n  expect(`${bundleSize}kB`).toMatchInlineSnapshot(`\"6.084kB\"`)\n})\n"
  },
  {
    "path": "lib/octicons_react/babel.config.js",
    "content": "'use strict'\n\nmodule.exports = {\n  presets: [\n    [\n      '@babel/preset-env',\n      {\n        targets: {\n          node: 'current'\n        }\n      }\n    ],\n    '@babel/preset-react'\n  ],\n  env: {\n    production: {\n      presets: ['next/babel']\n    }\n  }\n}\n"
  },
  {
    "path": "lib/octicons_react/jest.config.js",
    "content": "'use strict'\n\nmodule.exports = {\n  moduleNameMapper: {\n    '^rollup$': require.resolve('rollup')\n  },\n  testEnvironment: 'jsdom',\n  transform: {\n    '^.+\\\\.(mjs|cjs|js|jsx)$': require.resolve('babel-jest')\n  }\n}\n"
  },
  {
    "path": "lib/octicons_react/next.config.mjs",
    "content": "/** @type {import('next').NextConfig} */\nconst nextConfig = {\n  reactStrictMode: true,\n  transpilePackages: ['@primer/components'],\n  pageExtensions: ['js', 'jsx', 'mjs', 'ts', 'tsx'],\n}\n\nexport default nextConfig\n"
  },
  {
    "path": "lib/octicons_react/package.json",
    "content": "{\n  \"name\": \"@primer/octicons-react\",\n  \"version\": \"19.23.1\",\n  \"description\": \"A scalable set of icons handcrafted with <3 by GitHub.\",\n  \"homepage\": \"https://primer.style/octicons\",\n  \"author\": \"GitHub, Inc.\",\n  \"license\": \"MIT\",\n  \"type\": \"commonjs\",\n  \"main\": \"dist/index.umd.js\",\n  \"module\": \"dist/index.esm.mjs\",\n  \"exports\": {\n    \"types\": {\n      \"import\": \"./dist/index.d.mts\",\n      \"require\": \"./dist/index.d.ts\"\n    },\n    \"import\": \"./dist/index.esm.mjs\",\n    \"require\": \"./dist/index.umd.js\"\n  },\n  \"sideEffects\": false,\n  \"types\": \"dist/index.d.ts\",\n  \"repository\": \"primer/octicons\",\n  \"scripts\": {\n    \"build\": \"script/build.js && script/types.js && rollup -c\",\n    \"clean\": \"rimraf .next dist src/__generated__\",\n    \"develop\": \"next\",\n    \"lint\": \"eslint src pages/*.mjs script\",\n    \"test\": \"jest\",\n    \"ts-test\": \"tsc -P ts-tests\",\n    \"posttest\": \"yarn ts-test\"\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"keywords\": [\n    \"GitHub\",\n    \"icons\",\n    \"svg\",\n    \"octicons\",\n    \"react\",\n    \"primer\"\n  ],\n  \"devDependencies\": {\n    \"@babel/core\": \"^7.22.0\",\n    \"@babel/generator\": \"^7.22.0\",\n    \"@babel/preset-env\": \"^7.22.0\",\n    \"@babel/preset-react\": \"^7.22.0\",\n    \"@babel/types\": \"^7.22.0\",\n    \"@github/prettier-config\": \"0.0.4\",\n    \"@primer/components\": \"27.0.0\",\n    \"@rollup/plugin-babel\": \"5.3.1\",\n    \"@rollup/plugin-commonjs\": \"22.0.2\",\n    \"@rollup/plugin-node-resolve\": \"14.1.0\",\n    \"@rollup/plugin-virtual\": \"2.1.0\",\n    \"@testing-library/jest-dom\": \"^5.16.5\",\n    \"@testing-library/react\": \"^13.4.0\",\n    \"@types/react\": \"^18.2.0\",\n    \"babel-jest\": \"29.0.3\",\n    \"eslint\": \"^6.5.1\",\n    \"eslint-plugin-github\": \"4.1.3\",\n    \"eslint-plugin-jest\": \"^21.17.0\",\n    \"eslint-plugin-jsx-a11y\": \"6.4.1\",\n    \"eslint-plugin-react\": \"7.23.2\",\n    \"fs-extra\": \"^6.0.1\",\n    \"jest\": \"^29.0.3\",\n    \"jest-environment-jsdom\": \"29.0.3\",\n    \"next\": \"^16.1.5\",\n    \"react\": \"^18.2.0\",\n    \"react-dom\": \"^18.2.0\",\n    \"rimraf\": \"3.0.2\",\n    \"rollup\": \"^2.79.0\",\n    \"styled-components\": \"^4.2.0\",\n    \"typescript\": \"^4.8.3\"\n  },\n  \"peerDependencies\": {\n    \"react\": \">=16.3\"\n  },\n  \"engines\": {\n    \"node\": \">=8\"\n  }\n}\n"
  },
  {
    "path": "lib/octicons_react/pages/_document.mjs",
    "content": "import React from 'react'\nimport Document, {Head, Html, Main, NextScript} from 'next/document'\n\nexport default class PrimerDocument extends Document {\n  render() {\n    return (\n      <Html lang=\"en\">\n        <Head>\n          <link rel=\"stylesheet\" href=\"https://unpkg.com/primer/build/build.css\" />\n        </Head>\n        <body>\n          <Main />\n          <NextScript />\n        </body>\n      </Html>\n    )\n  }\n}\n"
  },
  {
    "path": "lib/octicons_react/pages/index.mjs",
    "content": "import React from 'react'\nimport {Box, Text} from '@primer/components'\nimport pkg from '../package.json'\n// eslint-disable-next-line import/no-namespace\nimport * as Octicons from '../'\n\n// eslint-disable-next-line no-unused-vars, import/namespace\nconst {default: _Octicon, ...iconsByName} = Octicons\n\nexport default function App() {\n  const sizes = ['small', 'medium', 'large']\n  return (\n    <Box p={4}>\n      <table className=\"data-table\">\n        <thead>\n          <tr>\n            <th>key</th>\n            <th>import</th>\n            <th>small, medium, large</th>\n            <th>code sample</th>\n          </tr>\n        </thead>\n        <tbody>\n          {Object.keys(iconsByName).map(key => {\n            const Icon = iconsByName[key]\n            const iconName = Icon.displayName || key\n            return (\n              <tr key={key}>\n                <td>\n                  <Text mono nowrap>\n                    {key}\n                  </Text>\n                </td>\n                <td>\n                  <Text mono nowrap>\n                    {iconName}\n                  </Text>\n                </td>\n                <td>\n                  {sizes.map(size => (\n                    <Text mr={4} key={size}>\n                      <Icon size={size} verticalAlign=\"middle\" />\n                    </Text>\n                  ))}\n                </td>\n                <td>\n                  <pre>\n                    {`\nimport {${iconName}} from '${pkg.name}'\nexport default () => <${iconName} />\n                  `.trim()}\n                  </pre>\n                </td>\n              </tr>\n            )\n          })}\n        </tbody>\n      </table>\n    </Box>\n  )\n}\n"
  },
  {
    "path": "lib/octicons_react/prettier.config.js",
    "content": "module.exports = require('@github/prettier-config')\n"
  },
  {
    "path": "lib/octicons_react/rollup.config.js",
    "content": "import babel from '@rollup/plugin-babel'\nimport commonjs from '@rollup/plugin-commonjs'\nimport packageJson from './package.json'\n\nconst dependencies = [\n  ...Object.keys(packageJson.peerDependencies ?? {}),\n  ...Object.keys(packageJson.dependencies ?? {}),\n  ...Object.keys(packageJson.devDependencies ?? {})\n]\n\nfunction createPackageRegex(name) {\n  return new RegExp(`^${name}(/.*)?`)\n}\n\nconst baseConfig = {\n  input: 'src/index.js',\n  external: dependencies.map(createPackageRegex),\n  plugins: [\n    babel({\n      babelrc: false,\n      presets: [\n        [\n          '@babel/preset-env',\n          {\n            modules: false\n          }\n        ],\n        '@babel/preset-react'\n      ],\n      babelHelpers: 'bundled'\n    }),\n    commonjs()\n  ]\n}\n\nexport default [\n  {\n    ...baseConfig,\n    output: {\n      file: `dist/index.esm.mjs`,\n      format: 'esm'\n    }\n  },\n  {\n    ...baseConfig,\n    output: {\n      file: `dist/index.umd.js`,\n      format: 'umd',\n      name: 'reocticons',\n      globals: {\n        react: 'React'\n      }\n    }\n  }\n]\n"
  },
  {
    "path": "lib/octicons_react/script/.eslintrc.json",
    "content": "{\n  \"env\": {\n    \"node\": true,\n    \"browser\": false\n  },\n  \"rules\": {\n    \"no-console\": 0,\n    \"no-shadow\": 0\n  }\n}\n"
  },
  {
    "path": "lib/octicons_react/script/build.js",
    "content": "#!/usr/bin/env node\n\nconst octicons = require('../../build/data.json')\nconst {default: generate} = require('@babel/generator')\nconst t = require('@babel/types')\nconst fse = require('fs-extra')\nconst {join, resolve} = require('path')\n\nconst srcDir = resolve(__dirname, '../src/__generated__')\nconst iconsFile = join(srcDir, 'icons.js')\nconst typesFile = join(srcDir, 'icons.d.ts')\n\nconst GENERATED_HEADER = '/* THIS FILE IS GENERATED. DO NOT EDIT IT. */'\n\nfunction pascalCase(str) {\n  return str.replace(/(^|-)([a-z])/g, (_, __, c) => c.toUpperCase())\n}\n\nconst icons = Object.entries(octicons)\n  .map(([key, octicon]) => {\n    const name = `${pascalCase(key)}Icon`\n    // Build an object with the following structure:\n    //\n    // type SVGData = {\n    //   [key in string]: {\n    //     width: number,\n    //     path: React.JSXElement\n    //   },\n    // }\n    //\n    const svgData = t.objectExpression(\n      Object.entries(octicon.heights).map(([height, icon]) => {\n        return t.objectProperty(\n          t.stringLiteral(height),\n          t.objectExpression([\n            t.objectProperty(t.stringLiteral('width'), t.numericLiteral(icon.width)),\n            t.objectProperty(t.stringLiteral('path'), svgToJSX(icon.ast))\n          ])\n        )\n      })\n    )\n    // Define the icon by using the `createIconComponent` helper and the svgData\n    // defined above. This generates the following:\n    //\n    // const IconName = /*#__PURE__*/ createIconComponent('name', 'default-class-name', () => ({\n    //   /* svgData */\n    // }));\n    //\n    const {code} = generate(\n      t.variableDeclaration('const', [\n        t.variableDeclarator(\n          t.identifier(name),\n          t.addComment(\n            t.callExpression(t.identifier('createIconComponent'), [\n              // The name of the generated icon\n              t.stringLiteral(name),\n              // The className used on the underlying <svg> element\n              t.stringLiteral(`octicon octicon-${key}`),\n              t.arrowFunctionExpression([], t.blockStatement([t.returnStatement(svgData)]))\n            ]),\n            'leading',\n            '#__PURE__'\n          )\n        )\n      ])\n    )\n\n    return {\n      key,\n      name,\n      octicon,\n      code\n    }\n  })\n  .sort((a, b) => a.key.localeCompare(b.key))\n\nfunction writeIcons(file) {\n  const count = icons.length\n  const code = `${GENERATED_HEADER}\nimport React from 'react'\nimport { createIconComponent } from '../createIconComponent'\n\n${icons.map(({code}) => code).join('\\n')}\n\nexport {\n  ${icons.map(({name}) => name).join(',\\n  ')}\n}`\n  return fse.writeFile(file, code, 'utf8').then(() => {\n    console.warn('wrote %s with %d exports', file, count)\n    return icons\n  })\n}\n\nfunction writeTypes(file) {\n  const count = icons.length\n  const code = `${GENERATED_HEADER}\nimport * as React from 'react'\n\ntype Size = 'small' | 'medium' | 'large'\n\ninterface IconProps {\n  'aria-label'?: string\n  className?: string\n  fill?: string\n  size?: number | Size\n  verticalAlign?: 'middle' | 'text-bottom' | 'text-top' | 'top' | 'unset'\n}\n\ntype Icon = React.FC<IconProps>\n\n${icons.map(({name}) => `declare const ${name}: Icon`).join('\\n')}\n\nexport {\n  Icon,\n  IconProps,\n  ${icons.map(({name}) => name).join(',\\n  ')}\n}`\n  return fse.writeFile(file, code, 'utf8').then(() => {\n    console.warn('wrote %s with %d exports', file, count)\n    return icons\n  })\n}\n\nfse\n  .mkdirs(srcDir)\n  .then(() => writeIcons(iconsFile))\n  .then(() => writeTypes(typesFile))\n  .catch(error => {\n    console.error(error)\n    process.exit(1)\n  })\n\n/**\n * Convert a given node from an svg AST into a JS AST of JSX Elements\n */\nfunction svgToJSX(node) {\n  if (node.type === 'element') {\n    const children = node.children.map(svgToJSX)\n\n    if (node.name === 'svg') {\n      if (children.length === 0) {\n        throw new Error(`No children available for icon`)\n      }\n\n      if (children.length > 1) {\n        return t.jsxFragment(t.jsxOpeningFragment(), t.jsxClosingFragment(), children)\n      }\n\n      return children[0]\n    }\n\n    const attrs = Object.entries(node.attributes).map(([key, value]) => {\n      if (typeof value !== 'string') {\n        throw new Error(`Unknown value type: ${value}`)\n      }\n      return t.jsxAttribute(t.jsxIdentifier(key), t.stringLiteral(value))\n    })\n    const openingElement = t.jsxOpeningElement(t.jsxIdentifier(node.name), attrs, children.length === 0)\n    const closingElement = t.jsxClosingElement(t.jsxIdentifier(node.name))\n\n    if (children.length > 0) {\n      return t.jsxElement(openingElement, closingElement, children, false)\n    }\n\n    return t.jsxElement(openingElement, closingElement, [], true)\n  }\n\n  throw new Error(`Unknown type: ${node.type}`)\n}\n"
  },
  {
    "path": "lib/octicons_react/script/types.js",
    "content": "#!/usr/bin/env node\nconst fse = require('fs-extra')\nconst {join, resolve} = require('path')\n\nconst srcDir = resolve(__dirname, '../src/__generated__')\nconst iconsSrc = join(srcDir, 'icons.d.ts')\nconst indexSrc = join(srcDir, '../index.d.ts')\n\nconst destDir = resolve(__dirname, '../dist')\nconst iconsDest = join(destDir, 'icons.d.ts')\nconst indexDest = join(destDir, 'index.d.ts')\n\nasync function main() {\n  await fse.copy(iconsSrc, iconsDest)\n\n  let contents = await fse.readFile(indexSrc, 'utf8')\n  contents = contents.replace(/.\\/__generated__\\//g, './')\n\n  await fse.writeFile(indexDest, contents, 'utf8')\n  await fse.writeFile(join(destDir, 'index.d.mts'), contents, 'utf8')\n}\n\nmain().catch(error => {\n  console.error(error)\n  process.exitCode = 1\n})\n"
  },
  {
    "path": "lib/octicons_react/src/__tests__/.eslintrc.json",
    "content": "{\n  \"rules\": {\n    \"github/unescaped-html-literal\": 0\n  }\n}\n"
  },
  {
    "path": "lib/octicons_react/src/__tests__/__snapshots__/octicon.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`An icon component matches snapshot 1`] = `\n<svg\n  aria-hidden=\"true\"\n  class=\"octicon octicon-alert\"\n  display=\"inline-block\"\n  fill=\"currentColor\"\n  focusable=\"false\"\n  height=\"16\"\n  overflow=\"visible\"\n  style=\"vertical-align: text-bottom;\"\n  viewBox=\"0 0 16 16\"\n  width=\"16\"\n>\n  <path\n    d=\"M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\"\n  />\n</svg>\n`;\n"
  },
  {
    "path": "lib/octicons_react/src/__tests__/octicon.js",
    "content": "import '@testing-library/jest-dom'\nimport {render, screen} from '@testing-library/react'\nimport React from 'react'\nimport {AlertIcon} from '../index'\n\ndescribe('An icon component', () => {\n  it('matches snapshot', () => {\n    const {container} = render(<AlertIcon />)\n    expect(container.querySelector('svg')).toMatchSnapshot()\n  })\n\n  it('defaults to `aria-hidden=\"true\"` if no label is present', () => {\n    const {container} = render(<AlertIcon />)\n    expect(container.querySelector('svg')).toHaveAttribute('aria-hidden', 'true')\n  })\n\n  it('sets `role=\"img\"` if `aria-label` is provided', () => {\n    render(<AlertIcon aria-label=\"Alert\" />)\n    expect(screen.getByLabelText('Alert')).toHaveAttribute('role', 'img')\n  })\n\n  it('sets `role=\"img\"` if `aria-labelledby` is provided', () => {\n    render(\n      <>\n        <span id=\"label\">Alert</span>\n        <AlertIcon aria-labelledby=\"label\" />\n      </>\n    )\n    expect(screen.getByLabelText('Alert')).toHaveAttribute('role', 'img')\n  })\n\n  it('sets aria-hidden=\"false\" if ariaLabel prop is present', () => {\n    const {container} = render(<AlertIcon aria-label=\"icon\" />)\n    expect(container.querySelector('svg')).not.toHaveAttribute('aria-hidden')\n    expect(container.querySelector('svg')).toHaveAttribute('aria-label', 'icon')\n  })\n\n  it('set the focusable prop to false if tabIndex prop is not present', () => {\n    const {container} = render(<AlertIcon />)\n    expect(container.querySelector('svg')).toHaveAttribute('focusable', 'false')\n  })\n\n  it('sets focusable prop to true if tabIndex prop is present and greater than 0', () => {\n    const {container} = render(<AlertIcon aria-label=\"icon\" tabIndex={0} />)\n    expect(container.querySelector('svg')).toHaveAttribute('tabindex', '0')\n    expect(container.querySelector('svg')).toHaveAttribute('focusable', 'true')\n  })\n\n  it('sets focusable prop to false if tabIndex prop is -1', () => {\n    const {container} = render(<AlertIcon aria-label=\"icon\" tabIndex={-1} />)\n    expect(container.querySelector('svg')).toHaveAttribute('tabindex', '-1')\n    expect(container.querySelector('svg')).toHaveAttribute('focusable', 'false')\n  })\n\n  it('respects the className prop', () => {\n    const {container} = render(<AlertIcon className=\"foo\" />)\n    expect(container.querySelector('svg')).toHaveAttribute('class', 'octicon octicon-alert foo')\n  })\n\n  it('respects the fill prop', () => {\n    const {container} = render(<AlertIcon fill=\"#f00\" />)\n    expect(container.querySelector('svg')).toHaveAttribute('fill', '#f00')\n  })\n\n  it('respects the verticalAlign prop', () => {\n    const {container} = render(<AlertIcon verticalAlign=\"middle\" />)\n    expect(container.querySelector('svg')).toHaveStyle({verticalAlign: 'middle'})\n  })\n\n  it('supports additional props on the outermost element', () => {\n    const {container} = render(<AlertIcon data-testid=\"icon\" />)\n    expect(container.firstChild).toHaveAttribute('data-testid', 'icon')\n  })\n\n  describe('size props', () => {\n    it('respects size=\"small\"', () => {\n      const {container} = render(<AlertIcon size=\"small\" />)\n      expect(container.querySelector('svg')).toHaveAttribute('width', '16')\n      expect(container.querySelector('svg')).toHaveAttribute('height', '16')\n    })\n\n    it('respects size=\"medium\"', () => {\n      const {container} = render(<AlertIcon size=\"medium\" />)\n      expect(container.querySelector('svg')).toHaveAttribute('width', '32')\n      expect(container.querySelector('svg')).toHaveAttribute('height', '32')\n    })\n\n    it('respects size=\"large\"', () => {\n      const {container} = render(<AlertIcon size=\"large\" />)\n      expect(container.querySelector('svg')).toHaveAttribute('width', '64')\n      expect(container.querySelector('svg')).toHaveAttribute('height', '64')\n    })\n\n    it('respects size={number}', () => {\n      const {container} = render(<AlertIcon size={128} />)\n      expect(container.querySelector('svg')).toHaveAttribute('width', '128')\n      expect(container.querySelector('svg')).toHaveAttribute('height', '128')\n    })\n\n    it('chooses the correct SVG given a size <24', () => {\n      const {container} = render(<AlertIcon size={20} />)\n      expect(container.querySelector('svg')).toHaveAttribute('viewBox', '0 0 16 16')\n      expect(container.querySelector('svg')).toHaveAttribute('width', '20')\n      expect(container.querySelector('svg')).toHaveAttribute('height', '20')\n    })\n\n    it('chooses the correct SVG given a size >=24', () => {\n      const {container} = render(<AlertIcon size={24} />)\n      expect(container.querySelector('svg')).toHaveAttribute('viewBox', '0 0 24 24')\n      expect(container.querySelector('svg')).toHaveAttribute('width', '24')\n      expect(container.querySelector('svg')).toHaveAttribute('height', '24')\n    })\n  })\n})\n"
  },
  {
    "path": "lib/octicons_react/src/createIconComponent.js",
    "content": "import React from 'react'\n\nconst sizeMap = {\n  small: 16,\n  medium: 32,\n  large: 64\n}\n\nexport function createIconComponent(name, defaultClassName, getSVGData) {\n  const svgDataByHeight = getSVGData()\n  const heights = Object.keys(svgDataByHeight)\n\n  const Icon = React.forwardRef(\n    (\n      {\n        'aria-label': ariaLabel,\n        'aria-labelledby': arialabelledby,\n        tabIndex,\n        className = '',\n        fill = 'currentColor',\n        size = 16,\n        verticalAlign = 'text-bottom',\n        id,\n        title,\n        style,\n        ...rest\n      },\n      forwardedRef\n    ) => {\n      const height = sizeMap[size] || size\n      const naturalHeight = closestNaturalHeight(heights, height)\n      const naturalWidth = svgDataByHeight[naturalHeight].width\n      const width = height * (naturalWidth / naturalHeight)\n      const path = svgDataByHeight[naturalHeight].path\n      const labelled = ariaLabel || arialabelledby\n      const role = labelled ? 'img' : undefined\n\n      return (\n        <svg\n          ref={forwardedRef}\n          {...rest}\n          aria-hidden={labelled ? undefined : 'true'}\n          tabIndex={tabIndex}\n          focusable={tabIndex >= 0 ? 'true' : 'false'}\n          aria-label={ariaLabel}\n          aria-labelledby={arialabelledby}\n          className={`${defaultClassName} ${className}`.trim()}\n          role={role}\n          viewBox={`0 0 ${naturalWidth} ${naturalHeight}`}\n          width={width}\n          height={height}\n          fill={fill}\n          id={id}\n          display=\"inline-block\"\n          overflow=\"visible\"\n          style={{\n            verticalAlign,\n            ...style\n          }}\n        >\n          {title ? <title>{title}</title> : null}\n          {path}\n        </svg>\n      )\n    }\n  )\n\n  Icon.displayName = name\n\n  return Icon\n}\n\nfunction closestNaturalHeight(naturalHeights, height) {\n  return naturalHeights\n    .map(naturalHeight => parseInt(naturalHeight, 10))\n    .reduce((acc, naturalHeight) => (naturalHeight <= height ? naturalHeight : acc), naturalHeights[0])\n}\n"
  },
  {
    "path": "lib/octicons_react/src/index.d.ts",
    "content": "// eslint-disable-next-line import/no-namespace\nimport * as React from 'react'\n\n// eslint-disable-next-line prettier/prettier\nimport {Icon} from './__generated__/icons.js'\n\ntype Size = 'small' | 'medium' | 'large'\n\nexport interface OcticonProps extends React.ComponentPropsWithoutRef<'svg'> {\n  'aria-label'?: string\n  'aria-labelledby'?: string\n  tabIndex?: number\n  children?: React.ReactElement<any>\n  className?: string\n  title?: string | React.ReactElement<any>\n  id?: string\n  fill?: string\n  icon?: Icon | React.ReactNode\n  size?: number | Size\n  /** @deprecated use v-align utilities instead */\n  verticalAlign?: 'middle' | 'text-bottom' | 'text-top' | 'top' | 'unset'\n}\n\nexport * from './__generated__/icons.js'\n"
  },
  {
    "path": "lib/octicons_react/src/index.js",
    "content": "export * from './__generated__/icons'\n"
  },
  {
    "path": "lib/octicons_react/ts-tests/index.tsx",
    "content": "import * as React from 'react'\nimport {MarkGithubIcon, PlusIcon, RepoIcon} from '../src'\n\nfunction TestOcticons() {\n  return (\n    <div>\n      <MarkGithubIcon />\n      <PlusIcon />\n      <RepoIcon size=\"medium\" className=\"test\" aria-label=\"repo\" verticalAlign=\"middle\" />\n    </div>\n  )\n}\n"
  },
  {
    "path": "lib/octicons_react/ts-tests/tsconfig.json",
    "content": "{\n  \"$schema\": \"http://json.schemastore.org/tsconfig\",\n  \"compileOnSave\": false,\n  \"compilerOptions\": {\n    \"module\": \"commonjs\",\n    \"noEmit\": true,\n    \"noImplicitAny\": true,\n    \"jsx\": \"react\",\n    \"lib\": [\"es2015\"],\n    \"skipLibCheck\": true\n  }\n}\n"
  },
  {
    "path": "lib/octicons_styled/.babelrc",
    "content": "{\n  \"presets\": [\"env\", \"stage-0\", \"react\"],\n  \"env\": {\n    \"production\": {\n      \"presets\": [\"next/babel\"]\n    }\n  }\n}\n"
  },
  {
    "path": "lib/octicons_styled/.eslintignore",
    "content": "src/__generated__/\n"
  },
  {
    "path": "lib/octicons_styled/.eslintrc.json",
    "content": "{\n  \"parser\": \"@typescript-eslint/parser\",\n  \"parserOptions\": {\n    \"ecmaFeatures\": {\n      \"jsx\": true\n    }\n  },\n  \"extends\": [\n    \"plugin:react/recommended\",\n    \"plugin:jsx-a11y/recommended\",\n    \"plugin:prettier/recommended\",\n    \"plugin:github/recommended\",\n    \"plugin:github/browser\"\n  ],\n  \"rules\": {\n    \"github/no-then\": 0,\n    \"import/named\": 0,\n    \"react/prop-types\": 0\n  },\n  \"env\": {\n    \"browser\": true,\n    \"commonjs\": true,\n    \"es6\": true,\n    \"jest\": true,\n    \"node\": true\n  },\n  \"settings\": {\n    \"react\": {\n      \"version\": \"16\"\n    }\n  }\n}\n"
  },
  {
    "path": "lib/octicons_styled/.gitignore",
    "content": ".cache\n.next\ndist/\nsrc/__generated__/\n"
  },
  {
    "path": "lib/octicons_styled/.npmignore",
    "content": "*.config.js\n.*.sw?\n.*rc\n.cache\n.eslint*\n.gitignore\n.next\nscript\nsrc\n"
  },
  {
    "path": "lib/octicons_styled/.nvmrc",
    "content": "8\n"
  },
  {
    "path": "lib/octicons_styled/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2026 GitHub Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "lib/octicons_styled/README.md",
    "content": "# @primer/styled-octicons\n\n[![npm version](https://img.shields.io/npm/v/@primer/styled-octicons.svg)](https://www.npmjs.org/package/@primer/styled-octicons)\n\nThe `@primer/styled-octicons` package wraps icon components from [`@primer/octicons-react`](/packages/react) with [system props](https://primer.style/components/system-props), making them easier to style in projects that use [styled system](https://styled-system.com/)—like [Primer React](https://primer.style/components).\n\n## Install\n\n```shell\nnpm install @primer/styled-octicons\n```\n\n## Usage\n\n`@primer/styled-octicons`  exports each icons as a named export. This allows you to import only the icons you need:\n\n```jsx\nimport {AlertIcon} from '@primer/styled-octicons'\n\nexport () => (\n  <AlertIcon color=\"red.6\" mr={2} />\n)\n```\n\n## System props\n\nAll icon components in `@primer/styled-octicons` get `color` and `space` system props as well as the `sx` prop. Read the Primer React [System Props](https://primer.style/components/system-props) documentation for a full list of available props.\n\n\n## Props\n\nIn addition to system props, icon components in `@primer/styled-octicons` accept the same props as components in `@primer/octicons-react`:\n\n| Name | Type | Default | Description |\n| :- | :- | :-: | :- |\n| aria-label | String | | Sets the [`aria-label`](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/ARIA_Techniques/Using_the_aria-label_attribute) attribute of the `<svg>`. If no `aria-label` is defined, `aria-hidden` will be set to `true`.  |\n| className | String | | Sets the `class` attribute on the `<svg>`. |\n| size | Number \\| `\"small\"` \\| `\"medium\"` \\| `\"large\"` | `16` | The height of the icon. Width will be scaled proportionally. |\n| verticalAlign | `\"middle\"` \\| `\"text-bottom\"` \\| `\"text-top\"` \\| `\"top\"` \\| `\"unset\"` | `\"text-bottom\"` | The vertical alignment of the `<svg>`. |\n"
  },
  {
    "path": "lib/octicons_styled/package.json",
    "content": "{\n  \"name\": \"@primer/styled-octicons\",\n  \"version\": \"16.1.0\",\n  \"description\": \"A scalable set of icons handcrafted with <3 by GitHub.\",\n  \"homepage\": \"https://primer.style/octicons\",\n  \"author\": \"GitHub, Inc.\",\n  \"license\": \"MIT\",\n  \"main\": \"dist/index.umd.js\",\n  \"module\": \"dist/index.esm.js\",\n  \"sideEffects\": false,\n  \"types\": \"dist/index.d.ts\",\n  \"repository\": \"primer/octicons\",\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"build\": \"script/build.js && npm run rollup && script/copy.sh\",\n    \"ts-test\": \"tsc -P ts-tests\",\n    \"test\": \"jest\",\n    \"posttest\": \"npm run ts-test\",\n    \"lint\": \"eslint src script\",\n    \"rollup\": \"rollup -c --bundleConfigAsCjs\"\n  },\n  \"keywords\": [\n    \"GitHub\",\n    \"icons\",\n    \"svg\",\n    \"octicons\",\n    \"react\",\n    \"primer\"\n  ],\n  \"dependencies\": {\n    \"@styled-system/css\": \"^5.1.5\",\n    \"@styled-system/prop-types\": \"^5.1.5\",\n    \"@types/styled-system\": \"^5.1.9\",\n    \"@types/styled-system__css\": \"^5.0.8\",\n    \"styled-system\": \"^5.1.5\"\n  },\n  \"peerDependencies\": {\n    \"react\": \">=15\",\n    \"styled-components\": \"4.x || 5.x\"\n  },\n  \"devDependencies\": {\n    \"@babel/core\": \"7.24.7\",\n    \"@babel/preset-env\": \"7.24.7\",\n    \"@babel/preset-react\": \"7.24.7\",\n    \"@github/prettier-config\": \"0.0.4\",\n    \"@rollup/plugin-babel\": \"6.0.4\",\n    \"@testing-library/jest-dom\": \"^5.3.0\",\n    \"@testing-library/react\": \"^10.0.2\",\n    \"@types/react\": \"^16.4.6\",\n    \"eslint\": \"^6.5.1\",\n    \"eslint-plugin-github\": \"4.1.3\",\n    \"eslint-plugin-jest\": \"^21.17.0\",\n    \"eslint-plugin-jsx-a11y\": \"6.4.1\",\n    \"eslint-plugin-react\": \"7.23.2\",\n    \"fs-extra\": \"^6.0.1\",\n    \"jest\": \"^23.2.0\",\n    \"jest-styled-components\": \"^7.0.2\",\n    \"next\": \"^16.1.7\",\n    \"react\": \"^16.4.0\",\n    \"react-dom\": \"^16.4.1\",\n    \"rollup\": \"^4.18.0\",\n    \"styled-components\": \"^5.1.0\",\n    \"typescript\": \"^3.7.5\"\n  },\n  \"engines\": {\n    \"node\": \">=8\"\n  }\n}\n"
  },
  {
    "path": "lib/octicons_styled/prettier.config.js",
    "content": "module.exports = require('@github/prettier-config')\n"
  },
  {
    "path": "lib/octicons_styled/rollup.config.js",
    "content": "import babel from '@rollup/plugin-babel'\n// eslint-disable-next-line import/no-namespace\nimport * as octicons from '../octicons_react/dist/index.esm'\n\nconst icons = Object.keys(octicons).filter(name => name !== 'default')\n\nexport default [\n  {\n    input: 'src/__generated__/index.js',\n    plugins: [\n      babel({\n        babelrc: false,\n        presets: [[require.resolve('@babel/preset-env'), {modules: false}], require.resolve('@babel/preset-react')],\n        babelHelpers: 'inline'\n      })\n    ],\n    output: {\n      file: 'dist/index.umd.js',\n      format: 'umd',\n      name: 'reocticons'\n    }\n  },\n  {\n    input: Object.fromEntries(icons.map(name => [`icons/${name}`, `src/__generated__/icons/${name}.js`])),\n    plugins: [\n      babel({\n        babelrc: false,\n        presets: [[require.resolve('@babel/preset-env'), {modules: false}], require.resolve('@babel/preset-react')],\n        babelHelpers: 'bundled'\n      })\n    ],\n    output: {\n      dir: 'dist',\n      format: 'esm'\n    }\n  }\n]\n"
  },
  {
    "path": "lib/octicons_styled/script/.eslintrc.json",
    "content": "{\n  \"env\": {\n    \"node\": true,\n    \"browser\": false\n  },\n  \"rules\": {\n    \"no-console\": 0\n  }\n}\n"
  },
  {
    "path": "lib/octicons_styled/script/build.js",
    "content": "#!/usr/bin/env node\nconst path = require('path')\nconst fs = require('fs-extra')\nconst octicons = require('../../octicons_react')\n\nconst GENERATED_HEADER = '/* THIS FILE IS GENERATED. DO NOT EDIT IT. */'\n\nconst generatedDir = path.join(__dirname, '../src/__generated__')\nconst iconsDir = path.join(generatedDir, 'icons')\n\nfs.ensureDirSync(iconsDir)\n\nconst icons = Object.keys(octicons).filter(name => name !== 'default')\n\nconst initialTypeDefinitions = `${GENERATED_HEADER}\nimport * as React from 'react'\nimport * as StyledSystem from 'styled-system'\nimport {SystemStyleObject} from '@styled-system/css'\n\ntype Size = 'small' | 'medium' | 'large'\n\nexport interface IconProps extends StyledSystem.ColorProps, StyledSystem.SpaceProps {\n  'aria-label'?: string\n  className?: string\n  size?: number | Size\n  verticalAlign?: 'middle' | 'text-bottom' | 'text-top' | 'top' | 'unset'\n  sx?: SystemStyleObject\n}\n\nexport type Icon = React.FC<IconProps>\n`\n\nfs.writeFileSync(path.join(generatedDir, 'index.js'), '', 'utf-8')\nfs.writeFileSync(path.join(generatedDir, 'index.d.ts'), initialTypeDefinitions, 'utf-8')\n\nfor (const name of icons) {\n  const location = path.join(iconsDir, `${name}.js`)\n\n  const code = `${GENERATED_HEADER}\nimport styled from 'styled-components'\nimport * as styledSystem from 'styled-system'\nimport {${name}} from '../../../../octicons_react/dist/index.esm'\nimport {COMMON, sx} from '../../utils'\n\nconst Styled${name} = styled(${name})(COMMON, sx)\n\nexport default Styled${name}\n`\n\n  fs.writeFileSync(location, code, 'utf-8')\n\n  console.log('Successfully built', name)\n\n  const exportString = `export { default as ${name} } from './icons/${name}';\\r\\n`\n  fs.appendFileSync(path.join(generatedDir, 'index.js'), exportString, 'utf-8')\n\n  const exportTypeString = `export const ${name}: Icon;\\n`\n  fs.appendFileSync(path.join(generatedDir, 'index.d.ts'), exportTypeString, 'utf-8')\n}\n"
  },
  {
    "path": "lib/octicons_styled/script/copy.sh",
    "content": "#!/bin/bash\n\ncp src/__generated__/index.d.ts dist/index.d.ts\ncp src/__generated__/index.js dist/index.esm.js\n"
  },
  {
    "path": "lib/octicons_styled/src/__tests__/.eslintrc.json",
    "content": "{\n  \"rules\": {\n    \"github/unescaped-html-literal\": 0\n  }\n}\n"
  },
  {
    "path": "lib/octicons_styled/src/__tests__/octicon.js",
    "content": "import '@testing-library/jest-dom'\nimport {render} from '@testing-library/react'\nimport 'jest-styled-components'\nimport React from 'react'\nimport {ThemeProvider} from 'styled-components'\nimport {AlertIcon} from '../__generated__/index'\n\ndescribe('An icon component', () => {\n  it('sets aria-hidden=\"false\" if ariaLabel prop is present', () => {\n    const {container} = render(<AlertIcon aria-label=\"icon\" />)\n    expect(container.querySelector('svg')).toHaveAttribute('aria-hidden', 'false')\n    expect(container.querySelector('svg')).toHaveAttribute('aria-label', 'icon')\n  })\n\n  it('respects the className prop', () => {\n    const {container} = render(<AlertIcon className=\"foo\" />)\n    expect(container.querySelector('svg')).toHaveClass('foo')\n  })\n\n  it('respects the verticalAlign prop', () => {\n    const {container} = render(<AlertIcon verticalAlign=\"middle\" />)\n    expect(container.querySelector('svg')).toHaveStyle({verticalAlign: 'middle'})\n  })\n\n  describe('size props', () => {\n    it('respects size=\"small\"', () => {\n      const {container} = render(<AlertIcon size=\"small\" />)\n      expect(container.querySelector('svg')).toHaveAttribute('width', '16')\n      expect(container.querySelector('svg')).toHaveAttribute('height', '16')\n    })\n\n    it('respects size=\"medium\"', () => {\n      const {container} = render(<AlertIcon size=\"medium\" />)\n      expect(container.querySelector('svg')).toHaveAttribute('width', '32')\n      expect(container.querySelector('svg')).toHaveAttribute('height', '32')\n    })\n\n    it('respects size=\"large\"', () => {\n      const {container} = render(<AlertIcon size=\"large\" />)\n      expect(container.querySelector('svg')).toHaveAttribute('width', '64')\n      expect(container.querySelector('svg')).toHaveAttribute('height', '64')\n    })\n\n    it('respects size={number}', () => {\n      const {container} = render(<AlertIcon size={128} />)\n      expect(container.querySelector('svg')).toHaveAttribute('width', '128')\n      expect(container.querySelector('svg')).toHaveAttribute('height', '128')\n    })\n\n    it('chooses the correct SVG given a size <24', () => {\n      const {container} = render(<AlertIcon size={20} />)\n      expect(container.querySelector('svg')).toHaveAttribute('viewBox', '0 0 16 16')\n      expect(container.querySelector('svg')).toHaveAttribute('width', '20')\n      expect(container.querySelector('svg')).toHaveAttribute('height', '20')\n    })\n\n    it('chooses the correct SVG given a size >=24', () => {\n      const {container} = render(<AlertIcon size={24} />)\n      expect(container.querySelector('svg')).toHaveAttribute('viewBox', '0 0 24 24')\n      expect(container.querySelector('svg')).toHaveAttribute('width', '24')\n      expect(container.querySelector('svg')).toHaveAttribute('height', '24')\n    })\n  })\n\n  describe('system props', () => {\n    it('respects the color prop', () => {\n      const theme = {colors: {red: ['#ffeef0', '#ffdce0']}}\n      const {container} = render(\n        <ThemeProvider theme={theme}>\n          <AlertIcon color=\"red.1\" />\n        </ThemeProvider>\n      )\n      expect(container.querySelector('svg')).toHaveStyleRule('color', '#ffdce0')\n    })\n\n    it('respects space props', () => {\n      const theme = {space: [0, 4, 8, 16, 24, 32, 40, 48]}\n      const {container} = render(\n        <ThemeProvider theme={theme}>\n          <AlertIcon ml={2} mt={1} mr={3} mb={4} />\n        </ThemeProvider>\n      )\n      expect(container.querySelector('svg')).toHaveStyleRule('margin-top', '4px')\n      expect(container.querySelector('svg')).toHaveStyleRule('margin-left', '8px')\n      expect(container.querySelector('svg')).toHaveStyleRule('margin-right', '16px')\n      expect(container.querySelector('svg')).toHaveStyleRule('margin-bottom', '24px')\n    })\n\n    it('respects sx props', () => {\n      const theme = {colors: {red: ['#ffeef0', '#ffdce0']}}\n      const {container} = render(\n        <ThemeProvider theme={theme}>\n          <AlertIcon sx={{color: 'red.0'}} />\n        </ThemeProvider>\n      )\n      expect(container.querySelector('svg')).toHaveStyleRule('color', '#ffeef0')\n    })\n  })\n})\n"
  },
  {
    "path": "lib/octicons_styled/src/utils.js",
    "content": "// eslint-disable-next-line import/no-namespace\nimport * as styledSystem from 'styled-system'\nimport css from '@styled-system/css'\n\nexport const COMMON = styledSystem.compose(styledSystem.space, styledSystem.color)\n\nexport const sx = props => css(props.sx)\n"
  },
  {
    "path": "lib/octicons_styled/ts-tests/index.tsx",
    "content": "import * as React from 'react'\nimport {RepoIcon} from '../src/__generated__'\n\nfunction TestOcticons() {\n  return (\n    <div>\n      <RepoIcon />\n      <RepoIcon size=\"medium\" className=\"test\" aria-label=\"repo\" verticalAlign=\"middle\" />\n      <RepoIcon color=\"red\" />\n      <RepoIcon m={3} ml={1} mr={2} mt={3} mb={4} />\n    </div>\n  )\n}\n"
  },
  {
    "path": "lib/octicons_styled/ts-tests/tsconfig.json",
    "content": "{\n  \"$schema\": \"http://json.schemastore.org/tsconfig\",\n  \"compileOnSave\": false,\n  \"compilerOptions\": {\n    \"module\": \"commonjs\",\n    \"noEmit\": true,\n    \"noImplicitAny\": true,\n    \"jsx\": \"react\",\n    \"lib\": [\"es2015\"],\n    \"skipLibCheck\": true\n  }\n}\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"@primer/octicons\",\n  \"version\": \"19.23.1\",\n  \"publishConfig\": {\n    \"registry\": \"no registry, don't publish from this package.json.\"\n  },\n  \"scripts\": {\n    \"build\": \"script/build.js --input icons/**/*.svg --output lib/build/data.json\",\n    \"changeset:version\": \"changeset version && script/version\",\n    \"lint\": \"eslint tests\",\n    \"svgo\": \"svgo icons --config svgo.config.js\",\n    \"test\": \"ava -v tests/*.js\",\n    \"version\": \"script/version\"\n  },\n  \"devDependencies\": {\n    \"@changesets/changelog-github\": \"0.4.1\",\n    \"@changesets/cli\": \"2.17.0\",\n    \"@github/prettier-config\": \"0.0.6\",\n    \"ava\": \"2.1.0\",\n    \"braces\": \"3.0.3\",\n    \"cheerio\": \"1.0.0-rc.3\",\n    \"eslint\": \"8.57.1\",\n    \"eslint-plugin-github\": \"5.0.2\",\n    \"eslint-plugin-prettier\": \"5.2.1\",\n    \"execa\": \"4.0.0\",\n    \"fs-extra\": \"7.0.1\",\n    \"globby\": \"11.0.0\",\n    \"js-yaml\": \"3.14.2\",\n    \"prettier\": \"3.4.1\",\n    \"lodash.merge\": \"4.6.2\",\n    \"svgo\": \"3.3.3\",\n    \"svgson\": \"5.2.1\",\n    \"trim-newlines\": \"3.0.1\",\n    \"yargs\": \"15.1.0\"\n  },\n  \"eslintConfig\": {\n    \"extends\": [\n      \"plugin:github/internal\",\n      \"plugin:github/recommended\"\n    ],\n    \"env\": {\n      \"es6\": true,\n      \"node\": true\n    },\n    \"parserOptions\": {\n      \"ecmaVersion\": 2017,\n      \"requireConfigFile\": false\n    },\n    \"rules\": {\n      \"github/no-then\": 0,\n      \"eslint-comments/no-use\": 0\n    }\n  },\n  \"packageManager\": \"yarn@1.22.1\"\n}\n"
  },
  {
    "path": "prettier.config.js",
    "content": "module.exports = require('@github/prettier-config')\n"
  },
  {
    "path": "script/build.js",
    "content": "#!/usr/bin/env node\n/* eslint-env node */\nconst fs = require('fs-extra')\nconst path = require('path')\nconst globby = require('globby')\nconst cheerio = require('cheerio')\nconst {parseSync} = require('svgson')\nconst trimNewlines = require('trim-newlines')\nconst yargs = require('yargs')\nconst merge = require('lodash.merge')\nconst keywords = require('../keywords.json')\n\n// This script generates a JSON file that contains\n// information about input SVG files.\n\nconst {argv} = yargs\n  .usage('Usage: $0 --input <input filepaths> --output <output filepath>')\n  .example('$0 --input icons/**/*.svg --output build/data.json')\n  .option('input', {\n    alias: 'i',\n    type: 'array',\n    demandOption: true,\n    describe: 'Input SVG files'\n  })\n  .option('output', {\n    alias: 'o',\n    type: 'string',\n    describe: 'Output JSON file. Defaults to stdout if no output file is provided.'\n  })\n\n// The `argv.input` array could contain globs (e.g. \"**/*.svg\").\nconst filepaths = globby.sync(argv.input)\nconst svgFilepaths = filepaths.filter(filepath => path.parse(filepath).ext === '.svg')\n\nif (svgFilepaths.length === 0) {\n  // eslint-disable-next-line no-console\n  console.error('No input SVG file(s) found')\n  process.exit(1)\n}\n\nlet exitCode = 0\n\nconst icons = svgFilepaths.map(filepath => {\n  try {\n    const filename = path.parse(filepath).base\n    const filenamePattern = /(.+)-([0-9]+).svg$/\n\n    if (!filenamePattern.test(filename)) {\n      throw new Error(\n        `${filename}: Invalid filename. Please append the height of the SVG to the end of the filename (e.g. alert-16.svg).`\n      )\n    }\n\n    const [, name, height] = filename.match(filenamePattern)\n    const svg = fs.readFileSync(path.resolve(filepath), 'utf8')\n    const svgElement = cheerio.load(svg)('svg')\n    const svgWidth = parseInt(svgElement.attr('width'))\n    const svgHeight = parseInt(svgElement.attr('height'))\n    const svgViewBox = svgElement.attr('viewBox')\n    const svgPath = trimNewlines(svgElement.html()).trim()\n    const ast = parseSync(svg, {\n      camelcase: true\n    })\n\n    if (!svgWidth) {\n      throw new Error(`${filename}: Missing width attribute.`)\n    }\n\n    if (!svgHeight) {\n      throw new Error(`${filename}: Missing height attribute.`)\n    }\n\n    if (!svgViewBox) {\n      throw new Error(`${filename}: Missing viewBox attribute.`)\n    }\n\n    if (svgHeight !== parseInt(height)) {\n      throw new Error(`${filename}: Height in filename does not match height attribute of SVG`)\n    }\n\n    const viewBoxPattern = /0 0 ([0-9]+) ([0-9]+)/\n\n    if (!viewBoxPattern.test(svgViewBox)) {\n      throw new Error(\n        `${filename}: Invalid viewBox attribute. The viewBox attribute should be in the following format: \"0 0 <width> <height>\"`\n      )\n    }\n\n    const [, viewBoxWidth, viewBoxHeight] = svgViewBox.match(viewBoxPattern)\n\n    if (svgWidth !== parseInt(viewBoxWidth)) {\n      throw new Error(`${filename}: width attribute and viewBox width do not match.`)\n    }\n\n    if (svgHeight !== parseInt(viewBoxHeight)) {\n      throw new Error(`${filename}: height attribute and viewBox height do not match.`)\n    }\n\n    return {\n      name,\n      keywords: keywords[name] || [],\n      width: svgWidth,\n      height: svgHeight,\n      path: svgPath,\n      ast\n    }\n  } catch (error) {\n    // eslint-disable-next-line no-console\n    console.error(error)\n    // Instead of exiting immediately, we set exitCode to 1 and continue\n    // iterating through the rest of the SVGs. This allows us to identify all\n    // the SVGs that have errors, not just the first one. An exit code of 1\n    // indicates that an error occurred.\n    // Reference: https://nodejs.org/api/process.html#process_exit_codes\n    exitCode = 1\n    return null\n  }\n})\n\n// Exit early if any errors occurred.\nif (exitCode !== 0) {\n  process.exit(exitCode)\n}\n\nconst iconsByName = icons.reduce(\n  (acc, icon) =>\n    merge(acc, {\n      [icon.name]: {\n        name: icon.name,\n        keywords: icon.keywords,\n        heights: {\n          [icon.height]: {\n            width: icon.width,\n            path: icon.path,\n            ast: icon.ast\n          }\n        }\n      }\n    }),\n  {}\n)\n\nif (argv.output) {\n  fs.outputJsonSync(path.resolve(argv.output), iconsByName)\n} else {\n  process.stdout.write(JSON.stringify(iconsByName))\n}\n"
  },
  {
    "path": "script/changeset-publish",
    "content": "#!/bin/bash\n\n# This is a hack to make the changeset action think we npm published, so that it creates the github release\n\n# Get the current version\nPACKAGE_VERSION=$(jq '.version' --raw-output ./package.json)\n\n# Check if the remote has the current version as a git tag\n# If it doesn't, we echo \"New tag:\" which is what the changeset action expects https://github.com/changesets/action/blob/b98cec97583b917ff1dc6179dd4d230d3e439894/src/run.ts#L123\ngit ls-remote --exit-code --tags origin \"v$PACKAGE_VERSION\" || echo \"New tag:\"\n"
  },
  {
    "path": "script/version",
    "content": "#!/bin/bash\n\nPACKAGE_VERSION=$(jq '.version' --raw-output ./package.json)\n\necho $PACKAGE_VERSION\n\necho \"Versioning Octicons node package\"\n\ncd lib/octicons_node/\nnpm -f --no-git-tag-version --allow-same-version version $PACKAGE_VERSION\n\necho \"Versioning Octicons react package\"\n\ncd ../octicons_react/\nnpm -f --no-git-tag-version --allow-same-version version $PACKAGE_VERSION\n\necho \"Versioning Octicons ruby gem\"\n\ncd ../octicons_gem/\nrake version\\[\"$PACKAGE_VERSION\"\\]\n\necho \"Versioning Octicons rails helper gem\"\n\ncd ../octicons_helper/\nrake version\\[\"$PACKAGE_VERSION\"\\]\n\necho \"Versioning Octicons jekyll plugin gem\"\n\ncd ../octicons_jekyll/\nrake version\\[\"$PACKAGE_VERSION\"\\]\n\ncd ../../\ngit add lib/\n"
  },
  {
    "path": "svgo.config.js",
    "content": "/* eslint-disable import/no-commonjs,filenames/match-regex */\n\nmodule.exports = {\n  multipass: true,\n  plugins: [\n    {\n      name: 'preset-default',\n      params: {\n        overrides: {\n          removeViewBox: false\n        }\n      }\n    },\n    'removeStyleElement',\n    {\n      name: 'removeAttrs',\n      params: {\n        attrs: ['xmlns:xlink', 'id', 'class', 'data-name', 'fill', 'transform', 'href', 'clip-path', 'clip-rule']\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "tests/build.js",
    "content": "/* eslint-disable import/no-commonjs */\nconst path = require('path')\nconst test = require('ava')\nconst execa = require('execa')\n\ntest('builds an object with the correct shape', t => {\n  return execa(\n    path.resolve(__dirname, '../script/build.js'),\n    ['--input', 'icons/icon-a-16.svg', './icons/icon-a-24.svg', './icons/icon-b-16.svg'],\n    {cwd: __dirname},\n  ).then(({stdout}) => {\n    const icons = JSON.parse(stdout)\n    t.snapshot(icons)\n  })\n})\n\ntest('fails when input argument is missing', t => {\n  return execa(path.resolve(__dirname, '../script/build.js'))\n    .then(() => {\n      t.fail() // Test should fail if execa() call doesn't throw an error\n    })\n    .catch(error => {\n      t.is(error.exitCode, 1)\n      t.false(error.killed)\n    })\n})\n\ntest('fails when input file does not exist', t => {\n  return execa(path.resolve(__dirname, '../script/build.js'), ['--input', 'fake-16.svg'])\n    .then(() => {\n      t.fail() // Test should fail if execa() call doesn't throw an error\n    })\n    .catch(error => {\n      t.is(error.exitCode, 1)\n      t.false(error.killed)\n    })\n})\n\ntest('fails when filename is missing a height', t => {\n  return execa(path.resolve(__dirname, '../script/build.js'), ['--input', 'tests/icons/missing-height.svg'])\n    .then(() => {\n      t.fail() // Test should fail if execa() call doesn't throw an error\n    })\n    .catch(error => {\n      t.is(error.exitCode, 1)\n      t.false(error.killed)\n    })\n})\n\ntest('fails when height in filename does not match height attribute of SVG', t => {\n  return execa(path.resolve(__dirname, '../script/build.js'), ['--input', 'tests/icons/height-mismatch-24.svg'])\n    .then(() => {\n      t.fail() // Test should fail if execa() call doesn't throw an error\n    })\n    .catch(error => {\n      t.is(error.exitCode, 1)\n      t.false(error.killed)\n    })\n})\n\ntest('fails when height attribute is missing', t => {\n  return execa(path.resolve(__dirname, '../script/build.js'), ['--input', 'tests/icons/missing-height-attr-16.svg'])\n    .then(() => {\n      t.fail() // Test should fail if execa() call doesn't throw an error\n    })\n    .catch(error => {\n      t.is(error.exitCode, 1)\n      t.false(error.killed)\n    })\n})\n\ntest('fails when width attribute is missing', t => {\n  return execa(path.resolve(__dirname, '../script/build.js'), ['--input', 'tests/icons/missing-width-attr-16.svg'])\n    .then(() => {\n      t.fail() // Test should fail if execa() call doesn't throw an error\n    })\n    .catch(error => {\n      t.is(error.exitCode, 1)\n      t.false(error.killed)\n    })\n})\n\ntest('fails when viewBox attribute is missing', t => {\n  return execa(path.resolve(__dirname, '../script/build.js'), ['--input', 'tests/icons/missing-viewbox-attr-16.svg'])\n    .then(() => {\n      t.fail() // Test should fail if execa() call doesn't throw an error\n    })\n    .catch(error => {\n      t.is(error.exitCode, 1)\n      t.false(error.killed)\n    })\n})\n\ntest('fails when height attribute is invalid', t => {\n  return execa(path.resolve(__dirname, '../script/build.js'), ['--input', 'tests/icons/invalid-height-attr-16.svg'])\n    .then(() => {\n      t.fail() // Test should fail if execa() call doesn't throw an error\n    })\n    .catch(error => {\n      t.is(error.exitCode, 1)\n      t.false(error.killed)\n    })\n})\n\ntest('fails when width attribute is invalid', t => {\n  return execa(path.resolve(__dirname, '../script/build.js'), ['--input', 'tests/icons/invalid-width-attr-16.svg'])\n    .then(() => {\n      t.fail() // Test should fail if execa() call doesn't throw an error\n    })\n    .catch(error => {\n      t.is(error.exitCode, 1)\n      t.false(error.killed)\n    })\n})\n\ntest('fails when viewBox attribute is invalid', t => {\n  return execa(path.resolve(__dirname, '../script/build.js'), ['--input', 'tests/icons/invalid-viewbox-attr-16.svg'])\n    .then(() => {\n      t.fail() // Test should fail if execa() call doesn't throw an error\n    })\n    .catch(error => {\n      t.is(error.exitCode, 1)\n      t.false(error.killed)\n    })\n})\n\ntest('fails when viewBox width does not match width attribute', t => {\n  return execa(path.resolve(__dirname, '../script/build.js'), ['--input', 'tests/icons/viewbox-width-mismatch-16.svg'])\n    .then(() => {\n      t.fail() // Test should fail if execa() call doesn't throw an error\n    })\n    .catch(error => {\n      t.is(error.exitCode, 1)\n      t.false(error.killed)\n    })\n})\n\ntest('fails when viewBox height does not match height attribute', t => {\n  return execa(path.resolve(__dirname, '../script/build.js'), ['--input', 'tests/icons/viewbox-height-mismatch-16.svg'])\n    .then(() => {\n      t.fail() // Test should fail if execa() call doesn't throw an error\n    })\n    .catch(error => {\n      t.is(error.exitCode, 1)\n      t.false(error.killed)\n    })\n})\n\ntest('ignores non-SVG input files', t => {\n  return execa(path.resolve(__dirname, '../script/build.js'), ['--input', 'tests/build.js'])\n    .then(() => {\n      t.fail() // Test should fail if execa() call doesn't throw an error\n    })\n    .catch(error => {\n      t.is(error.exitCode, 1)\n      t.false(error.killed)\n    })\n})\n"
  },
  {
    "path": "tests/index.js",
    "content": "/* eslint-disable import/no-commonjs */\n/* eslint-disable i18n-text/no-en */\n\nconst test = require('ava')\nconst fs = require('fs-extra')\nconst globby = require('globby')\n\nconst year = new Date().getFullYear()\nconst yearRegex = new RegExp(`Copyright \\\\(c\\\\) ${year} GitHub Inc\\\\.`)\nconst octiconsLib = fs.readdirSync('./lib/build/svg')\nconst octiconsData = require('../lib/build/data.json')\n\ntest(`LICENSE files have the current year ${year}`, t => {\n  return globby(['**/LICENSE', '!**/node_modules/**/LICENSE', '!**/vendor/**/LICENSE']).then(paths => {\n    t.plan(paths.length)\n    return paths.map(path => {\n      const license = fs.readFileSync(path, 'utf8')\n      return t.regex(license, yearRegex, `The license \"${path}\" does not include the current year ${year}`)\n    })\n  })\n})\n\ntest('SVG icons exist', t => {\n  t.not(octiconsLib.length, 0, `We didn't find any svg files`)\n})\n\ntest('Data file exist', t => {\n  t.not(octiconsData.length, 0, `We didn't find any data files`)\n})\n\nconst names = {}\nfor (const octicon of Object.values(octiconsData)) {\n  test(`No duplicate ${octicon.name} icon`, t => {\n    if (names[octicon.name]) {\n      t.fail(\n        `Found duplicate '${octicon.name}' icons in the figma file. Please rename one of them. https://www.figma.com/file/${octicon.file}?node-id=${octicon.id}`,\n      )\n    } else {\n      names[octicon.name] = octicon\n      t.pass()\n    }\n  })\n}\n"
  },
  {
    "path": "tests/snapshots/build.js.md",
    "content": "# Snapshot report for `tests/build.js`\n\nThe actual snapshot is saved in `build.js.snap`.\n\nGenerated by [AVA](https://ava.li).\n\n## builds an object with the correct shape\n\n> Snapshot 1\n\n    {\n      'icon-a': {\n        heights: {\n          16: {\n            ast: {\n              attributes: {\n                height: '16',\n                viewBox: '0 0 16 16',\n                width: '16',\n                xmlns: 'http://www.w3.org/2000/svg',\n              },\n              children: [\n                {\n                  attributes: {\n                    clipRule: 'evenodd',\n                    d: 'M8.22048 1.75358C8.1263 1.57738 7.87369 1.57738 7.77951 1.75359L1.69787 13.1321C1.60886 13.2987 1.72953 13.5 1.91835 13.5H14.0816C14.2705 13.5 14.3911 13.2987 14.3021 13.1321L8.22048 1.75358ZM6.45662 1.04652C7.11588 -0.186933 8.88412 -0.186935 9.54338 1.04652L15.625 12.4251C16.2481 13.5908 15.4034 15 14.0816 15H1.91835C0.596554 15 -0.248093 13.5908 0.374974 12.4251L6.45662 1.04652ZM9 11C9 11.5523 8.55229 12 8 12C7.44772 12 7 11.5523 7 11C7 10.4477 7.44772 10 8 10C8.55229 10 9 10.4477 9 11ZM8.75 5.75C8.75 5.33579 8.41421 5 8 5C7.58579 5 7.25 5.33579 7.25 5.75V8.25C7.25 8.66421 7.58579 9 8 9C8.41421 9 8.75 8.66421 8.75 8.25V5.75Z',\n                    fillRule: 'evenodd',\n                  },\n                  children: [],\n                  name: 'path',\n                  type: 'element',\n                  value: '',\n                },\n              ],\n              name: 'svg',\n              type: 'element',\n              value: '',\n            },\n            path: '<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M8.22048 1.75358C8.1263 1.57738 7.87369 1.57738 7.77951 1.75359L1.69787 13.1321C1.60886 13.2987 1.72953 13.5 1.91835 13.5H14.0816C14.2705 13.5 14.3911 13.2987 14.3021 13.1321L8.22048 1.75358ZM6.45662 1.04652C7.11588 -0.186933 8.88412 -0.186935 9.54338 1.04652L15.625 12.4251C16.2481 13.5908 15.4034 15 14.0816 15H1.91835C0.596554 15 -0.248093 13.5908 0.374974 12.4251L6.45662 1.04652ZM9 11C9 11.5523 8.55229 12 8 12C7.44772 12 7 11.5523 7 11C7 10.4477 7.44772 10 8 10C8.55229 10 9 10.4477 9 11ZM8.75 5.75C8.75 5.33579 8.41421 5 8 5C7.58579 5 7.25 5.33579 7.25 5.75V8.25C7.25 8.66421 7.58579 9 8 9C8.41421 9 8.75 8.66421 8.75 8.25V5.75Z\"></path>',\n            width: 16,\n          },\n          24: {\n            ast: {\n              attributes: {\n                height: '24',\n                viewBox: '0 0 24 24',\n                width: '24',\n                xmlns: 'http://www.w3.org/2000/svg',\n              },\n              children: [\n                {\n                  attributes: {\n                    d: 'M13 17.5C13 18.0523 12.5523 18.5 12 18.5C11.4477 18.5 11 18.0523 11 17.5C11 16.9477 11.4477 16.5 12 16.5C12.5523 16.5 13 16.9477 13 17.5Z',\n                  },\n                  children: [],\n                  name: 'path',\n                  type: 'element',\n                  value: '',\n                },\n                {\n                  attributes: {\n                    d: 'M12.75 9.25C12.75 8.83579 12.4142 8.5 12 8.5C11.5858 8.5 11.25 8.83579 11.25 9.25V13.75C11.25 14.1642 11.5858 14.5 12 14.5C12.4142 14.5 12.75 14.1642 12.75 13.75V9.25Z',\n                  },\n                  children: [],\n                  name: 'path',\n                  type: 'element',\n                  value: '',\n                },\n                {\n                  attributes: {\n                    clipRule: 'evenodd',\n                    d: 'M9.83587 3.24404C10.7985 1.57946 13.2015 1.57946 14.1642 3.24404L23.1306 18.7484C24.0944 20.4151 22.8917 22.5 20.9664 22.5H3.03364C1.10834 22.5 -0.0943731 20.4151 0.869482 18.7484L9.83587 3.24404ZM12.8657 3.99498C12.4806 3.32915 11.5194 3.32915 11.1344 3.99498L2.16798 19.4994C1.78244 20.166 2.26352 21 3.03364 21H20.9664C21.7365 21 22.2176 20.166 21.8321 19.4994L12.8657 3.99498Z',\n                    fillRule: 'evenodd',\n                  },\n                  children: [],\n                  name: 'path',\n                  type: 'element',\n                  value: '',\n                },\n              ],\n              name: 'svg',\n              type: 'element',\n              value: '',\n            },\n            path: '<path d=\"M13 17.5C13 18.0523 12.5523 18.5 12 18.5C11.4477 18.5 11 18.0523 11 17.5C11 16.9477 11.4477 16.5 12 16.5C12.5523 16.5 13 16.9477 13 17.5Z\"></path><path d=\"M12.75 9.25C12.75 8.83579 12.4142 8.5 12 8.5C11.5858 8.5 11.25 8.83579 11.25 9.25V13.75C11.25 14.1642 11.5858 14.5 12 14.5C12.4142 14.5 12.75 14.1642 12.75 13.75V9.25Z\"></path><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M9.83587 3.24404C10.7985 1.57946 13.2015 1.57946 14.1642 3.24404L23.1306 18.7484C24.0944 20.4151 22.8917 22.5 20.9664 22.5H3.03364C1.10834 22.5 -0.0943731 20.4151 0.869482 18.7484L9.83587 3.24404ZM12.8657 3.99498C12.4806 3.32915 11.5194 3.32915 11.1344 3.99498L2.16798 19.4994C1.78244 20.166 2.26352 21 3.03364 21H20.9664C21.7365 21 22.2176 20.166 21.8321 19.4994L12.8657 3.99498Z\"></path>',\n            width: 24,\n          },\n        },\n        keywords: [],\n        name: 'icon-a',\n      },\n      'icon-b': {\n        heights: {\n          16: {\n            ast: {\n              attributes: {\n                height: '16',\n                viewBox: '0 0 14 16',\n                width: '14',\n                xmlns: 'http://www.w3.org/2000/svg',\n              },\n              children: [\n                {\n                  attributes: {\n                    d: 'M13 2H1v2h12V2zM0 4a1 1 0 001 1v9a1 1 0 001 1h10a1 1 0 001-1V5a1 1 0 001-1V2a1 1 0 00-1-1H1a1 1 0 00-1 1v2zm2 1h10v9H2V5zm2 3h6V7H4v1z',\n                    fillRule: 'evenodd',\n                  },\n                  children: [],\n                  name: 'path',\n                  type: 'element',\n                  value: '',\n                },\n              ],\n              name: 'svg',\n              type: 'element',\n              value: '',\n            },\n            path: '<path fill-rule=\"evenodd\" d=\"M13 2H1v2h12V2zM0 4a1 1 0 001 1v9a1 1 0 001 1h10a1 1 0 001-1V5a1 1 0 001-1V2a1 1 0 00-1-1H1a1 1 0 00-1 1v2zm2 1h10v9H2V5zm2 3h6V7H4v1z\"></path>',\n            width: 14,\n          },\n        },\n        keywords: [],\n        name: 'icon-b',\n      },\n    }\n"
  }
]