├── .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 | [](https://chrome.google.com/webstore/detail/json-formatter/gpmodmeblccallcadopbcoeoejepgpnb)
10 | [](https://chrome.google.com/webstore/detail/json-formatter/gpmodmeblccallcadopbcoeoejepgpnb)
11 | [](https://chrome.google.com/webstore/detail/json-formatter/gpmodmeblccallcadopbcoeoejepgpnb)
12 | [](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 |
34 |
35 |
36 |
37 |
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 | 
54 |
55 | 
56 |
57 | 
58 |
59 | 
60 |
61 | 
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 |
34 |
35 |
36 |
37 |
38 |
39 |
40 | Parsed View
41 |
42 |
43 |
44 | p
45 |
46 |
47 |
48 |
50 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 | Raw View
66 |
67 |
68 |
69 | r
70 |
71 |
72 |
73 |
75 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 | Formatted Raw View
91 |
92 |
93 |
94 | Shift + r
95 |
96 |
97 |
98 |
100 |
102 |
103 |
104 |
105 |
106 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 | Toggle Dark Mode
117 |
118 |
119 |
120 | d
121 |
122 |
123 |
124 |
126 |
128 |
129 |
130 |
131 |
132 |
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 |
142 | Collapse All
143 |
144 |
145 |
146 | [
147 |
148 |
149 |
150 |
152 |
154 |
155 |
156 |
157 |
158 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 | Expand All
169 |
170 |
171 |
172 | ]
173 |
174 |
175 |
176 |
178 |
180 |
181 |
182 |
183 |
184 |
185 |
186 |
187 |
188 |
189 |
190 |
191 |
192 |
193 | Toggle Toolbar
194 |
195 |
196 |
197 | t
198 |
199 |
200 |
201 |
203 |
205 |
206 |
207 |
208 |
209 |
211 |
212 |
213 |
214 |
215 |
216 |
217 |
218 |
220 |
222 |
224 |
225 | Reset to Default
226 |
227 |
228 |
229 |
230 |
231 |
232 |
233 |
Press desired key combination then press ENTER.
234 |
235 |
238 |
239 |
240 |
241 |
242 |
243 |
244 |
246 |
247 |
248 |
249 |
252 |
253 |
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 |
39 |
40 |
42 |
43 |
44 |
45 |
46 |
48 |
49 |
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 |
29 | Parsed
30 | Formatted Raw
31 | Raw
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 | Color Scheme
42 |
43 |
44 | System Default
45 | Dark
46 | Light
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 | Dark Mode Theme
57 |
58 |
59 | Default Dark
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 | Light Mode Theme
70 |
71 |
72 | Default Light
73 |
74 |
75 |
76 |
77 |
78 |
79 |
95 |
96 |
97 |
98 |
114 |
115 |
116 |
117 |
118 |
119 |
120 | Word Wrapping
121 |
122 |
124 | Enabled
125 | Disabled
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 |
135 | Sorting Order
136 |
137 |
138 | Alphabetical
139 | Unchanged
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 | Raw Unicode Escapes
149 |
150 |
152 | Enabled
153 | Disabled
154 |
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 |
23 |
24 |
25 |
27 |
28 |
29 |
30 |
32 |
33 |
34 |
35 |
36 |
37 |
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 |
16 |
17 |
18 |
19 |
20 |
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
--------------------------------------------------------------------------------