├── .github ├── FUNDING.yml ├── ISSUE_TEMPLATE │ ├── bug_report.yaml │ └── feature_request.yaml └── workflows │ └── codeql-analysis.yml ├── .gitignore ├── CHANGELOG.md ├── CNAME ├── CODE_OF_CONDUCT.md ├── LICENSE ├── README.md ├── _layouts └── default.html ├── ads.txt ├── extension ├── css │ ├── UI.css │ ├── content.css │ ├── themes.css │ └── whats-new.css ├── hotkeys.html ├── images │ └── icons │ │ ├── icon_round_1024.png │ │ ├── icon_round_128.png │ │ ├── icon_round_16.png │ │ ├── icon_round_2048.png │ │ ├── icon_round_256.png │ │ ├── icon_round_32.png │ │ ├── icon_round_384.png │ │ ├── icon_round_48.png │ │ ├── icon_round_512.png │ │ ├── icon_round_64.png │ │ └── icon_round_72.png ├── js │ ├── content.js │ ├── globals.js │ ├── hotkeys.js │ ├── messenger.js │ ├── options.js │ ├── themes.js │ ├── utils.js │ └── whats-new.js ├── manifest.json ├── options.html ├── themes.html └── whats-new.html └── images ├── banners ├── JF_VTuber_logo.png ├── JF_VTuber_logo.svg ├── promo_tile_lg.png ├── promo_tile_marquee.png └── promo_tile_sm.png ├── extension ├── chevron-down-dark.svg ├── chevron-down-light.svg ├── chevron-right-dark.svg ├── chevron-right-light.svg ├── icon.svg ├── icon_1024.png ├── icon_128.png ├── icon_16.png ├── icon_2048.png ├── icon_256.png ├── icon_32.png ├── icon_384.png ├── icon_48.png ├── icon_512.png ├── icon_64.png ├── icon_72.png ├── icon_round.svg ├── icon_round_1024.png ├── icon_round_128.png ├── icon_round_16.png ├── icon_round_2048.png ├── icon_round_256.png ├── icon_round_32.png ├── icon_round_384.png ├── icon_round_48.png ├── icon_round_512.png ├── icon_round_64.png └── icon_round_72.png └── screenshots ├── clickable-links.png ├── different-formatting-modes.png ├── edge ├── clickable-links.png ├── different-formatting-modes.png ├── light-theme.png ├── selecting-theme.png └── themes-preview.png ├── firefox ├── clickable-links.png ├── different-formatting-modes.png ├── light-theme.png ├── selecting-theme.png └── themes-preview.png ├── light-theme.png ├── selecting-theme.png └── themes-preview.png /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | buy_me_a_coffee: arnavkr 2 | patreon: arnavkr 3 | ko_fi: arnav 4 | github: arnav-kr 5 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.yaml: -------------------------------------------------------------------------------- 1 | name: 🐞 Bug report 2 | description: File a bug/issue 3 | title: "Bug: " 4 | labels: bug 5 | 6 | body: 7 | - type: checkboxes 8 | attributes: 9 | label: Is there an existing issue for this? 10 | description: Please search to see if an issue already exists for the bug you encountered. 11 | options: 12 | - label: I have searched the existing issues 13 | required: true 14 | - type: textarea 15 | attributes: 16 | label: Describe the bug 17 | description: A clear and concise description of what you're experiencing. 18 | validations: 19 | required: true 20 | - type: textarea 21 | attributes: 22 | label: Expected Behavior 23 | description: A clear and concise description of what you expected to happen. 24 | validations: 25 | required: false 26 | - type: textarea 27 | attributes: 28 | label: Steps To Reproduce 29 | description: Steps to reproduce the behavior. 30 | placeholder: | 31 | 1. Go to '...' 32 | 2. Click on '....' 33 | 3. Scroll down to '....' 34 | 4. See error 35 | validations: 36 | required: false 37 | - type: textarea 38 | attributes: 39 | label: System Info 40 | description: | 41 | examples: 42 | - **OS**: Windows 11 Version 21H2 (Build 22000.527) 43 | - **Browser**: Google Chrome 99.0.4844.51 (Official Build) (64-bit) (cohort: Stable) 44 | value: | 45 | - OS: 46 | - Browser: 47 | render: markdown 48 | validations: 49 | required: false 50 | - type: textarea 51 | attributes: 52 | label: Additional context? 53 | description: | 54 | Links? References? Anything that will give us more context about the issue you are encountering! 55 | 56 | Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in. 57 | validations: 58 | required: false 59 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.yaml: -------------------------------------------------------------------------------- 1 | name: ✨ Feature request 2 | description: Suggest an feature or idea for the json formatter 3 | title: "Feature Request: " 4 | labels: enhancement 5 | 6 | body: 7 | - type: textarea 8 | attributes: 9 | label: Describe your feature 10 | description: A clear and concise description of your feature. 11 | validations: 12 | required: true 13 | - type: textarea 14 | attributes: 15 | label: Any Solutions You have thought of? 16 | description: If you have a solution in your mind, you can decribe that here. 17 | validations: 18 | required: false 19 | - type: textarea 20 | attributes: 21 | label: Additional context? 22 | description: | 23 | Add any other context or screenshots about the feature request here. 24 | 25 | Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in. 26 | validations: 27 | required: false 28 | -------------------------------------------------------------------------------- /.github/workflows/codeql-analysis.yml: -------------------------------------------------------------------------------- 1 | # For most projects, this workflow file will not need changing; you simply need 2 | # to commit it to your repository. 3 | # 4 | # You may wish to alter this file to override the set of languages analyzed, 5 | # or to provide custom queries or build logic. 6 | # 7 | # ******** NOTE ******** 8 | # We have attempted to detect the languages in your repository. Please check 9 | # the `language` matrix defined below to confirm you have the correct set of 10 | # supported CodeQL languages. 11 | # 12 | name: "CodeQL" 13 | 14 | on: 15 | push: 16 | branches: [ main ] 17 | pull_request: 18 | # The branches below must be a subset of the branches above 19 | branches: [ main ] 20 | schedule: 21 | - cron: '32 5 * * 0' 22 | 23 | jobs: 24 | analyze: 25 | name: Analyze 26 | runs-on: ubuntu-latest 27 | permissions: 28 | actions: read 29 | contents: read 30 | security-events: write 31 | 32 | strategy: 33 | fail-fast: false 34 | matrix: 35 | language: [ 'javascript' ] 36 | # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ] 37 | # Learn more about CodeQL language support at https://git.io/codeql-language-support 38 | 39 | steps: 40 | - name: Checkout repository 41 | uses: actions/checkout@v2 42 | 43 | # Initializes the CodeQL tools for scanning. 44 | - name: Initialize CodeQL 45 | uses: github/codeql-action/init@v1 46 | with: 47 | languages: ${{ matrix.language }} 48 | # If you wish to specify custom queries, you can do so here or in a config file. 49 | # By default, queries listed here will override any specified in a config file. 50 | # Prefix the list here with "+" to use these queries and those in the config file. 51 | # queries: ./path/to/local/query, your-org/your-repo/queries@main 52 | 53 | # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). 54 | # If this step fails, then you should remove it and run the build manually (see below) 55 | - name: Autobuild 56 | uses: github/codeql-action/autobuild@v1 57 | 58 | # ℹ️ Command-line programs to run using the OS shell. 59 | # 📚 https://git.io/JvXDl 60 | 61 | # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines 62 | # and modify them (or add more) to build your code if your project 63 | # uses a compiled language 64 | 65 | #- run: | 66 | # make bootstrap 67 | # make release 68 | 69 | - name: Perform CodeQL Analysis 70 | uses: github/codeql-action/analyze@v1 71 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /example.json 2 | /local/ -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # CHANGELOG V2.1.10 2 | * New option to Enable/Disable Custom Context Menu -------------------------------------------------------------------------------- /CNAME: -------------------------------------------------------------------------------- 1 | json-formatter.js.org 2 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Citizen Code of Conduct 2 | 3 | ## 1. Purpose 4 | 5 | A primary goal of Json Formatter is to be inclusive to the largest number of contributors, with the most varied and diverse backgrounds possible. As such, we are committed to providing a friendly, safe and welcoming environment for all, regardless of gender, sexual orientation, ability, ethnicity, socioeconomic status, and religion (or lack thereof). 6 | 7 | This code of conduct outlines our expectations for all those who participate in our community, as well as the consequences for unacceptable behavior. 8 | 9 | We invite all those who participate in Json Formatter to help us create safe and positive experiences for everyone. 10 | 11 | ## 2. Open [Source/Culture/Tech] Citizenship 12 | 13 | A supplemental goal of this Code of Conduct is to increase open [source/culture/tech] citizenship by encouraging participants to recognize and strengthen the relationships between our actions and their effects on our community. 14 | 15 | Communities mirror the societies in which they exist and positive action is essential to counteract the many forms of inequality and abuses of power that exist in society. 16 | 17 | If you see someone who is making an extra effort to ensure our community is welcoming, friendly, and encourages all participants to contribute to the fullest extent, we want to know. 18 | 19 | ## 3. Expected Behavior 20 | 21 | The following behaviors are expected and requested of all community members: 22 | 23 | * Participate in an authentic and active way. In doing so, you contribute to the health and longevity of this community. 24 | * Exercise consideration and respect in your speech and actions. 25 | * Attempt collaboration before conflict. 26 | * Refrain from demeaning, discriminatory, or harassing behavior and speech. 27 | * Be mindful of your surroundings and of your fellow participants. Alert community leaders if you notice a dangerous situation, someone in distress, or violations of this Code of Conduct, even if they seem inconsequential. 28 | * Remember that community event venues may be shared with members of the public; please be respectful to all patrons of these locations. 29 | 30 | ## 4. Unacceptable Behavior 31 | 32 | The following behaviors are considered harassment and are unacceptable within our community: 33 | 34 | * Violence, threats of violence or violent language directed against another person. 35 | * Sexist, racist, homophobic, transphobic, ableist or otherwise discriminatory jokes and language. 36 | * Posting or displaying sexually explicit or violent material. 37 | * Posting or threatening to post other people's personally identifying information ("doxing"). 38 | * Personal insults, particularly those related to gender, sexual orientation, race, religion, or disability. 39 | * Inappropriate photography or recording. 40 | * Inappropriate physical contact. You should have someone's consent before touching them. 41 | * Unwelcome sexual attention. This includes, sexualized comments or jokes; inappropriate touching, groping, and unwelcomed sexual advances. 42 | * Deliberate intimidation, stalking or following (online or in person). 43 | * Advocating for, or encouraging, any of the above behavior. 44 | * Sustained disruption of community events, including talks and presentations. 45 | 46 | ## 5. Weapons Policy 47 | 48 | No weapons will be allowed at Json Formatter events, community spaces, or in other spaces covered by the scope of this Code of Conduct. Weapons include but are not limited to guns, explosives (including fireworks), and large knives such as those used for hunting or display, as well as any other item used for the purpose of causing injury or harm to others. Anyone seen in possession of one of these items will be asked to leave immediately, and will only be allowed to return without the weapon. Community members are further expected to comply with all state and local laws on this matter. 49 | 50 | ## 6. Consequences of Unacceptable Behavior 51 | 52 | Unacceptable behavior from any community member, including sponsors and those with decision-making authority, will not be tolerated. 53 | 54 | Anyone asked to stop unacceptable behavior is expected to comply immediately. 55 | 56 | If a community member engages in unacceptable behavior, the community organizers may take any action they deem appropriate, up to and including a temporary ban or permanent expulsion from the community without warning (and without refund in the case of a paid event). 57 | 58 | ## 7. Reporting Guidelines 59 | 60 | If you are subject to or witness unacceptable behavior, or have any other concerns, please notify a community organizer as soon as possible. arnav-kumar@outlook.com. 61 | 62 | 63 | 64 | Additionally, community organizers are available to help community members engage with local law enforcement or to otherwise help those experiencing unacceptable behavior feel safe. In the context of in-person events, organizers will also provide escorts as desired by the person experiencing distress. 65 | 66 | ## 8. Addressing Grievances 67 | 68 | If you feel you have been falsely or unfairly accused of violating this Code of Conduct, you should notify with a concise description of your grievance. Your grievance will be handled in accordance with our existing governing policies. 69 | 70 | 71 | 72 | ## 9. Scope 73 | 74 | We expect all community participants (contributors, paid or otherwise; sponsors; and other guests) to abide by this Code of Conduct in all community venues--online and in-person--as well as in all one-on-one communications pertaining to community business. 75 | 76 | This code of conduct and its related procedures also applies to unacceptable behavior occurring outside the scope of community activities when such behavior has the potential to adversely affect the safety and well-being of community members. 77 | 78 | ## 10. Contact info 79 | 80 | arnav-kumar@outlook.com 81 | 82 | ## 11. License and attribution 83 | 84 | The Citizen Code of Conduct is distributed by [Stumptown Syndicate](http://stumptownsyndicate.org) under a [Creative Commons Attribution-ShareAlike license](http://creativecommons.org/licenses/by-sa/3.0/). 85 | 86 | Portions of text derived from the [Django Code of Conduct](https://www.djangoproject.com/conduct/) and the [Geek Feminism Anti-Harassment Policy](http://geekfeminism.wikia.com/wiki/Conference_anti-harassment/Policy). 87 | 88 | _Revision 2.3. Posted 6 March 2017._ 89 | 90 | _Revision 2.2. Posted 4 February 2016._ 91 | 92 | _Revision 2.1. Posted 23 June 2014._ 93 | 94 | _Revision 2.0, adopted by the [Stumptown Syndicate](http://stumptownsyndicate.org) board on 10 January 2013. Posted 17 March 2013._ 95 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Arnav Kumar 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | # JSON Formatter 6 | 7 | ### A Browser Extensions for formating and prettifying JSON but better. 8 | 9 | [![Chrome Web Store Version](https://img.shields.io/chrome-web-store/v/gpmodmeblccallcadopbcoeoejepgpnb?style=flat-square&logo=googlechrome&logoColor=%23fff&label=%20&color=%234285F4&labelColor=%233d3d3d)](https://chrome.google.com/webstore/detail/json-formatter/gpmodmeblccallcadopbcoeoejepgpnb) 10 | [![Chrome Web Store](https://img.shields.io/chrome-web-store/rating/gpmodmeblccallcadopbcoeoejepgpnb?style=flat-square&logo=googlechrome&label=Webstore%20Rating&logoColor=%23fff&color=%234285F4&labelColor=%233d3d3d&link=https%3A%2F%2Fchrome.google.com%2Fwebstore%2Fdetail%2Fjson-formatter%2Fgpmodmeblccallcadopbcoeoejepgpnb)](https://chrome.google.com/webstore/detail/json-formatter/gpmodmeblccallcadopbcoeoejepgpnb) 11 | [![Chrome Web Store Users](https://img.shields.io/chrome-web-store/users/gpmodmeblccallcadopbcoeoejepgpnb?style=flat-square&logo=googlechrome&label=Webstore%20Users&logoColor=%23fff&color=%234285F4&labelColor=%233d3d3d&link=https%3A%2F%2Fchrome.google.com%2Fwebstore%2Fdetail%2Fjson-formatter%2Fgpmodmeblccallcadopbcoeoejepgpnb)](https://chrome.google.com/webstore/detail/json-formatter/gpmodmeblccallcadopbcoeoejepgpnb) 12 | [![GitHub](https://img.shields.io/github/license/arnav-kr/json-formatter?style=flat-square&logo=github&logoColor=white&label=GitHub&labelColor=%233d3d3d&color=%234285F4)](https://github.com/arnav-kr/json-formatter) 13 | 14 | 15 | **[V2.1.10.0 CHANGELOG](CHANGELOG.md)** 16 | 17 | ## Features: 18 | * 60+ Themes for both Light and Dark Mode 19 | * Syntax Highlighting 20 | * Works Offline 21 | * No tracking or analytics 22 | * Word Wrapping and Sorting Order to stay organized 23 | * Works with any JSON Webpage 24 | * Automatically Linkify Links 25 | * Formats JSON automatically 26 | * `Raw`, `Formatted Raw` and `Parsed` Mode 27 | * Collapse/Expand All option 28 | * Remembers Theme Preferences 29 | * Shortcut Keys for ease of use 30 | * Customize Shortcut Keys 31 | * Collapsible Toolbar 32 | 33 | Add to Chrome 34 | 35 | Add to Firefox 36 | 37 | Add to Microsoft Edge 38 | 39 | ### Default Shortcut Keys Reference: 40 | * `P` - Parsed View 41 | * `R` - Raw View 42 | * `Shift + R` - Formatted Raw View 43 | * `D` - Toggle Dark Mode 44 | * `[` - Collapse All 45 | * `]` - Expand All 46 | * `T` - Toggle Toolbar 47 | 48 | Moreover, you can customize these shortcut keys as per your convenience from the extension settings. 49 | 50 | 51 | ## Screenshots: 52 | 53 | ![Selecting Theme](https://github.com/arnav-kr/json-formatter/blob/main/images/screenshots/selecting-theme.png?raw=true) 54 | 55 | ![Clickable Links](https://github.com/arnav-kr/json-formatter/blob/main/images/screenshots/clickable-links.png?raw=true) 56 | 57 | ![Themes Preview](https://github.com/arnav-kr/json-formatter/blob/main/images/screenshots/themes-preview.png?raw=true) 58 | 59 | ![Different Formatting Options](https://github.com/arnav-kr/json-formatter/blob/main/images/screenshots/different-formatting-modes.png?raw=true) 60 | 61 | ![Light Theme](https://github.com/arnav-kr/json-formatter/blob/main/images/screenshots/light-theme.png?raw=true) 62 | 63 | ## Installation 64 | 65 | **Method 1** - Install JSON Formatter from [Chrome Web Store](https://chrome.google.com/webstore/detail/json-formatter/gpmodmeblccallcadopbcoeoejepgpnb) 66 | 67 | **Method 2** - Install It locally 68 | * clone/download this repo, 69 | * open Chrome and go to chrome://chrome/extensions/, 70 | * enable "Developer mode", 71 | * click "Load unpacked extension", 72 | * select the extension folder in this repo. 73 | 74 | ### Credits 75 | 76 | * [Arnav](https://github.com/arnav-kr) 77 | * Extracts from [pgrabovets/json-view](https://github.com/pgrabovets/json-view) 78 | 79 | ### License: 80 | 81 | [MIT Licence](LICENSE) 82 | 83 | -------------------------------------------------------------------------------- /_layouts/default.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 20 | 21 | 22 | JSON Formatter - Beautify Your JSON Code in the Browser 23 | 24 | 26 | 28 | 29 | 30 | 151 | 152 | 153 | 154 | 155 | 156 | 158 | 160 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 173 | 175 | 176 | 177 | 179 | 181 | 183 | 184 | 185 | {% include head-custom.html %} 186 | 187 | 189 | 190 | 191 | 192 |
193 | 194 | 195 | {{ content }} 196 | 202 |
203 | 205 | 206 | 207 | 208 | 209 | -------------------------------------------------------------------------------- /ads.txt: -------------------------------------------------------------------------------- 1 | google.com, pub-6290792326682212, DIRECT, f08c47fec0942fa0 2 | -------------------------------------------------------------------------------- /extension/css/UI.css: -------------------------------------------------------------------------------- 1 | :root { 2 | min-width: 428px; 3 | min-height: 400px; 4 | } 5 | 6 | ::-webkit-scrollbar { 7 | display: none; 8 | } 9 | 10 | * { 11 | box-sizing: border-box; 12 | } 13 | 14 | h1, 15 | h2, 16 | h3, 17 | h4, 18 | h5, 19 | h6 { 20 | font-weight: 500; 21 | } 22 | 23 | body { 24 | background-color: #f8f9fa; 25 | color: #202124; 26 | font-family: Roboto, "Segoe UI", Tahoma, sans-serif; 27 | font-size: 14px; 28 | padding: 16px; 29 | margin: 0; 30 | display: flex; 31 | justify-content: center; 32 | user-select: none; 33 | -webkit-user-select: none; 34 | } 35 | 36 | #header, 37 | .title { 38 | color: #202124; 39 | font-size: 108%; 40 | font-weight: 400; 41 | letter-spacing: 0.25px; 42 | margin-bottom: 12px; 43 | margin-top: 0px; 44 | outline: none; 45 | padding-bottom: 4px; 46 | padding-top: 8px; 47 | max-width: 680px; 48 | box-sizing: border-box; 49 | margin-left: 4px; 50 | display: flex; 51 | align-items: center; 52 | gap: 4px; 53 | } 54 | 55 | #header { 56 | justify-content: space-between; 57 | } 58 | 59 | .root { 60 | width: 100%; 61 | height: 100%; 62 | max-width: 680px; 63 | } 64 | 65 | div.container { 66 | background-color: #ffffff; 67 | display: flex; 68 | flex-direction: column; 69 | height: 100%; 70 | width: inherit; 71 | border-radius: 4px; 72 | overflow: hidden; 73 | max-width: 680px; 74 | min-width: 380px; 75 | box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12), 76 | 0 3px 1px -2px rgba(0, 0, 0, 0.2); 77 | } 78 | 79 | div.item { 80 | padding: 0 20px; 81 | color: #202124; 82 | background-color: #ffffff; 83 | user-select: none; 84 | -webkit-user-select: none; 85 | } 86 | 87 | .hotkeys .item:not(.item-end) { 88 | padding-right: 8px; 89 | cursor: pointer; 90 | } 91 | 92 | div.icon-actions { 93 | display: flex; 94 | gap: 8px; 95 | margin-right: 4px; 96 | } 97 | 98 | div.item.clickable:hover { 99 | background-color: rgba(32, 33, 36, 0.1); 100 | } 101 | 102 | div.item.clickable>a:focus-visible { 103 | box-shadow: none; 104 | outline: none; 105 | } 106 | 107 | div.item.clickable:focus-within { 108 | background-color: rgba(32, 33, 36, 0.1); 109 | } 110 | 111 | a, 112 | a:link, 113 | a:visited { 114 | color: inherit; 115 | text-decoration: none; 116 | } 117 | 118 | div.item-inner { 119 | padding: 12px 0; 120 | min-height: 56px; 121 | width: 100%; 122 | display: flex; 123 | gap: 16px; 124 | align-items: center; 125 | justify-content: space-between; 126 | vertical-align: middle; 127 | } 128 | 129 | .hotkeys div.item-inner { 130 | padding: 8px 0; 131 | min-height: auto; 132 | } 133 | 134 | div.item-control { 135 | display: flex; 136 | align-items: center; 137 | gap: 8px; 138 | } 139 | 140 | 141 | .icon-button { 142 | border-radius: 50%; 143 | display: flex; 144 | align-items: center; 145 | justify-content: center; 146 | width: 32px; 147 | height: 32px; 148 | border: 0; 149 | background-color: transparent; 150 | transition: 150ms ease; 151 | cursor: pointer; 152 | } 153 | 154 | .icon-button:hover { 155 | background-color: rgba(32, 33, 36, 0.1); 156 | } 157 | 158 | .icon-button:active { 159 | background-color: rgba(32, 33, 36, 0.2); 160 | } 161 | 162 | .cr-icon-button { 163 | appearance: none; 164 | background-color: transparent; 165 | border: none; 166 | cursor: pointer; 167 | color: #292a2d; 168 | display: flex; 169 | justify-content: center; 170 | align-items: center; 171 | padding: 2px; 172 | border-radius: 4px; 173 | transition: background-color 0.2s; 174 | } 175 | 176 | .cr-icon-button:hover { 177 | background-color: rgba(0, 0, 0, 0.08); 178 | } 179 | 180 | .item-action { 181 | visibility: hidden; 182 | } 183 | 184 | .header-note { 185 | font-size: 0.8rem; 186 | display: block; 187 | color: #5f6368; 188 | margin-bottom: 6px; 189 | padding: 0 4px; 190 | } 191 | 192 | div.item:hover .item-action { 193 | visibility: visible; 194 | } 195 | 196 | .item-end { 197 | margin-bottom: 12px; 198 | } 199 | 200 | .icon { 201 | fill: rgb(95, 99, 104); 202 | } 203 | 204 | .hr { 205 | border-top: 1px solid rgba(0, 0, 0, 0.06); 206 | } 207 | 208 | .md-select { 209 | align-items: center; 210 | appearance: none; 211 | background-attachment: scroll; 212 | background-clip: border-box; 213 | -webkit-background-clip: border-box; 214 | background-color: rgb(241, 243, 244); 215 | background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIxMiIgZmlsbD0iIzVGNjM2OCI+PHBhdGggZD0iTTAgMGgyNEwxMiAxMnoiLz48L3N2Zz4=); 216 | background-origin: padding-box; 217 | background-position: calc(100% - 8px) 50%; 218 | background-repeat: no-repeat; 219 | background-size: 10px; 220 | border-color: rgb(32, 33, 36); 221 | border-radius: 4px; 222 | border-style: none; 223 | border-width: 0; 224 | box-sizing: border-box; 225 | color: rgb(32, 33, 36); 226 | cursor: pointer; 227 | display: block; 228 | font-family: Roboto, "Segoe UI", Tahoma, sans-serif; 229 | font-size: 13px; 230 | font-stretch: 100%; 231 | font-style: normal; 232 | font-weight: 400; 233 | height: 32.0104px; 234 | letter-spacing: normal; 235 | line-height: 20.02px; 236 | margin-bottom: 0; 237 | max-width: 100%; 238 | outline-color: rgb(32, 33, 36); 239 | outline-style: none; 240 | outline-width: 0px; 241 | overflow-x: visible; 242 | overflow-y: visible; 243 | padding-bottom: 6px; 244 | padding-inline-end: 21px; 245 | padding-inline-start: 8px; 246 | padding-top: 6px; 247 | text-align: start; 248 | text-indent: 0px; 249 | text-rendering: auto; 250 | text-shadow: none; 251 | text-transform: none; 252 | user-select: text; 253 | -webkit-user-select: text; 254 | visibility: visible; 255 | white-space: pre; 256 | width: 200px; 257 | word-spacing: 0px; 258 | writing-mode: horizontal-tb; 259 | -webkit-rtl-ordering: logical; 260 | border-image: none; 261 | -webkit-border-image: none; 262 | } 263 | 264 | .cr-button { 265 | text-size-adjust: 100%; 266 | visibility: visible; 267 | position: relative; 268 | display: inline-flex; 269 | align-items: center; 270 | justify-content: center; 271 | box-sizing: border-box; 272 | min-width: 64px; 273 | border: none; 274 | outline: none; 275 | line-height: inherit; 276 | user-select: none; 277 | -webkit-user-select: none; 278 | appearance: none; 279 | -webkit-appearance: none; 280 | overflow: visible; 281 | vertical-align: middle; 282 | -webkit-font-smoothing: antialiased; 283 | text-decoration: none; 284 | -webkit-tap-highlight-color: rgba(0, 0, 0, 0); 285 | will-change: transform, opacity; 286 | height: 36px; 287 | border-radius: 4px; 288 | font-family: "Google Sans", Roboto, Arial, sans-serif; 289 | font-size: 0.875rem; 290 | letter-spacing: 0.0107142857em; 291 | font-weight: 500; 292 | text-transform: none; 293 | transition: 280ms cubic-bezier(0.4, 0, 0.2, 1); 294 | box-shadow: none; 295 | padding: 0 12px 0 12px; 296 | background-color: #1a73e8; 297 | color: #fff; 298 | cursor: pointer; 299 | } 300 | 301 | .cr-button:disabled { 302 | opacity: 0.38; 303 | cursor: default; 304 | } 305 | 306 | .cr-button:disabled:hover { 307 | background-color: #1a73e8; 308 | } 309 | 310 | .cr-button-icon { 311 | fill: #ffffff; 312 | } 313 | 314 | .cr-button:hover { 315 | background-color: #0a65db; 316 | } 317 | 318 | .cr-button:active { 319 | background-color: #0157c7; 320 | } 321 | 322 | .cr-button:focus-visible { 323 | box-shadow: 0 0 0 2px #000000; 324 | } 325 | 326 | .md-select:focus { 327 | box-shadow: 0 0 0 2px rgba(26, 115, 232, 0.4); 328 | } 329 | 330 | .md-select:active { 331 | box-shadow: none; 332 | } 333 | 334 | .kbd-wrapper { 335 | display: flex; 336 | gap: 4px; 337 | } 338 | 339 | kbd { 340 | font-size: 0.8rem; 341 | font-weight: 500; 342 | display: block; 343 | background-color: #f1f3f4; 344 | box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2); 345 | border: 1px solid rgba(0, 0, 0, 0.2); 346 | padding: 2px 6px; 347 | margin-bottom: 1px; 348 | border-radius: 4px; 349 | } 350 | 351 | .modal { 352 | position: fixed; 353 | top: 0; 354 | left: 0; 355 | right: 0; 356 | bottom: 0; 357 | background-color: rgba(0, 0, 0, 0.5); 358 | display: none; 359 | justify-content: center; 360 | align-items: center; 361 | z-index: 1000; 362 | } 363 | 364 | .modal-box { 365 | background-color: #ffffff; 366 | color: #202124; 367 | border-radius: 4px; 368 | box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12), 369 | 0 3px 1px -2px rgba(0, 0, 0, 0.2); 370 | padding: 16px; 371 | max-width: 400px; 372 | width: 100%; 373 | margin: 0 16px; 374 | display: flex; 375 | flex-direction: column; 376 | align-items: center; 377 | gap: 12px; 378 | } 379 | 380 | .modal-box p { 381 | margin: 0; 382 | text-align: center; 383 | } 384 | 385 | .modal-input { 386 | border: 1px solid #dadce0; 387 | background-color: #f1f3f4; 388 | border-radius: 4px; 389 | padding: 8px; 390 | width: 100%; 391 | font-size: 14px; 392 | transition: border-color 0.2s; 393 | text-align: center; 394 | } 395 | 396 | .modal-input:focus-visible { 397 | box-shadow: 0 0 0 2px #1a73e8; 398 | outline: none; 399 | } 400 | 401 | .modal-info { 402 | display: flex; 403 | gap: 4px; 404 | align-items: center; 405 | flex-direction: row-reverse; 406 | vertical-align: middle; 407 | color: #d93025; 408 | } 409 | 410 | .modal-note:empty+svg { 411 | display: none; 412 | } 413 | 414 | .modal-info svg { 415 | margin-top: 1px; 416 | } 417 | 418 | @media (prefers-color-scheme: dark) { 419 | .md-select { 420 | background-color: rgba(0, 0, 0, 0.3); 421 | background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIxMiIgZmlsbD0iIzlhYTBhNiI+PHBhdGggZD0iTTAgMGgyNEwxMiAxMnoiLz48L3N2Zz4=); 422 | border-color: rgb(232, 234, 237); 423 | color: rgb(232, 234, 237); 424 | outline-color: rgb(232, 234, 237); 425 | } 426 | 427 | .modal-box { 428 | color: rgb(232, 234, 237); 429 | background-color: #292a2d; 430 | } 431 | 432 | .modal-input { 433 | background-color: #202124; 434 | border-color: #292a2d; 435 | color: rgb(232, 234, 237); 436 | } 437 | 438 | .cr-icon-button { 439 | color: #f8f9fa; 440 | } 441 | 442 | .header-note { 443 | color: #9ea0a5; 444 | } 445 | 446 | .cr-icon-button:hover { 447 | background-color: rgba(255, 255, 255, 0.1); 448 | } 449 | 450 | body { 451 | background-color: #202124; 452 | color: rgb(232, 234, 237); 453 | } 454 | 455 | div.container { 456 | background-color: #292a2d; 457 | box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12), 458 | 0 3px 1px -2px rgba(0, 0, 0, 0.2); 459 | } 460 | 461 | #header, 462 | .title { 463 | color: rgb(232, 234, 237); 464 | } 465 | 466 | .hr { 467 | border-top: 1px solid rgba(255, 255, 255, 0.1); 468 | } 469 | 470 | div.item { 471 | padding: 0 20px; 472 | color: #e8eaed; 473 | background-color: #292a2d; 474 | } 475 | 476 | .icon { 477 | fill: rgb(154, 160, 166); 478 | } 479 | 480 | div.item.clickable:hover { 481 | background-color: rgba(255, 255, 255, 0.1); 482 | } 483 | 484 | div.item.clickable>a:focus-visible { 485 | box-shadow: none; 486 | outline: none; 487 | } 488 | 489 | div.item.clickable:focus-within { 490 | background-color: rgba(255, 255, 255, 0.1); 491 | } 492 | 493 | .cr-button:focus-visible { 494 | box-shadow: 0 0 0 2px #ffffff; 495 | } 496 | 497 | .md-select:focus { 498 | box-shadow: 0 0 0 2px rgba(138, 180, 248, 0.5); 499 | } 500 | 501 | .md-select option { 502 | background-color: #202124; 503 | } 504 | 505 | kbd { 506 | background-color: #202124; 507 | color: rgb(232, 234, 237); 508 | border: 1px solid rgba(255, 255, 255, 0.1); 509 | box-shadow: 0 1px 0 rgba(255, 255, 255, 0.1); 510 | } 511 | 512 | .modal-info { 513 | color: #ff8385; 514 | } 515 | } 516 | 517 | .hidden { 518 | display: none; 519 | } -------------------------------------------------------------------------------- /extension/css/content.css: -------------------------------------------------------------------------------- 1 | .JF_json-container { 2 | font-family: Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace; 3 | font-size: 13px; 4 | /* background-color: #fff; */ 5 | /* color: #808080; */ 6 | box-sizing: border-box; 7 | padding: 4px; 8 | overflow: auto; 9 | width: 100%; 10 | height: 100%; 11 | } 12 | 13 | .JF_json-container .line { 14 | margin: 4px 0; 15 | display: flex; 16 | justify-content: flex-start; 17 | } 18 | 19 | .JF_json-container .caret-icon { 20 | width: 18px; 21 | text-align: center; 22 | cursor: pointer; 23 | display: inline-flex; 24 | align-items: center; 25 | justify-content: center; 26 | } 27 | 28 | .JF_json-container .empty-icon { 29 | width: 18px; 30 | min-width: 18px; 31 | } 32 | 33 | .JF_json-container .json-type { 34 | margin-right: 4px; 35 | margin-left: 4px; 36 | } 37 | 38 | .JF_json-container .json-key { 39 | /* color: #444; */ 40 | flex-shrink: 0; 41 | margin-right: 4px; 42 | margin-left: 4px; 43 | white-space: pre; 44 | } 45 | 46 | .JF_json-container .json-index { 47 | margin-right: 4px; 48 | margin-left: 4px; 49 | } 50 | 51 | .JF_json-container .json-value { 52 | margin-left: 8px; 53 | white-space: pre; 54 | } 55 | 56 | .JF_json-container .json-number { 57 | /* color: #f9ae58; */ 58 | } 59 | 60 | .JF_json-container .json-boolean { 61 | /* color: #ec5f66; */ 62 | } 63 | 64 | .JF_json-container .json-string { 65 | /* color: #86b25c; */ 66 | } 67 | 68 | .JF_json-container .json-size { 69 | margin-right: 4px; 70 | margin-left: 4px; 71 | } 72 | 73 | .JF_json-container .hide { 74 | display: none; 75 | } 76 | 77 | .JF_json-container .codicon-chevron-down { 78 | width: 18px; 79 | height: 18px; 80 | /* background: #808080; */ 81 | -webkit-clip-path: url(#chevron-down); 82 | clip-path: url(#chevron-down); 83 | } 84 | 85 | .JF_json-container .codicon-chevron-right { 86 | width: 18px; 87 | height: 18px; 88 | /* background: #808080; */ 89 | -webkit-clip-path: url(#chevron-right); 90 | clip-path: url(#chevron-right); 91 | } 92 | 93 | body.JF_.JF_dark { 94 | /* background-color: #1e1e1e; */ 95 | } 96 | 97 | .JF_json-container.JF_dark { 98 | font-family: Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace; 99 | /* background-color: #1e1e1e; */ 100 | /* color: #d4d4d4; */ 101 | box-sizing: border-box; 102 | } 103 | 104 | .JF_json-container.JF_dark .line { 105 | margin: 4px 0; 106 | display: flex; 107 | justify-content: flex-start; 108 | } 109 | 110 | .JF_json-container.JF_dark .caret-icon { 111 | width: 18px; 112 | text-align: center; 113 | cursor: pointer; 114 | display: inline-flex; 115 | align-items: center; 116 | justify-content: center; 117 | } 118 | 119 | .JF_json-container.JF_dark .empty-icon { 120 | width: 18px; 121 | min-width: 18px; 122 | } 123 | 124 | .JF_json-container.JF_dark .json-type { 125 | margin-right: 4px; 126 | margin-left: 4px; 127 | } 128 | 129 | .JF_json-container.JF_dark .json-key { 130 | /* color: #9cdcfe; */ 131 | flex-shrink: 0; 132 | margin-right: 4px; 133 | margin-left: 4px; 134 | } 135 | 136 | .JF_json-container.JF_dark .json-index { 137 | margin-right: 4px; 138 | margin-left: 4px; 139 | } 140 | 141 | .JF_json-container.JF_dark .json-value { 142 | margin-left: 8px; 143 | } 144 | 145 | .JF_json-container.JF_dark .json-number { 146 | /* color: #b5cea8; */ 147 | } 148 | 149 | .JF_json-container.JF_dark .json-boolean { 150 | /* color: #569cd6; */ 151 | } 152 | 153 | .JF_json-container.JF_dark .json-string { 154 | /* color: #ce9178; */ 155 | } 156 | 157 | .JF_json-container.JF_dark .json-size { 158 | margin-right: 4px; 159 | margin-left: 4px; 160 | } 161 | 162 | .JF_json-container.JF_dark .hide { 163 | display: none; 164 | } 165 | 166 | .JF_json-container.JF_dark .codicon-chevron-down { 167 | width: 18px; 168 | height: 18px; 169 | /* background: #d4d4d4; */ 170 | -webkit-clip-path: url(#chevron-down); 171 | clip-path: url(#chevron-down); 172 | } 173 | 174 | .JF_json-container.JF_dark .codicon-chevron-right { 175 | width: 18px; 176 | height: 18px; 177 | /* background: #d4d4d4; */ 178 | -webkit-clip-path: url(#chevron-right); 179 | clip-path: url(#chevron-right); 180 | } 181 | 182 | /* body.JF_ { 183 | margin: 0; 184 | } */ 185 | 186 | .JF_raw { 187 | padding: 8px; 188 | overflow: auto; 189 | width: auto; 190 | box-sizing: border-box; 191 | margin: 0; 192 | width: 100%; 193 | height: 100%; 194 | position: fixed; 195 | top: 0; 196 | left: 0; 197 | bottom: 0; 198 | right: 0; 199 | } 200 | 201 | .JF_parsed { 202 | width: 100%; 203 | height: 100%; 204 | position: fixed; 205 | top: 0; 206 | left: 0; 207 | bottom: 0; 208 | right: 0; 209 | } 210 | 211 | .JF_raw.JF_dark { 212 | /* background-color: rgb(30, 30, 30); */ 213 | /* color: #d4d4d4; */ 214 | } 215 | 216 | .JF_button-wrapper { 217 | display: inline-flex; 218 | align-items: center; 219 | justify-content: center; 220 | } 221 | 222 | .JF_button-wrapper > button:first-child { 223 | border-radius: 4px 0 0 4px; 224 | left: 1px; 225 | } 226 | 227 | .JF_button-wrapper > button:nth-child(2) { 228 | border-radius: 0; 229 | border-width: 0 1px; 230 | border-style: solid; 231 | border-color: #dadce0; 232 | margin: 0; 233 | } 234 | 235 | .JF_button-wrapper > button:last-child { 236 | border-radius: 0 4px 4px 0; 237 | } 238 | 239 | .JF_actions { 240 | position: fixed; 241 | right: 24px; 242 | top: 16px; 243 | display: inline-flex; 244 | z-index: 10; 245 | } 246 | 247 | .JF_cr-button { 248 | text-size-adjust: 100%; 249 | visibility: visible; 250 | position: relative; 251 | display: inline-flex; 252 | align-items: center; 253 | justify-content: center; 254 | box-sizing: border-box; 255 | min-width: 64px; 256 | border: none; 257 | outline: none; 258 | line-height: inherit; 259 | -webkit-user-select: none; 260 | -webkit-appearance: none; 261 | overflow: visible; 262 | vertical-align: middle; 263 | -webkit-font-smoothing: antialiased; 264 | text-decoration: none; 265 | -webkit-tap-highlight-color: rgba(0, 0, 0, 0); 266 | will-change: transform, opacity; 267 | height: 36px; 268 | border-radius: 4px; 269 | font-family: "Google Sans", Roboto, Arial, sans-serif; 270 | font-size: 0.875rem; 271 | letter-spacing: 0.0107142857em; 272 | font-weight: 500; 273 | text-transform: none; 274 | transition: 280ms cubic-bezier(0.4, 0, 0.2, 1); 275 | box-shadow: none; 276 | padding: 0 12px 0 12px; 277 | background-color: #f1f3f4; 278 | color: rgb(30, 30, 30); 279 | cursor: pointer; 280 | } 281 | 282 | .JF_toggle_dark { 283 | padding: 0; 284 | border-radius: 50%; 285 | min-width: 36px; 286 | width: 36px; 287 | height: 36px; 288 | margin-right: 8px; 289 | } 290 | 291 | .JF_toggle_toolbar { 292 | padding: 0; 293 | border-radius: 50%; 294 | min-width: 36px; 295 | width: 36px; 296 | height: 36px; 297 | margin-left: 8px; 298 | opacity: 0.7; 299 | z-index: 3; 300 | } 301 | 302 | .JF_toggle_toolbar:hover { 303 | opacity: 1; 304 | } 305 | 306 | .JF_toggle_dark:hover img { 307 | filter: invert(20%); 308 | } 309 | 310 | .JF_cr-button:hover { 311 | background-color: #e5e7e8; 312 | } 313 | 314 | .JF_cr-button:active { 315 | background-color: #dadce0; 316 | } 317 | 318 | .JF_cr-button.active { 319 | background-color: #1a73e8 !important; 320 | color: #fff !important; 321 | } 322 | 323 | .JF_linkify-link { 324 | text-decoration: none; 325 | color: inherit; 326 | } 327 | 328 | .JF_linkify-link:hover { 329 | text-decoration: underline; 330 | } 331 | 332 | .JF_json_toolbar { 333 | display: inline-flex; 334 | transition: opacity 0.2s ease; 335 | } 336 | 337 | .JF_word-wrap { 338 | /* enable wrapping like in vs code, break anywhere */ 339 | white-space: pre-wrap !important; 340 | word-break: break-word !important; 341 | word-wrap: break-word !important; 342 | } 343 | 344 | .JF_invisible-toolbar { 345 | opacity: 0; 346 | } 347 | 348 | .JF_hidden-toolbar { 349 | pointer-events: none; 350 | display: none; 351 | } 352 | 353 | .JF_context_menu { 354 | background-color: #fff !important; 355 | padding: 6px 0; 356 | color: #202124; 357 | font-size: 0.8rem; 358 | position: fixed; 359 | visibility: hidden; 360 | left: -9999px; 361 | top: -9999px; 362 | appearance: none; 363 | border: none; 364 | background: none; 365 | z-index: 100; 366 | border-radius: 8px; 367 | box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.12), 0 12px 24px 0 rgba(0, 0, 0, 0.24); 368 | } 369 | 370 | body.JF_dark .JF_context_menu { 371 | background-color: #202124 !important; 372 | color: rgb(232, 234, 237); 373 | box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.12), 374 | 0 19px 38px 0 rgba(0, 0, 0, 0.24); 375 | } 376 | 377 | .JF_context_menu .JF_context_menu_item { 378 | display: flex; 379 | align-items: center; 380 | gap: 8px; 381 | padding: 8px 24px; 382 | cursor: pointer; 383 | transition: background-color 100ms ease; 384 | font-family: Roboto, "Segoe UI", Tahoma, sans-serif; 385 | } 386 | 387 | .JF_context_menu .JF_context_menu_item:hover { 388 | background-color: #f1f3f4; 389 | } 390 | 391 | body.JF_dark #JF_context_menu .JF_context_menu_item:hover { 392 | background-color: #2d2f31; 393 | } 394 | 395 | .JF_context_menu .JF_context_menu_item .JF_context_menu_item_shortcut { 396 | display: inline-flex; 397 | gap: 4px; 398 | } 399 | 400 | .JF_context_menu .JF_context_menu_item kbd { 401 | font-size: 0.7rem; 402 | font-weight: 500; 403 | display: block; 404 | background-color: #f1f3f4; 405 | box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2); 406 | border: 1px solid rgba(0, 0, 0, 0.2); 407 | padding: 2px 6px; 408 | margin-bottom: 1px; 409 | border-radius: 4px; 410 | } 411 | 412 | /* .JF_context_menu .JF_context_menu_item kbd { 413 | font-size: 0.7rem; 414 | background-color: #f1f3f4; 415 | box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2); 416 | border: 1px solid rgba(0, 0, 0, 0.2); 417 | padding: 2px 6px; 418 | border-radius: 4px; 419 | margin-left: 8px; 420 | font-family: Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace; 421 | } */ 422 | 423 | body.JF_dark #JF_context_menu .JF_context_menu_item kbd { 424 | background-color: #202124; 425 | color: rgb(232, 234, 237); 426 | border: 1px solid rgba(255, 255, 255, 0.1); 427 | box-shadow: 0 1px 0 rgba(255, 255, 255, 0.1); 428 | } 429 | 430 | /* Disable what's new popup */ 431 | /* #JF_whats_new { 432 | position: fixed; 433 | width: 460px; 434 | height: 250px; 435 | right: 24px; 436 | top: 64px; 437 | appearance: none; 438 | border: none; 439 | background: none; 440 | z-index: 100; 441 | border-radius: 8px; 442 | box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.12), 0 19px 38px 0 rgba(0, 0, 0, 0.24); 443 | } 444 | 445 | body.JF_dark #JF_whats_new { 446 | box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.12), 447 | 0 19px 38px 0 rgba(0, 0, 0, 0.24); 448 | } */ 449 | -------------------------------------------------------------------------------- /extension/css/themes.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --background: #1e1e1e; 3 | --textPrimary: #d4d4d4; 4 | --textSecondary: #d4d4d4; 5 | --key: #9cdcfe; 6 | --numberValue: #b5cea8; 7 | --booleanValue: #569cd6; 8 | --stringValue: #ce9178; 9 | --icons: #d4d4d4; 10 | } 11 | 12 | div.container { 13 | min-width: 380px; 14 | } 15 | 16 | .item { 17 | cursor: default; 18 | } 19 | 20 | .item-inner label { 21 | line-height: 18px; 22 | } 23 | 24 | 25 | .icon-button:focus-visible { 26 | box-shadow: 0 0 0 2px #000000; 27 | outline: none; 28 | } 29 | 30 | /* .button-danger svg {} */ 31 | 32 | .button-danger:hover svg path { 33 | fill: #f44336; 34 | } 35 | 36 | .button-danger:hover { 37 | background-color: rgba(244, 67, 54, 0.1) !important; 38 | } 39 | 40 | .button-danger:active { 41 | background-color: rgba(244, 67, 54, 0.2) !important; 42 | } 43 | 44 | .color_badge { 45 | display: inline-flex; 46 | color: white; 47 | font-size: 10px; 48 | font-weight: 500; 49 | padding: 4px 8px; 50 | border-radius: 16px; 51 | margin-left: 4px; 52 | text-transform: uppercase; 53 | background-color: #1a73e8; 54 | margin-block-start: 4px; 55 | } 56 | 57 | .default_badge { 58 | background-color: #5f6368 !important; 59 | } 60 | 61 | .code-preview { 62 | font-family: "Consolas", Monaco, "Andale Mono", "Ubuntu Mono", monospace; 63 | font-weight: normal; 64 | font-size: 13px; 65 | box-sizing: border-box; 66 | overflow: auto; 67 | font-feature-settings: "liga" 0, "calt" 0; 68 | background-color: var(--background); 69 | color: var(--textPrimary); 70 | border-radius: 8px; 71 | padding: 16px; 72 | margin-bottom: 16px; 73 | } 74 | 75 | .caret-icon { 76 | width: 18px; 77 | text-align: center; 78 | cursor: default; 79 | display: inline-flex; 80 | align-items: center; 81 | justify-content: center; 82 | } 83 | 84 | .empty-icon { 85 | width: 18px; 86 | } 87 | 88 | .line { 89 | margin: 4px 0; 90 | display: flex; 91 | justify-content: flex-start; 92 | } 93 | 94 | .sp-sm { 95 | margin-left: 18px; 96 | } 97 | 98 | .sp-lg { 99 | margin-left: 36px; 100 | } 101 | 102 | .json-type { 103 | margin-right: 4px; 104 | margin-left: 4px; 105 | } 106 | 107 | .json-key { 108 | color: var(--key); 109 | flex-shrink: 0; 110 | margin-right: 4px; 111 | margin-left: 4px; 112 | } 113 | 114 | .json-value { 115 | margin-left: 8px; 116 | } 117 | 118 | .json-number { 119 | color: var(--numberValue); 120 | } 121 | 122 | .json-boolean { 123 | color: var(--booleanValue); 124 | } 125 | 126 | .json-string { 127 | color: var(--stringValue); 128 | } 129 | 130 | .json-size { 131 | margin-right: 4px; 132 | margin-left: 4px; 133 | color: var(--textSecondary); 134 | } 135 | 136 | .json-separator { 137 | color: var(--textSecondary); 138 | } 139 | 140 | .json-index { 141 | margin-right: 4px; 142 | margin-left: 4px; 143 | } 144 | 145 | .chevron-down { 146 | width: 18px; 147 | height: 18px; 148 | background: var(--icons); 149 | clip-path: url("#chevron-down"); 150 | } 151 | 152 | .chevron-right { 153 | width: 18px; 154 | height: 18px; 155 | background: var(--icons); 156 | clip-path: url("#chevron-right"); 157 | } 158 | 159 | .icon-defs { 160 | position: fixed; 161 | left: -9999999999px; 162 | top: -9999999999px; 163 | } 164 | 165 | @media (prefers-color-scheme: dark) { 166 | .icon-button:hover { 167 | background-color: rgba(255, 255, 255, 0.1); 168 | } 169 | 170 | .icon-button:active { 171 | background-color: rgba(255, 255, 255, 0.2); 172 | } 173 | 174 | .icon-button:focus-visible { 175 | box-shadow: 0 0 0 2px #ffffff; 176 | outline: none; 177 | } 178 | 179 | .default_badge { 180 | background-color: #575961 !important; 181 | } 182 | } 183 | -------------------------------------------------------------------------------- /extension/css/whats-new.css: -------------------------------------------------------------------------------- 1 | :root { 2 | position: fixed; 3 | min-height: unset !important; 4 | } 5 | 6 | .container { 7 | min-width: 200px !important; 8 | max-width: 480px !important; 9 | } 10 | 11 | p { 12 | font-size: medium; 13 | } 14 | 15 | .link { 16 | color: #0a65db !important; 17 | font-weight: 500; 18 | } 19 | 20 | .link:hover { 21 | text-decoration: underline; 22 | } 23 | 24 | h2 { 25 | margin-top: 0px; 26 | } 27 | 28 | p:last-child { 29 | margin-bottom: 0px; 30 | } 31 | 32 | .close-button { 33 | position: fixed; 34 | top: 0; 35 | right: 0; 36 | display: inline-flex; 37 | align-items: center; 38 | justify-content: center; 39 | border: none; 40 | border-radius: 0 0 0 8px; 41 | padding: 8px; 42 | background: #fff; 43 | color: rgb(95, 99, 104); 44 | cursor: pointer; 45 | box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1); 46 | transition: all 150ms ease-in-out; 47 | } 48 | 49 | .close-button:hover { 50 | background-color: #f5f5f5; 51 | } 52 | 53 | .close-button:active { 54 | background-color: #e5e5e5; 55 | } 56 | 57 | body.dark { 58 | background-color: #202124; 59 | color: rgb(232, 234, 237); 60 | } 61 | 62 | body.dark .close-button { 63 | background-color: #2f3136; 64 | color: rgb(232, 234, 237); 65 | box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.1); 66 | } 67 | 68 | body.dark .close-button:hover { 69 | background-color: rgba(255, 255, 255, 0.12); 70 | } 71 | 72 | body.dark .close-button:active { 73 | background-color: rgba(255, 255, 255, 0.24); 74 | } 75 | 76 | body.dark .cr-button:focus-visible { 77 | box-shadow: 0 0 0 2px #ffffff; 78 | } 79 | 80 | body.dark .link { 81 | color: #4a96f9 !important; 82 | } 83 | 84 | /* only dark when prefer dark and body has dark class */ 85 | @media (prefers-color-scheme: dark) { 86 | body { 87 | background-color: #f8f9fa; 88 | color: #202124; 89 | } 90 | 91 | body.auto { 92 | background-color: #202124 !important; 93 | color: rgb(232, 234, 237) !important; 94 | } 95 | 96 | body.auto .close-button { 97 | background-color: #2f3136; 98 | color: rgb(232, 234, 237); 99 | box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.1); 100 | } 101 | 102 | body.auto .close-button:hover { 103 | background-color: rgba(255, 255, 255, 0.12); 104 | } 105 | 106 | body.auto .close-button:active { 107 | background-color: rgba(255, 255, 255, 0.24); 108 | } 109 | 110 | body.auto .cr-button:focus-visible { 111 | box-shadow: 0 0 0 2px #ffffff; 112 | } 113 | 114 | body.auto .link { 115 | color: #4a96f9 !important; 116 | } 117 | } -------------------------------------------------------------------------------- /extension/hotkeys.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Manage Hotkeys - JSON Formatter 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 33 | Double Click or Hover to Edit an Hotkey 34 |
35 | 36 | 37 |
38 |
39 |
40 | Parsed View 41 |
42 |
43 |
44 | p 45 |
46 |
47 | 54 |
55 |
56 | 57 |
58 |
59 |
60 | 61 | 62 |
63 |
64 |
65 | Raw View 66 |
67 |
68 |
69 | r 70 |
71 |
72 | 79 |
80 |
81 | 82 |
83 |
84 |
85 | 86 | 87 |
88 |
89 |
90 | Formatted Raw View 91 |
92 |
93 |
94 | Shift+r 95 |
96 |
97 | 104 |
105 |
106 | 108 |
109 |
110 |
111 | 112 | 113 |
114 |
115 |
116 | Toggle Dark Mode 117 |
118 |
119 |
120 | d 121 |
122 |
123 | 130 |
131 |
132 | 134 |
135 |
136 |
137 | 138 | 139 |
140 |
141 |
142 | Collapse All 143 |
144 |
145 |
146 | [ 147 |
148 |
149 | 156 |
157 |
158 | 160 |
161 |
162 |
163 | 164 | 165 |
166 |
167 |
168 | Expand All 169 |
170 |
171 |
172 | ] 173 |
174 |
175 | 182 |
183 |
184 | 185 |
186 |
187 |
188 | 189 | 190 |
191 |
192 |
193 | Toggle Toolbar 194 |
195 |
196 |
197 | t 198 |
199 |
200 | 207 |
208 |
209 | 211 |
212 |
213 | 214 | 215 | 216 |
217 |
218 | 227 |
228 |
229 |
230 |
231 | 254 | 255 | 256 | -------------------------------------------------------------------------------- /extension/images/icons/icon_round_1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arnav-kr/json-formatter/c1c0deaf26ecffb4ce44b7643f94d24209f973d5/extension/images/icons/icon_round_1024.png -------------------------------------------------------------------------------- /extension/images/icons/icon_round_128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arnav-kr/json-formatter/c1c0deaf26ecffb4ce44b7643f94d24209f973d5/extension/images/icons/icon_round_128.png -------------------------------------------------------------------------------- /extension/images/icons/icon_round_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arnav-kr/json-formatter/c1c0deaf26ecffb4ce44b7643f94d24209f973d5/extension/images/icons/icon_round_16.png -------------------------------------------------------------------------------- /extension/images/icons/icon_round_2048.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arnav-kr/json-formatter/c1c0deaf26ecffb4ce44b7643f94d24209f973d5/extension/images/icons/icon_round_2048.png -------------------------------------------------------------------------------- /extension/images/icons/icon_round_256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arnav-kr/json-formatter/c1c0deaf26ecffb4ce44b7643f94d24209f973d5/extension/images/icons/icon_round_256.png -------------------------------------------------------------------------------- /extension/images/icons/icon_round_32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arnav-kr/json-formatter/c1c0deaf26ecffb4ce44b7643f94d24209f973d5/extension/images/icons/icon_round_32.png -------------------------------------------------------------------------------- /extension/images/icons/icon_round_384.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arnav-kr/json-formatter/c1c0deaf26ecffb4ce44b7643f94d24209f973d5/extension/images/icons/icon_round_384.png -------------------------------------------------------------------------------- /extension/images/icons/icon_round_48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arnav-kr/json-formatter/c1c0deaf26ecffb4ce44b7643f94d24209f973d5/extension/images/icons/icon_round_48.png -------------------------------------------------------------------------------- /extension/images/icons/icon_round_512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arnav-kr/json-formatter/c1c0deaf26ecffb4ce44b7643f94d24209f973d5/extension/images/icons/icon_round_512.png -------------------------------------------------------------------------------- /extension/images/icons/icon_round_64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arnav-kr/json-formatter/c1c0deaf26ecffb4ce44b7643f94d24209f973d5/extension/images/icons/icon_round_64.png -------------------------------------------------------------------------------- /extension/images/icons/icon_round_72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arnav-kr/json-formatter/c1c0deaf26ecffb4ce44b7643f94d24209f973d5/extension/images/icons/icon_round_72.png -------------------------------------------------------------------------------- /extension/js/globals.js: -------------------------------------------------------------------------------- 1 | const displayTexts = { 2 | left: "←", 3 | right: "→", 4 | up: "↑", 5 | down: "↓", 6 | }; 7 | 8 | const defaultOptions = { 9 | "whats_new_screen_shown": true, 10 | "tab": "parsed", 11 | "colorScheme": "auto", 12 | "wordWrap": false, 13 | "rawUnicodeEscapes": false, 14 | "contextMenus": false, 15 | "sortingOrder": "unchanged", 16 | "hotkeys": { 17 | "parsed": "p", 18 | "raw": "r", 19 | "formatted_raw": "shift+r", 20 | "dark": "d", 21 | "collapse_all": "[", 22 | "expand_all": "]", 23 | "toolbar": "t", 24 | }, 25 | "themes": { 26 | "current": { 27 | "dark": { 28 | "version": "1.0.0", 29 | "name": "Default Dark", 30 | "id": "be9f950490404d24a021e1b2acbbd4e2:D", 31 | "immortal": true, 32 | "colorScheme": "dark", 33 | "colors": { 34 | "background": "#1E1E1E", 35 | "textSecondary": "#D4D4D4", 36 | "textPrimary": "#D4D4D4", 37 | "key": "#9CDCFE", 38 | "numberValue": "#B5CEA8", 39 | "booleanValue": "#569CD6", 40 | "stringValue": "#CE9178", 41 | "icons": "#D4D4D4" 42 | } 43 | }, 44 | "light": { 45 | "version": "1.0.0", 46 | "name": "Default Light", 47 | "id": "3ec360010a8a4dd39a515cadec2c2b3f:L", 48 | "immortal": true, 49 | "colorScheme": "light", 50 | "colors": { 51 | "background": "#FFFFFF", 52 | "textPrimary": "#000000", 53 | "textSecondary": "#808080", 54 | "key": "#444444", 55 | "numberValue": "#F9AE58", 56 | "booleanValue": "#EC5F66", 57 | "stringValue": "#86B25C", 58 | "icons": "#808080" 59 | } 60 | } 61 | }, 62 | "store": { 63 | "dark": [ 64 | { 65 | "version": "1.0.0", 66 | "name": "Default Dark", 67 | "id": "be9f950490404d24a021e1b2acbbd4e2:D", 68 | "immortal": true, 69 | "colorScheme": "dark", 70 | "colors": { 71 | "background": "#1E1E1E", 72 | "textPrimary": "#D4D4D4", 73 | "textSecondary": "#D4D4D4", 74 | "key": "#9CDCFE", 75 | "numberValue": "#B5CEA8", 76 | "booleanValue": "#569CD6", 77 | "stringValue": "#CE9178", 78 | "icons": "#D4D4D4" 79 | } 80 | }, 81 | { 82 | "version": "1.0.0", 83 | "name": "Purple Mountains", 84 | "id": "1c4ea202643b44539454b8c220c771ed:D", 85 | "colorScheme": "dark", 86 | "colors": { 87 | "background": "#241028", 88 | "textPrimary": "#D4D4D4", 89 | "textSecondary": "#bea4e5", 90 | "key": "#aa99ff", 91 | "numberValue": "#0cbb9e", 92 | "booleanValue": "#c7ad29", 93 | "stringValue": "#bd7800", 94 | "icons": "#cbb8ff" 95 | } 96 | }, 97 | { 98 | "version": "1.0.0", 99 | "name": "3024 Night", 100 | "id": "a778240fbeeb4db1b6a8ae91f33d7349:D", 101 | "immortal": true, 102 | "colorScheme": "dark", 103 | "colors": { 104 | "background": "#090300", 105 | "textPrimary": "#d6d5d4", 106 | "textSecondary": "#d6d5d4", 107 | "key": "#01a252", 108 | "numberValue": "#a16a94", 109 | "booleanValue": "#a16a94", 110 | "stringValue": "#fded02", 111 | "icons": "#db2d20" 112 | } 113 | }, 114 | { 115 | "version": "1.0.0", 116 | "name": "Abbott", 117 | "id": "580519094cd04f839b49de2e6cc655ad:D", 118 | "immortal": true, 119 | "colorScheme": "dark", 120 | "colors": { 121 | "background": "#231c14", 122 | "textPrimary": "#d8ff84", 123 | "textSecondary": "#d8ff84", 124 | "key": "#3f91f1", 125 | "numberValue": "#f63f05", 126 | "booleanValue": "#fef3b4", 127 | "stringValue": "#e6a2f3", 128 | "icons": "#d80450" 129 | } 130 | }, 131 | { 132 | "version": "1.0.0", 133 | "name": "Abcdef", 134 | "id": "03b11a2a73ee46d0b2e6b6afd36cb3a2:D", 135 | "immortal": true, 136 | "colorScheme": "dark", 137 | "colors": { 138 | "background": "#0f0f0f", 139 | "textPrimary": "#defdef", 140 | "textSecondary": "#ffff00", 141 | "key": "#fedcba", 142 | "numberValue": "#ee82ee", 143 | "booleanValue": "#7777ff", 144 | "stringValue": "#22bb44", 145 | "icons": "#b8860b" 146 | } 147 | }, 148 | { 149 | "version": "1.0.0", 150 | "name": "Ambiance", 151 | "id": "44598a765f434cb3815d299404bd95f8:D", 152 | "immortal": true, 153 | "colorScheme": "dark", 154 | "colors": { 155 | "background": "#202020", 156 | "textPrimary": "#e6e1dc", 157 | "textSecondary": "#fa8d6a", 158 | "key": "#eed1b3", 159 | "numberValue": "#78cf8a", 160 | "booleanValue": "#cf7ea9", 161 | "stringValue": "#8f9d6a", 162 | "icons": "#cda869" 163 | } 164 | }, 165 | { 166 | "version": "1.0.0", 167 | "name": "Ayu Dark", 168 | "id": "27fb92a419114011bf9e2a61483f0738:D", 169 | "immortal": true, 170 | "colorScheme": "dark", 171 | "colors": { 172 | "background": "#0a0e14", 173 | "textPrimary": "#b3b1ad", 174 | "textSecondary": "#b3b1ad", 175 | "key": "#ffb454", 176 | "numberValue": "#e6b450", 177 | "booleanValue": "#ae81ff", 178 | "stringValue": "#c2d94c", 179 | "icons": "#ff8f40" 180 | } 181 | }, 182 | { 183 | "version": "1.0.0", 184 | "name": "Ayu Mirage", 185 | "id": "b4ffcd6a4ffd44929f49d50154c973d9:D", 186 | "immortal": true, 187 | "colorScheme": "dark", 188 | "colors": { 189 | "background": "#1f2430", 190 | "textPrimary": "#cbccc6", 191 | "textSecondary": "#cbccc6", 192 | "key": "#f29e74", 193 | "numberValue": "#ffcc66", 194 | "booleanValue": "#ae81ff", 195 | "stringValue": "#bae67e", 196 | "icons": "#ffa759" 197 | } 198 | }, 199 | { 200 | "version": "1.0.0", 201 | "name": "Base16 Dark", 202 | "id": "3b529c0059b9427698bab1eb54f021ac:D", 203 | "immortal": true, 204 | "colorScheme": "dark", 205 | "colors": { 206 | "background": "#151515", 207 | "textPrimary": "#e0e0e0", 208 | "textSecondary": "#e0e0e0", 209 | "key": "#90a959", 210 | "numberValue": "#aa759f", 211 | "booleanValue": "#aa759f", 212 | "stringValue": "#f4bf75", 213 | "icons": "#ac4142" 214 | } 215 | }, 216 | { 217 | "version": "1.0.0", 218 | "name": "Bespin", 219 | "id": "f4d554970dd54ec2b18f9c4d229fb1ef:D", 220 | "immortal": true, 221 | "colorScheme": "dark", 222 | "colors": { 223 | "background": "#28211c", 224 | "textPrimary": "#9d9b97", 225 | "textSecondary": "#9d9b97", 226 | "key": "#54be0d", 227 | "numberValue": "#9b859d", 228 | "booleanValue": "#9b859d", 229 | "stringValue": "#f9ee98", 230 | "icons": "#cf6a4c" 231 | } 232 | }, 233 | { 234 | "version": "1.0.0", 235 | "name": "Blackboard", 236 | "id": "691a1eb547454b62bbb5a6ba7fb03703:D", 237 | "immortal": true, 238 | "colorScheme": "dark", 239 | "colors": { 240 | "background": "#0c1021", 241 | "textPrimary": "#f8f8f8", 242 | "textSecondary": "#fbde2d", 243 | "key": "#f8f8f8", 244 | "numberValue": "#d8fa3c", 245 | "booleanValue": "#d8fa3c", 246 | "stringValue": "#61ce3c", 247 | "icons": "#fbde2d" 248 | } 249 | }, 250 | { 251 | "version": "1.0.0", 252 | "name": "Cobalt", 253 | "id": "c7785ce961be48cba643012defd14277:D", 254 | "immortal": true, 255 | "colorScheme": "dark", 256 | "colors": { 257 | "background": "#002240", 258 | "textPrimary": "#ffffff", 259 | "textSecondary": "#ffffff", 260 | "key": "#ffffff", 261 | "numberValue": "#ff80e1", 262 | "booleanValue": "#845dc4", 263 | "stringValue": "#3ad900", 264 | "icons": "#ffee80" 265 | } 266 | }, 267 | { 268 | "version": "1.0.0", 269 | "name": "Colorforth", 270 | "id": "360e2c7bf25e40eebce29a2feec47984:D", 271 | "immortal": true, 272 | "colorScheme": "dark", 273 | "colors": { 274 | "background": "#000000", 275 | "textPrimary": "#f8f8f8", 276 | "textSecondary": "#f8f8f8", 277 | "key": "#f8f8f8", 278 | "numberValue": "#00c4ff", 279 | "booleanValue": "#606060", 280 | "stringValue": "#007bff", 281 | "icons": "#ffd900" 282 | } 283 | }, 284 | { 285 | "version": "1.0.0", 286 | "name": "Darcula", 287 | "id": "8543d9b22ba64b918e6a755588dd0c54:D", 288 | "immortal": true, 289 | "colorScheme": "dark", 290 | "colors": { 291 | "background": "#2b2b2b", 292 | "textPrimary": "#a9b7c6", 293 | "textSecondary": "#a9b7c6", 294 | "key": "#ffc66d", 295 | "numberValue": "#6897bb", 296 | "booleanValue": "#cc7832", 297 | "stringValue": "#6a8759", 298 | "icons": "#cc7832" 299 | } 300 | }, 301 | { 302 | "version": "1.0.0", 303 | "name": "Dracula", 304 | "id": "83003ca9aeac468cbf3826f76779d986:D", 305 | "immortal": true, 306 | "colorScheme": "dark", 307 | "colors": { 308 | "background": "#282a36", 309 | "textPrimary": "#f8f8f2", 310 | "textSecondary": "#ff79c6", 311 | "key": "#66d9ef", 312 | "numberValue": "#bd93f9", 313 | "booleanValue": "#bd93f9", 314 | "stringValue": "#f1fa8c", 315 | "icons": "#ff79c6" 316 | } 317 | }, 318 | { 319 | "version": "1.0.0", 320 | "name": "Duotone Dark", 321 | "id": "084254be29a848ac86e11c6fc606743a:D", 322 | "immortal": true, 323 | "colorScheme": "dark", 324 | "colors": { 325 | "background": "#2a2734", 326 | "textPrimary": "#6c6783", 327 | "textSecondary": "#ffad5c", 328 | "key": "#9a86fd", 329 | "numberValue": "#ffcc99", 330 | "booleanValue": "#ffcc99", 331 | "stringValue": "#ffb870", 332 | "icons": "#ffcc99" 333 | } 334 | }, 335 | { 336 | "version": "1.0.0", 337 | "name": "Erlang Dark", 338 | "id": "f08fea21c4344d838daca0b4021918c9:D", 339 | "immortal": true, 340 | "colorScheme": "dark", 341 | "colors": { 342 | "background": "#002240", 343 | "textPrimary": "#ffffff", 344 | "textSecondary": "#dd5555", 345 | "key": "#cccccc", 346 | "numberValue": "#ffd0d0", 347 | "booleanValue": "#f133f1", 348 | "stringValue": "#3ad900", 349 | "icons": "#ffee80" 350 | } 351 | }, 352 | { 353 | "version": "1.0.0", 354 | "name": "Gruvbox Dark", 355 | "id": "791f72e3ffbd4b14b2bd8f2bd6dff649:D", 356 | "immortal": true, 357 | "colorScheme": "dark", 358 | "colors": { 359 | "background": "#282828", 360 | "textPrimary": "#bdae93", 361 | "textSecondary": "#ebdbb2", 362 | "key": "#ebdbb2", 363 | "numberValue": "#d3869b", 364 | "booleanValue": "#d3869b", 365 | "stringValue": "#b8bb26", 366 | "icons": "#f84934" 367 | } 368 | }, 369 | { 370 | "version": "1.0.0", 371 | "name": "Hopscotch", 372 | "id": "86dc810229ca4d44b2f490669144ae1e:D", 373 | "immortal": true, 374 | "colorScheme": "dark", 375 | "colors": { 376 | "background": "#322931", 377 | "textPrimary": "#d5d3d5", 378 | "textSecondary": "#d5d3d5", 379 | "key": "#8fc13e", 380 | "numberValue": "#c85e7c", 381 | "booleanValue": "#c85e7c", 382 | "stringValue": "#fdcc59", 383 | "icons": "#dd464c" 384 | } 385 | }, 386 | { 387 | "version": "1.0.0", 388 | "name": "Icecoder", 389 | "id": "0501abcbce25415d90d4dfe0475466e2:D", 390 | "immortal": true, 391 | "colorScheme": "dark", 392 | "colors": { 393 | "background": "#1d1d1b", 394 | "textPrimary": "#666666", 395 | "textSecondary": "#9179bb", 396 | "key": "#eeeeee", 397 | "numberValue": "#6cb5d9", 398 | "booleanValue": "#e1c76e", 399 | "stringValue": "#b9ca4a", 400 | "icons": "#eeeeee" 401 | } 402 | }, 403 | { 404 | "version": "1.0.0", 405 | "name": "Isotope", 406 | "id": "c505f17f99aa4d998fd757ea420d1241:D", 407 | "immortal": true, 408 | "colorScheme": "dark", 409 | "colors": { 410 | "background": "#000000", 411 | "textPrimary": "#e0e0e0", 412 | "textSecondary": "#e0e0e0", 413 | "key": "#33ff00", 414 | "numberValue": "#cc00ff", 415 | "booleanValue": "#cc00ff", 416 | "stringValue": "#ff0099", 417 | "icons": "#ff0000" 418 | } 419 | }, 420 | { 421 | "version": "1.0.0", 422 | "name": "Lesser Dark", 423 | "id": "26932b75439e46fc98e29f456746ab6c:D", 424 | "immortal": true, 425 | "colorScheme": "dark", 426 | "colors": { 427 | "background": "#262626", 428 | "textPrimary": "#ebefe7", 429 | "textSecondary": "#92a75c", 430 | "key": "#92a75c", 431 | "numberValue": "#b35e4d", 432 | "booleanValue": "#c2b470", 433 | "stringValue": "#bcd279", 434 | "icons": "#599eff" 435 | } 436 | }, 437 | { 438 | "version": "1.0.0", 439 | "name": "Liquibyte", 440 | "id": "10fe36be63f5403e83e69747d19c6ffe:D", 441 | "immortal": true, 442 | "colorScheme": "dark", 443 | "colors": { 444 | "background": "#000000", 445 | "textPrimary": "#ffffff", 446 | "textSecondary": "#ffffff", 447 | "key": "#999999", 448 | "numberValue": "#00ff00", 449 | "booleanValue": "#bf3030", 450 | "stringValue": "#ff8000", 451 | "icons": "#c080ff" 452 | } 453 | }, 454 | { 455 | "version": "1.0.0", 456 | "name": "Lucario", 457 | "id": "817385f791674976a39d636a845b52e3:D", 458 | "immortal": true, 459 | "colorScheme": "dark", 460 | "colors": { 461 | "background": "#2b3e50", 462 | "textPrimary": "#f8f8f2", 463 | "textSecondary": "#66d9ef", 464 | "key": "#f8f8f2", 465 | "numberValue": "#ca94ff", 466 | "booleanValue": "#bd93f9", 467 | "stringValue": "#e6db74", 468 | "icons": "#ff6541" 469 | } 470 | }, 471 | { 472 | "version": "1.0.0", 473 | "name": "Material", 474 | "id": "e3389d9ca5424471a4ccbe397a728ae6:D", 475 | "immortal": true, 476 | "colorScheme": "dark", 477 | "colors": { 478 | "background": "#263238", 479 | "textPrimary": "#eeffff", 480 | "textSecondary": "#89ddff", 481 | "key": "#c792ea", 482 | "numberValue": "#ff5370", 483 | "booleanValue": "#f78c6c", 484 | "stringValue": "#c3e88d", 485 | "icons": "#c792ea" 486 | } 487 | }, 488 | { 489 | "version": "1.0.0", 490 | "name": "Material Darker", 491 | "id": "86bdee751de34134b907aa3a95e68589:D", 492 | "immortal": true, 493 | "colorScheme": "dark", 494 | "colors": { 495 | "background": "#212121", 496 | "textPrimary": "#eeffff", 497 | "textSecondary": "#89ddff", 498 | "key": "#c792ea", 499 | "numberValue": "#ff5370", 500 | "booleanValue": "#f78c6c", 501 | "stringValue": "#c3e88d", 502 | "icons": "#c792ea" 503 | } 504 | }, 505 | { 506 | "version": "1.0.0", 507 | "name": "Material Palenight", 508 | "id": "955c5b4a833740e1828b2a28bc3f1d54:D", 509 | "immortal": true, 510 | "colorScheme": "dark", 511 | "colors": { 512 | "background": "#292d3e", 513 | "textPrimary": "#a6accd", 514 | "textSecondary": "#89ddff", 515 | "key": "#c792ea", 516 | "numberValue": "#ff5370", 517 | "booleanValue": "#f78c6c", 518 | "stringValue": "#c3e88d", 519 | "icons": "#c792ea" 520 | } 521 | }, 522 | { 523 | "version": "1.0.0", 524 | "name": "Material Ocean", 525 | "id": "54d93134cf994f3daddefd68bbed71db:D", 526 | "immortal": true, 527 | "colorScheme": "dark", 528 | "colors": { 529 | "background": "#0f111a", 530 | "textPrimary": "#8f93a2", 531 | "textSecondary": "#89ddff", 532 | "key": "#c792ea", 533 | "numberValue": "#ff5370", 534 | "booleanValue": "#f78c6c", 535 | "stringValue": "#c3e88d", 536 | "icons": "#c792ea" 537 | } 538 | }, 539 | { 540 | "version": "1.0.0", 541 | "name": "Mbo", 542 | "id": "3b3707fc89b04f72ae893e412ca72ecc:D", 543 | "immortal": true, 544 | "colorScheme": "dark", 545 | "colors": { 546 | "background": "#2c2c2c", 547 | "textPrimary": "#ffffec", 548 | "textSecondary": "#ffffec", 549 | "key": "#9ddfe9", 550 | "numberValue": "#00a8c6", 551 | "booleanValue": "#00a8c6", 552 | "stringValue": "#ffcf6c", 553 | "icons": "#ffb928" 554 | } 555 | }, 556 | { 557 | "version": "1.0.0", 558 | "name": "Midnight", 559 | "id": "7e98faf9566744d5a21b3953cc984eee:D", 560 | "immortal": true, 561 | "colorScheme": "dark", 562 | "colors": { 563 | "background": "#0f192a", 564 | "textPrimary": "#d1edff", 565 | "textSecondary": "#d1edff", 566 | "key": "#a6e22e", 567 | "numberValue": "#d1edff", 568 | "booleanValue": "#ae81ff", 569 | "stringValue": "#1dc116", 570 | "icons": "#e83737" 571 | } 572 | }, 573 | { 574 | "version": "1.0.0", 575 | "name": "Monokai", 576 | "id": "8bbd9b321a1b4665b24560f650558922:D", 577 | "immortal": true, 578 | "colorScheme": "dark", 579 | "colors": { 580 | "background": "#272822", 581 | "textPrimary": "#f8f8f2", 582 | "textSecondary": "#f8f8f2", 583 | "key": "#a6e22e", 584 | "numberValue": "#ae81ff", 585 | "booleanValue": "#ae81ff", 586 | "stringValue": "#e6db74", 587 | "icons": "#f92672" 588 | } 589 | }, 590 | { 591 | "version": "1.0.0", 592 | "name": "Moxer", 593 | "id": "7d7a14b85a8441b583aa81a7ecd5c222:D", 594 | "immortal": true, 595 | "colorScheme": "dark", 596 | "colors": { 597 | "background": "#090a0f", 598 | "textPrimary": "#8e95b4", 599 | "textSecondary": "#d46c6c", 600 | "key": "#81c5da", 601 | "numberValue": "#7ca4c0", 602 | "booleanValue": "#a99be2", 603 | "stringValue": "#b2e4ae", 604 | "icons": "#d46c6c" 605 | } 606 | }, 607 | { 608 | "version": "1.0.0", 609 | "name": "Night", 610 | "id": "3bf21c03280c40acb9c7d624f24a16dd:D", 611 | "immortal": true, 612 | "colorScheme": "dark", 613 | "colors": { 614 | "background": "#0a001f", 615 | "textPrimary": "#f8f8f8", 616 | "textSecondary": "#f8f8f8", 617 | "key": "#f8f8f8", 618 | "numberValue": "#ffd500", 619 | "booleanValue": "#845dc4", 620 | "stringValue": "#37f14a", 621 | "icons": "#599eff" 622 | } 623 | }, 624 | { 625 | "version": "1.0.0", 626 | "name": "Nord", 627 | "id": "ff75a0c5a04a4fcb909ec1cabb5bd1bb:D", 628 | "immortal": true, 629 | "colorScheme": "dark", 630 | "colors": { 631 | "background": "#2e3440", 632 | "textPrimary": "#d8dee9", 633 | "textSecondary": "#d8dee9", 634 | "key": "#8fbcbb", 635 | "numberValue": "#b48ead", 636 | "booleanValue": "#b48ead", 637 | "stringValue": "#a3be8c", 638 | "icons": "#81a1c1" 639 | } 640 | }, 641 | { 642 | "version": "1.0.0", 643 | "name": "Oceanic Next", 644 | "id": "890ad5ef15da451faa4d5719fbb788b8:D", 645 | "immortal": true, 646 | "colorScheme": "dark", 647 | "colors": { 648 | "background": "#304148", 649 | "textPrimary": "#f8f8f2", 650 | "textSecondary": "#f8f8f2", 651 | "key": "#99c794", 652 | "numberValue": "#f99157", 653 | "booleanValue": "#c594c5", 654 | "stringValue": "#99c794", 655 | "icons": "#c594c5" 656 | } 657 | }, 658 | { 659 | "version": "1.0.0", 660 | "name": "Panda Syntax", 661 | "id": "a40bf45fc00b439d9ee32bb95a030917:D", 662 | "immortal": true, 663 | "colorScheme": "dark", 664 | "colors": { 665 | "background": "#292a2b", 666 | "textPrimary": "#e6e6e6", 667 | "textSecondary": "#f3f3f3", 668 | "key": "#f3f3f3", 669 | "numberValue": "#ffb86c", 670 | "booleanValue": "#ff2c6d", 671 | "stringValue": "#19f9d8", 672 | "icons": "#ff75b5" 673 | } 674 | }, 675 | { 676 | "version": "1.0.0", 677 | "name": "Paraiso Dark", 678 | "id": "beaf8a682de641f98687444502af4ed3:D", 679 | "immortal": true, 680 | "colorScheme": "dark", 681 | "colors": { 682 | "background": "#2f1e2e", 683 | "textPrimary": "#b9b6b0", 684 | "textSecondary": "#b9b6b0", 685 | "key": "#48b685", 686 | "numberValue": "#815ba4", 687 | "booleanValue": "#815ba4", 688 | "stringValue": "#fec418", 689 | "icons": "#ef6155" 690 | } 691 | }, 692 | { 693 | "version": "1.0.0", 694 | "name": "Pastel On Dark", 695 | "id": "f81d726884524b8fa5e5b81c9fe80e58:D", 696 | "immortal": true, 697 | "colorScheme": "dark", 698 | "colors": { 699 | "background": "#2c2827", 700 | "textPrimary": "#8f938f", 701 | "textSecondary": "#8f938f", 702 | "key": "#8f938f", 703 | "numberValue": "#cccccc", 704 | "booleanValue": "#de8e30", 705 | "stringValue": "#66a968", 706 | "icons": "#aeb2f8" 707 | } 708 | }, 709 | { 710 | "version": "1.0.0", 711 | "name": "Railscasts", 712 | "id": "f4cb033a907e46bfa01ee62c3bce29c0:D", 713 | "immortal": true, 714 | "colorScheme": "dark", 715 | "colors": { 716 | "background": "#2b2b2b", 717 | "textPrimary": "#f4f1ed", 718 | "textSecondary": "#f4f1ed", 719 | "key": "#a5c261", 720 | "numberValue": "#b6b3eb", 721 | "booleanValue": "#b6b3eb", 722 | "stringValue": "#ffc66d", 723 | "icons": "#da4939" 724 | } 725 | }, 726 | { 727 | "version": "1.0.0", 728 | "name": "Rubyblue", 729 | "id": "92ca3783bee44132b930a261aaa17c52:D", 730 | "immortal": true, 731 | "colorScheme": "dark", 732 | "colors": { 733 | "background": "#112435", 734 | "textPrimary": "#ffffff", 735 | "textSecondary": "#ffffff", 736 | "key": "#ffffff", 737 | "numberValue": "#82c6e0", 738 | "booleanValue": "#f4c20b", 739 | "stringValue": "#f08047", 740 | "icons": "#ff00ff" 741 | } 742 | }, 743 | { 744 | "version": "1.0.0", 745 | "name": "Seti", 746 | "id": "7d0171adb8f94d959d6506e1899ebe3e:D", 747 | "immortal": true, 748 | "colorScheme": "dark", 749 | "colors": { 750 | "background": "#151718", 751 | "textPrimary": "#cfd2d1", 752 | "textSecondary": "#9fca56", 753 | "key": "#a074c4", 754 | "numberValue": "#cd3f45", 755 | "booleanValue": "#cd3f45", 756 | "stringValue": "#55b5db", 757 | "icons": "#e6cd69" 758 | } 759 | }, 760 | { 761 | "version": "1.0.0", 762 | "name": "Shadowfox", 763 | "id": "22310b2948824b619d1b895728d15212:D", 764 | "immortal": true, 765 | "colorScheme": "dark", 766 | "colors": { 767 | "background": "#2a2a2e", 768 | "textPrimary": "#b1b1b3", 769 | "textSecondary": "#b1b1b3", 770 | "key": "#86de74", 771 | "numberValue": "#6b89ff", 772 | "booleanValue": "#ff7de9", 773 | "stringValue": "#6b89ff", 774 | "icons": "#ff7de9" 775 | } 776 | }, 777 | { 778 | "version": "1.0.0", 779 | "name": "Solarized", 780 | "id": "4c259097eec144acaf056055603963cd:D", 781 | "immortal": true, 782 | "colorScheme": "dark", 783 | "colors": { 784 | "background": "#002b36", 785 | "textPrimary": "#839496", 786 | "textSecondary": "#6c71c4", 787 | "key": "#2aa198", 788 | "numberValue": "#d33682", 789 | "booleanValue": "#d33682", 790 | "stringValue": "#859900", 791 | "icons": "#cb4b16" 792 | } 793 | }, 794 | { 795 | "version": "1.0.0", 796 | "name": "The Matrix", 797 | "id": "f785297ccd1146f8adb4f9b53b5434e9:D", 798 | "immortal": true, 799 | "colorScheme": "dark", 800 | "colors": { 801 | "background": "#000000", 802 | "textPrimary": "#00ff00", 803 | "textSecondary": "#999999", 804 | "key": "#62ffa0", 805 | "numberValue": "#ffb94f", 806 | "booleanValue": "#33ffff", 807 | "stringValue": "#3399cc", 808 | "icons": "#008803" 809 | } 810 | }, 811 | { 812 | "version": "1.0.0", 813 | "name": "Tomorrow Night Bright", 814 | "id": "8b6060ea15fe46fa903961d008647862:D", 815 | "immortal": true, 816 | "colorScheme": "dark", 817 | "colors": { 818 | "background": "#000000", 819 | "textPrimary": "#eaeaea", 820 | "textSecondary": "#eaeaea", 821 | "key": "#99cc99", 822 | "numberValue": "#a16a94", 823 | "booleanValue": "#a16a94", 824 | "stringValue": "#e7c547", 825 | "icons": "#d54e53" 826 | } 827 | }, 828 | { 829 | "version": "1.0.0", 830 | "name": "Tomorrow Night Eighties", 831 | "id": "e5113aa2f29c4fe0bf04dd7c4751a39a:D", 832 | "immortal": true, 833 | "colorScheme": "dark", 834 | "colors": { 835 | "background": "#000000", 836 | "textPrimary": "#cccccc", 837 | "textSecondary": "#cccccc", 838 | "key": "#99cc99", 839 | "numberValue": "#a16a94", 840 | "booleanValue": "#a16a94", 841 | "stringValue": "#ffcc66", 842 | "icons": "#f2777a" 843 | } 844 | }, 845 | { 846 | "version": "1.0.0", 847 | "name": "Twilight", 848 | "id": "64c5cc42d9f94a1b942a55fa8fc256e3:D", 849 | "immortal": true, 850 | "colorScheme": "dark", 851 | "colors": { 852 | "background": "#141414", 853 | "textPrimary": "#f7f7f7", 854 | "textSecondary": "#cda869", 855 | "key": "#f7f7f7", 856 | "numberValue": "#ca7841", 857 | "booleanValue": "#ffcc00", 858 | "stringValue": "#8f9d6a", 859 | "icons": "#f9ee98" 860 | } 861 | }, 862 | { 863 | "version": "1.0.0", 864 | "name": "Vibrant Ink", 865 | "id": "72c2a34b64f9450a9f683de7caa4f97b:D", 866 | "immortal": true, 867 | "colorScheme": "dark", 868 | "colors": { 869 | "background": "#000000", 870 | "textPrimary": "#ffffff", 871 | "textSecondary": "#888888", 872 | "key": "#ffffff", 873 | "numberValue": "#ffee98", 874 | "booleanValue": "#ffcc00", 875 | "stringValue": "#a5c25c", 876 | "icons": "#cc7832" 877 | } 878 | }, 879 | { 880 | "version": "1.0.0", 881 | "name": "Xq Dark", 882 | "id": "1ece8a8bdbdd48a485bed1cfe6bef85f:D", 883 | "immortal": true, 884 | "colorScheme": "dark", 885 | "colors": { 886 | "background": "#0a001f", 887 | "textPrimary": "#f8f8f8", 888 | "textSecondary": "#f8f8f8", 889 | "key": "#f8f8f8", 890 | "numberValue": "#116644", 891 | "booleanValue": "#6c8cd5", 892 | "stringValue": "#9fee00", 893 | "icons": "#ffbd40" 894 | } 895 | }, 896 | { 897 | "version": "1.0.0", 898 | "name": "Yonce", 899 | "id": "f306daf76ff2441fa5fb546c72eb2ddd:D", 900 | "immortal": true, 901 | "colorScheme": "dark", 902 | "colors": { 903 | "background": "#1c1c1c", 904 | "textPrimary": "#d4d4d4", 905 | "textSecondary": "#fc4384", 906 | "key": "#d4d4d4", 907 | "numberValue": "#a06fca", 908 | "booleanValue": "#f39b35", 909 | "stringValue": "#e6db74", 910 | "icons": "#00a7aa" 911 | } 912 | }, 913 | { 914 | "version": "1.0.0", 915 | "name": "Zenburn", 916 | "id": "d4931917ec7f400d8a62bc3862e4ff40:D", 917 | "immortal": true, 918 | "colorScheme": "dark", 919 | "colors": { 920 | "background": "#3f3f3f", 921 | "textPrimary": "#dcdceb", 922 | "textSecondary": "#f0efd0", 923 | "key": "#dfaf8f", 924 | "numberValue": "#dcdccc", 925 | "booleanValue": "#bfebbf", 926 | "stringValue": "#cc9393", 927 | "icons": "#f0dfaf" 928 | } 929 | } 930 | ], 931 | "light": [ 932 | { 933 | "version": "1.0.0", 934 | "name": "Default Light", 935 | "id": "3ec360010a8a4dd39a515cadec2c2b3f:L", 936 | "immortal": true, 937 | "colorScheme": "light", 938 | "colors": { 939 | "background": "#FFFFFF", 940 | "textPrimary": "#000000", 941 | "textSecondary": "#808080", 942 | "key": "#444444", 943 | "numberValue": "#F9AE58", 944 | "booleanValue": "#EC5F66", 945 | "stringValue": "#86B25C", 946 | "icons": "#808080" 947 | } 948 | }, 949 | { 950 | "version": "1.0.0", 951 | "name": "3024 Day", 952 | "id": "d4eae2cb53b84ee3aa2734c142f6c036:L", 953 | "immortal": true, 954 | "colorScheme": "light", 955 | "colors": { 956 | "background": "#f7f7f7", 957 | "textPrimary": "#3a3432", 958 | "textSecondary": "#3a3432", 959 | "key": "#01a252", 960 | "numberValue": "#a16a94", 961 | "booleanValue": "#a16a94", 962 | "stringValue": "#fded02", 963 | "icons": "#db2d20" 964 | } 965 | }, 966 | { 967 | "version": "1.0.0", 968 | "name": "Base16 Light", 969 | "id": "189f75daf59f4d699d789980a2e11b61:L", 970 | "immortal": true, 971 | "colorScheme": "light", 972 | "colors": { 973 | "background": "#f5f5f5", 974 | "textPrimary": "#202020", 975 | "textSecondary": "#202020", 976 | "key": "#90a959", 977 | "numberValue": "#aa759f", 978 | "booleanValue": "#aa759f", 979 | "stringValue": "#f4bf75", 980 | "icons": "#ac4142" 981 | } 982 | }, 983 | { 984 | "version": "1.0.0", 985 | "name": "Duotone Light", 986 | "id": "402a4217a0fa4bdd8d62043a31cdcc75:L", 987 | "immortal": true, 988 | "colorScheme": "light", 989 | "colors": { 990 | "background": "#faf8f5", 991 | "textPrimary": "#b29762", 992 | "textSecondary": "#1659df", 993 | "key": "#b29762", 994 | "numberValue": "#063289", 995 | "booleanValue": "#063289", 996 | "stringValue": "#1659df", 997 | "icons": "#063289" 998 | } 999 | }, 1000 | { 1001 | "version": "1.0.0", 1002 | "name": "Eclipse", 1003 | "id": "4cf58f354d7246dfab431d8325a18677:L", 1004 | "immortal": true, 1005 | "colorScheme": "light", 1006 | "colors": { 1007 | "background": "#ffffff", 1008 | "textPrimary": "#000000", 1009 | "textSecondary": "#000000", 1010 | "key": "#000000", 1011 | "numberValue": "#116644", 1012 | "booleanValue": "#221199", 1013 | "stringValue": "#2a00ff", 1014 | "icons": "#7f0055" 1015 | } 1016 | }, 1017 | { 1018 | "version": "1.0.0", 1019 | "name": "Elegant", 1020 | "id": "f6822ce08360497b85c7cb49a2fb3ee2:L", 1021 | "immortal": true, 1022 | "colorScheme": "light", 1023 | "colors": { 1024 | "background": "#ffffff", 1025 | "textPrimary": "#000000", 1026 | "textSecondary": "#000000", 1027 | "key": "#000000", 1028 | "numberValue": "#776622", 1029 | "booleanValue": "#776622", 1030 | "stringValue": "#776622", 1031 | "icons": "#773300" 1032 | } 1033 | }, 1034 | { 1035 | "version": "1.0.0", 1036 | "name": "Idea", 1037 | "id": "29bfec103c424125a919b817f74569ae:L", 1038 | "immortal": true, 1039 | "colorScheme": "light", 1040 | "colors": { 1041 | "background": "#ffffff", 1042 | "textPrimary": "#000000", 1043 | "textSecondary": "#000000", 1044 | "key": "#000000", 1045 | "numberValue": "#0000ff", 1046 | "booleanValue": "#000080", 1047 | "stringValue": "#008000", 1048 | "icons": "#000080" 1049 | } 1050 | }, 1051 | { 1052 | "version": "1.0.0", 1053 | "name": "Juejin", 1054 | "id": "190a2cef706a4c7fa713660464b27cf4:L", 1055 | "immortal": true, 1056 | "colorScheme": "light", 1057 | "colors": { 1058 | "background": "#f8f9fa", 1059 | "textPrimary": "#000000", 1060 | "textSecondary": "#000000", 1061 | "key": "#000000", 1062 | "numberValue": "#000000", 1063 | "booleanValue": "#d3869b", 1064 | "stringValue": "#000000", 1065 | "icons": "#bb51b8" 1066 | } 1067 | }, 1068 | { 1069 | "version": "1.0.0", 1070 | "name": "Mdn Like", 1071 | "id": "9178ce24718948b3a45e677dd9d3f3db:L", 1072 | "immortal": true, 1073 | "colorScheme": "light", 1074 | "colors": { 1075 | "background": "#ffffff", 1076 | "textPrimary": "#999999", 1077 | "textSecondary": "#cda869", 1078 | "key": "#990055", 1079 | "numberValue": "#ca7841", 1080 | "booleanValue": "#ff9900", 1081 | "stringValue": "#0077aa", 1082 | "icons": "#6262ff" 1083 | } 1084 | }, 1085 | { 1086 | "version": "1.0.0", 1087 | "name": "Neat", 1088 | "id": "741a12319c6f4926a7be789f95ddb70f:L", 1089 | "immortal": true, 1090 | "colorScheme": "light", 1091 | "colors": { 1092 | "background": "#ffffff", 1093 | "textPrimary": "#000000", 1094 | "textSecondary": "#000000", 1095 | "key": "#000000", 1096 | "numberValue": "#33aa33", 1097 | "booleanValue": "#33aa33", 1098 | "stringValue": "#aa2222", 1099 | "icons": "#0000ff" 1100 | } 1101 | }, 1102 | { 1103 | "version": "1.0.0", 1104 | "name": "Neo", 1105 | "id": "42d5d83ac84043fa89301db8a3d58bbf:L", 1106 | "immortal": true, 1107 | "colorScheme": "light", 1108 | "colors": { 1109 | "background": "#ffffff", 1110 | "textPrimary": "#2e383c", 1111 | "textSecondary": "#2e383c", 1112 | "key": "#1d75b3", 1113 | "numberValue": "#75438a", 1114 | "booleanValue": "#75438a", 1115 | "stringValue": "#b35e14", 1116 | "icons": "#1d75b3" 1117 | } 1118 | }, 1119 | { 1120 | "version": "1.0.0", 1121 | "name": "Paraiso Light", 1122 | "id": "4bbc65288c734c7e8cfe8690abcb8c55:L", 1123 | "immortal": true, 1124 | "colorScheme": "light", 1125 | "colors": { 1126 | "background": "#e7e9db", 1127 | "textPrimary": "#41323f", 1128 | "textSecondary": "#41323f", 1129 | "key": "#48b685", 1130 | "numberValue": "#815ba4", 1131 | "booleanValue": "#815ba4", 1132 | "stringValue": "#fec418", 1133 | "icons": "#ef6155" 1134 | } 1135 | }, 1136 | { 1137 | "version": "1.0.0", 1138 | "name": "Solarized", 1139 | "id": "8b5c3c335f414189a32aefdbc28b4983:L", 1140 | "immortal": true, 1141 | "colorScheme": "light", 1142 | "colors": { 1143 | "background": "#fdf6e3", 1144 | "textPrimary": "#657b83", 1145 | "textSecondary": "#6c71c4", 1146 | "key": "#2aa198", 1147 | "numberValue": "#d33682", 1148 | "booleanValue": "#d33682", 1149 | "stringValue": "#859900", 1150 | "icons": "#cb4b16" 1151 | } 1152 | }, 1153 | { 1154 | "version": "1.0.0", 1155 | "name": "Ttcn", 1156 | "id": "dcd0fd5b5ce64e879ab8dd259e7fbefe:L", 1157 | "immortal": true, 1158 | "colorScheme": "light", 1159 | "colors": { 1160 | "background": "#ffffff", 1161 | "textPrimary": "#000000", 1162 | "textSecondary": "#000000", 1163 | "key": "#000000", 1164 | "numberValue": "#000000", 1165 | "booleanValue": "#221199", 1166 | "stringValue": "#006400", 1167 | "icons": "#000000" 1168 | } 1169 | }, 1170 | { 1171 | "version": "1.0.0", 1172 | "name": "Xq Light", 1173 | "id": "321e0da4ae034383804a0381a6d3db96:L", 1174 | "immortal": true, 1175 | "colorScheme": "light", 1176 | "colors": { 1177 | "background": "#ffffff", 1178 | "textPrimary": "#000000", 1179 | "textSecondary": "#000000", 1180 | "key": "#000000", 1181 | "numberValue": "#116644", 1182 | "booleanValue": "#6c8cd5", 1183 | "stringValue": "#ff0000", 1184 | "icons": "#5a5cad" 1185 | } 1186 | }, 1187 | { 1188 | "version": "1.0.0", 1189 | "name": "Yeti", 1190 | "id": "f362454587ca4a3abeeacf1187e16978:L", 1191 | "immortal": true, 1192 | "colorScheme": "light", 1193 | "colors": { 1194 | "background": "#eceae8", 1195 | "textPrimary": "#d1c9c0", 1196 | "textSecondary": "#9fb96e", 1197 | "key": "#a074c4", 1198 | "numberValue": "#a074c4", 1199 | "booleanValue": "#a074c4", 1200 | "stringValue": "#96c0d8", 1201 | "icons": "#9fb96e" 1202 | } 1203 | } 1204 | ] 1205 | } 1206 | } 1207 | }; 1208 | 1209 | 1210 | globalThis.sharedData = { 1211 | defaultOptions, 1212 | displayTexts, 1213 | }; -------------------------------------------------------------------------------- /extension/js/hotkeys.js: -------------------------------------------------------------------------------- 1 | var hotkeyInput, modal, modalPreview, modalNote, resetButton, options = {}, 2 | bucket = "JSON_FORMATTER_OPTIONS", 3 | stateObj = { 4 | currentValue: "", 5 | currentTarget: "", 6 | errored: false, 7 | isDirty: false, 8 | }; 9 | let state = new Proxy(stateObj, { 10 | set: (target, key, value) => { 11 | target[key] = value; 12 | 13 | if (key === "currentValue") { 14 | hotkeyInput.value = value; 15 | if (value === "") { 16 | modalPreview.innerHTML = ""; 17 | return true; 18 | } 19 | modalPreview.innerHTML = keyPreview(value); 20 | 21 | let newKey = value; 22 | // check if key is already in use 23 | let found = Object.entries(options.hotkeys).find(([k, v]) => v === newKey); 24 | if (found && found[0] !== target.currentTarget) { 25 | modalNote.innerHTML = `Already in use for "${found[0].replace(/_/g, " ").split(" ").map(i => i[0].toUpperCase() + i.slice(1)).join(" ")}"`; 26 | state.errored = true; 27 | } else { 28 | state.errored = false; 29 | modalNote.innerHTML = ""; 30 | } 31 | } 32 | 33 | if (key === "isDirty") { 34 | resetButton.disabled = !value; 35 | } 36 | return true; 37 | } 38 | }); 39 | 40 | window.addEventListener("load", async () => { 41 | // setting elements 42 | hotkeyInput = document.getElementById("hotkey"); 43 | modal = document.getElementById("modal"); 44 | modalPreview = document.querySelector(".modal-preview"); 45 | modalNote = document.querySelector(".modal-note"); 46 | resetButton = document.getElementById("reset"); 47 | 48 | // initialise extension settings 49 | await initExtensionSettings(); 50 | 51 | // toggle dirty state 52 | state.isDirty = isDirty(); 53 | 54 | // reset to default 55 | resetButton.addEventListener("click", resetToDefault); 56 | 57 | // close when input loses focus 58 | hotkeyInput.addEventListener("blur", handleClose); 59 | 60 | // double click to open modal 61 | document.querySelectorAll(".hotkeys .item:not(.item-end)").forEach(item => { 62 | item.addEventListener("dblclick", event => { 63 | event.preventDefault(); 64 | event.stopPropagation(); 65 | openModal(item.dataset.target); 66 | }); 67 | }); 68 | 69 | // click edit button to open modal 70 | document.querySelectorAll(".hotkey-edit-btn").forEach(btn => { 71 | btn.addEventListener("click", event => { 72 | event.preventDefault(); 73 | event.stopPropagation(); 74 | openModal(btn.closest(".item").dataset.target); 75 | }); 76 | }); 77 | 78 | // handle shortcut key inputs 79 | hotkeyInput.addEventListener("keydown", async (event) => { 80 | event.preventDefault(); 81 | event.stopPropagation(); 82 | 83 | state.currentTarget = hotkeyInput.dataset.target; 84 | 85 | // handle key submission 86 | if (event.key === "Enter") { 87 | if (state.errored) return; 88 | let target = hotkeyInput.dataset.target; 89 | 90 | // update local state 91 | options.hotkeys[target] = state.currentValue; 92 | 93 | // update UI 94 | let inputField = document.querySelector(`.item[data-target="${target}"] .kbd-wrapper`); 95 | inputField.innerHTML = keyPreview(state.currentValue); 96 | 97 | // save hotkey 98 | await chrome.storage.local.set({ [bucket]: options }); 99 | 100 | // toggle dirty state 101 | state.isDirty = isDirty(); 102 | 103 | // close modal 104 | handleClose(); 105 | } 106 | 107 | // esc to clear input 108 | if (event.key === "Escape") { 109 | state.currentValue = ""; 110 | return; 111 | } 112 | 113 | let keyCombination = new Set(); 114 | if (event.ctrlKey) keyCombination.add("ctrl"); 115 | if (event.shiftKey) keyCombination.add("shift"); 116 | if (event.altKey) keyCombination.add("alt"); 117 | if (event.key === "AltGraph") keyCombination.add("alt"); 118 | if (event.metaKey) keyCombination.add("meta"); 119 | 120 | if (event.key !== "Control" && event.key !== "Shift" && event.key !== "Alt" && event.key !== "AltGraph" && event.key !== "Meta") keyCombination.add(event.key.toLowerCase()); 121 | 122 | let final = Array.from(keyCombination) 123 | .join("+") 124 | .replace(/arrow([a-z]{2,5})/g, "$1") 125 | .replace(/printscreen/g, "prtsc") 126 | .replace(/audiovolumedown/g, "volumedown") 127 | .replace(/audiovolumeup/g, "volumeup") 128 | .replace(/audiomute/g, "mute") 129 | .replace(/\s/g, "space") 130 | 131 | state.currentValue = final; 132 | }); 133 | }); 134 | 135 | function keyPreview(str) { 136 | return str.split("+").map(key => `${globalThis.sharedData.displayTexts[key] || key}`).join("+"); 137 | } 138 | 139 | function handleClose(e) { 140 | if (e) { 141 | e.preventDefault(); 142 | e.stopPropagation(); 143 | } 144 | hotkeyInput.value = ""; 145 | modalPreview.innerHTML = ""; 146 | modalNote.innerHTML = ""; 147 | modal.style.display = "none"; 148 | } 149 | 150 | function openModal(inputField) { 151 | modal.style.display = "flex"; 152 | hotkeyInput.dataset.target = inputField; 153 | hotkeyInput.focus(); 154 | } 155 | 156 | function isDirty() { 157 | return Object.keys(options.hotkeys).some(key => options.hotkeys[key] !== globalThis.sharedData.defaultOptions.hotkeys[key]); 158 | } 159 | 160 | function resetToDefault() { 161 | options.hotkeys = Object.assign({}, globalThis.sharedData.defaultOptions.hotkeys); 162 | populateValues(); 163 | chrome.storage.local.set({ [bucket]: options }); 164 | state.isDirty = isDirty(); 165 | } 166 | 167 | function populateValues() { 168 | for (let key in options.hotkeys) { 169 | let item = document.querySelector(`.hotkeys .item[data-target="${key}"]`); 170 | item.querySelector(".kbd-wrapper").innerHTML = keyPreview(options.hotkeys[key]); 171 | } 172 | } 173 | 174 | async function initExtensionSettings() { 175 | // Get Options 176 | let data = await chrome.storage.local.get(bucket); 177 | // No Options set, setting them 178 | if (Object.keys(data[bucket] || {}).length === 0) { 179 | await chrome.storage.local.set({ [bucket]: globalThis.sharedData.defaultOptions }); 180 | Object.assign(options, globalThis.sharedData.defaultOptions); 181 | } 182 | else { 183 | // doesn't have hotkeys, update it to new format 184 | if (!data[bucket].hasOwnProperty("hotkeys")) { 185 | let newData = Object.assign(options, data[bucket]); 186 | newData.hotkeys = Object.assign({}, globalThis.sharedData.defaultOptions.hotkeys); 187 | Object.assign(options, newData); 188 | await chrome.storage.local.set({ [bucket]: options }); 189 | } 190 | else { 191 | // update our local copy 192 | Object.assign(options, data[bucket]); 193 | } 194 | // update list items with new data 195 | populateValues(); 196 | } 197 | 198 | // Syncing Options 199 | chrome.storage.onChanged.addListener(async (changes, area) => { 200 | if (area === 'local' && changes[bucket]?.newValue) { 201 | // No Options set, setting them 202 | if (Object.keys(changes[bucket].newValue || {}).length === 0) { 203 | await chrome.storage.local.set({ [bucket]: globalThis.sharedData.defaultOptions }); 204 | Object.assign(options, globalThis.sharedData.defaultOptions); 205 | } 206 | else { 207 | // update our local copy 208 | Object.assign(options, data[bucket].newValue); 209 | } 210 | } 211 | }); 212 | return true; 213 | } -------------------------------------------------------------------------------- /extension/js/messenger.js: -------------------------------------------------------------------------------- 1 | window.addEventListener("message", function (event) { if (event.data.type == "real_json") { window.json = event.data.msg; console.log('%c[JSON Formatter] %cType %cjson%c to access original JSON.', "color:purple;font-weight:bold;", "", "color:rgb(26, 115, 232);font-style:italic;font-weight:bold;",""); } }, false); -------------------------------------------------------------------------------- /extension/js/options.js: -------------------------------------------------------------------------------- 1 | var tabEl, 2 | colorSchemeEl, 3 | lightThemeEl, 4 | darkThemeEl, 5 | wordWrapEl, 6 | sortingOrderEl, 7 | rawUnicodeEscapesEl, 8 | contextMenusEl, 9 | options = {}, 10 | bucket = "JSON_FORMATTER_OPTIONS"; 11 | 12 | window.addEventListener("load", async () => { 13 | // Getting Elements 14 | tabEl = document.getElementById("default_tab"); 15 | colorSchemeEl = document.getElementById("colorScheme"); 16 | lightThemeEl = document.getElementById("light_theme"); 17 | darkThemeEl = document.getElementById("dark_theme"); 18 | wordWrapEl = document.getElementById("word_wrap"); 19 | sortingOrderEl = document.getElementById("sorting_order"); 20 | rawUnicodeEscapesEl = document.getElementById("raw_unicode_escapes") 21 | contextMenusEl = document.getElementById("context_menus"); 22 | 23 | await fetchExtensionSettings(); 24 | console.log(options); 25 | // add select options to dark mode theme 26 | darkThemeEl.replaceChildren(...options.themes.store.dark.map(thme => { 27 | let el = document.createElement("OPTION"); 28 | el.value = thme.id; 29 | if (thme.id == options.themes.current.dark.id) el.setAttribute("selected", "selected"); 30 | el.textContent = thme.name; 31 | return el; 32 | })); 33 | 34 | // add select options to light mode theme 35 | lightThemeEl.replaceChildren(...options.themes.store.light.map(thme => { 36 | let el = document.createElement("OPTION"); 37 | el.value = thme.id; 38 | if (thme.id == options.themes.current.light.id) el.setAttribute("selected", "selected"); 39 | el.textContent = thme.name; 40 | return el; 41 | })); 42 | 43 | function updateInputs() { 44 | tabEl.value = options.tab; 45 | colorSchemeEl.value = options.colorScheme; 46 | lightThemeEl.value = options.themes.current.light.id; 47 | darkThemeEl.value = options.themes.current.dark.id; 48 | wordWrapEl.value = options.wordWrap; 49 | sortingOrderEl.value = options.sortingOrder; 50 | rawUnicodeEscapesEl.value = options.rawUnicodeEscapes; 51 | contextMenusEl.value = options.contextMenus; 52 | } 53 | async function fetchExtensionSettings() { 54 | // Get Options 55 | let data = await chrome.storage.local.get(bucket); 56 | // No Options set, setting them 57 | if (Object.keys(data[bucket] || {}).length === 0) { 58 | console.log(options); 59 | await chrome.storage.local.set({ [bucket]: globalThis.sharedData.defaultOptions }); 60 | Object.assign(options, globalThis.sharedData.defaultOptions); 61 | } 62 | else { 63 | if (!data[bucket].hasOwnProperty("themes") || !data[bucket].hasOwnProperty("colorScheme") || !data[bucket].hasOwnProperty("wordWrap") || !data[bucket].hasOwnProperty("sortingOrder") || !data[bucket].hasOwnProperty("rawUnicodeEscapes") || !data[bucket].hasOwnProperty("contextMenus")) { 64 | // still has old data format, update it to new format 65 | let newDataFormat = Object.assign({}, globalThis.sharedData.defaultOptions); 66 | console.log(newDataFormat); 67 | if (data[bucket].themeMode == "auto") { 68 | newDataFormat.colorScheme = "auto"; 69 | } 70 | else { 71 | if (data[bucket].currentTheme == "dark") { 72 | newDataFormat.colorScheme = "dark"; 73 | } 74 | else { 75 | newDataFormat.colorScheme = "light"; 76 | } 77 | } 78 | if (data[bucket].defaultTab) { 79 | newDataFormat.tab = data[bucket].defaultTab; 80 | } 81 | 82 | delete data[bucket].themeMode; 83 | delete data[bucket].currentTheme; 84 | delete data[bucket].defaultTab; 85 | 86 | newDataFormat = { ...newDataFormat, ...data[bucket] }; 87 | console.log(newDataFormat); 88 | Object.assign(options, newDataFormat); 89 | await chrome.storage.local.set({ [bucket]: newDataFormat }); 90 | } 91 | else { 92 | // update our local copy 93 | Object.assign(options, data[bucket]); 94 | } 95 | // update inputs with new data 96 | updateInputs(); 97 | } 98 | 99 | // Syncing Options 100 | chrome.storage.onChanged.addListener(async (changes, area) => { 101 | if (area === 'local' && changes[bucket]?.newValue) { 102 | // No Options set, setting them 103 | if (Object.keys(changes[bucket].newValue || {}).length === 0) { 104 | Object.assign(options, globalThis.sharedData.defaultOptions); 105 | await chrome.storage.local.set({ [bucket]: globalThis.sharedData.defaultOptions }); 106 | } 107 | else { 108 | // update our local copy 109 | Object.assign(options, changes[bucket].newValue); 110 | // update inputs with new data 111 | console.log(options); 112 | // updateInputs(); 113 | } 114 | } 115 | }); 116 | return true; 117 | } 118 | 119 | // Input Updates 120 | tabEl.addEventListener("input", async (e) => { 121 | if (options.tab == e.target.value) return; 122 | options.tab = e.target.value; 123 | await chrome.storage.local.set({ [bucket]: options }); 124 | }); 125 | 126 | colorSchemeEl.addEventListener("input", async (e) => { 127 | if (options.colorScheme == e.target.value) return; 128 | options.colorScheme = e.target.value; 129 | await chrome.storage.local.set({ [bucket]: options }); 130 | }); 131 | 132 | lightThemeEl.addEventListener("input", async (e) => { 133 | if (options.themes.current.light.id == e.target.value) return; 134 | options.themes.current.light = [...options.themes.store.dark, ...options.themes.store.light].filter(t => t.id == e.target.value)[0]; 135 | await chrome.storage.local.set({ [bucket]: options }); 136 | }); 137 | 138 | darkThemeEl.addEventListener("input", async (e) => { 139 | if (options.themes.current.dark.id == e.target.value) return; 140 | options.themes.current.dark = [...options.themes.store.dark, ...options.themes.store.light].filter(t => t.id == e.target.value)[0]; 141 | await chrome.storage.local.set({ [bucket]: options }); 142 | }); 143 | 144 | wordWrapEl.addEventListener("input", async (e) => { 145 | if (options.wordWrap == (e.target.value == "true" ? true : false)) return; 146 | options.wordWrap = e.target.value == "true" ? true : false; 147 | await chrome.storage.local.set({ [bucket]: options }); 148 | }); 149 | 150 | sortingOrderEl.addEventListener("input", async (e) => { 151 | if (options.sortingOrder == e.target.value) return; 152 | options.sortingOrder = e.target.value; 153 | await chrome.storage.local.set({ [bucket]: options }); 154 | }); 155 | 156 | rawUnicodeEscapesEl.addEventListener("input", async (e) => { 157 | if (options.rawUnicodeEscapes == e.target.value) return; 158 | options.rawUnicodeEscapes = e.target.value == "true" ? true : false; 159 | await chrome.storage.local.set({ [bucket]: options }); 160 | }); 161 | 162 | contextMenusEl.addEventListener("input", async (e) => { 163 | if (options.contextMenus == e.target.value) return; 164 | options.contextMenus = e.target.value == "true" ? true : false; 165 | await chrome.storage.local.set({ [bucket]: options }); 166 | }); 167 | }); -------------------------------------------------------------------------------- /extension/js/themes.js: -------------------------------------------------------------------------------- 1 | // const { getThemeById, parseThemeId } = globalThis.sharedData.utils; 2 | let 3 | options = {}, 4 | bucket = "JSON_FORMATTER_OPTIONS", 5 | DISABLE_INCOMPLETE_FEATURES = true; 6 | 7 | function HR() { 8 | let el = document.createElement("DIV"); 9 | el.classList.add("hr"); 10 | return el; 11 | } 12 | 13 | function ThemeItem(ThemeData, isCurrent) { 14 | const { 15 | version, 16 | id, 17 | colorScheme, 18 | immortal, 19 | name, 20 | colors: { 21 | background, 22 | textPrimary, 23 | textSecondary, 24 | key, 25 | numberValue, 26 | booleanValue, 27 | stringValue, 28 | icons } 29 | } = ThemeData; 30 | let html = `
31 |
32 |
33 | ${name} 34 |
${colorScheme}
35 | ${isCurrent ? `
current theme
` : ""} 36 |
37 | ${immortal || DISABLE_INCOMPLETE_FEATURES ? "" : `
38 | 44 | 50 |
`} 51 |
52 |
53 |
54 | 55 | object 56 | {5} 57 |
58 |
59 | 60 | text 61 | : 62 | "Lorem ipsum dolor sit amet" 63 |
64 |
65 | 66 | integer 67 | : 68 | 42 69 |
70 |
71 | 72 | float 73 | : 74 | 3.14 75 |
76 |
77 | 78 | boolean 79 | : 80 | true 81 |
82 |
83 | 84 | array 85 | [4] 86 |
87 |
88 | 89 | 0 90 | : 91 | "Lorem ipsum dolor sit amet" 92 |
93 |
94 | 95 | 1 96 | : 97 | 42 98 |
99 |
100 | 101 | 2 102 | : 103 | 3.14 104 |
105 |
106 | 107 | 3 108 | : 109 | true 110 |
111 |
112 |
`; 113 | let doc = new DOMParser().parseFromString(html, "text/html"); 114 | let theme = doc.getElementById(id); 115 | if (!(immortal || DISABLE_INCOMPLETE_FEATURES)) { 116 | theme.querySelector(".delete-theme").addEventListener("click", () => deleteTheme(id)); 117 | theme.querySelector(".edit-theme").addEventListener("click", () => editTheme(id)); 118 | } 119 | return theme; 120 | } 121 | 122 | /** NOT IMPLIMENTED **/ 123 | // window.deleteTheme = async (id) => { 124 | // const res = confirm("Are you sure you want to delete this theme?"); 125 | // if (res) { 126 | // let { type } = parseThemeId(id); 127 | // let themeToBeDeleted = getThemeById(options, id); 128 | // let currentThemes = [options.themes.current.dark.id, options.themes.current.light.id] 129 | // if (currentThemes.includes(id)) { 130 | // options.themes.current[type] = globalThis.sharedData.defaultOptions.themes.current[type]; 131 | // } 132 | // if (themeToBeDeleted.immortal) return alert("Sorry, You cannot delete Default Themes!") 133 | // options.themes.store[type] = options.themes.store[type].filter((theme) => theme.id !== id); 134 | // await chrome.storage.local.set({ [bucket]: options }); 135 | // document.getElementById(id).remove(); 136 | // } 137 | // } 138 | 139 | // window.editTheme = (id) => { 140 | 141 | // } 142 | 143 | function updateThemes() { 144 | let allThemes = [...options.themes.store.dark, ...options.themes.store.light]; 145 | let HrCount = 1 146 | allThemes.forEach((theme) => { 147 | document.getElementById("themes-container").appendChild(ThemeItem(theme, [options.themes.current.dark.id, options.themes.current.light.id].includes(theme.id))); 148 | if (HrCount < allThemes.length) { 149 | document.getElementById("themes-container").appendChild(HR()); 150 | HrCount++; 151 | } 152 | }); 153 | } 154 | 155 | window.addEventListener("load", () => { 156 | // Get Options 157 | chrome.storage.local.get(bucket, async (data) => { 158 | // No Options set, setting them 159 | if (Object.keys(data[bucket] || {}).length === 0) { 160 | await chrome.storage.local.set({ [bucket]: globalThis.sharedData.defaultOptions }); 161 | Object.assign(options, globalThis.sharedData.defaultOptions); 162 | } 163 | else { 164 | if (!data[bucket].hasOwnProperty("themes") || !data[bucket].hasOwnProperty("colorScheme") || !data[bucket].hasOwnProperty("wordWrap") || !data[bucket].hasOwnProperty("sortingOrder")) { 165 | // still has old data format, update it to new format 166 | let newDataFormat = Object.assign({}, globalThis.sharedData.defaultOptions); 167 | if (data[bucket].themeMode == "auto") { 168 | newDataFormat.colorScheme = "auto"; 169 | } 170 | else { 171 | if (data[bucket].currentTheme == "dark") { 172 | newDataFormat.colorScheme = "dark"; 173 | } 174 | else { 175 | newDataFormat.colorScheme = "light"; 176 | } 177 | } 178 | newDataFormat.tab = data[bucket].defaultTab; 179 | 180 | Object.assign(options, newDataFormat); 181 | await chrome.storage.local.set({ [bucket]: newDataFormat }); 182 | } 183 | else { 184 | // update our local copy 185 | Object.assign(options, data[bucket]); 186 | } 187 | } 188 | updateThemes(); 189 | }); 190 | 191 | // Syncing Options 192 | chrome.storage.onChanged.addListener(async (changes, area) => { 193 | if (area === 'local' && changes[bucket]?.newValue) { 194 | // No Options set, setting them 195 | if (Object.keys(changes[bucket].newValue || {}).length === 0) { 196 | await chrome.storage.local.set({ [bucket]: globalThis.sharedData.defaultOptions }); 197 | Object.assign(options, globalThis.sharedData.defaultOptions); 198 | } 199 | else { 200 | // update our local copy 201 | Object.assign(options, changes[bucket].newValue); 202 | } 203 | } 204 | }); 205 | }); -------------------------------------------------------------------------------- /extension/js/utils.js: -------------------------------------------------------------------------------- 1 | const isValidColor = color => (/^#[0-9a-fA-F]{6}$/).test(color); 2 | 3 | const isValidVersion = version => (/^\d+\.\d+\.\d+$/).test(version); 4 | 5 | const isValidColorScheme = scheme => ["dark", "light"].indexOf(scheme) !== -1; 6 | 7 | const requiredColors = ["background", "textPrimary", "textSecondary", "key", "numberValue", "booleanValue", "stringValue", "icons"] 8 | 9 | function validate(string) { 10 | let errors = []; 11 | // check if undefined 12 | if (!string) { 13 | errors.push("theme data is empty."); 14 | } 15 | let isValidJSON = false; 16 | // check if valid json 17 | try { 18 | JSON.parse(string); 19 | isValidJSON = true; 20 | } catch (e) { 21 | errors.push("theme data is not valid JSON."); 22 | } 23 | 24 | if (!isValidJSON) { 25 | return errors; 26 | } 27 | let json = JSON.parse(string); 28 | // check if version number there 29 | if (!json.version) { 30 | errors.push("property \"version\" is missing."); 31 | } 32 | else { 33 | // check if version number is valid 34 | try { 35 | if (!isValidVersion(json.version)) { 36 | errors.push("the value for the \"version\" property is invalid."); 37 | } 38 | } catch (e) { 39 | errors.push("the value for the \"version\" property is invalid."); 40 | } 41 | } 42 | // check if Color Scheme is there 43 | if (!json.colorScheme) { 44 | errors.push("property \"colorScheme\" is missing in theme data."); 45 | } 46 | else { 47 | // check if color scheme is valid 48 | try { 49 | if (!isValidColorScheme(json.colorScheme)) { 50 | errors.push("the value for the \"colorScheme\" property is invalid."); 51 | } 52 | } catch (e) { 53 | errors.push("the value for the \"colorScheme\" property is invalid."); 54 | } 55 | } 56 | // check if colors are there 57 | if (!json.colors) { 58 | errors.push("property \"colors\" is missing in theme data."); 59 | } 60 | else { 61 | // check if colors are objects and not array 62 | try { 63 | if (typeof json.colors !== "object" || Array.isArray(json.colors)) { 64 | errors.push("the \"colors\" property is not an object."); 65 | } 66 | } catch (e) { 67 | errors.push("the \"colors\" property is not an object."); 68 | } 69 | 70 | try { 71 | if (Object.keys(json.colors).length !== requiredColors.length) { 72 | errors.push("the \"colors\" property is missing some required colors."); 73 | } 74 | } catch (e) { 75 | errors.push("the \"colors\" property is missing some required colors."); 76 | } 77 | 78 | // check if each individual color is valid 79 | for (let key in json.colors) { 80 | try { 81 | if (!isValidColor(json.colors[key])) { 82 | errors.push(`the value for the "${key}" property is not a valid Hexadecimal Color.`); 83 | } 84 | } catch (e) { 85 | errors.push(`the value for the "${key}" property is not a valid Hexadecimal Color.`); 86 | } 87 | try { 88 | if (requiredColors.indexOf(key) === -1) { 89 | errors.push(`the property "${key}" is not a valid color property.`); 90 | } 91 | } catch (e) { 92 | errors.push(`the property "${key}" is not a valid color property.`); 93 | } 94 | } 95 | } 96 | // if errors exist, return them with success: false 97 | if (errors.length > 0) { 98 | return { 99 | success: false, 100 | errors: errors, 101 | }; 102 | } 103 | // if no errors, return success: true 104 | else { 105 | return { 106 | success: true, 107 | errors: [], 108 | } 109 | } 110 | } 111 | 112 | const ThemeMetadata = new Map([ 113 | [ 114 | "body${isDark}, .JF_json-container${isDark}", // key 115 | { 116 | properties: [ 117 | { 118 | name: "background", 119 | type: "background-color", 120 | }, // item 121 | { 122 | name: "textPrimary", 123 | type: "color", 124 | }, // item 125 | ], // properties 126 | } // value 127 | ], // entry 128 | 129 | [ 130 | ".JF_json-container${isDark} .json-key", // key 131 | { 132 | properties: [ 133 | { 134 | name: "key", 135 | type: "color", 136 | }, // item 137 | ], // properties 138 | }, // value 139 | ], // entry 140 | 141 | [ 142 | ".JF_json-container${isDark} .json-size", // key 143 | { 144 | properties: [ 145 | { 146 | name: "textSecondary", 147 | type: "color", 148 | }, // item 149 | ], // properties 150 | }, // value 151 | ], // entry 152 | 153 | [ 154 | ".JF_json-container${isDark} .json-separator", // key 155 | { 156 | properties: [ 157 | { 158 | name: "textSecondary", 159 | type: "color", 160 | }, // item 161 | ], // properties 162 | }, // value 163 | ], // entry 164 | 165 | [ 166 | ".JF_json-container${isDark} .json-number", // key 167 | { 168 | properties: [ 169 | { 170 | name: "numberValue", 171 | type: "color", 172 | }, // item 173 | ], // properties 174 | } // value 175 | ], // entry 176 | 177 | [ 178 | ".JF_json-container${isDark} .json-boolean", // key 179 | { 180 | properties: [ 181 | { 182 | name: "booleanValue", 183 | type: "color", 184 | }, // item 185 | ], // properties 186 | } // value 187 | ], // entry 188 | 189 | [ 190 | ".JF_json-container${isDark} .json-string", // key 191 | { 192 | properties: [ 193 | { 194 | name: "stringValue", 195 | type: "color", 196 | }, // item 197 | ], // properties 198 | } // value 199 | ], // entry 200 | 201 | [ 202 | ".JF_json-container${isDark} .codicon-chevron-right, .JF_json-container${isDark} .codicon-chevron-down", // key 203 | { 204 | properties: [ 205 | { 206 | name: "icons", 207 | type: "background-color", 208 | }, // item 209 | ], // properties 210 | } // value 211 | ], // entry 212 | 213 | ]); 214 | 215 | function themeToCSS(theme) { 216 | let isDark = theme.colorScheme === "dark" ? ".JF_dark" : ""; 217 | let css = ""; 218 | ThemeMetadata.forEach((item, selector) => { 219 | css += `${selector.replace(/\$\{isDark\}/gmi, isDark)} { 220 | ${item.properties.map(i => ` ${i.type}: ${theme.colors[i.name]};`).join("\n")} 221 | }\n` 222 | }); 223 | return css; 224 | } 225 | 226 | async function parse(file) { 227 | const themeData = await file.text(); 228 | const validationResults = validate(themeData); 229 | if (validationResults.success) { 230 | const css = themeToCSS(JSON.parse(themeData)); 231 | return { 232 | success: true, 233 | data: css, 234 | errors: [], 235 | }; 236 | } 237 | else { 238 | return { 239 | success: false, 240 | data: null, 241 | errors: validationResults.errors 242 | }; 243 | } 244 | } 245 | 246 | function parseThemeId(id) { 247 | let splitted = id.split(":"); 248 | if (splitted.length !== 2) throw new Error("Invalid ID"); 249 | if (splitted[1].length !== 1) throw new Error("Invalid ID"); 250 | let type = splitted[1].toUpperCase() == "D" ? "dark" : "light"; 251 | let identifier = splitted[0]; 252 | return { 253 | identifier, type 254 | } 255 | } 256 | 257 | async function generateThemeId(theme) { 258 | return crypto.randomUUID().replace(/\-/mg, "") + `:${theme.colorScheme == "dark" ? "D" : "L"}`; 259 | } 260 | 261 | function getThemeById(bucket, id) { 262 | return [...bucket.themes.store.dark, ...bucket.themes.store.light].filter(t => t.id == id)[0] || null; 263 | } 264 | 265 | globalThis.sharedData.utils = { 266 | isValidColor, 267 | isValidVersion, 268 | isValidColorScheme, 269 | validate, 270 | themeToCSS, 271 | parse, 272 | parseThemeId, 273 | generateThemeId, 274 | getThemeById 275 | } -------------------------------------------------------------------------------- /extension/js/whats-new.js: -------------------------------------------------------------------------------- 1 | let queries = new URLSearchParams(window.location.search); 2 | let theme = queries.get('theme'); 3 | if (theme == "auto") { 4 | document.body.classList.add("auto"); 5 | } 6 | else if (theme == "dark") { 7 | document.body.classList.add("dark"); 8 | } 9 | else if (theme == "light") { 10 | document.body.classList.add("light"); 11 | } 12 | 13 | window.addEventListener("DOMContentLoaded", () => { 14 | let closeButton = document.getElementById("close-whats-new"); 15 | 16 | closeButton.addEventListener("click", () => { 17 | window.parent.postMessage({ 18 | type: "JF-close-whats-new", 19 | data: null 20 | }, "*"); 21 | }); 22 | }) -------------------------------------------------------------------------------- /extension/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "JSON Formatter", 3 | "short_name": "JSON Formatter", 4 | "version": "2.1.10", 5 | "version_name": "Version 2.1.10 Beta", 6 | "manifest_version": 3, 7 | "description": "Formats JSON automatically! Open Source, Available with 60+ Themes, Syntax Highlighting, automatically linkifies links and more.", 8 | "author": "Arnav", 9 | "homepage_url": "https://github.com/arnav-kr/json-formatter", 10 | "minimum_chrome_version": "88", 11 | "offline_enabled": true, 12 | "options_ui": { 13 | "page": "options.html", 14 | "open_in_tab": false 15 | }, 16 | "action": { 17 | "default_icon": { 18 | "16": "images/icons/icon_round_16.png", 19 | "32": "images/icons/icon_round_32.png", 20 | "48": "images/icons/icon_round_48.png", 21 | "64": "images/icons/icon_round_64.png", 22 | "72": "images/icons/icon_round_72.png", 23 | "128": "images/icons/icon_round_128.png", 24 | "256": "images/icons/icon_round_256.png", 25 | "384": "images/icons/icon_round_384.png", 26 | "512": "images/icons/icon_round_512.png", 27 | "1024": "images/icons/icon_round_1024.png" 28 | }, 29 | "default_title": "JSON Formatter - Edit Preferences", 30 | "default_popup": "options.html" 31 | }, 32 | "icons": { 33 | "16": "images/icons/icon_round_16.png", 34 | "32": "images/icons/icon_round_32.png", 35 | "48": "images/icons/icon_round_48.png", 36 | "64": "images/icons/icon_round_64.png", 37 | "72": "images/icons/icon_round_72.png", 38 | "128": "images/icons/icon_round_128.png", 39 | "256": "images/icons/icon_round_256.png", 40 | "384": "images/icons/icon_round_384.png", 41 | "512": "images/icons/icon_round_512.png", 42 | "1024": "images/icons/icon_round_1024.png" 43 | }, 44 | "content_scripts": [ 45 | { 46 | "matches": [ 47 | "" 48 | ], 49 | "js": [ 50 | "js/globals.js", 51 | "js/utils.js", 52 | "js/content.js" 53 | ], 54 | "css": [ 55 | "css/content.css" 56 | ], 57 | "run_at": "document_start", 58 | "all_frames": true, 59 | "match_origin_as_fallback": true 60 | } 61 | ], 62 | "host_permissions": [ 63 | "*://*/*", 64 | "" 65 | ], 66 | "permissions": [ 67 | "storage", 68 | "unlimitedStorage" 69 | ], 70 | "web_accessible_resources": [ 71 | { 72 | "resources": [ 73 | "images/*", 74 | "js/*", 75 | "css/*", 76 | "*.html" 77 | ], 78 | "matches": [ 79 | "" 80 | ] 81 | } 82 | ] 83 | } -------------------------------------------------------------------------------- /extension/options.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Preferences - JSON Formatter 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 |
22 | 23 |
24 |
25 |
26 | Default Tab 27 |
28 | 33 |
34 |
35 |
36 | 37 | 38 |
39 |
40 |
41 | Color Scheme 42 |
43 | 48 |
49 |
50 |
51 | 52 | 53 |
54 |
55 |
56 | Dark Mode Theme 57 |
58 | 61 |
62 |
63 |
64 | 65 | 66 |
67 |
68 |
69 | Light Mode Theme 70 |
71 | 74 |
75 |
76 |
77 | 78 | 79 | 95 |
96 | 97 | 98 | 114 |
115 | 116 | 117 |
118 |
119 |
120 | Word Wrapping 121 |
122 | 127 |
128 |
129 |
130 | 131 | 132 |
133 |
134 |
135 | Sorting Order 136 |
137 | 141 |
142 |
143 | 144 | 145 |
146 |
147 |
148 | Raw Unicode Escapes 149 |
150 | 155 |
156 |
157 | 158 | 159 |
160 |
161 |
162 | Context Menus 163 |
164 | 169 |
170 |
171 |
172 |
173 |
174 | 175 | 176 | -------------------------------------------------------------------------------- /extension/themes.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Manage Themes - JSON Formatter 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 36 | 37 |
38 | 60 |
61 |
62 | 63 | 64 | -------------------------------------------------------------------------------- /extension/whats-new.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Your JSON Formatter got updated! 9 | 10 | 11 | 12 | 13 | 14 | 15 | 21 |
22 |

Your JSON Formatter got updated!

23 |

We have fixed some bugs in this update.

24 |

Check out CHANGELOG for more information.

26 |

Thank you for your continued support!

27 |

PS: Follow @JSONFormatter_ on twitter (X) to stay 30 | updated with latest!

31 |
32 | 33 | 34 | -------------------------------------------------------------------------------- /images/banners/JF_VTuber_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arnav-kr/json-formatter/c1c0deaf26ecffb4ce44b7643f94d24209f973d5/images/banners/JF_VTuber_logo.png -------------------------------------------------------------------------------- /images/banners/JF_VTuber_logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /images/banners/promo_tile_lg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arnav-kr/json-formatter/c1c0deaf26ecffb4ce44b7643f94d24209f973d5/images/banners/promo_tile_lg.png -------------------------------------------------------------------------------- /images/banners/promo_tile_marquee.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arnav-kr/json-formatter/c1c0deaf26ecffb4ce44b7643f94d24209f973d5/images/banners/promo_tile_marquee.png -------------------------------------------------------------------------------- /images/banners/promo_tile_sm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arnav-kr/json-formatter/c1c0deaf26ecffb4ce44b7643f94d24209f973d5/images/banners/promo_tile_sm.png -------------------------------------------------------------------------------- /images/extension/chevron-down-dark.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /images/extension/chevron-down-light.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /images/extension/chevron-right-dark.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /images/extension/chevron-right-light.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /images/extension/icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /images/extension/icon_1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arnav-kr/json-formatter/c1c0deaf26ecffb4ce44b7643f94d24209f973d5/images/extension/icon_1024.png -------------------------------------------------------------------------------- /images/extension/icon_128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arnav-kr/json-formatter/c1c0deaf26ecffb4ce44b7643f94d24209f973d5/images/extension/icon_128.png -------------------------------------------------------------------------------- /images/extension/icon_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arnav-kr/json-formatter/c1c0deaf26ecffb4ce44b7643f94d24209f973d5/images/extension/icon_16.png -------------------------------------------------------------------------------- /images/extension/icon_2048.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arnav-kr/json-formatter/c1c0deaf26ecffb4ce44b7643f94d24209f973d5/images/extension/icon_2048.png -------------------------------------------------------------------------------- /images/extension/icon_256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arnav-kr/json-formatter/c1c0deaf26ecffb4ce44b7643f94d24209f973d5/images/extension/icon_256.png -------------------------------------------------------------------------------- /images/extension/icon_32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arnav-kr/json-formatter/c1c0deaf26ecffb4ce44b7643f94d24209f973d5/images/extension/icon_32.png -------------------------------------------------------------------------------- /images/extension/icon_384.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arnav-kr/json-formatter/c1c0deaf26ecffb4ce44b7643f94d24209f973d5/images/extension/icon_384.png -------------------------------------------------------------------------------- /images/extension/icon_48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arnav-kr/json-formatter/c1c0deaf26ecffb4ce44b7643f94d24209f973d5/images/extension/icon_48.png -------------------------------------------------------------------------------- /images/extension/icon_512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arnav-kr/json-formatter/c1c0deaf26ecffb4ce44b7643f94d24209f973d5/images/extension/icon_512.png -------------------------------------------------------------------------------- /images/extension/icon_64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arnav-kr/json-formatter/c1c0deaf26ecffb4ce44b7643f94d24209f973d5/images/extension/icon_64.png -------------------------------------------------------------------------------- /images/extension/icon_72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arnav-kr/json-formatter/c1c0deaf26ecffb4ce44b7643f94d24209f973d5/images/extension/icon_72.png -------------------------------------------------------------------------------- /images/extension/icon_round.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /images/extension/icon_round_1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arnav-kr/json-formatter/c1c0deaf26ecffb4ce44b7643f94d24209f973d5/images/extension/icon_round_1024.png -------------------------------------------------------------------------------- /images/extension/icon_round_128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arnav-kr/json-formatter/c1c0deaf26ecffb4ce44b7643f94d24209f973d5/images/extension/icon_round_128.png -------------------------------------------------------------------------------- /images/extension/icon_round_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arnav-kr/json-formatter/c1c0deaf26ecffb4ce44b7643f94d24209f973d5/images/extension/icon_round_16.png -------------------------------------------------------------------------------- /images/extension/icon_round_2048.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arnav-kr/json-formatter/c1c0deaf26ecffb4ce44b7643f94d24209f973d5/images/extension/icon_round_2048.png -------------------------------------------------------------------------------- /images/extension/icon_round_256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arnav-kr/json-formatter/c1c0deaf26ecffb4ce44b7643f94d24209f973d5/images/extension/icon_round_256.png -------------------------------------------------------------------------------- /images/extension/icon_round_32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arnav-kr/json-formatter/c1c0deaf26ecffb4ce44b7643f94d24209f973d5/images/extension/icon_round_32.png -------------------------------------------------------------------------------- /images/extension/icon_round_384.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arnav-kr/json-formatter/c1c0deaf26ecffb4ce44b7643f94d24209f973d5/images/extension/icon_round_384.png -------------------------------------------------------------------------------- /images/extension/icon_round_48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arnav-kr/json-formatter/c1c0deaf26ecffb4ce44b7643f94d24209f973d5/images/extension/icon_round_48.png -------------------------------------------------------------------------------- /images/extension/icon_round_512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arnav-kr/json-formatter/c1c0deaf26ecffb4ce44b7643f94d24209f973d5/images/extension/icon_round_512.png -------------------------------------------------------------------------------- /images/extension/icon_round_64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arnav-kr/json-formatter/c1c0deaf26ecffb4ce44b7643f94d24209f973d5/images/extension/icon_round_64.png -------------------------------------------------------------------------------- /images/extension/icon_round_72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arnav-kr/json-formatter/c1c0deaf26ecffb4ce44b7643f94d24209f973d5/images/extension/icon_round_72.png -------------------------------------------------------------------------------- /images/screenshots/clickable-links.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arnav-kr/json-formatter/c1c0deaf26ecffb4ce44b7643f94d24209f973d5/images/screenshots/clickable-links.png -------------------------------------------------------------------------------- /images/screenshots/different-formatting-modes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arnav-kr/json-formatter/c1c0deaf26ecffb4ce44b7643f94d24209f973d5/images/screenshots/different-formatting-modes.png -------------------------------------------------------------------------------- /images/screenshots/edge/clickable-links.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arnav-kr/json-formatter/c1c0deaf26ecffb4ce44b7643f94d24209f973d5/images/screenshots/edge/clickable-links.png -------------------------------------------------------------------------------- /images/screenshots/edge/different-formatting-modes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arnav-kr/json-formatter/c1c0deaf26ecffb4ce44b7643f94d24209f973d5/images/screenshots/edge/different-formatting-modes.png -------------------------------------------------------------------------------- /images/screenshots/edge/light-theme.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arnav-kr/json-formatter/c1c0deaf26ecffb4ce44b7643f94d24209f973d5/images/screenshots/edge/light-theme.png -------------------------------------------------------------------------------- /images/screenshots/edge/selecting-theme.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arnav-kr/json-formatter/c1c0deaf26ecffb4ce44b7643f94d24209f973d5/images/screenshots/edge/selecting-theme.png -------------------------------------------------------------------------------- /images/screenshots/edge/themes-preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arnav-kr/json-formatter/c1c0deaf26ecffb4ce44b7643f94d24209f973d5/images/screenshots/edge/themes-preview.png -------------------------------------------------------------------------------- /images/screenshots/firefox/clickable-links.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arnav-kr/json-formatter/c1c0deaf26ecffb4ce44b7643f94d24209f973d5/images/screenshots/firefox/clickable-links.png -------------------------------------------------------------------------------- /images/screenshots/firefox/different-formatting-modes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arnav-kr/json-formatter/c1c0deaf26ecffb4ce44b7643f94d24209f973d5/images/screenshots/firefox/different-formatting-modes.png -------------------------------------------------------------------------------- /images/screenshots/firefox/light-theme.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arnav-kr/json-formatter/c1c0deaf26ecffb4ce44b7643f94d24209f973d5/images/screenshots/firefox/light-theme.png -------------------------------------------------------------------------------- /images/screenshots/firefox/selecting-theme.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arnav-kr/json-formatter/c1c0deaf26ecffb4ce44b7643f94d24209f973d5/images/screenshots/firefox/selecting-theme.png -------------------------------------------------------------------------------- /images/screenshots/firefox/themes-preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arnav-kr/json-formatter/c1c0deaf26ecffb4ce44b7643f94d24209f973d5/images/screenshots/firefox/themes-preview.png -------------------------------------------------------------------------------- /images/screenshots/light-theme.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arnav-kr/json-formatter/c1c0deaf26ecffb4ce44b7643f94d24209f973d5/images/screenshots/light-theme.png -------------------------------------------------------------------------------- /images/screenshots/selecting-theme.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arnav-kr/json-formatter/c1c0deaf26ecffb4ce44b7643f94d24209f973d5/images/screenshots/selecting-theme.png -------------------------------------------------------------------------------- /images/screenshots/themes-preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arnav-kr/json-formatter/c1c0deaf26ecffb4ce44b7643f94d24209f973d5/images/screenshots/themes-preview.png --------------------------------------------------------------------------------