├── .gitignore ├── projecticon.png ├── media ├── localstyle.css ├── page.js ├── jsoneditor.min.css └── img │ └── jsoneditor-icons.svg ├── .vscodeignore ├── .vscode ├── extensions.json ├── settings.json ├── tasks.json └── launch.json ├── CONTRIBUTING.md ├── src ├── test │ ├── runTest.ts │ └── suite │ │ ├── index.ts │ │ └── extension.test.ts └── extension.ts ├── tsconfig.json ├── prettier.config.js ├── LICENSE ├── README.md ├── package.json ├── CHANGELOG.md ├── vsc-extension-quickstart.md └── .eslintrc.js /.gitignore: -------------------------------------------------------------------------------- 1 | out 2 | node_modules 3 | .vscode-test/ 4 | *.vsix 5 | -------------------------------------------------------------------------------- /projecticon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccimage/jsonviewer/HEAD/projecticon.png -------------------------------------------------------------------------------- /media/localstyle.css: -------------------------------------------------------------------------------- 1 | body { font: 12pt; } 2 | #jsoneditor { width: 100%; background-color:white; } -------------------------------------------------------------------------------- /.vscodeignore: -------------------------------------------------------------------------------- 1 | .vscode/** 2 | .vscode-test/** 3 | out/test/** 4 | out/**/*.map 5 | src/** 6 | .gitignore 7 | tsconfig.json 8 | vsc-extension-quickstart.md 9 | tslint.json -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | // See http://go.microsoft.com/fwlink/?LinkId=827846 3 | // for the documentation about the extensions.json format 4 | "recommendations": [ 5 | "eg2.tslint" 6 | ] 7 | } -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | ## Contributing 2 | 3 | update 4 | > change version number in package.json 5 | > add change log 6 | 7 | build 8 | 9 | > npm run compile 10 | 11 | publish 12 | 13 | > vsce publish 14 | 15 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | // Place your settings in this file to overwrite default and user settings. 2 | { 3 | "files.exclude": { 4 | "out": false // set this to true to hide the "out" folder with the compiled JS files 5 | }, 6 | "search.exclude": { 7 | "out": true // set this to false to include "out" folder in search results 8 | } 9 | } -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | // See https://go.microsoft.com/fwlink/?LinkId=733558 2 | // for the documentation about the tasks.json format 3 | { 4 | "version": "2.0.0", 5 | "tasks": [ 6 | { 7 | "type": "npm", 8 | "script": "watch", 9 | "problemMatcher": "$tsc-watch", 10 | "isBackground": true, 11 | "presentation": { 12 | "reveal": "never" 13 | }, 14 | "group": { 15 | "kind": "build", 16 | "isDefault": true 17 | } 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /media/page.js: -------------------------------------------------------------------------------- 1 | function initDoc(text){ 2 | var container = document.getElementById('jsoneditor'); 3 | var options = { mode: 'view', 4 | modes: ['view', 'code', 'text', 'tree'], 5 | onModeChange: function (newMode, oldMode) { 6 | console.log('Mode switched from', oldMode, 'to', newMode); 7 | container.style.height = window.innerHeight + "px"; 8 | } 9 | }; 10 | var editor = new JSONEditor(container, options, decodeURIComponent(text)); 11 | container.style.height = window.innerHeight + "px"; 12 | } -------------------------------------------------------------------------------- /src/test/runTest.ts: -------------------------------------------------------------------------------- 1 | import * as path from 'path'; 2 | 3 | import { runTests } from '@vscode/test-electron'; 4 | 5 | async function main() { 6 | try { 7 | // The folder containing the Extension Manifest package.json 8 | // Passed to `--extensionDevelopmentPath` 9 | const extensionDevelopmentPath = path.resolve(__dirname, '../../'); 10 | 11 | // The path to the extension test script 12 | // Passed to --extensionTestsPath 13 | const extensionTestsPath = path.resolve(__dirname, './suite/index'); 14 | 15 | // Download VS Code, unzip it and run the integration test 16 | await runTests({ extensionDevelopmentPath, extensionTestsPath }); 17 | } catch (err) { 18 | console.error('Failed to run tests'); 19 | process.exit(1); 20 | } 21 | } 22 | 23 | main(); -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es6", 5 | "outDir": "out", 6 | "lib": [ 7 | "es6" 8 | ], 9 | "sourceMap": true, 10 | "rootDir": "src", 11 | /* Strict Type-Checking Option */ 12 | "strict": true, /* enable all strict type-checking options */ 13 | /* Additional Checks */ 14 | "noUnusedLocals": true /* Report errors on unused locals. */ 15 | // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ 16 | // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ 17 | // "noUnusedParameters": true, /* Report errors on unused parameters. */ 18 | }, 19 | "exclude": [ 20 | "node_modules", 21 | ".vscode-test" 22 | ] 23 | } -------------------------------------------------------------------------------- /prettier.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | arrowParens: "avoid", // 只有一个参数的箭头函数的参数是否带圆括号(默认avoid) 3 | bracketSpacing: true, // 对象字面量的大括号间使用空格(默认true) 4 | cursorOffset: 1, // Print (to stderr) where a cursor at the given position would move to after formatting.\nThis option cannot be used with --range-start and --range-end. 5 | endOfLine: "lf", // Which end of line characters to apply. 6 | // htmlWhitespaceSensitivity: "strict", 7 | // insertPragma: false, 8 | jsxBracketSameLine: false, // 多行JSX中的>放置在最后一行的结尾,而不是另起一行(默认false) 9 | jsxSingleQuote: true, 10 | printWidth: 120, // 每行代码长度(默认80) 11 | // proseWrap: "preserve", 12 | // requirePragma: false, 13 | semi: true, // 声明结尾使用分号(默认true) 14 | singleQuote: false, // 使用单引号(默认false) 15 | tabWidth: 4, // 每个tab相当于多少个空格(默认2) 16 | // trailingComma: 'none', // 多行使用拖尾逗号(默认none) 17 | useTabs: false, // 是否使用tab进行缩进(默认false) 18 | }; 19 | -------------------------------------------------------------------------------- /src/test/suite/index.ts: -------------------------------------------------------------------------------- 1 | import * as path from 'path'; 2 | import * as Mocha from 'mocha'; 3 | import * as glob from 'glob'; 4 | 5 | export function run(): Promise { 6 | // Create the mocha test 7 | const mocha = new Mocha({ 8 | ui: 'tdd' 9 | }); 10 | 11 | const testsRoot = path.resolve(__dirname, '..'); 12 | 13 | return new Promise((c, e) => { 14 | glob('**/**.test.js', { cwd: testsRoot }, (err: any, files: string[]) => { 15 | if (err) { 16 | return e(err); 17 | } 18 | 19 | // Add files to the test suite 20 | files.forEach(f => mocha.addFile(path.resolve(testsRoot, f))); 21 | 22 | try { 23 | // Run the mocha test 24 | mocha.run(failures => { 25 | if (failures > 0) { 26 | e(new Error(`${failures} tests failed.`)); 27 | } else { 28 | c(); 29 | } 30 | }); 31 | } catch (err) { 32 | console.error(err); 33 | e(err); 34 | } 35 | }); 36 | }); 37 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 mrche 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 | Download as VSCode Extenstion: [JSON Viewer](https://marketplace.visualstudio.com/items?itemName=ccimage.jsonviewer) 2 | 3 | Project home page [http://www.github.com/ccimage/jsonviewer](http://www.github.com/ccimage/jsonviewer) 4 | 5 | //~~Based on chrome/firefox extension [jsonview](https://github.com/bhollis/jsonview)~~ 6 | 7 | Change viewer to [JSONEditor](https://github.com/josdejong/jsoneditor) 8 | 9 | 10 | ## install 11 | - Open vscode and search extensions for 'json viewer' 12 | - download 13 | - reload 14 | - Usage: open a file, Press F1 and run 'Open in json viewer' 15 | Run the command again on editor to update the view. 16 | ## Features 17 | 18 | Show JSON file as a treeview in vscode. 19 | 20 | 21 | ## Requirements 22 | 23 | VSCode 24 | 25 | ## Extension Settings 26 | 27 | Null 28 | 29 | ## Known Issues 30 | - if string value with the letter ", the escape character will always shows (as \\") 31 | - others: 32 | > https://github.com/ccimage/jsonviewer/issues 33 | 34 | 35 | 36 | ## Release Notes 37 | Special thanks to [JSONEditor](https://github.com/josdejong/jsoneditor) 38 | 39 | JSONViewer is open source software under the MIT licence. 40 | 41 | ## Thanks 42 | Alex Giddings add feature: open json with comments -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | // A launch configuration that compiles the extension and then opens it inside a new window 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | { 6 | "version": "0.2.0", 7 | "configurations": [ 8 | { 9 | "name": "Extension", 10 | "type": "extensionHost", 11 | "request": "launch", 12 | "runtimeExecutable": "${execPath}", 13 | "args": [ 14 | "--extensionDevelopmentPath=${workspaceFolder}" 15 | ], 16 | "outFiles": [ 17 | "${workspaceFolder}/out/**/*.js" 18 | ], 19 | "preLaunchTask": "npm: watch" 20 | }, 21 | { 22 | "name": "Extension Tests", 23 | "type": "extensionHost", 24 | "request": "launch", 25 | "runtimeExecutable": "${execPath}", 26 | "args": [ 27 | "--extensionDevelopmentPath=${workspaceFolder}", 28 | "--extensionTestsPath=${workspaceFolder}/out/test" 29 | ], 30 | "outFiles": [ 31 | "${workspaceFolder}/out/test/**/*.js" 32 | ], 33 | "preLaunchTask": "npm: watch" 34 | } 35 | ] 36 | } 37 | -------------------------------------------------------------------------------- /src/test/suite/extension.test.ts: -------------------------------------------------------------------------------- 1 | import * as assert from 'assert'; 2 | import * as path from 'path'; 3 | 4 | // You can import and use all API from the 'vscode' module 5 | // as well as import your extension to test it 6 | import * as vscode from 'vscode'; 7 | import * as myExtension from '../../extension'; 8 | 9 | suite('Extension Test Suite', () => { 10 | vscode.window.showInformationMessage('Start all tests.'); 11 | vscode.window.showOpenDialog().then((uri) => { 12 | console.log("uri=", uri); 13 | const currentPanel = vscode.window.createWebviewPanel( 14 | 'ccjsonviewer', // Identifies the type of the webview. Used internally 15 | "Json Viewer", // Title of the panel displayed to the user 16 | vscode.ViewColumn.One, // Editor column to show the new webview panel in. 17 | { 18 | enableScripts: true, 19 | localResourceRoots: [ 20 | vscode.Uri.file(path.join('../../../../', 'media')) 21 | ] 22 | } // Webview options. More on these later. 23 | ); 24 | const editor = vscode.window.activeTextEditor!; 25 | // And set its HTML content 26 | currentPanel.webview.html = myExtension.jsonToHTML(editor.document.getText(), editor.document.uri.toString(), '../../../../', currentPanel.webview); 27 | }); 28 | 29 | test('Sample test', () => { 30 | assert.strictEqual([1, 2, 3].indexOf(5), -1); 31 | assert.strictEqual([1, 2, 3].indexOf(0), -1); 32 | }); 33 | 34 | }); -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jsonviewer", 3 | "displayName": "JSON Viewer", 4 | "description": "Preview JSON as tree view on VSCode", 5 | "version": "1.5.2", 6 | "publisher": "ccimage", 7 | "icon": "projecticon.png", 8 | "repository": { 9 | "type": "git", 10 | "url": "https://github.com/ccimage/jsonviewer" 11 | }, 12 | "engines": { 13 | "vscode": "^1.34.0" 14 | }, 15 | "categories": [ 16 | "Formatters" 17 | ], 18 | "activationEvents": [ 19 | "onCommand:extension.viewJson" 20 | ], 21 | "main": "./out/extension", 22 | "contributes": { 23 | "commands": [ 24 | { 25 | "command": "extension.viewJson", 26 | "title": "Open in json viewer" 27 | } 28 | ] 29 | }, 30 | "scripts": { 31 | "vscode:prepublish": "npm run compile", 32 | "compile": "tsc -p ./", 33 | "watch": "tsc -watch -p ./", 34 | "lint": "eslint . --ext .ts,.tsx", 35 | "test": "node ./out/test/runTest.js" 36 | }, 37 | "dependencies": { 38 | "comment-json": "^4.2.3" 39 | }, 40 | "devDependencies": { 41 | "@types/glob": "^7.2.0", 42 | "@types/mocha": "^9.1.0", 43 | "@types/node": "^14.14.37", 44 | "@types/vscode": "^1.34.0", 45 | "@typescript-eslint/parser": "^4.22.1", 46 | "@vscode/test-electron": "^2.1.2", 47 | "eslint": "^7.23.0", 48 | "eslint-config-prettier": "^8.1.0", 49 | "eslint-plugin-import": "^2.22.1", 50 | "eslint-plugin-prettier": "^3.3.1", 51 | "lint-staged": "^11.0.0", 52 | "mocha": "^9.2.1", 53 | "prettier": "^2.2.1", 54 | "typescript": "^4.5.5" 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | All notable changes to the "jsonviewer" extension will be documented in this file. 3 | 4 | Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file. 5 | 6 | ## [1.5.2] - 2024-8-16 7 | - fix/improve: not render when have ‘ in json key or value 8 | 9 | ## [1.5.1] - 2024-8-15 10 | - fix/improve: [#11](https://github.com/ccimage/jsonviewer/issues/11) "parseError": "Invalid character '\n' at position " 11 | 12 | ## [1.5.0] - 2023-9-26 13 | - fix/improve: retain context when hidden tabs. 14 | 15 | ## [1.4.0] - 2023-8-21 16 | - fix: [#8](https://github.com/ccimage/jsonviewer/issues/8) uint64 numbers are displayed incorrectly 17 | - replace json editor with a version forked by myself. to make long number correct (use bigint) 18 | 19 | ## [1.3.3] - 2023-8-18 20 | - fix: [#7](https://github.com/ccimage/jsonviewer/issues/7) Json viewer will break (cannot be rendered properly) if there is a text `````` in any json strings 21 | 22 | ## [1.3.2] - 2023-1-5 23 | - fix: comment-json module not found 24 | 25 | ## [1.3.0] - 2023-1-5 26 | - new: open json with comments by Alex Giddings 27 | 28 | ## [1.2.5] - 2022-8-31 29 | - update: add some other modes to the editor (open a menu) 30 | 31 | ## [1.2.4] - 2022-8-31 32 | - update: upgrade version of JSONEditor to v9.9.0 33 | 34 | ## [1.2.3] - 2022-2-25 35 | - update: dev tools, engine to vscode 1.34 and shift tslint to eslint 36 | - update: use new api of webview 37 | 38 | ## [1.2.1] - 2018-09-14 39 | - change js resource link to local file 40 | 41 | ## [1.2.2] - 2018-10-08 42 | - fixed: See nothing on Dark theme 43 | 44 | ## [1.1.1] 45 | - fix bug: Icons not display 46 | 47 | ## [1.1.0] - 2018-08-24 48 | - update viwer to JSONEditor's Viewer 49 | - command menu display as 'Open in json viewer' 50 | 51 | ## [1.0.3] 52 | - add project icon 53 | 54 | ## [1.0.2] - 2018-05-21 55 | - fix some mistake on the document 56 | 57 | ## [1.0.0] - 2018-05-20 58 | - First version 59 | - Based on chrome/firefox extension [jsonview](https://github.com/bhollis/jsonview) 60 | - All of the codes are from [jsonview](https://github.com/bhollis/jsonview) excepted the in18 and error message 61 | -------------------------------------------------------------------------------- /vsc-extension-quickstart.md: -------------------------------------------------------------------------------- 1 | # Welcome to your VS Code Extension 2 | 3 | ## What's in the folder 4 | * This folder contains all of the files necessary for your extension. 5 | * `package.json` - this is the manifest file in which you declare your extension and command. 6 | The sample plugin registers a command and defines its title and command name. With this information 7 | VS Code can show the command in the command palette. It doesn’t yet need to load the plugin. 8 | * `src/extension.ts` - this is the main file where you will provide the implementation of your command. 9 | The file exports one function, `activate`, which is called the very first time your extension is 10 | activated (in this case by executing the command). Inside the `activate` function we call `registerCommand`. 11 | We pass the function containing the implementation of the command as the second parameter to 12 | `registerCommand`. 13 | 14 | ## Get up and running straight away 15 | * Press `F5` to open a new window with your extension loaded. 16 | * Run your command from the command palette by pressing (`Ctrl+Shift+P` or `Cmd+Shift+P` on Mac) and typing `Hello World`. 17 | * Set breakpoints in your code inside `src/extension.ts` to debug your extension. 18 | * Find output from your extension in the debug console. 19 | 20 | ## Make changes 21 | * You can relaunch the extension from the debug toolbar after changing code in `src/extension.ts`. 22 | * You can also reload (`Ctrl+R` or `Cmd+R` on Mac) the VS Code window with your extension to load your changes. 23 | 24 | ## Explore the API 25 | * You can open the full set of our API when you open the file `node_modules/vscode/vscode.d.ts`. 26 | 27 | ## Run tests 28 | * Open the debug viewlet (`Ctrl+Shift+D` or `Cmd+Shift+D` on Mac) and from the launch configuration dropdown pick `Launch Tests`. 29 | * Press `F5` to run the tests in a new window with your extension loaded. 30 | * See the output of the test result in the debug console. 31 | * Make changes to `test/extension.test.ts` or create new test files inside the `test` folder. 32 | * By convention, the test runner will only consider files matching the name pattern `**.test.ts`. 33 | * You can create folders inside the `test` folder to structure your tests any way you want. 34 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | // https://eslint.org/docs/rules/ 2 | module.exports = { 3 | root: true, 4 | env: { 5 | node: true, 6 | es6: true, 7 | }, 8 | parser: "@typescript-eslint/parser", 9 | parserOptions: { 10 | parser: "@typescript-eslint/parser", 11 | ecmaVersion: 2020, 12 | sourceType: "module", 13 | project: ["tsconfig.eslint.json"], 14 | }, 15 | extends: [ 16 | "airbnb-base", 17 | "airbnb-typescript/base", 18 | "plugin:@typescript-eslint/recommended", 19 | "plugin:@typescript-eslint/recommended-requiring-type-checking", 20 | "prettier", 21 | "plugin:prettier/recommended", 22 | ], 23 | ignorePatterns: [ 24 | "src/generate/*", 25 | "src/config/Config/*.ts", 26 | "src/common/TEA.ts", 27 | "src/common/TSTea*", 28 | "submodules/AkaShareCode/BattleLogic/*", 29 | ], 30 | rules: { 31 | "prettier/prettier": [ 32 | 1, 33 | { 34 | endOfLine: "lf", 35 | printWidth: 130, 36 | tabWidth: 4, 37 | trailingComma: "all", 38 | }, 39 | ], 40 | "no-debugger": process.env.NODE_ENV === "production" ? 2 : 1, 41 | "import/no-cycle": 0, 42 | "import/no-dynamic-require": 0, 43 | "import/order": [ 44 | 1, 45 | { 46 | groups: ["builtin", "external", "internal", "parent", "sibling", "index", "object", "type"], 47 | alphabetize: { order: "asc", caseInsensitive: true }, 48 | }, 49 | ], 50 | "import/prefer-default-export": 0, 51 | "@typescript-eslint/lines-between-class-members": 0, 52 | "@typescript-eslint/no-explicit-any": 0, 53 | "@typescript-eslint/no-inferrable-types": [1, { ignoreParameters: true, ignoreProperties: true }], 54 | "@typescript-eslint/no-misused-promises": [2, { checksVoidReturn: false }], 55 | "@typescript-eslint/no-non-null-assertion": 0, 56 | "@typescript-eslint/no-unsafe-argument": 0, 57 | "@typescript-eslint/no-unsafe-assignment": 0, 58 | "@typescript-eslint/no-unsafe-member-access": 0, 59 | "@typescript-eslint/no-use-before-define": [ 60 | 2, 61 | { 62 | classes: false, 63 | functions: false, 64 | enums: false, 65 | typedefs: false, 66 | ignoreTypeReferences: true, 67 | }, 68 | ], 69 | "@typescript-eslint/require-await": 1, 70 | "@typescript-eslint/no-var-requires": 0, 71 | "@typescript-eslint/ban-ts-comment": 0, 72 | "@typescript-eslint/no-unsafe-call": 0, 73 | "@typescript-eslint/restrict-template-expressions": 0, 74 | "@typescript-eslint/no-unused-vars": 0, 75 | "global-require": 0, 76 | "no-console": 0, 77 | "no-constant-condition": 0, 78 | "object-shorthand": 0, 79 | "class-methods-use-this": 0, 80 | "comma-dangle": [1, "always-multiline"], // 尾部的"," 81 | "eol-last": 1, // 文件后的空行 82 | eqeqeq: [2, "smart"], 83 | "lines-between-class-members": [1, "always", { exceptAfterSingleLine: true }], // Class属性间的换行 84 | "max-classes-per-file": 0, 85 | "no-await-in-loop": 0, 86 | "no-continue": 0, 87 | "no-param-reassign": 0, 88 | "no-plusplus": 0, 89 | "no-restricted-syntax": 0, 90 | "no-underscore-dangle": 0, 91 | "no-unused-vars": 0, // 禁止未使用变量 92 | "no-var": 2, // 禁止var 93 | "no-void": 0, 94 | "prefer-const": 2, // 尽量使用const 95 | "prefer-destructuring": 0, 96 | "prefer-template": 1, 97 | "quote-props": [2, "as-needed"], // 属性的引号 98 | "no-empty": 0, 99 | "prefer-exponentiation-operator": 0, // Math.pow ==> ** 100 | "no-restricted-properties": 0, // Math.pow ==> ** 101 | "no-bitwise": 0, 102 | radix: [1, "as-needed"], 103 | "func-names": 0, 104 | }, 105 | }; 106 | -------------------------------------------------------------------------------- /src/extension.ts: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | // The module 'vscode' contains the VS Code extensibility API 3 | // Import the module and reference it with the alias vscode in your code below 4 | import * as vscode from "vscode"; 5 | import * as path from "path"; 6 | import { parse as jsonParse, stringify as jsonStringify } from "comment-json"; 7 | 8 | // Track currently webview panel 9 | let currentPanel: vscode.WebviewPanel | undefined = undefined; 10 | 11 | // this method is called when your extension is activated 12 | // your extension is activated the very first time the command is executed 13 | export function activate(context: vscode.ExtensionContext) { 14 | // Use the console to output diagnostic information (console.log) and errors (console.error) 15 | // This line of code will only be executed once when your extension is activated 16 | //console.log('Congratulations, your extension "jsonviewer" is now active!'); 17 | 18 | // The command has been defined in the package.json file 19 | // Now provide the implementation of the command with registerCommand 20 | // The commandId parameter must match the command field in package.json 21 | let disposable = vscode.commands.registerCommand("extension.viewJson", () => { 22 | // The code you place here will be executed every time your command is executed 23 | 24 | const columnToShowIn = vscode.window.activeTextEditor ? vscode.window.activeTextEditor.viewColumn : undefined; 25 | 26 | let editor = vscode.window.activeTextEditor; 27 | if (!editor) { 28 | return; // No open text editor 29 | } 30 | 31 | if (currentPanel) { 32 | // If we already have a panel, show it in the target column 33 | currentPanel.reveal(columnToShowIn); 34 | currentPanel.webview.html = jsonToHTML( 35 | editor.document.getText(), 36 | editor.document.uri.toString(), 37 | context.extensionPath, 38 | currentPanel.webview 39 | ); 40 | } else { 41 | // Create and show a new webview 42 | currentPanel = vscode.window.createWebviewPanel( 43 | "ccjsonviewer", // Identifies the type of the webview. Used internally 44 | "Json Viewer", // Title of the panel displayed to the user 45 | vscode.ViewColumn.One, // Editor column to show the new webview panel in. 46 | { 47 | enableScripts: true, 48 | localResourceRoots: [vscode.Uri.file(path.join(context.extensionPath, "media"))], 49 | retainContextWhenHidden: true 50 | } // Webview options. More on these later. 51 | ); 52 | // And set its HTML content 53 | currentPanel.webview.html = jsonToHTML( 54 | editor.document.getText(), 55 | editor.document.uri.toString(), 56 | context.extensionPath, 57 | currentPanel.webview 58 | ); 59 | currentPanel.onDidDispose( 60 | () => { 61 | currentPanel = undefined; 62 | }, 63 | null, 64 | context.subscriptions 65 | ); 66 | } 67 | }); 68 | 69 | 70 | context.subscriptions.push(disposable); 71 | } 72 | 73 | // this method is called when your extension is deactivated 74 | export function deactivate() { 75 | if (currentPanel) { 76 | currentPanel.dispose(); 77 | } 78 | 79 | currentPanel = undefined; 80 | } 81 | 82 | /** 83 | * The JSONFormatter helper module. This contains two major functions, jsonToHTML and errorPage, 84 | * each of which returns an HTML document. 85 | */ 86 | 87 | /** Convert a whole JSON value / JSONP response into a formatted HTML document */ 88 | export function jsonToHTML(jsonStr: string, uri: string, rootPath: string, webView: vscode.Webview) { 89 | // if(typeof json === 'string'){ 90 | // try{ 91 | // json = JSON.parse(json); 92 | // } 93 | // catch(e){ 94 | // //console.log(e); 95 | // let error:Error = e; 96 | 97 | // return error.stack || "Unknown exception occured on JSON parse."; 98 | // } 99 | 100 | // } 101 | try { 102 | // jsonStr = jsonStr.replace(/\n/g, ""); 103 | jsonParse(jsonStr, undefined, true); 104 | } catch (e) { 105 | jsonStr = '{"error":"json format not correct."}'; 106 | } 107 | return toHTML(jsonStr, uri, rootPath, webView); 108 | //return toHTML(jsonToHTMLBody(json), uri); 109 | } 110 | 111 | /** Convert a whole JSON value / JSONP response into an HTML body, without title and scripts */ 112 | // function jsonToHTMLBody(json: any) { 113 | // return `
${valueToHTML(json, '')}
`; 114 | // } 115 | 116 | /** 117 | * Encode a string to be used in HTML 118 | */ 119 | function htmlEncode(t: any): string { 120 | return typeof t !== "undefined" && t !== null 121 | ? t.toString().replace(/&/g, "&").replace(/"/g, """).replace(//g, ">") 122 | : ""; 123 | } 124 | 125 | /** 126 | * Completely escape a json string 127 | */ 128 | function jsString(s: string): string { 129 | // Slice off the surrounding quotes 130 | s = jsonStringify(s).slice(1, -1); 131 | return htmlEncode(s); 132 | } 133 | 134 | /** 135 | * Is this a valid "bare" property name? 136 | */ 137 | function isBareProp(prop: string): boolean { 138 | return /^[A-Za-z_$][A-Za-z0-9_\-$]*$/.test(prop); 139 | } 140 | 141 | /** 142 | * Surround value with a span, including the given className 143 | */ 144 | function decorateWithSpan(value: any, className: string) { 145 | return `${htmlEncode(value)}`; 146 | } 147 | 148 | // Convert a basic JSON datatype (number, string, boolean, null, object, array) into an HTML fragment. 149 | function valueToHTML(value: any, path: string) { 150 | const valueType = typeof value; 151 | 152 | if (value === null) { 153 | return decorateWithSpan("null", "null"); 154 | } else if (Array.isArray(value)) { 155 | return arrayToHTML(value, path); 156 | } else if (valueType === "object") { 157 | return objectToHTML(value, path); 158 | } else if (valueType === "number") { 159 | return decorateWithSpan(value, "num"); 160 | } else if (valueType === "string" && value.charCodeAt(0) === 8203 && !isNaN(value.slice(1))) { 161 | return decorateWithSpan(value.slice(1), "num"); 162 | } else if (valueType === "string") { 163 | if (/^(http|https|file):\/\/[^\s]+$/i.test(value)) { 164 | return `"${jsString( 165 | value 166 | )}"`; 167 | } else { 168 | return `"${jsString(value)}"`; 169 | } 170 | } else if (valueType === "boolean") { 171 | return decorateWithSpan(value, "bool"); 172 | } 173 | 174 | return ""; 175 | } 176 | 177 | // Convert an array into an HTML fragment 178 | function arrayToHTML(json: any, path: string) { 179 | if (json.length === 0) { 180 | return "[ ]"; 181 | } 182 | 183 | let output = ""; 184 | for (let i = 0; i < json.length; i++) { 185 | const subPath = `${path}[${i}]`; 186 | output += "
  • " + valueToHTML(json[i], subPath); 187 | if (i < json.length - 1) { 188 | output += ","; 189 | } 190 | output += "
  • "; 191 | } 192 | return ( 193 | (json.length === 0 ? "" : '') + `[]` 194 | ); 195 | } 196 | 197 | // Convert a JSON object to an HTML fragment 198 | function objectToHTML(json: any, path: string) { 199 | let numProps = Object.keys(json).length; 200 | if (numProps === 0) { 201 | return "{ }"; 202 | } 203 | 204 | let output = ""; 205 | for (const prop in json) { 206 | let subPath = ""; 207 | let escapedProp = jsonStringify(prop).slice(1, -1); 208 | const bare = isBareProp(prop); 209 | if (bare) { 210 | subPath = `${path}.${escapedProp}`; 211 | } else { 212 | escapedProp = `"${escapedProp}"`; 213 | } 214 | output += `
  • "${jsString(prop)}": ${valueToHTML( 217 | json[prop], 218 | subPath 219 | )}`; 220 | if (numProps > 1) { 221 | output += ","; 222 | } 223 | output += "
  • "; 224 | numProps--; 225 | } 226 | 227 | return `{}`; 228 | } 229 | /* 230 | // Clean up a JSON parsing error message 231 | function massageError(error: Error): { 232 | message: string; 233 | line?: number; 234 | column?: number; 235 | } { 236 | if (!error.message) { 237 | return error; 238 | } 239 | 240 | const message = error.message.replace(/^JSON.parse: /, '').replace(/of the JSON data/, ''); 241 | const parts = /line (\d+) column (\d+)/.exec(message); 242 | if (!parts || parts.length !== 3) { 243 | return error; 244 | } 245 | 246 | return { 247 | message: htmlEncode(message), 248 | line: Number(parts[1]), 249 | column: Number(parts[2]) 250 | }; 251 | } 252 | 253 | function highlightError(data: string, lineNum?: number, columnNum?: number) { 254 | if (!lineNum || !columnNum) { 255 | return htmlEncode(data); 256 | } 257 | 258 | const lines = data.match(/^.*((\r\n|\n|\r)|$)/gm)!; 259 | 260 | let output = ''; 261 | for (let i = 0; i < lines.length; i++) { 262 | const line = lines[i]; 263 | 264 | if (i === lineNum - 1) { 265 | output += ''; 266 | output += `${htmlEncode(line.substring(0, columnNum - 1))}${htmlEncode(line[columnNum - 1])}${htmlEncode(line.substring(columnNum))}`; 267 | output += ''; 268 | } else { 269 | output += htmlEncode(line); 270 | } 271 | } 272 | 273 | return output; 274 | } 275 | */ 276 | 277 | // Wrap the HTML fragment in a full document. Used by jsonToHTML and errorPage. 278 | function toHTML(content: string, title: string, extPath: string, webView: vscode.Webview) { 279 | // Local path to main script run in the webview 280 | const extScriptOnDisk = vscode.Uri.file(path.join(extPath, "media", "jsoneditor.min.js")); 281 | const extCssOnDisk = vscode.Uri.file(path.join(extPath, "media", "jsoneditor.min.css")); 282 | 283 | const localCssOnDisk = vscode.Uri.file(path.join(extPath, "media", "localstyle.css")); 284 | const localScriptOnDisk = vscode.Uri.file(path.join(extPath, "media", "page.js")); 285 | 286 | // And the uri we use to load this script in the webview 287 | // const scriptUri = scriptPathOnDisk.with({ scheme: 'vscode-resource' }); 288 | // const cssUri = cssPathOnDisk.with({ scheme: 'vscode-resource' }); 289 | // upgrade to new api 2022-2 290 | const extScriptUri = webView.asWebviewUri(extScriptOnDisk); 291 | const extCssUri = webView.asWebviewUri(extCssOnDisk); 292 | 293 | const localCssUri = webView.asWebviewUri(localCssOnDisk); 294 | const localScriptUri = webView.asWebviewUri(localScriptOnDisk); 295 | 296 | // Use a nonce to whitelist which scripts can be run 297 | const nonce = getNonce(); 298 | // console.log("content = ", content); 299 | return `${htmlEncode(title)} | Viewer 300 | 301 | 302 | 303 |
    304 | 307 | 308 | `; 309 | } 310 | 311 | function getNonce() { 312 | let text = ""; 313 | const possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; 314 | for (let i = 0; i < 32; i++) { 315 | text += possible.charAt(Math.floor(Math.random() * possible.length)); 316 | } 317 | return text; 318 | } 319 | -------------------------------------------------------------------------------- /media/jsoneditor.min.css: -------------------------------------------------------------------------------- 1 | .jsoneditor input,.jsoneditor input:not([type]),.jsoneditor input[type=search],.jsoneditor input[type=text],.jsoneditor-modal input,.jsoneditor-modal input:not([type]),.jsoneditor-modal input[type=search],.jsoneditor-modal input[type=text]{height:auto;border:inherit;box-shadow:none;font-size:inherit;box-sizing:inherit;padding:inherit;font-family:inherit;transition:none;line-height:inherit}.jsoneditor input:focus,.jsoneditor input:not([type]):focus,.jsoneditor input[type=search]:focus,.jsoneditor input[type=text]:focus,.jsoneditor-modal input:focus,.jsoneditor-modal input:not([type]):focus,.jsoneditor-modal input[type=search]:focus,.jsoneditor-modal input[type=text]:focus{border:inherit;box-shadow:inherit}.jsoneditor textarea,.jsoneditor-modal textarea{height:inherit}.jsoneditor select,.jsoneditor-modal select{display:inherit;height:inherit}.jsoneditor label,.jsoneditor-modal label{font-size:inherit;font-weight:inherit;color:inherit}.jsoneditor table,.jsoneditor-modal table{border-collapse:collapse;width:auto}.jsoneditor td,.jsoneditor th,.jsoneditor-modal td,.jsoneditor-modal th{padding:0;display:table-cell;text-align:left;vertical-align:inherit;border-radius:inherit}.jsoneditor .autocomplete.dropdown{position:absolute;background:#fff;box-shadow:2px 2px 12px rgba(128,128,128,.3);border:1px solid #d3d3d3;overflow-x:hidden;overflow-y:auto;cursor:default;margin:0;padding:5px;text-align:left;outline:0;font-family:consolas,menlo,monaco,"Ubuntu Mono",source-code-pro,monospace;font-size:14px}.jsoneditor .autocomplete.dropdown .item{color:#1a1a1a}.jsoneditor .autocomplete.dropdown .item.hover{background-color:#ebebeb}.jsoneditor .autocomplete.hint{color:#a1a1a1;top:4px;left:4px}.jsoneditor-contextmenu-root{position:relative;width:0;height:0}.jsoneditor-contextmenu{position:absolute;box-sizing:content-box;z-index:2}.jsoneditor-contextmenu .jsoneditor-menu{position:relative;left:0;top:0;width:128px;height:auto;background:#fff;border:1px solid #d3d3d3;box-shadow:2px 2px 12px rgba(128,128,128,.3);list-style:none;margin:0;padding:0}.jsoneditor-contextmenu .jsoneditor-menu button{position:relative;padding:0 8px 0 0;margin:0;width:128px;height:auto;border:none;cursor:pointer;color:#4d4d4d;background:0 0;font-size:14px;font-family:arial,sans-serif;box-sizing:border-box;text-align:left}.jsoneditor-contextmenu .jsoneditor-menu button::-moz-focus-inner{padding:0;border:0}.jsoneditor-contextmenu .jsoneditor-menu button.jsoneditor-default{width:96px}.jsoneditor-contextmenu .jsoneditor-menu button.jsoneditor-expand{float:right;width:32px;height:24px;border-left:1px solid #e5e5e5}.jsoneditor-contextmenu .jsoneditor-menu li{overflow:hidden}.jsoneditor-contextmenu .jsoneditor-menu li ul{display:none;position:relative;left:-10px;top:0;border:none;box-shadow:inset 0 0 10px rgba(128,128,128,.5);padding:0 10px;-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out}.jsoneditor-contextmenu .jsoneditor-menu li ul .jsoneditor-icon{margin-left:24px}.jsoneditor-contextmenu .jsoneditor-menu li ul li button{padding-left:24px;animation:all ease-in-out 1s}.jsoneditor-contextmenu .jsoneditor-menu li button .jsoneditor-expand{position:absolute;top:0;right:0;width:24px;height:24px;padding:0;margin:0 4px 0 0;background-image:url(./img/jsoneditor-icons.svg);background-position:0 -72px}.jsoneditor-contextmenu .jsoneditor-icon{position:absolute;top:0;left:0;width:24px;height:24px;border:none;padding:0;margin:0;background-image:url(./img/jsoneditor-icons.svg)}.jsoneditor-contextmenu .jsoneditor-text{padding:4px 0 4px 24px;word-wrap:break-word}.jsoneditor-contextmenu .jsoneditor-text.jsoneditor-right-margin{padding-right:24px}.jsoneditor-contextmenu .jsoneditor-separator{height:0;border-top:1px solid #e5e5e5;padding-top:5px;margin-top:5px}.jsoneditor-contextmenu button.jsoneditor-remove .jsoneditor-icon{background-position:-24px 0}.jsoneditor-contextmenu button.jsoneditor-append .jsoneditor-icon{background-position:0 0}.jsoneditor-contextmenu button.jsoneditor-insert .jsoneditor-icon{background-position:0 0}.jsoneditor-contextmenu button.jsoneditor-duplicate .jsoneditor-icon{background-position:-48px 0}.jsoneditor-contextmenu button.jsoneditor-sort-asc .jsoneditor-icon{background-position:-168px 0}.jsoneditor-contextmenu button.jsoneditor-sort-desc .jsoneditor-icon{background-position:-192px 0}.jsoneditor-contextmenu button.jsoneditor-transform .jsoneditor-icon{background-position:-216px 0}.jsoneditor-contextmenu button.jsoneditor-extract .jsoneditor-icon{background-position:0 -24px}.jsoneditor-contextmenu button.jsoneditor-type-string .jsoneditor-icon{background-position:-144px 0}.jsoneditor-contextmenu button.jsoneditor-type-auto .jsoneditor-icon{background-position:-120px 0}.jsoneditor-contextmenu button.jsoneditor-type-object .jsoneditor-icon{background-position:-72px 0}.jsoneditor-contextmenu button.jsoneditor-type-array .jsoneditor-icon{background-position:-96px 0}.jsoneditor-contextmenu button.jsoneditor-type-modes .jsoneditor-icon{background-image:none;width:6px}.jsoneditor-contextmenu li,.jsoneditor-contextmenu ul{box-sizing:content-box;position:relative}.jsoneditor-contextmenu .jsoneditor-menu button:focus,.jsoneditor-contextmenu .jsoneditor-menu button:hover{color:#1a1a1a;background-color:#f5f5f5;outline:0}.jsoneditor-contextmenu .jsoneditor-menu li button.jsoneditor-selected,.jsoneditor-contextmenu .jsoneditor-menu li button.jsoneditor-selected:focus,.jsoneditor-contextmenu .jsoneditor-menu li button.jsoneditor-selected:hover{color:#fff;background-color:#ee422e}.jsoneditor-contextmenu .jsoneditor-menu li ul li button:focus,.jsoneditor-contextmenu .jsoneditor-menu li ul li button:hover{background-color:#f5f5f5}.jsoneditor-modal{max-width:95%;border-radius:2px!important;padding:45px 15px 15px 15px!important;box-shadow:2px 2px 12px rgba(128,128,128,.3);color:#4d4d4d;line-height:1.3em}.jsoneditor-modal.jsoneditor-modal-transform{width:600px!important}.jsoneditor-modal .pico-modal-header{position:absolute;box-sizing:border-box;top:0;left:0;width:100%;padding:0 10px;height:30px;line-height:30px;font-family:arial,sans-serif;font-size:11pt;background:#3883fa;color:#fff}.jsoneditor-modal table{width:100%}.jsoneditor-modal table td{padding:3px 0}.jsoneditor-modal table td.jsoneditor-modal-input{text-align:right;padding-right:0;white-space:nowrap}.jsoneditor-modal table td.jsoneditor-modal-actions{padding-top:15px}.jsoneditor-modal table th{vertical-align:middle}.jsoneditor-modal p:first-child{margin-top:0}.jsoneditor-modal a{color:#3883fa}.jsoneditor-modal .jsoneditor-jmespath-block{margin-bottom:10px}.jsoneditor-modal .pico-close{background:0 0!important;font-size:24px!important;top:7px!important;right:7px!important;color:#fff}.jsoneditor-modal input{padding:4px}.jsoneditor-modal input[type=text]{cursor:inherit}.jsoneditor-modal input[disabled]{background:#d3d3d3;color:grey}.jsoneditor-modal .jsoneditor-select-wrapper{position:relative;display:inline-block}.jsoneditor-modal .jsoneditor-select-wrapper:after{content:"";width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:6px solid #666;position:absolute;right:8px;top:14px;pointer-events:none}.jsoneditor-modal select{padding:3px 24px 3px 10px;min-width:180px;max-width:350px;-webkit-appearance:none;-moz-appearance:none;appearance:none;text-indent:0;text-overflow:"";font-size:14px;line-height:1.5em}.jsoneditor-modal select::-ms-expand{display:none}.jsoneditor-modal .jsoneditor-button-group input{padding:4px 10px;margin:0;border-radius:0;border-left-style:none}.jsoneditor-modal .jsoneditor-button-group input.jsoneditor-button-first{border-top-left-radius:3px;border-bottom-left-radius:3px;border-left-style:solid}.jsoneditor-modal .jsoneditor-button-group input.jsoneditor-button-last{border-top-right-radius:3px;border-bottom-right-radius:3px}.jsoneditor-modal .jsoneditor-transform-preview{background:#f5f5f5;height:200px}.jsoneditor-modal .jsoneditor-transform-preview.jsoneditor-error{color:#ee422e}.jsoneditor-modal .jsoneditor-jmespath-wizard{line-height:1.2em;width:100%;padding:0;border-radius:3px}.jsoneditor-modal .jsoneditor-jmespath-label{font-weight:700;color:#1e90ff;margin-top:20px;margin-bottom:5px}.jsoneditor-modal .jsoneditor-jmespath-wizard-table{width:100%;border-collapse:collapse}.jsoneditor-modal .jsoneditor-jmespath-wizard-label{font-style:italic;margin:4px 0 2px 0}.jsoneditor-modal .jsoneditor-inline{position:relative;display:inline-block;width:100%;padding-top:2px;padding-bottom:2px}.jsoneditor-modal .jsoneditor-inline:not(:last-child){padding-right:2px}.jsoneditor-modal .jsoneditor-jmespath-filter{display:flex;flex-wrap:wrap}.jsoneditor-modal .jsoneditor-jmespath-filter-field{width:180px}.jsoneditor-modal .jsoneditor-jmespath-filter-relation{width:100px}.jsoneditor-modal .jsoneditor-jmespath-filter-value{min-width:180px;flex:1}.jsoneditor-modal .jsoneditor-jmespath-sort-field{width:170px}.jsoneditor-modal .jsoneditor-jmespath-sort-order{width:150px}.jsoneditor-modal .jsoneditor-jmespath-select-fields{width:100%}.jsoneditor-modal .selectr-selected{border-color:#d3d3d3;padding:4px 28px 4px 8px}.jsoneditor-modal .selectr-selected .selectr-tag{background-color:#3883fa;border-radius:5px}.jsoneditor-modal table td,.jsoneditor-modal table th{text-align:left;vertical-align:middle;font-weight:400;color:#4d4d4d;border-spacing:0;border-collapse:collapse}.jsoneditor-modal #query,.jsoneditor-modal input,.jsoneditor-modal input[type=text],.jsoneditor-modal input[type=text]:focus,.jsoneditor-modal select,.jsoneditor-modal textarea{background:#fff;border:1px solid #d3d3d3;color:#4d4d4d;border-radius:3px;padding:4px}.jsoneditor-modal #query,.jsoneditor-modal textarea{border-radius:unset}.jsoneditor-modal,.jsoneditor-modal #query,.jsoneditor-modal input,.jsoneditor-modal input[type=text],.jsoneditor-modal option,.jsoneditor-modal select,.jsoneditor-modal table td,.jsoneditor-modal table th,.jsoneditor-modal textarea{font-size:10.5pt;font-family:arial,sans-serif}.jsoneditor-modal #query,.jsoneditor-modal .jsoneditor-transform-preview{font-family:consolas,menlo,monaco,"Ubuntu Mono",source-code-pro,monospace;font-size:14px;width:100%;box-sizing:border-box}.jsoneditor-modal input[type=button],.jsoneditor-modal input[type=submit]{background:#f5f5f5;padding:4px 20px}.jsoneditor-modal input,.jsoneditor-modal select{cursor:pointer}.jsoneditor-modal .jsoneditor-button-group.jsoneditor-button-group-value-asc input.jsoneditor-button-asc,.jsoneditor-modal .jsoneditor-button-group.jsoneditor-button-group-value-desc input.jsoneditor-button-desc{background:#3883fa;border-color:#3883fa;color:#fff}.jsoneditor{color:#1a1a1a;border:thin solid #3883fa;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;height:100%;position:relative;padding:0;line-height:100%}div.jsoneditor-default,div.jsoneditor-field,div.jsoneditor-readonly,div.jsoneditor-value{border:1px solid transparent;min-height:16px;min-width:32px;line-height:16px;padding:2px;margin:1px;word-wrap:break-word;float:left}div.jsoneditor-field p,div.jsoneditor-value p{margin:0}div.jsoneditor-value{word-break:break-word}div.jsoneditor-value.jsoneditor-empty::after{content:"value"}div.jsoneditor-value.jsoneditor-string{color:#006000}div.jsoneditor-value.jsoneditor-number{color:#ee422e}div.jsoneditor-value.jsoneditor-boolean{color:#ff8c00}div.jsoneditor-value.jsoneditor-null{color:#004ed0}div.jsoneditor-value.jsoneditor-color-value{color:#1a1a1a}div.jsoneditor-value.jsoneditor-invalid{color:#1a1a1a}div.jsoneditor-readonly{min-width:16px;color:grey}div.jsoneditor-empty{border-color:#d3d3d3;border-style:dashed;border-radius:2px}div.jsoneditor-field.jsoneditor-empty::after{content:"field"}div.jsoneditor td{vertical-align:top}div.jsoneditor td.jsoneditor-separator{padding:3px 0;vertical-align:top;color:grey}div.jsoneditor td.jsoneditor-tree{vertical-align:top}div.jsoneditor.busy pre.jsoneditor-preview{background:#f5f5f5;color:grey}div.jsoneditor.busy div.jsoneditor-busy{display:inherit}div.jsoneditor code.jsoneditor-preview{background:0 0}div.jsoneditor.jsoneditor-mode-preview pre.jsoneditor-preview{width:100%;height:100%;box-sizing:border-box;overflow:auto;padding:2px;margin:0;white-space:pre-wrap;word-break:break-all}div.jsoneditor-default{color:grey;padding-left:10px}div.jsoneditor-tree{width:100%;height:100%;position:relative;overflow:auto;background:#fff}div.jsoneditor-tree button.jsoneditor-button{width:24px;height:24px;padding:0;margin:0;border:none;cursor:pointer;background-color:transparent;background-image:url(./img/jsoneditor-icons.svg)}div.jsoneditor-tree button.jsoneditor-button:focus{background-color:#f5f5f5;outline:#e5e5e5 solid 1px}div.jsoneditor-tree button.jsoneditor-collapsed{background-position:0 -48px}div.jsoneditor-tree button.jsoneditor-expanded{background-position:0 -72px}div.jsoneditor-tree button.jsoneditor-contextmenu-button{background-position:-48px -72px}div.jsoneditor-tree button.jsoneditor-invisible{visibility:hidden;background:0 0}div.jsoneditor-tree button.jsoneditor-dragarea{background-image:url(./img/jsoneditor-icons.svg);background-position:-72px -72px;cursor:move}div.jsoneditor-tree :focus{outline:0}div.jsoneditor-tree div.jsoneditor-show-more{display:inline-block;padding:3px 4px;margin:2px 0;background-color:#e5e5e5;border-radius:3px;color:grey;font-family:arial,sans-serif;font-size:14px}div.jsoneditor-tree div.jsoneditor-show-more a{display:inline-block;color:grey}div.jsoneditor-tree div.jsoneditor-color{display:inline-block;width:12px;height:12px;margin:4px;border:1px solid grey;cursor:pointer}div.jsoneditor-tree div.jsoneditor-color.jsoneditor-color-readonly{cursor:inherit}div.jsoneditor-tree div.jsoneditor-date{background:#a1a1a1;color:#fff;font-family:arial,sans-serif;border-radius:3px;display:inline-block;padding:3px;margin:0 3px}div.jsoneditor-tree table.jsoneditor-tree{border-collapse:collapse;border-spacing:0;width:100%}div.jsoneditor-tree .jsoneditor-button{display:block}div.jsoneditor-tree .jsoneditor-button.jsoneditor-schema-error{width:24px;height:24px;padding:0;margin:0 4px 0 0;background-image:url(./img/jsoneditor-icons.svg);background-position:-168px -48px;background-color:transparent}div.jsoneditor-outer{position:static;width:100%;height:100%;margin:0;padding:0;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}div.jsoneditor-outer.has-nav-bar{margin-top:-26px;padding-top:26px}div.jsoneditor-outer.has-nav-bar.has-main-menu-bar{margin-top:-61px;padding-top:61px}div.jsoneditor-outer.has-status-bar{margin-bottom:-26px;padding-bottom:26px}div.jsoneditor-outer.has-main-menu-bar{margin-top:-35px;padding-top:35px}div.jsoneditor-busy{position:absolute;top:15%;left:0;box-sizing:border-box;width:100%;text-align:center;display:none}div.jsoneditor-busy span{background-color:#ffffab;border:1px solid #fe0;border-radius:3px;padding:5px 15px;box-shadow:0 0 5px rgba(0,0,0,.4)}div.jsoneditor-field.jsoneditor-empty::after,div.jsoneditor-value.jsoneditor-empty::after{pointer-events:none;color:#d3d3d3;font-size:8pt}a.jsoneditor-value.jsoneditor-url,div.jsoneditor-value.jsoneditor-url{color:#006000;text-decoration:underline}a.jsoneditor-value.jsoneditor-url{display:inline-block;padding:2px;margin:2px}a.jsoneditor-value.jsoneditor-url:focus,a.jsoneditor-value.jsoneditor-url:hover{color:#ee422e}div.jsoneditor-field.jsoneditor-highlight,div.jsoneditor-field[contenteditable=true]:focus,div.jsoneditor-field[contenteditable=true]:hover,div.jsoneditor-value.jsoneditor-highlight,div.jsoneditor-value[contenteditable=true]:focus,div.jsoneditor-value[contenteditable=true]:hover{background-color:#ffffab;border:1px solid #fe0;border-radius:2px}div.jsoneditor-field.jsoneditor-highlight-active,div.jsoneditor-field.jsoneditor-highlight-active:focus,div.jsoneditor-field.jsoneditor-highlight-active:hover,div.jsoneditor-value.jsoneditor-highlight-active,div.jsoneditor-value.jsoneditor-highlight-active:focus,div.jsoneditor-value.jsoneditor-highlight-active:hover{background-color:#fe0;border:1px solid #ffc700;border-radius:2px}div.jsoneditor-value.jsoneditor-array,div.jsoneditor-value.jsoneditor-object{min-width:16px}div.jsoneditor-tree button.jsoneditor-contextmenu-button.jsoneditor-selected,div.jsoneditor-tree button.jsoneditor-contextmenu-button:focus,div.jsoneditor-tree button.jsoneditor-contextmenu-button:hover,tr.jsoneditor-selected.jsoneditor-first button.jsoneditor-contextmenu-button{background-position:-48px -48px}div.jsoneditor-tree div.jsoneditor-show-more a:focus,div.jsoneditor-tree div.jsoneditor-show-more a:hover{color:#ee422e}.ace-jsoneditor,textarea.jsoneditor-text{min-height:150px}.ace-jsoneditor.ace_editor,textarea.jsoneditor-text.ace_editor{font-family:consolas,menlo,monaco,"Ubuntu Mono",source-code-pro,monospace}textarea.jsoneditor-text{width:100%;height:100%;margin:0;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;outline-width:0;border:none;background-color:#fff;resize:none}tr.jsoneditor-highlight,tr.jsoneditor-selected{background-color:#d3d3d3}tr.jsoneditor-selected button.jsoneditor-contextmenu-button,tr.jsoneditor-selected button.jsoneditor-dragarea{visibility:hidden}tr.jsoneditor-selected.jsoneditor-first button.jsoneditor-contextmenu-button,tr.jsoneditor-selected.jsoneditor-first button.jsoneditor-dragarea{visibility:visible}div.jsoneditor-tree button.jsoneditor-dragarea:focus,div.jsoneditor-tree button.jsoneditor-dragarea:hover,tr.jsoneditor-selected.jsoneditor-first button.jsoneditor-dragarea{background-position:-72px -48px}div.jsoneditor td,div.jsoneditor th,div.jsoneditor tr{padding:0;margin:0}.jsoneditor-popover,.jsoneditor-schema-error,div.jsoneditor td,div.jsoneditor textarea,div.jsoneditor th,div.jsoneditor-field,div.jsoneditor-value,pre.jsoneditor-preview{font-family:consolas,menlo,monaco,"Ubuntu Mono",source-code-pro,monospace;font-size:14px;color:#1a1a1a}.jsoneditor-schema-error{cursor:default;display:inline-block;height:24px;line-height:24px;position:relative;text-align:center;width:24px}.jsoneditor-popover{background-color:#4c4c4c;border-radius:3px;box-shadow:0 0 5px rgba(0,0,0,.4);color:#fff;padding:7px 10px;position:absolute;cursor:auto;width:200px}.jsoneditor-popover.jsoneditor-above{bottom:32px;left:-98px}.jsoneditor-popover.jsoneditor-above:before{border-top:7px solid #4c4c4c;bottom:-7px}.jsoneditor-popover.jsoneditor-below{top:32px;left:-98px}.jsoneditor-popover.jsoneditor-below:before{border-bottom:7px solid #4c4c4c;top:-7px}.jsoneditor-popover.jsoneditor-left{top:-7px;right:32px}.jsoneditor-popover.jsoneditor-left:before{border-left:7px solid #4c4c4c;border-top:7px solid transparent;border-bottom:7px solid transparent;content:"";top:19px;right:-14px;left:inherit;margin-left:inherit;margin-top:-7px;position:absolute}.jsoneditor-popover.jsoneditor-right{top:-7px;left:32px}.jsoneditor-popover.jsoneditor-right:before{border-right:7px solid #4c4c4c;border-top:7px solid transparent;border-bottom:7px solid transparent;content:"";top:19px;left:-14px;margin-left:inherit;margin-top:-7px;position:absolute}.jsoneditor-popover:before{border-right:7px solid transparent;border-left:7px solid transparent;content:"";display:block;left:50%;margin-left:-7px;position:absolute}.jsoneditor-text-errors tr.jump-to-line:hover{text-decoration:underline;cursor:pointer}.jsoneditor-schema-error:focus .jsoneditor-popover,.jsoneditor-schema-error:hover .jsoneditor-popover{display:block;animation:fade-in .3s linear 1,move-up .3s linear 1}@keyframes fade-in{from{opacity:0}to{opacity:1}}.jsoneditor .jsoneditor-validation-errors-container{max-height:130px;overflow-y:auto}.jsoneditor .jsoneditor-validation-errors{width:100%;overflow:hidden}.jsoneditor .jsoneditor-additional-errors{position:absolute;margin:auto;bottom:31px;left:calc(50% - 92px);color:grey;background-color:#ebebeb;padding:7px 15px;border-radius:8px}.jsoneditor .jsoneditor-additional-errors.visible{visibility:visible;opacity:1;transition:opacity 2s linear}.jsoneditor .jsoneditor-additional-errors.hidden{visibility:hidden;opacity:0;transition:visibility 0s 2s,opacity 2s linear}.jsoneditor .jsoneditor-text-errors{width:100%;border-collapse:collapse;border-top:1px solid #ffc700}.jsoneditor .jsoneditor-text-errors td{padding:3px 6px;vertical-align:middle}.jsoneditor .jsoneditor-text-errors td pre{margin:0;white-space:pre-wrap}.jsoneditor .jsoneditor-text-errors tr{background-color:#ffffab}.jsoneditor .jsoneditor-text-errors tr.parse-error{background-color:rgba(238,46,46,.4392156863)}.jsoneditor-text-errors .jsoneditor-schema-error{border:none;width:24px;height:24px;padding:0;margin:0 4px 0 0;cursor:pointer}.jsoneditor-text-errors tr .jsoneditor-schema-error{background-image:url(./img/jsoneditor-icons.svg);background-position:-168px -48px;background-color:transparent}.jsoneditor-text-errors tr.parse-error .jsoneditor-schema-error{background-image:url(./img/jsoneditor-icons.svg);background-position:-25px 0;background-color:transparent}.jsoneditor-anchor{cursor:pointer}.jsoneditor-anchor .picker_wrapper.popup.popup_bottom{top:28px;left:-10px}.fadein{-webkit-animation:fadein .3s;animation:fadein .3s;-moz-animation:fadein .3s;-o-animation:fadein .3s}@keyframes fadein{0%{opacity:0}100%{opacity:1}}.jsoneditor-modal input[type=search].selectr-input{border:1px solid #d3d3d3;width:calc(100% - 4px);margin:2px;padding:4px;box-sizing:border-box}.jsoneditor-modal button.selectr-input-clear{right:8px}.jsoneditor-menu{width:100%;height:35px;padding:2px;margin:0;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;color:#fff;background-color:#3883fa;border-bottom:1px solid #3883fa}.jsoneditor-menu>.jsoneditor-modes>button,.jsoneditor-menu>button{width:26px;height:26px;margin:2px;padding:0;border-radius:2px;border:1px solid transparent;background-color:transparent;background-image:url(./img/jsoneditor-icons.svg);color:#fff;opacity:.8;font-family:arial,sans-serif;font-size:14px;float:left}.jsoneditor-menu>.jsoneditor-modes>button:hover,.jsoneditor-menu>button:hover{background-color:rgba(255,255,255,.2);border:1px solid rgba(255,255,255,.4)}.jsoneditor-menu>.jsoneditor-modes>button:active,.jsoneditor-menu>.jsoneditor-modes>button:focus,.jsoneditor-menu>button:active,.jsoneditor-menu>button:focus{background-color:rgba(255,255,255,.3)}.jsoneditor-menu>.jsoneditor-modes>button:disabled,.jsoneditor-menu>button:disabled{opacity:.5;background-color:transparent;border:none}.jsoneditor-menu>button.jsoneditor-collapse-all{background-position:0 -96px}.jsoneditor-menu>button.jsoneditor-expand-all{background-position:0 -120px}.jsoneditor-menu>button.jsoneditor-sort{background-position:-120px -96px}.jsoneditor-menu>button.jsoneditor-transform{background-position:-144px -96px}.jsoneditor.jsoneditor-mode-form>.jsoneditor-menu>button.jsoneditor-sort,.jsoneditor.jsoneditor-mode-form>.jsoneditor-menu>button.jsoneditor-transform,.jsoneditor.jsoneditor-mode-view>.jsoneditor-menu>button.jsoneditor-sort,.jsoneditor.jsoneditor-mode-view>.jsoneditor-menu>button.jsoneditor-transform{display:none}.jsoneditor-menu>button.jsoneditor-undo{background-position:-24px -96px}.jsoneditor-menu>button.jsoneditor-undo:disabled{background-position:-24px -120px}.jsoneditor-menu>button.jsoneditor-redo{background-position:-48px -96px}.jsoneditor-menu>button.jsoneditor-redo:disabled{background-position:-48px -120px}.jsoneditor-menu>button.jsoneditor-compact{background-position:-72px -96px}.jsoneditor-menu>button.jsoneditor-format{background-position:-72px -120px}.jsoneditor-menu>button.jsoneditor-repair{background-position:-96px -96px}.jsoneditor-menu>.jsoneditor-modes{display:inline-block;float:left}.jsoneditor-menu>.jsoneditor-modes>button{background-image:none;width:auto;padding-left:6px;padding-right:6px}.jsoneditor-menu>.jsoneditor-modes>button.jsoneditor-separator,.jsoneditor-menu>button.jsoneditor-separator{margin-left:10px}.jsoneditor-menu a{font-family:arial,sans-serif;font-size:14px;color:#fff;opacity:.8;vertical-align:middle}.jsoneditor-menu a:hover{opacity:1}.jsoneditor-menu a.jsoneditor-poweredBy{font-size:8pt;position:absolute;right:0;top:0;padding:10px}.jsoneditor-navigation-bar{width:100%;height:26px;line-height:26px;padding:0;margin:0;border-bottom:1px solid #d3d3d3;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;color:grey;background-color:#ebebeb;overflow:hidden;font-family:arial,sans-serif;font-size:14px}.jsoneditor-search{font-family:arial,sans-serif;position:absolute;right:4px;top:4px;border-collapse:collapse;border-spacing:0;display:flex}.jsoneditor-search input{color:#1a1a1a;width:120px;border:none;outline:0;margin:1px;line-height:20px;font-family:arial,sans-serif}.jsoneditor-search button{width:16px;height:24px;padding:0;margin:0;border:none;background:url(./img/jsoneditor-icons.svg);vertical-align:top}.jsoneditor-search button:hover{background-color:transparent}.jsoneditor-search button.jsoneditor-refresh{width:18px;background-position:-99px -73px}.jsoneditor-search button.jsoneditor-next{cursor:pointer;background-position:-124px -73px}.jsoneditor-search button.jsoneditor-next:hover{background-position:-124px -49px}.jsoneditor-search button.jsoneditor-previous{cursor:pointer;background-position:-148px -73px;margin-right:2px}.jsoneditor-search button.jsoneditor-previous:hover{background-position:-148px -49px}.jsoneditor-results{font-family:arial,sans-serif;color:#fff;padding-right:5px;line-height:26px}.jsoneditor-frame{border:1px solid transparent;background-color:#fff;padding:0 2px;margin:0}.jsoneditor-statusbar{line-height:26px;height:26px;color:grey;background-color:#ebebeb;border-top:1px solid #d3d3d3;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;font-size:14px}.jsoneditor-statusbar>.jsoneditor-curserinfo-val{margin-right:12px}.jsoneditor-statusbar>.jsoneditor-curserinfo-count{margin-left:4px}.jsoneditor-statusbar>.jsoneditor-validation-error-icon{float:right;width:24px;height:24px;padding:0;margin-top:1px;background-image:url(./img/jsoneditor-icons.svg);background-position:-168px -48px;cursor:pointer}.jsoneditor-statusbar>.jsoneditor-validation-error-count{float:right;margin:0 4px 0 0;cursor:pointer}.jsoneditor-statusbar>.jsoneditor-parse-error-icon{float:right;width:24px;height:24px;padding:0;margin:1px;background-image:url(./img/jsoneditor-icons.svg);background-position:-25px 0}.jsoneditor-statusbar .jsoneditor-array-info a{color:inherit}div.jsoneditor-statusbar>.jsoneditor-curserinfo-label,div.jsoneditor-statusbar>.jsoneditor-size-info{margin:0 4px}.jsoneditor-treepath{padding:0 5px;overflow:hidden;white-space:nowrap;outline:0}.jsoneditor-treepath.show-all{word-wrap:break-word;white-space:normal;position:absolute;background-color:#ebebeb;z-index:1;box-shadow:2px 2px 12px rgba(128,128,128,.3)}.jsoneditor-treepath.show-all span.jsoneditor-treepath-show-all-btn{display:none}.jsoneditor-treepath div.jsoneditor-contextmenu-root{position:absolute;left:0}.jsoneditor-treepath .jsoneditor-treepath-show-all-btn{position:absolute;background-color:#ebebeb;left:0;height:20px;padding:0 3px;cursor:pointer}.jsoneditor-treepath .jsoneditor-treepath-element{margin:1px;font-family:arial,sans-serif;font-size:14px}.jsoneditor-treepath .jsoneditor-treepath-seperator{margin:2px;font-size:9pt;font-family:arial,sans-serif}.jsoneditor-treepath span.jsoneditor-treepath-element:hover,.jsoneditor-treepath span.jsoneditor-treepath-seperator:hover{cursor:pointer;text-decoration:underline}/*! 2 | * Selectr 2.4.13 3 | * http://mobius.ovh/docs/selectr 4 | * 5 | * Released under the MIT license 6 | */.selectr-container{position:relative}.selectr-container li{list-style:none}.selectr-hidden{position:absolute;overflow:hidden;clip:rect(0,0,0,0);width:1px;height:1px;margin:-1px;padding:0;border:0 none}.selectr-visible{position:absolute;left:0;top:0;width:100%;height:100%;opacity:0;z-index:11}.selectr-desktop.multiple .selectr-visible{display:none}.selectr-desktop.multiple.native-open .selectr-visible{top:100%;min-height:200px!important;height:auto;opacity:1;display:block}.selectr-container.multiple.selectr-mobile .selectr-selected{z-index:0}.selectr-selected{position:relative;z-index:1;box-sizing:border-box;width:100%;padding:7px 28px 7px 14px;cursor:pointer;border:1px solid #999;border-radius:3px;background-color:#fff}.selectr-selected::before{position:absolute;top:50%;right:10px;width:0;height:0;content:"";-o-transform:rotate(0) translate3d(0,-50%,0);-ms-transform:rotate(0) translate3d(0,-50%,0);-moz-transform:rotate(0) translate3d(0,-50%,0);-webkit-transform:rotate(0) translate3d(0,-50%,0);transform:rotate(0) translate3d(0,-50%,0);border-width:4px 4px 0 4px;border-style:solid;border-color:#6c7a86 transparent transparent}.selectr-container.native-open .selectr-selected::before,.selectr-container.open .selectr-selected::before{border-width:0 4px 4px 4px;border-style:solid;border-color:transparent transparent #6c7a86}.selectr-label{display:none;overflow:hidden;width:100%;white-space:nowrap;text-overflow:ellipsis}.selectr-placeholder{color:#6c7a86}.selectr-tags{margin:0;padding:0;white-space:normal}.has-selected .selectr-tags{margin:0 0 -2px}.selectr-tag{list-style:none;position:relative;float:left;padding:2px 25px 2px 8px;margin:0 2px 2px 0;cursor:default;color:#fff;border:medium none;border-radius:10px;background:#acb7bf none repeat scroll 0 0}.selectr-container.multiple.has-selected .selectr-selected{padding:5px 28px 5px 5px}.selectr-options-container{position:absolute;z-index:10000;top:calc(100% - 1px);left:0;display:none;box-sizing:border-box;width:100%;border-width:0 1px 1px;border-style:solid;border-color:transparent #999 #999;border-radius:0 0 3px 3px;background-color:#fff}.selectr-container.open .selectr-options-container{display:block}.selectr-input-container{position:relative;display:none}.selectr-clear,.selectr-input-clear,.selectr-tag-remove{position:absolute;top:50%;right:22px;width:20px;height:20px;padding:0;cursor:pointer;-o-transform:translate3d(0,-50%,0);-ms-transform:translate3d(0,-50%,0);-moz-transform:translate3d(0,-50%,0);-webkit-transform:translate3d(0,-50%,0);transform:translate3d(0,-50%,0);border:medium none;background-color:transparent;z-index:11}.selectr-clear,.selectr-input-clear{display:none}.selectr-container.has-selected .selectr-clear,.selectr-input-container.active .selectr-input-clear{display:block}.selectr-selected .selectr-tag-remove{right:2px}.selectr-clear::after,.selectr-clear::before,.selectr-input-clear::after,.selectr-input-clear::before,.selectr-tag-remove::after,.selectr-tag-remove::before{position:absolute;top:5px;left:9px;width:2px;height:10px;content:" ";background-color:#6c7a86}.selectr-tag-remove::after,.selectr-tag-remove::before{top:4px;width:3px;height:12px;background-color:#fff}.selectr-clear:before,.selectr-input-clear::before,.selectr-tag-remove::before{-o-transform:rotate(45deg);-ms-transform:rotate(45deg);-moz-transform:rotate(45deg);-webkit-transform:rotate(45deg);transform:rotate(45deg)}.selectr-clear:after,.selectr-input-clear::after,.selectr-tag-remove::after{-o-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.selectr-input-container.active,.selectr-input-container.active .selectr-clear{display:block}.selectr-input{top:5px;left:5px;box-sizing:border-box;width:calc(100% - 30px);margin:10px 15px;padding:7px 30px 7px 9px;border:1px solid #999;border-radius:3px}.selectr-notice{display:none;box-sizing:border-box;width:100%;padding:8px 16px;border-top:1px solid #999;border-radius:0 0 3px 3px;background-color:#fff}.selectr-container.notice .selectr-notice{display:block}.selectr-container.notice .selectr-selected{border-radius:3px 3px 0 0}.selectr-options{position:relative;top:calc(100% + 2px);display:none;overflow-x:auto;overflow-y:scroll;max-height:200px;margin:0;padding:0}.selectr-container.notice .selectr-options-container,.selectr-container.open .selectr-input-container,.selectr-container.open .selectr-options{display:block}.selectr-option{position:relative;display:block;padding:5px 20px;list-style:outside none none;cursor:pointer;font-weight:400}.selectr-options.optgroups>.selectr-option{padding-left:25px}.selectr-optgroup{font-weight:700;padding:0}.selectr-optgroup--label{font-weight:700;margin-top:10px;padding:5px 15px}.selectr-match{text-decoration:underline}.selectr-option.selected{background-color:#ddd}.selectr-option.active{color:#fff;background-color:#5897fb}.selectr-option.disabled{opacity:.4}.selectr-option.excluded{display:none}.selectr-container.open .selectr-selected{border-color:#999 #999 transparent #999;border-radius:3px 3px 0 0}.selectr-container.open .selectr-selected::after{-o-transform:rotate(180deg) translate3d(0,50%,0);-ms-transform:rotate(180deg) translate3d(0,50%,0);-moz-transform:rotate(180deg) translate3d(0,50%,0);-webkit-transform:rotate(180deg) translate3d(0,50%,0);transform:rotate(180deg) translate3d(0,50%,0)}.selectr-disabled{opacity:.6}.has-selected .selectr-placeholder,.selectr-empty{display:none}.has-selected .selectr-label{display:block}.taggable .selectr-selected{padding:4px 28px 4px 4px}.taggable .selectr-selected::after{display:table;content:" ";clear:both}.taggable .selectr-label{width:auto}.taggable .selectr-tags{float:left;display:block}.taggable .selectr-placeholder{display:none}.input-tag{float:left;min-width:90px;width:auto}.selectr-tag-input{border:medium none;padding:3px 10px;width:100%;font-family:inherit;font-weight:inherit;font-size:inherit}.selectr-input-container.loading::after{position:absolute;top:50%;right:20px;width:20px;height:20px;content:"";-o-transform:translate3d(0,-50%,0);-ms-transform:translate3d(0,-50%,0);-moz-transform:translate3d(0,-50%,0);-webkit-transform:translate3d(0,-50%,0);transform:translate3d(0,-50%,0);-o-transform-origin:50% 0 0;-ms-transform-origin:50% 0 0;-moz-transform-origin:50% 0 0;-webkit-transform-origin:50% 0 0;transform-origin:50% 0 0;-moz-animation:.5s linear 0s normal forwards infinite running selectr-spin;-webkit-animation:.5s linear 0s normal forwards infinite running selectr-spin;animation:.5s linear 0s normal forwards infinite running selectr-spin;border-width:3px;border-style:solid;border-color:#aaa #ddd #ddd;border-radius:50%}@-webkit-keyframes selectr-spin{0%{-webkit-transform:rotate(0) translate3d(0,-50%,0);transform:rotate(0) translate3d(0,-50%,0)}100%{-webkit-transform:rotate(360deg) translate3d(0,-50%,0);transform:rotate(360deg) translate3d(0,-50%,0)}}@keyframes selectr-spin{0%{-webkit-transform:rotate(0) translate3d(0,-50%,0);transform:rotate(0) translate3d(0,-50%,0)}100%{-webkit-transform:rotate(360deg) translate3d(0,-50%,0);transform:rotate(360deg) translate3d(0,-50%,0)}}.selectr-container.open.inverted .selectr-selected{border-color:transparent #999 #999;border-radius:0 0 3px 3px}.selectr-container.inverted .selectr-options-container{border-width:1px 1px 0;border-color:#999 #999 transparent;border-radius:3px 3px 0 0;background-color:#fff}.selectr-container.inverted .selectr-options-container{top:auto;bottom:calc(100% - 1px)}.selectr-container ::-webkit-input-placeholder{color:#6c7a86;opacity:1}.selectr-container ::-moz-placeholder{color:#6c7a86;opacity:1}.selectr-container :-ms-input-placeholder{color:#6c7a86;opacity:1}.selectr-container ::placeholder{color:#6c7a86;opacity:1} -------------------------------------------------------------------------------- /media/img/jsoneditor-icons.svg: -------------------------------------------------------------------------------- 1 | 2 | 16 | JSON Editor Icons 18 | 20 | 21 | 23 | image/svg+xml 24 | 26 | JSON Editor Icons 27 | 28 | 29 | 30 | 32 | 56 | 60 | 61 | 62 | 69 | 76 | 83 | 90 | 97 | 100 | 107 | 114 | 115 | 119 | 126 | 133 | 134 | 141 | 148 | 155 | 157 | 164 | 171 | 178 | 179 | 182 | 189 | 196 | 203 | 204 | 211 | 217 | 223 | 230 | 235 | 240 | 247 | 253 | 258 | 265 | 271 | 277 | 284 | 291 | 298 | 305 | 312 | 319 | 326 | 332 | 340 | 346 | 352 | 359 | 367 | 375 | 382 | 389 | 396 | 403 | 410 | 417 | 424 | 431 | 437 | 445 | 451 | 457 | 464 | 472 | 480 | 487 | 494 | 501 | 508 | 515 | 522 | 529 | 536 | 541 | 546 | 551 | 557 | 563 | 568 | 573 | 578 | 583 | 588 | 604 | 621 | 638 | 655 | 661 | 667 | 673 | 679 | 686 | 692 | 695 | 702 | 709 | 716 | 723 | 729 | 730 | 736 | 743 | 749 | 750 | --------------------------------------------------------------------------------