mirror of
https://github.com/ptarmiganlabs/butler-sos.git
synced 2025-12-19 17:58:18 -05:00
Add comprehensive documentation for system information security configuration
Co-authored-by: mountaindude <1029262+mountaindude@users.noreply.github.com>
This commit is contained in:
140
docs/system-information-security.md
Normal file
140
docs/system-information-security.md
Normal file
@@ -0,0 +1,140 @@
|
|||||||
|
# System Information and OS Command Execution
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
Butler SOS collects system information for monitoring and diagnostic purposes. This information helps with troubleshooting, resource monitoring, and identifying system characteristics. However, on Windows systems, this may trigger security alerts in enterprise environments due to OS command execution.
|
||||||
|
|
||||||
|
## Root Cause
|
||||||
|
|
||||||
|
Butler SOS uses the [systeminformation](https://www.npmjs.com/package/systeminformation) npm package to gather detailed system information. On Windows, this package internally executes several OS commands to collect system details:
|
||||||
|
|
||||||
|
- `cmd.exe /d /s /c \chcp` - Gets code page information
|
||||||
|
- `netstat -r` - Gets routing table information
|
||||||
|
- `cmd.exe /d /s /c \echo %COMPUTERNAME%.%USERDNSDOMAIN%` - Gets computer name and domain
|
||||||
|
|
||||||
|
These commands are **not executed directly by Butler SOS** but by the systeminformation package dependency. The commands are legitimate system information gathering commands, but they may trigger alerts in security monitoring tools.
|
||||||
|
|
||||||
|
## Code Location
|
||||||
|
|
||||||
|
The system information gathering occurs in the `initHostInfo()` function in `src/globals.js` (lines 1027-1085), which is called during Butler SOS startup from `src/butler-sos.js`.
|
||||||
|
|
||||||
|
## Security Configuration
|
||||||
|
|
||||||
|
Starting with version 11.1.0, Butler SOS provides a configuration option to disable detailed system information gathering for security-sensitive environments.
|
||||||
|
|
||||||
|
### Configuration Option
|
||||||
|
|
||||||
|
Add this section to your Butler SOS configuration file:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
Butler-SOS:
|
||||||
|
# System information gathering
|
||||||
|
# Butler SOS collects system information for monitoring and diagnostic purposes.
|
||||||
|
# On Windows, this may trigger security alerts as it executes OS commands like:
|
||||||
|
# - cmd.exe /d /s /c \chcp (to get code page info)
|
||||||
|
# - netstat -r (to get routing table)
|
||||||
|
# - cmd.exe /d /s /c \echo %COMPUTERNAME%.%USERDNSDOMAIN% (to get computer/domain names)
|
||||||
|
# These commands are executed by the 'systeminformation' npm package, not directly by Butler SOS.
|
||||||
|
systemInfo:
|
||||||
|
enable: true # Set to false in security-sensitive environments
|
||||||
|
```
|
||||||
|
|
||||||
|
### When to Disable System Information
|
||||||
|
|
||||||
|
Consider setting `systemInfo.enable: false` if:
|
||||||
|
|
||||||
|
- Your security monitoring tools flag the OS command execution as suspicious
|
||||||
|
- Your organization has strict policies against any automated OS command execution
|
||||||
|
- You don't need detailed system information in logs and monitoring outputs
|
||||||
|
- Butler SOS runs in a highly secured environment
|
||||||
|
|
||||||
|
### Impact of Disabling System Information
|
||||||
|
|
||||||
|
When `systemInfo.enable` is set to `false`:
|
||||||
|
|
||||||
|
**✅ Benefits:**
|
||||||
|
- No OS commands are executed by the systeminformation package
|
||||||
|
- Eliminates security alerts from monitoring tools
|
||||||
|
- Butler SOS continues to function normally
|
||||||
|
- Basic system information is still collected using Node.js built-in APIs
|
||||||
|
|
||||||
|
**⚠️ Limitations:**
|
||||||
|
- Reduced detail in system information logs
|
||||||
|
- Some monitoring dashboards may show less detailed host information
|
||||||
|
- Telemetry data will contain minimal system details
|
||||||
|
|
||||||
|
**What's Still Collected:**
|
||||||
|
- Node.js version and platform information
|
||||||
|
- Basic OS platform, architecture, and version
|
||||||
|
- Memory and CPU count from Node.js APIs
|
||||||
|
- Application version and instance ID
|
||||||
|
|
||||||
|
**What's Not Collected:**
|
||||||
|
- Detailed CPU model and specifications
|
||||||
|
- Detailed OS distribution information
|
||||||
|
- Network interface details
|
||||||
|
- Docker information
|
||||||
|
- Detailed memory specifications
|
||||||
|
|
||||||
|
## Example Configuration Files
|
||||||
|
|
||||||
|
### High Security Environment
|
||||||
|
```yaml
|
||||||
|
Butler-SOS:
|
||||||
|
systemInfo:
|
||||||
|
enable: false # Disable to prevent OS command execution
|
||||||
|
# ... rest of configuration
|
||||||
|
```
|
||||||
|
|
||||||
|
### Standard Environment
|
||||||
|
```yaml
|
||||||
|
Butler-SOS:
|
||||||
|
systemInfo:
|
||||||
|
enable: true # Default - enables full system information gathering
|
||||||
|
# ... rest of configuration
|
||||||
|
```
|
||||||
|
|
||||||
|
## Testing the Configuration
|
||||||
|
|
||||||
|
To test that the configuration is working correctly:
|
||||||
|
|
||||||
|
1. Set `systemInfo.enable: false` in your config
|
||||||
|
2. Start Butler SOS
|
||||||
|
3. Check the logs for: `"SYSTEM INFO: Detailed system information gathering is disabled. Using minimal system info."`
|
||||||
|
4. Verify that your security monitoring tools no longer flag the OS command execution
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Configuration Validation Errors
|
||||||
|
|
||||||
|
If you see configuration validation errors related to `systemInfo`:
|
||||||
|
|
||||||
|
1. Ensure the `systemInfo` section is properly nested under `Butler-SOS`
|
||||||
|
2. Verify that `enable` is set to a boolean value (`true` or `false`), not a string
|
||||||
|
3. Check YAML indentation is correct
|
||||||
|
|
||||||
|
### Missing System Information
|
||||||
|
|
||||||
|
If you need some system information but want to minimize OS command execution:
|
||||||
|
|
||||||
|
1. Consider using `systemInfo.enable: true` but monitor which specific commands trigger alerts
|
||||||
|
2. Work with your security team to whitelist the specific systeminformation package commands
|
||||||
|
3. Use Butler SOS logging to capture the minimal system information that's still collected
|
||||||
|
|
||||||
|
## Security Best Practices
|
||||||
|
|
||||||
|
1. **Principle of Least Privilege**: Only enable detailed system information gathering if you need it for your monitoring use case
|
||||||
|
2. **Security Monitoring**: Work with your security team to understand which specific commands trigger alerts
|
||||||
|
3. **Documentation**: Document your `systemInfo.enable` setting choice in your deployment documentation
|
||||||
|
4. **Testing**: Test configuration changes in a development environment first
|
||||||
|
5. **Monitoring**: Monitor Butler SOS logs to ensure it's working correctly with your chosen configuration
|
||||||
|
|
||||||
|
## Related Issues
|
||||||
|
|
||||||
|
- [Issue #1037](https://github.com/ptarmiganlabs/butler-sos/issues/1037) - Original investigation of OS command execution
|
||||||
|
- [systeminformation package documentation](https://github.com/sebhildebrandt/systeminformation) - For understanding what information is collected
|
||||||
|
|
||||||
|
## Version History
|
||||||
|
|
||||||
|
- **11.1.0**: Added `systemInfo.enable` configuration option
|
||||||
|
- **11.0.3**: Initial report of OS command execution alerts
|
||||||
@@ -1021,12 +1021,12 @@ class Settings {
|
|||||||
/**
|
/**
|
||||||
* Gathers and returns information about the host system where Butler SOS is running.
|
* Gathers and returns information about the host system where Butler SOS is running.
|
||||||
* Includes OS details, network info, hardware details, and a unique ID.
|
* Includes OS details, network info, hardware details, and a unique ID.
|
||||||
*
|
*
|
||||||
* Note: On Windows, this function may execute OS commands via the 'systeminformation' npm package:
|
* Note: On Windows, this function may execute OS commands via the 'systeminformation' npm package:
|
||||||
* - cmd.exe /d /s /c \chcp (to get code page info)
|
* - cmd.exe /d /s /c \chcp (to get code page info)
|
||||||
* - netstat -r (to get routing table info)
|
* - netstat -r (to get routing table info)
|
||||||
* - cmd.exe /d /s /c \echo %COMPUTERNAME%.%USERDNSDOMAIN% (to get computer/domain names)
|
* - cmd.exe /d /s /c \echo %COMPUTERNAME%.%USERDNSDOMAIN% (to get computer/domain names)
|
||||||
*
|
*
|
||||||
* These commands are not executed directly by Butler SOS, but by the systeminformation package
|
* These commands are not executed directly by Butler SOS, but by the systeminformation package
|
||||||
* to gather system details. If this triggers security alerts, you can disable detailed system
|
* to gather system details. If this triggers security alerts, you can disable detailed system
|
||||||
* information gathering by setting Butler-SOS.systemInfo.enable to false in the config file.
|
* information gathering by setting Butler-SOS.systemInfo.enable to false in the config file.
|
||||||
@@ -1037,7 +1037,7 @@ class Settings {
|
|||||||
try {
|
try {
|
||||||
// Check if detailed system info gathering is enabled
|
// Check if detailed system info gathering is enabled
|
||||||
const enableSystemInfo = this.config.get('Butler-SOS.systemInfo.enable');
|
const enableSystemInfo = this.config.get('Butler-SOS.systemInfo.enable');
|
||||||
|
|
||||||
let siCPU = {};
|
let siCPU = {};
|
||||||
let siSystem = {};
|
let siSystem = {};
|
||||||
let siMem = {};
|
let siMem = {};
|
||||||
@@ -1045,7 +1045,7 @@ class Settings {
|
|||||||
let siDocker = {};
|
let siDocker = {};
|
||||||
let siNetwork = [];
|
let siNetwork = [];
|
||||||
let siNetworkDefault = '';
|
let siNetworkDefault = '';
|
||||||
|
|
||||||
// Only gather detailed system info if enabled in config
|
// Only gather detailed system info if enabled in config
|
||||||
if (enableSystemInfo) {
|
if (enableSystemInfo) {
|
||||||
siCPU = await si.cpu();
|
siCPU = await si.cpu();
|
||||||
@@ -1057,27 +1057,31 @@ class Settings {
|
|||||||
siNetworkDefault = await si.networkInterfaceDefault();
|
siNetworkDefault = await si.networkInterfaceDefault();
|
||||||
} else {
|
} else {
|
||||||
// If detailed system info is disabled, use minimal fallback values
|
// If detailed system info is disabled, use minimal fallback values
|
||||||
this.logger.info('SYSTEM INFO: Detailed system information gathering is disabled. Using minimal system info.');
|
this.logger.info(
|
||||||
|
'SYSTEM INFO: Detailed system information gathering is disabled. Using minimal system info.'
|
||||||
|
);
|
||||||
siSystem = { uuid: 'disabled' };
|
siSystem = { uuid: 'disabled' };
|
||||||
siMem = { total: 0 };
|
siMem = { total: 0 };
|
||||||
siOS = {
|
siOS = {
|
||||||
platform: os.platform(),
|
platform: os.platform(),
|
||||||
arch: os.arch(),
|
arch: os.arch(),
|
||||||
release: 'unknown',
|
release: 'unknown',
|
||||||
distro: 'unknown',
|
distro: 'unknown',
|
||||||
codename: 'unknown'
|
codename: 'unknown',
|
||||||
};
|
};
|
||||||
siCPU = {
|
siCPU = {
|
||||||
processors: 1,
|
processors: 1,
|
||||||
physicalCores: 1,
|
physicalCores: 1,
|
||||||
cores: 1,
|
cores: 1,
|
||||||
hypervizor: 'unknown'
|
hypervizor: 'unknown',
|
||||||
};
|
};
|
||||||
siNetwork = [{
|
siNetwork = [
|
||||||
iface: 'default',
|
{
|
||||||
mac: '00:00:00:00:00:00',
|
iface: 'default',
|
||||||
ip4: '127.0.0.1'
|
mac: '00:00:00:00:00:00',
|
||||||
}];
|
ip4: '127.0.0.1',
|
||||||
|
},
|
||||||
|
];
|
||||||
siNetworkDefault = 'default';
|
siNetworkDefault = 'default';
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1088,10 +1092,13 @@ class Settings {
|
|||||||
);
|
);
|
||||||
|
|
||||||
// Ensure we have at least one network interface for ID generation
|
// Ensure we have at least one network interface for ID generation
|
||||||
const netIface = networkInterface.length > 0 ? networkInterface[0] : siNetwork[0] || {
|
const netIface =
|
||||||
mac: '00:00:00:00:00:00',
|
networkInterface.length > 0
|
||||||
ip4: '127.0.0.1'
|
? networkInterface[0]
|
||||||
};
|
: siNetwork[0] || {
|
||||||
|
mac: '00:00:00:00:00:00',
|
||||||
|
ip4: '127.0.0.1',
|
||||||
|
};
|
||||||
|
|
||||||
const idSrc = netIface.mac + netIface.ip4 + siSystem.uuid;
|
const idSrc = netIface.mac + netIface.ip4 + siSystem.uuid;
|
||||||
const salt = netIface.mac;
|
const salt = netIface.mac;
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import addKeywords from 'ajv-keywords';
|
|||||||
|
|
||||||
describe('System Information Configuration Schema', () => {
|
describe('System Information Configuration Schema', () => {
|
||||||
let ajv;
|
let ajv;
|
||||||
|
|
||||||
beforeAll(() => {
|
beforeAll(() => {
|
||||||
ajv = new Ajv({ strict: false });
|
ajv = new Ajv({ strict: false });
|
||||||
addFormats(ajv);
|
addFormats(ajv);
|
||||||
@@ -18,24 +18,24 @@ describe('System Information Configuration Schema', () => {
|
|||||||
const systemInfoSchema = {
|
const systemInfoSchema = {
|
||||||
type: 'object',
|
type: 'object',
|
||||||
properties: {
|
properties: {
|
||||||
systemInfo: confifgFileSchema.properties['Butler-SOS'].properties.systemInfo
|
systemInfo: confifgFileSchema.properties['Butler-SOS'].properties.systemInfo,
|
||||||
},
|
},
|
||||||
required: ['systemInfo']
|
required: ['systemInfo'],
|
||||||
};
|
};
|
||||||
|
|
||||||
const config = {
|
const config = {
|
||||||
systemInfo: {
|
systemInfo: {
|
||||||
enable: false
|
enable: false,
|
||||||
}
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
const validate = ajv.compile(systemInfoSchema);
|
const validate = ajv.compile(systemInfoSchema);
|
||||||
const isValid = validate(config);
|
const isValid = validate(config);
|
||||||
|
|
||||||
if (!isValid) {
|
if (!isValid) {
|
||||||
console.log('Validation errors:', validate.errors);
|
console.log('Validation errors:', validate.errors);
|
||||||
}
|
}
|
||||||
|
|
||||||
expect(isValid).toBe(true);
|
expect(isValid).toBe(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -44,20 +44,20 @@ describe('System Information Configuration Schema', () => {
|
|||||||
const systemInfoSchema = {
|
const systemInfoSchema = {
|
||||||
type: 'object',
|
type: 'object',
|
||||||
properties: {
|
properties: {
|
||||||
systemInfo: confifgFileSchema.properties['Butler-SOS'].properties.systemInfo
|
systemInfo: confifgFileSchema.properties['Butler-SOS'].properties.systemInfo,
|
||||||
},
|
},
|
||||||
required: ['systemInfo']
|
required: ['systemInfo'],
|
||||||
};
|
};
|
||||||
|
|
||||||
const config = {
|
const config = {
|
||||||
systemInfo: {
|
systemInfo: {
|
||||||
enable: true
|
enable: true,
|
||||||
}
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
const validate = ajv.compile(systemInfoSchema);
|
const validate = ajv.compile(systemInfoSchema);
|
||||||
const isValid = validate(config);
|
const isValid = validate(config);
|
||||||
|
|
||||||
expect(isValid).toBe(true);
|
expect(isValid).toBe(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -66,25 +66,25 @@ describe('System Information Configuration Schema', () => {
|
|||||||
const systemInfoSchema = {
|
const systemInfoSchema = {
|
||||||
type: 'object',
|
type: 'object',
|
||||||
properties: {
|
properties: {
|
||||||
systemInfo: confifgFileSchema.properties['Butler-SOS'].properties.systemInfo
|
systemInfo: confifgFileSchema.properties['Butler-SOS'].properties.systemInfo,
|
||||||
},
|
},
|
||||||
required: ['systemInfo']
|
required: ['systemInfo'],
|
||||||
};
|
};
|
||||||
|
|
||||||
const config = {
|
const config = {
|
||||||
systemInfo: {
|
systemInfo: {
|
||||||
enable: 'not-a-boolean'
|
enable: 'not-a-boolean',
|
||||||
}
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
const validate = ajv.compile(systemInfoSchema);
|
const validate = ajv.compile(systemInfoSchema);
|
||||||
const isValid = validate(config);
|
const isValid = validate(config);
|
||||||
|
|
||||||
expect(isValid).toBe(false);
|
expect(isValid).toBe(false);
|
||||||
expect(validate.errors).toContainEqual(
|
expect(validate.errors).toContainEqual(
|
||||||
expect.objectContaining({
|
expect.objectContaining({
|
||||||
instancePath: "/systemInfo/enable",
|
instancePath: '/systemInfo/enable',
|
||||||
keyword: "type"
|
keyword: 'type',
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
@@ -94,24 +94,24 @@ describe('System Information Configuration Schema', () => {
|
|||||||
const systemInfoSchema = {
|
const systemInfoSchema = {
|
||||||
type: 'object',
|
type: 'object',
|
||||||
properties: {
|
properties: {
|
||||||
systemInfo: confifgFileSchema.properties['Butler-SOS'].properties.systemInfo
|
systemInfo: confifgFileSchema.properties['Butler-SOS'].properties.systemInfo,
|
||||||
},
|
},
|
||||||
required: ['systemInfo']
|
required: ['systemInfo'],
|
||||||
};
|
};
|
||||||
|
|
||||||
const config = {
|
const config = {
|
||||||
systemInfo: {}
|
systemInfo: {},
|
||||||
};
|
};
|
||||||
|
|
||||||
const validate = ajv.compile(systemInfoSchema);
|
const validate = ajv.compile(systemInfoSchema);
|
||||||
const isValid = validate(config);
|
const isValid = validate(config);
|
||||||
|
|
||||||
expect(isValid).toBe(false);
|
expect(isValid).toBe(false);
|
||||||
expect(validate.errors).toContainEqual(
|
expect(validate.errors).toContainEqual(
|
||||||
expect.objectContaining({
|
expect.objectContaining({
|
||||||
instancePath: "/systemInfo",
|
instancePath: '/systemInfo',
|
||||||
keyword: "required"
|
keyword: 'required',
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -5,67 +5,58 @@
|
|||||||
* Released under the MIT License
|
* Released under the MIT License
|
||||||
*/
|
*/
|
||||||
:root {
|
:root {
|
||||||
--json-tree-js-default-font: system-ui,
|
--json-tree-js-default-font:
|
||||||
-apple-system,
|
system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', 'Noto Sans',
|
||||||
"Segoe UI",
|
'Liberation Sans', Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji',
|
||||||
Roboto,
|
'Segoe UI Symbol', 'Noto Color Emoji';
|
||||||
"Helvetica Neue",
|
--json-tree-js-text-bold-weight: 400;
|
||||||
"Noto Sans",
|
--json-tree-js-header-bold-weight: 900;
|
||||||
"Liberation Sans",
|
--json-tree-js-title-bold-weight: var(--json-tree-js-header-bold-weight);
|
||||||
Arial,
|
--json-tree-js-text-bold-weight-active: var(--json-tree-js-header-bold-weight);
|
||||||
sans-serif,
|
--json-tree-js-color-dark-black: #1c2128;
|
||||||
"Apple Color Emoji",
|
--json-tree-js-color-black: #3b3a3a;
|
||||||
"Segoe UI Emoji",
|
--json-tree-js-color-white: #f5f5f5;
|
||||||
"Segoe UI Symbol",
|
--json-tree-js-color-snow-white: #f5f5f5;
|
||||||
"Noto Color Emoji";
|
--json-tree-js-color-light-gray: #bbbbbb;
|
||||||
--json-tree-js-text-bold-weight: 400;
|
--json-tree-js-color-array: #f28c28;
|
||||||
--json-tree-js-header-bold-weight: 900;
|
--json-tree-js-color-object: #c0c0c0;
|
||||||
--json-tree-js-title-bold-weight: var(--json-tree-js-header-bold-weight);
|
--json-tree-js-color-map: #bdb5d5;
|
||||||
--json-tree-js-text-bold-weight-active: var(--json-tree-js-header-bold-weight);
|
--json-tree-js-color-set: #ffd700;
|
||||||
--json-tree-js-color-dark-black: #1c2128;
|
--json-tree-js-color-boolean: #ff0000;
|
||||||
--json-tree-js-color-black: #3b3a3a;
|
--json-tree-js-color-decimal: #e3c868;
|
||||||
--json-tree-js-color-white: #F5F5F5;
|
--json-tree-js-color-number: #666bf9;
|
||||||
--json-tree-js-color-snow-white: #F5F5F5;
|
--json-tree-js-color-bigint: #6495ed;
|
||||||
--json-tree-js-color-light-gray: #BBBBBB;
|
--json-tree-js-color-string: #78b13f;
|
||||||
--json-tree-js-color-array: #F28C28;
|
--json-tree-js-color-date: #a656f5;
|
||||||
--json-tree-js-color-object: #C0C0C0;
|
--json-tree-js-color-null: var(--json-tree-js-color-light-gray);
|
||||||
--json-tree-js-color-map: #BDB5D5;
|
--json-tree-js-color-undefined: var(--json-tree-js-color-null);
|
||||||
--json-tree-js-color-set: #FFD700;
|
--json-tree-js-color-symbol: #daa06d;
|
||||||
--json-tree-js-color-boolean: #FF0000;
|
--json-tree-js-color-function: var(--json-tree-js-color-null);
|
||||||
--json-tree-js-color-decimal: #e3c868;
|
--json-tree-js-color-unknown: var(--json-tree-js-color-null);
|
||||||
--json-tree-js-color-number: #666bf9;
|
--json-tree-js-color-guid: #c45600;
|
||||||
--json-tree-js-color-bigint: #6495ED;
|
--json-tree-js-color-regexp: #aa336a;
|
||||||
--json-tree-js-color-string: #78b13f;
|
--json-tree-js-editable-text-color: var(--json-tree-js-color-snow-white);
|
||||||
--json-tree-js-color-date: #a656f5;
|
--json-tree-js-editable-background-color: #2d333b;
|
||||||
--json-tree-js-color-null: var(--json-tree-js-color-light-gray);
|
--json-tree-js-editable-border-color: #454c56;
|
||||||
--json-tree-js-color-undefined: var(--json-tree-js-color-null);
|
--json-tree-js-tooltip-background-color: var(--json-tree-js-container-background-color);
|
||||||
--json-tree-js-color-symbol: #DAA06D;
|
--json-tree-js-tooltip-border-color: var(--json-tree-js-container-border-color);
|
||||||
--json-tree-js-color-function: var(--json-tree-js-color-null);
|
--json-tree-js-tooltip-text-color: var(--json-tree-js-color-white);
|
||||||
--json-tree-js-color-unknown: var(--json-tree-js-color-null);
|
--json-tree-js-container-background-color: #22272e;
|
||||||
--json-tree-js-color-guid: #c45600;
|
--json-tree-js-container-border-color: #454c56;
|
||||||
--json-tree-js-color-regexp: #AA336A;
|
--json-tree-js-button-background-color: #2d333b;
|
||||||
--json-tree-js-editable-text-color: var(--json-tree-js-color-snow-white);
|
--json-tree-js-button-border-color: var(--json-tree-js-container-border-color);
|
||||||
--json-tree-js-editable-background-color: #2d333b;
|
--json-tree-js-button-text-color: var(--json-tree-js-color-white);
|
||||||
--json-tree-js-editable-border-color: #454c56;
|
--json-tree-js-button-background-color-hover: var(--json-tree-js-container-border-color);
|
||||||
--json-tree-js-tooltip-background-color: var(--json-tree-js-container-background-color);
|
--json-tree-js-button-text-color-hover: var(--json-tree-js-color-snow-white);
|
||||||
--json-tree-js-tooltip-border-color: var(--json-tree-js-container-border-color);
|
--json-tree-js-button-background-color-active: #616b79;
|
||||||
--json-tree-js-tooltip-text-color: var(--json-tree-js-color-white);
|
--json-tree-js-button-text-color-active: var(--json-tree-js-color-snow-white);
|
||||||
--json-tree-js-container-background-color: #22272e;
|
--json-tree-js-border-radius-editable: 0.25rem;
|
||||||
--json-tree-js-container-border-color: #454c56;
|
--json-tree-js-border-radius: 0.5rem;
|
||||||
--json-tree-js-button-background-color: #2d333b;
|
--json-tree-js-border-size: 0.5px;
|
||||||
--json-tree-js-button-border-color: var(--json-tree-js-container-border-color);
|
--json-tree-js-spacing: 10px;
|
||||||
--json-tree-js-button-text-color: var(--json-tree-js-color-white);
|
--json-tree-js-spacing-font-size: 0.85rem;
|
||||||
--json-tree-js-button-background-color-hover: var(--json-tree-js-container-border-color);
|
--json-tree-js-transition: all 0.3s;
|
||||||
--json-tree-js-button-text-color-hover: var(--json-tree-js-color-snow-white);
|
--json-tree-js-animation-length: 0.5s;
|
||||||
--json-tree-js-button-background-color-active: #616b79;
|
|
||||||
--json-tree-js-button-text-color-active: var(--json-tree-js-color-snow-white);
|
|
||||||
--json-tree-js-border-radius-editable: 0.25rem;
|
|
||||||
--json-tree-js-border-radius: 0.5rem;
|
|
||||||
--json-tree-js-border-size: 0.5px;
|
|
||||||
--json-tree-js-spacing: 10px;
|
|
||||||
--json-tree-js-spacing-font-size: 0.85rem;
|
|
||||||
--json-tree-js-transition: all .3s;
|
|
||||||
--json-tree-js-animation-length: 0.5s;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -74,70 +65,71 @@
|
|||||||
-------------------------------------------------------------------------
|
-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
div.json-tree-js {
|
div.json-tree-js {
|
||||||
-moz-user-select: none;
|
-moz-user-select: none;
|
||||||
-webkit-user-select: none;
|
-webkit-user-select: none;
|
||||||
-ms-user-select: none;
|
-ms-user-select: none;
|
||||||
-o-user-select: none;
|
-o-user-select: none;
|
||||||
user-select: none;
|
user-select: none;
|
||||||
cursor: default;
|
cursor: default;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
line-height: normal;
|
line-height: normal;
|
||||||
font-family: var(--json-tree-js-default-font) !important;
|
font-family: var(--json-tree-js-default-font) !important;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
position: relative;
|
position: relative;
|
||||||
border-radius: var(--json-tree-js-border-radius);
|
border-radius: var(--json-tree-js-border-radius);
|
||||||
background-color: var(--json-tree-js-container-background-color);
|
background-color: var(--json-tree-js-container-background-color);
|
||||||
color: var(--json-tree-js-color-white);
|
color: var(--json-tree-js-color-white);
|
||||||
border: var(--json-tree-js-border-size) solid var(--json-tree-js-container-border-color);
|
border: var(--json-tree-js-border-size) solid var(--json-tree-js-container-border-color);
|
||||||
font-size: var(--json-tree-js-spacing-font-size);
|
font-size: var(--json-tree-js-spacing-font-size);
|
||||||
font-weight: var(--json-tree-js-text-bold-weight);
|
font-weight: var(--json-tree-js-text-bold-weight);
|
||||||
width: 100%;
|
width: 100%;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
margin: 0 !important;
|
margin: 0 !important;
|
||||||
max-width: 500px;
|
max-width: 500px;
|
||||||
}
|
}
|
||||||
div.json-tree-js button {
|
div.json-tree-js button {
|
||||||
font-family: var(--heat-js-default-font);
|
font-family: var(--heat-js-default-font);
|
||||||
}
|
}
|
||||||
div.json-tree-js div.no-click {
|
div.json-tree-js div.no-click {
|
||||||
pointer-events: none !important;
|
pointer-events: none !important;
|
||||||
}
|
}
|
||||||
div.json-tree-js div.page-switch {
|
div.json-tree-js div.page-switch {
|
||||||
animation: fade-in-animation var(--json-tree-js-animation-length);
|
animation: fade-in-animation var(--json-tree-js-animation-length);
|
||||||
}
|
}
|
||||||
div.json-tree-js * {
|
div.json-tree-js * {
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
line-height: normal;
|
line-height: normal;
|
||||||
}
|
}
|
||||||
div.json-tree-js *::before, div.json-tree-js *::after {
|
div.json-tree-js *::before,
|
||||||
box-sizing: border-box;
|
div.json-tree-js *::after {
|
||||||
line-height: normal;
|
box-sizing: border-box;
|
||||||
|
line-height: normal;
|
||||||
}
|
}
|
||||||
|
|
||||||
div.full-screen {
|
div.full-screen {
|
||||||
position: fixed;
|
position: fixed;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
top: 0;
|
top: 0;
|
||||||
left: 0;
|
left: 0;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
max-width: none;
|
max-width: none;
|
||||||
border-radius: 0;
|
border-radius: 0;
|
||||||
z-index: 1000;
|
z-index: 1000;
|
||||||
}
|
}
|
||||||
div.full-screen div.title-bar {
|
div.full-screen div.title-bar {
|
||||||
border-radius: 0 !important;
|
border-radius: 0 !important;
|
||||||
}
|
}
|
||||||
div.full-screen div.contents {
|
div.full-screen div.contents {
|
||||||
flex-grow: 1;
|
flex-grow: 1;
|
||||||
position: relative;
|
position: relative;
|
||||||
}
|
}
|
||||||
div.full-screen div.contents span.no-json-text {
|
div.full-screen div.contents span.no-json-text {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
left: 50%;
|
left: 50%;
|
||||||
top: 50%;
|
top: 50%;
|
||||||
transform: translate(-50%, -50%);
|
transform: translate(-50%, -50%);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -146,34 +138,34 @@ div.full-screen div.contents span.no-json-text {
|
|||||||
-------------------------------------------------------------------------
|
-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
div.json-tree-js div.no-arrow {
|
div.json-tree-js div.no-arrow {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
width: 12px;
|
width: 12px;
|
||||||
height: 8px;
|
height: 8px;
|
||||||
margin-right: calc(var(--json-tree-js-spacing));
|
margin-right: calc(var(--json-tree-js-spacing));
|
||||||
}
|
}
|
||||||
div.json-tree-js div.down-arrow,
|
div.json-tree-js div.down-arrow,
|
||||||
div.json-tree-js div.right-arrow {
|
div.json-tree-js div.right-arrow {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
width: 0;
|
width: 0;
|
||||||
height: 0;
|
height: 0;
|
||||||
margin-right: calc(var(--json-tree-js-spacing));
|
margin-right: calc(var(--json-tree-js-spacing));
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
transition: var(--json-tree-js-transition);
|
transition: var(--json-tree-js-transition);
|
||||||
transition-property: opacity;
|
transition-property: opacity;
|
||||||
}
|
}
|
||||||
div.json-tree-js div.down-arrow:hover,
|
div.json-tree-js div.down-arrow:hover,
|
||||||
div.json-tree-js div.right-arrow:hover {
|
div.json-tree-js div.right-arrow:hover {
|
||||||
opacity: 0.7;
|
opacity: 0.7;
|
||||||
}
|
}
|
||||||
div.json-tree-js div.down-arrow {
|
div.json-tree-js div.down-arrow {
|
||||||
border-left: 6px solid transparent;
|
border-left: 6px solid transparent;
|
||||||
border-right: 6px solid transparent;
|
border-right: 6px solid transparent;
|
||||||
border-top: 8px solid var(--json-tree-js-color-white);
|
border-top: 8px solid var(--json-tree-js-color-white);
|
||||||
}
|
}
|
||||||
div.json-tree-js div.right-arrow {
|
div.json-tree-js div.right-arrow {
|
||||||
border-top: 5px solid transparent;
|
border-top: 5px solid transparent;
|
||||||
border-bottom: 5px solid transparent;
|
border-bottom: 5px solid transparent;
|
||||||
border-left: 12px solid var(--json-tree-js-color-white);
|
border-left: 12px solid var(--json-tree-js-color-white);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -182,72 +174,72 @@ div.json-tree-js div.right-arrow {
|
|||||||
-------------------------------------------------------------------------
|
-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
div.json-tree-js div.title-bar {
|
div.json-tree-js div.title-bar {
|
||||||
display: flex;
|
display: flex;
|
||||||
padding: calc(var(--json-tree-js-spacing) / 2);
|
padding: calc(var(--json-tree-js-spacing) / 2);
|
||||||
background-color: var(--json-tree-js-color-dark-black);
|
background-color: var(--json-tree-js-color-dark-black);
|
||||||
border-radius: var(--json-tree-js-border-radius);
|
border-radius: var(--json-tree-js-border-radius);
|
||||||
border-bottom: var(--json-tree-js-container-border-color) solid var(--json-tree-js-border-size);
|
border-bottom: var(--json-tree-js-container-border-color) solid var(--json-tree-js-border-size);
|
||||||
justify-content: left;
|
justify-content: left;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
}
|
}
|
||||||
div.json-tree-js div.title-bar div.title {
|
div.json-tree-js div.title-bar div.title {
|
||||||
text-align: left;
|
text-align: left;
|
||||||
width: auto;
|
width: auto;
|
||||||
font-weight: var(--json-tree-js-title-bold-weight);
|
font-weight: var(--json-tree-js-title-bold-weight);
|
||||||
font-size: 1.2rem;
|
font-size: 1.2rem;
|
||||||
margin: 3px;
|
margin: 3px;
|
||||||
margin-left: calc(var(--json-tree-js-spacing) / 2);
|
margin-left: calc(var(--json-tree-js-spacing) / 2);
|
||||||
}
|
}
|
||||||
div.json-tree-js div.title-bar div.controls {
|
div.json-tree-js div.title-bar div.controls {
|
||||||
margin-left: calc(var(--json-tree-js-spacing) * 6);
|
margin-left: calc(var(--json-tree-js-spacing) * 6);
|
||||||
flex-grow: 1;
|
flex-grow: 1;
|
||||||
text-align: right;
|
text-align: right;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
@media (min-width: 768px) {
|
@media (min-width: 768px) {
|
||||||
div.json-tree-js div.title-bar div.controls {
|
div.json-tree-js div.title-bar div.controls {
|
||||||
margin-left: calc(var(--json-tree-js-spacing) * 12);
|
margin-left: calc(var(--json-tree-js-spacing) * 12);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
div.json-tree-js div.title-bar div.controls button {
|
div.json-tree-js div.title-bar div.controls button {
|
||||||
background-color: var(--json-tree-js-button-background-color);
|
background-color: var(--json-tree-js-button-background-color);
|
||||||
border: var(--json-tree-js-border-size) solid var(--json-tree-js-button-border-color);
|
border: var(--json-tree-js-border-size) solid var(--json-tree-js-button-border-color);
|
||||||
color: var(--json-tree-js-button-text-color);
|
color: var(--json-tree-js-button-text-color);
|
||||||
border-radius: var(--json-tree-js-border-radius);
|
border-radius: var(--json-tree-js-border-radius);
|
||||||
padding-top: 5px;
|
padding-top: 5px;
|
||||||
padding-bottom: 5px;
|
padding-bottom: 5px;
|
||||||
padding-left: 9px;
|
padding-left: 9px;
|
||||||
padding-right: 9px;
|
padding-right: 9px;
|
||||||
margin: 3px;
|
margin: 3px;
|
||||||
outline: none;
|
outline: none;
|
||||||
transition: var(--json-tree-js-transition);
|
transition: var(--json-tree-js-transition);
|
||||||
}
|
}
|
||||||
div.json-tree-js div.title-bar div.controls button:disabled {
|
div.json-tree-js div.title-bar div.controls button:disabled {
|
||||||
color: var(--json-tree-js-button-border-color);
|
color: var(--json-tree-js-button-border-color);
|
||||||
}
|
}
|
||||||
div.json-tree-js div.title-bar div.controls button:not(.active):not(:disabled):active {
|
div.json-tree-js div.title-bar div.controls button:not(.active):not(:disabled):active {
|
||||||
background: var(--json-tree-js-button-background-color-active) !important;
|
background: var(--json-tree-js-button-background-color-active) !important;
|
||||||
color: var(--json-tree-js-button-text-color-active) !important;
|
color: var(--json-tree-js-button-text-color-active) !important;
|
||||||
}
|
}
|
||||||
div.json-tree-js div.title-bar div.controls button:not(.active):not(:disabled):hover {
|
div.json-tree-js div.title-bar div.controls button:not(.active):not(:disabled):hover {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
background: var(--json-tree-js-button-background-color-hover);
|
background: var(--json-tree-js-button-background-color-hover);
|
||||||
color: var(--json-tree-js-button-text-color-hover);
|
color: var(--json-tree-js-button-text-color-hover);
|
||||||
}
|
}
|
||||||
div.json-tree-js div.title-bar div.controls button {
|
div.json-tree-js div.title-bar div.controls button {
|
||||||
margin-left: calc(var(--json-tree-js-spacing) / 2) !important;
|
margin-left: calc(var(--json-tree-js-spacing) / 2) !important;
|
||||||
font-weight: var(--json-tree-js-header-bold-weight);
|
font-weight: var(--json-tree-js-header-bold-weight);
|
||||||
min-width: 30px;
|
min-width: 30px;
|
||||||
min-height: 30px;
|
min-height: 30px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
div.json-tree-js div.title-bar div.controls button.copy-all {
|
div.json-tree-js div.title-bar div.controls button.copy-all {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
@media (min-width: 768px) {
|
@media (min-width: 768px) {
|
||||||
div.json-tree-js div.title-bar div.controls button.copy-all {
|
div.json-tree-js div.title-bar div.controls button.copy-all {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -256,17 +248,17 @@ div.json-tree-js div.title-bar div.controls button.copy-all {
|
|||||||
-------------------------------------------------------------------------
|
-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
div.json-tree-js div.contents {
|
div.json-tree-js div.contents {
|
||||||
padding: var(--json-tree-js-spacing);
|
padding: var(--json-tree-js-spacing);
|
||||||
margin: 0 !important;
|
margin: 0 !important;
|
||||||
overflow-x: auto;
|
overflow-x: auto;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
}
|
}
|
||||||
div.json-tree-js div.contents div.last-item {
|
div.json-tree-js div.contents div.last-item {
|
||||||
margin-bottom: 0 !important;
|
margin-bottom: 0 !important;
|
||||||
}
|
}
|
||||||
div.json-tree-js div.contents span.no-json-text {
|
div.json-tree-js div.contents span.no-json-text {
|
||||||
font-style: italic;
|
font-style: italic;
|
||||||
color: var(--json-tree-js-color-light-gray) !important;
|
color: var(--json-tree-js-color-light-gray) !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -275,43 +267,43 @@ div.json-tree-js div.contents span.no-json-text {
|
|||||||
-------------------------------------------------------------------------
|
-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
div.json-tree-js div.object-type-title {
|
div.json-tree-js div.object-type-title {
|
||||||
font-weight: var(--json-tree-js-header-bold-weight);
|
font-weight: var(--json-tree-js-header-bold-weight);
|
||||||
text-align: left !important;
|
text-align: left !important;
|
||||||
width: fit-content;
|
width: fit-content;
|
||||||
}
|
}
|
||||||
div.json-tree-js div.object-type-title span.main-title {
|
div.json-tree-js div.object-type-title span.main-title {
|
||||||
transition: var(--json-tree-js-transition);
|
transition: var(--json-tree-js-transition);
|
||||||
transition-property: opacity;
|
transition-property: opacity;
|
||||||
}
|
}
|
||||||
div.json-tree-js div.object-type-title span.main-title:not(.no-hover):hover {
|
div.json-tree-js div.object-type-title span.main-title:not(.no-hover):hover {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
opacity: 0.7;
|
opacity: 0.7;
|
||||||
}
|
}
|
||||||
div.json-tree-js div.object-type-title span.array {
|
div.json-tree-js div.object-type-title span.array {
|
||||||
color: var(--json-tree-js-color-array);
|
color: var(--json-tree-js-color-array);
|
||||||
}
|
}
|
||||||
div.json-tree-js div.object-type-title span.object {
|
div.json-tree-js div.object-type-title span.object {
|
||||||
color: var(--json-tree-js-color-object);
|
color: var(--json-tree-js-color-object);
|
||||||
}
|
}
|
||||||
div.json-tree-js div.object-type-title span.map {
|
div.json-tree-js div.object-type-title span.map {
|
||||||
color: var(--json-tree-js-color-map);
|
color: var(--json-tree-js-color-map);
|
||||||
}
|
}
|
||||||
div.json-tree-js div.object-type-title span.set {
|
div.json-tree-js div.object-type-title span.set {
|
||||||
color: var(--json-tree-js-color-set);
|
color: var(--json-tree-js-color-set);
|
||||||
}
|
}
|
||||||
div.json-tree-js div.object-type-title span.count {
|
div.json-tree-js div.object-type-title span.count {
|
||||||
margin-left: calc(var(--json-tree-js-spacing) / 2);
|
margin-left: calc(var(--json-tree-js-spacing) / 2);
|
||||||
font-weight: var(--json-tree-js-text-bold-weight);
|
font-weight: var(--json-tree-js-text-bold-weight);
|
||||||
}
|
}
|
||||||
div.json-tree-js div.object-type-title span.data-array-index {
|
div.json-tree-js div.object-type-title span.data-array-index {
|
||||||
margin-right: calc(var(--json-tree-js-spacing) / 2);
|
margin-right: calc(var(--json-tree-js-spacing) / 2);
|
||||||
font-weight: var(--json-tree-js-text-bold-weight);
|
font-weight: var(--json-tree-js-text-bold-weight);
|
||||||
}
|
}
|
||||||
div.json-tree-js div.object-type-title span.opening-symbol {
|
div.json-tree-js div.object-type-title span.opening-symbol {
|
||||||
margin-left: calc(var(--json-tree-js-spacing) / 2);
|
margin-left: calc(var(--json-tree-js-spacing) / 2);
|
||||||
margin-right: calc(var(--json-tree-js-spacing) / 2);
|
margin-right: calc(var(--json-tree-js-spacing) / 2);
|
||||||
font-weight: var(--json-tree-js-text-bold-weight);
|
font-weight: var(--json-tree-js-text-bold-weight);
|
||||||
color: var(--json-tree-js-color-snow-white) !important;
|
color: var(--json-tree-js-color-snow-white) !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -320,10 +312,10 @@ div.json-tree-js div.object-type-title span.opening-symbol {
|
|||||||
-------------------------------------------------------------------------
|
-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
div.json-tree-js div.object-type-contents {
|
div.json-tree-js div.object-type-contents {
|
||||||
margin-top: calc(var(--json-tree-js-spacing) / 2);
|
margin-top: calc(var(--json-tree-js-spacing) / 2);
|
||||||
text-align: left !important;
|
text-align: left !important;
|
||||||
width: fit-content;
|
width: fit-content;
|
||||||
margin-bottom: var(--json-tree-js-spacing);
|
margin-bottom: var(--json-tree-js-spacing);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -332,111 +324,117 @@ div.json-tree-js div.object-type-contents {
|
|||||||
-------------------------------------------------------------------------
|
-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
div.json-tree-js div.object-type-contents span.opening-symbol {
|
div.json-tree-js div.object-type-contents span.opening-symbol {
|
||||||
margin-left: calc(var(--json-tree-js-spacing) / 2);
|
margin-left: calc(var(--json-tree-js-spacing) / 2);
|
||||||
margin-right: calc(var(--json-tree-js-spacing) / 2);
|
margin-right: calc(var(--json-tree-js-spacing) / 2);
|
||||||
font-weight: var(--json-tree-js-text-bold-weight);
|
font-weight: var(--json-tree-js-text-bold-weight);
|
||||||
color: var(--json-tree-js-color-snow-white) !important;
|
color: var(--json-tree-js-color-snow-white) !important;
|
||||||
}
|
}
|
||||||
div.json-tree-js div.object-type-contents div.closing-symbol div {
|
div.json-tree-js div.object-type-contents div.closing-symbol div {
|
||||||
display: inline-block !important;
|
display: inline-block !important;
|
||||||
}
|
}
|
||||||
div.json-tree-js div.object-type-contents div.closing-symbol div.object-type-end {
|
div.json-tree-js div.object-type-contents div.closing-symbol div.object-type-end {
|
||||||
font-weight: var(--json-tree-js-text-bold-weight);
|
font-weight: var(--json-tree-js-text-bold-weight);
|
||||||
}
|
}
|
||||||
div.json-tree-js div.object-type-contents div.object-type-value {
|
div.json-tree-js div.object-type-contents div.object-type-value {
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
margin-top: calc(var(--json-tree-js-spacing) / 2);
|
margin-top: calc(var(--json-tree-js-spacing) / 2);
|
||||||
margin-bottom: calc(var(--json-tree-js-spacing) / 2);
|
margin-bottom: calc(var(--json-tree-js-spacing) / 2);
|
||||||
margin-left: calc(var(--json-tree-js-spacing) * 2);
|
margin-left: calc(var(--json-tree-js-spacing) * 2);
|
||||||
}
|
}
|
||||||
div.json-tree-js div.object-type-contents div.object-type-value span.split {
|
div.json-tree-js div.object-type-contents div.object-type-value span.split {
|
||||||
margin-left: calc(var(--json-tree-js-spacing) / 2);
|
margin-left: calc(var(--json-tree-js-spacing) / 2);
|
||||||
margin-right: calc(var(--json-tree-js-spacing) / 2);
|
margin-right: calc(var(--json-tree-js-spacing) / 2);
|
||||||
}
|
}
|
||||||
div.json-tree-js div.object-type-contents div.object-type-value span.value,
|
div.json-tree-js div.object-type-contents div.object-type-value span.value,
|
||||||
div.json-tree-js div.object-type-contents div.object-type-value span.main-title {
|
div.json-tree-js div.object-type-contents div.object-type-value span.main-title {
|
||||||
transition: var(--json-tree-js-transition);
|
transition: var(--json-tree-js-transition);
|
||||||
transition-property: opacity;
|
transition-property: opacity;
|
||||||
}
|
}
|
||||||
div.json-tree-js div.object-type-contents div.object-type-value span.value:not(.no-hover):not(.editable):hover,
|
div.json-tree-js
|
||||||
div.json-tree-js div.object-type-contents div.object-type-value span.main-title:not(.no-hover):not(.editable):hover {
|
div.object-type-contents
|
||||||
cursor: pointer;
|
div.object-type-value
|
||||||
opacity: 0.7;
|
span.value:not(.no-hover):not(.editable):hover,
|
||||||
|
div.json-tree-js
|
||||||
|
div.object-type-contents
|
||||||
|
div.object-type-value
|
||||||
|
span.main-title:not(.no-hover):not(.editable):hover {
|
||||||
|
cursor: pointer;
|
||||||
|
opacity: 0.7;
|
||||||
}
|
}
|
||||||
div.json-tree-js div.object-type-contents div.object-type-value span.editable {
|
div.json-tree-js div.object-type-contents div.object-type-value span.editable {
|
||||||
background-color: var(--json-tree-js-editable-background-color) !important;
|
background-color: var(--json-tree-js-editable-background-color) !important;
|
||||||
color: var(--json-tree-js-editable-text-color) !important;
|
color: var(--json-tree-js-editable-text-color) !important;
|
||||||
border: var(--json-tree-js-border-size) solid var(--json-tree-js-editable-border-color);
|
border: var(--json-tree-js-border-size) solid var(--json-tree-js-editable-border-color);
|
||||||
outline: none !important;
|
outline: none !important;
|
||||||
box-shadow: none !important;
|
box-shadow: none !important;
|
||||||
padding: calc(var(--json-tree-js-spacing) / 2) !important;
|
padding: calc(var(--json-tree-js-spacing) / 2) !important;
|
||||||
border-radius: var(--json-tree-js-border-radius-editable) !important;
|
border-radius: var(--json-tree-js-border-radius-editable) !important;
|
||||||
cursor: text !important;
|
cursor: text !important;
|
||||||
}
|
}
|
||||||
div.json-tree-js div.object-type-contents div.object-type-value span.main-title {
|
div.json-tree-js div.object-type-contents div.object-type-value span.main-title {
|
||||||
font-weight: var(--json-tree-js-header-bold-weight);
|
font-weight: var(--json-tree-js-header-bold-weight);
|
||||||
}
|
}
|
||||||
div.json-tree-js div.object-type-contents div.object-type-value span.non-value {
|
div.json-tree-js div.object-type-contents div.object-type-value span.non-value {
|
||||||
font-style: italic;
|
font-style: italic;
|
||||||
}
|
}
|
||||||
div.json-tree-js div.object-type-contents div.object-type-value span.comma {
|
div.json-tree-js div.object-type-contents div.object-type-value span.comma {
|
||||||
color: var(--json-tree-js-color-white);
|
color: var(--json-tree-js-color-white);
|
||||||
font-weight: var(--json-tree-js-text-bold-weight);
|
font-weight: var(--json-tree-js-text-bold-weight);
|
||||||
}
|
}
|
||||||
div.json-tree-js div.object-type-contents div.object-type-value span.array {
|
div.json-tree-js div.object-type-contents div.object-type-value span.array {
|
||||||
color: var(--json-tree-js-color-array);
|
color: var(--json-tree-js-color-array);
|
||||||
}
|
}
|
||||||
div.json-tree-js div.object-type-contents div.object-type-value span.object {
|
div.json-tree-js div.object-type-contents div.object-type-value span.object {
|
||||||
color: var(--json-tree-js-color-object);
|
color: var(--json-tree-js-color-object);
|
||||||
}
|
}
|
||||||
div.json-tree-js div.object-type-contents div.object-type-value span.map {
|
div.json-tree-js div.object-type-contents div.object-type-value span.map {
|
||||||
color: var(--json-tree-js-color-map);
|
color: var(--json-tree-js-color-map);
|
||||||
}
|
}
|
||||||
div.json-tree-js div.object-type-contents div.object-type-value span.set {
|
div.json-tree-js div.object-type-contents div.object-type-value span.set {
|
||||||
color: var(--json-tree-js-color-set);
|
color: var(--json-tree-js-color-set);
|
||||||
}
|
}
|
||||||
div.json-tree-js div.object-type-contents div.object-type-value span.boolean {
|
div.json-tree-js div.object-type-contents div.object-type-value span.boolean {
|
||||||
color: var(--json-tree-js-color-boolean);
|
color: var(--json-tree-js-color-boolean);
|
||||||
}
|
}
|
||||||
div.json-tree-js div.object-type-contents div.object-type-value span.decimal {
|
div.json-tree-js div.object-type-contents div.object-type-value span.decimal {
|
||||||
color: var(--json-tree-js-color-decimal);
|
color: var(--json-tree-js-color-decimal);
|
||||||
}
|
}
|
||||||
div.json-tree-js div.object-type-contents div.object-type-value span.number {
|
div.json-tree-js div.object-type-contents div.object-type-value span.number {
|
||||||
color: var(--json-tree-js-color-number);
|
color: var(--json-tree-js-color-number);
|
||||||
}
|
}
|
||||||
div.json-tree-js div.object-type-contents div.object-type-value span.bigint {
|
div.json-tree-js div.object-type-contents div.object-type-value span.bigint {
|
||||||
color: var(--json-tree-js-color-bigint);
|
color: var(--json-tree-js-color-bigint);
|
||||||
}
|
}
|
||||||
div.json-tree-js div.object-type-contents div.object-type-value span.string {
|
div.json-tree-js div.object-type-contents div.object-type-value span.string {
|
||||||
color: var(--json-tree-js-color-string);
|
color: var(--json-tree-js-color-string);
|
||||||
}
|
}
|
||||||
div.json-tree-js div.object-type-contents div.object-type-value span.date {
|
div.json-tree-js div.object-type-contents div.object-type-value span.date {
|
||||||
color: var(--json-tree-js-color-date);
|
color: var(--json-tree-js-color-date);
|
||||||
}
|
}
|
||||||
div.json-tree-js div.object-type-contents div.object-type-value span.null {
|
div.json-tree-js div.object-type-contents div.object-type-value span.null {
|
||||||
color: var(--json-tree-js-color-null);
|
color: var(--json-tree-js-color-null);
|
||||||
}
|
}
|
||||||
div.json-tree-js div.object-type-contents div.object-type-value span.symbol {
|
div.json-tree-js div.object-type-contents div.object-type-value span.symbol {
|
||||||
color: var(--json-tree-js-color-symbol);
|
color: var(--json-tree-js-color-symbol);
|
||||||
}
|
}
|
||||||
div.json-tree-js div.object-type-contents div.object-type-value span.function {
|
div.json-tree-js div.object-type-contents div.object-type-value span.function {
|
||||||
color: var(--json-tree-js-color-function);
|
color: var(--json-tree-js-color-function);
|
||||||
}
|
}
|
||||||
div.json-tree-js div.object-type-contents div.object-type-value span.unknown {
|
div.json-tree-js div.object-type-contents div.object-type-value span.unknown {
|
||||||
color: var(--json-tree-js-color-unknown);
|
color: var(--json-tree-js-color-unknown);
|
||||||
}
|
}
|
||||||
div.json-tree-js div.object-type-contents div.object-type-value span.undefined {
|
div.json-tree-js div.object-type-contents div.object-type-value span.undefined {
|
||||||
color: var(--json-tree-js-color-null);
|
color: var(--json-tree-js-color-null);
|
||||||
}
|
}
|
||||||
div.json-tree-js div.object-type-contents div.object-type-value span.guid {
|
div.json-tree-js div.object-type-contents div.object-type-value span.guid {
|
||||||
color: var(--json-tree-js-color-guid);
|
color: var(--json-tree-js-color-guid);
|
||||||
}
|
}
|
||||||
div.json-tree-js div.object-type-contents div.object-type-value span.regexp {
|
div.json-tree-js div.object-type-contents div.object-type-value span.regexp {
|
||||||
color: var(--json-tree-js-color-regexp);
|
color: var(--json-tree-js-color-regexp);
|
||||||
}
|
}
|
||||||
div.json-tree-js div.object-type-contents div.object-type-value span.count {
|
div.json-tree-js div.object-type-contents div.object-type-value span.count {
|
||||||
margin-left: calc(var(--json-tree-js-spacing) / 2);
|
margin-left: calc(var(--json-tree-js-spacing) / 2);
|
||||||
font-weight: var(--json-tree-js-text-bold-weight);
|
font-weight: var(--json-tree-js-text-bold-weight);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -446,27 +444,27 @@ div.json-tree-js div.object-type-contents div.object-type-value span.count {
|
|||||||
*/
|
*/
|
||||||
div.jsontree-js-tooltip,
|
div.jsontree-js-tooltip,
|
||||||
div.jsontree-js-tooltip-value {
|
div.jsontree-js-tooltip-value {
|
||||||
-moz-user-select: none;
|
-moz-user-select: none;
|
||||||
-webkit-user-select: none;
|
-webkit-user-select: none;
|
||||||
-ms-user-select: none;
|
-ms-user-select: none;
|
||||||
-o-user-select: none;
|
-o-user-select: none;
|
||||||
user-select: none;
|
user-select: none;
|
||||||
cursor: default;
|
cursor: default;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
line-height: normal;
|
line-height: normal;
|
||||||
font-family: var(--json-tree-js-default-font);
|
font-family: var(--json-tree-js-default-font);
|
||||||
animation: fade-in-animation var(--json-tree-js-animation-length);
|
animation: fade-in-animation var(--json-tree-js-animation-length);
|
||||||
position: absolute;
|
position: absolute;
|
||||||
background-color: var(--json-tree-js-tooltip-background-color);
|
background-color: var(--json-tree-js-tooltip-background-color);
|
||||||
border: var(--json-tree-js-border-size) solid var(--json-tree-js-tooltip-border-color);
|
border: var(--json-tree-js-border-size) solid var(--json-tree-js-tooltip-border-color);
|
||||||
color: var(--json-tree-js-tooltip-text-color);
|
color: var(--json-tree-js-tooltip-text-color);
|
||||||
border-radius: var(--json-tree-js-border-radius);
|
border-radius: var(--json-tree-js-border-radius);
|
||||||
z-index: 2000;
|
z-index: 2000;
|
||||||
max-width: 300px;
|
max-width: 300px;
|
||||||
padding: var(--json-tree-js-spacing);
|
padding: var(--json-tree-js-spacing);
|
||||||
font-size: var(--json-tree-js-spacing-font-size);
|
font-size: var(--json-tree-js-spacing-font-size);
|
||||||
font-weight: var(--json-tree-js-text-bold-weight);
|
font-weight: var(--json-tree-js-text-bold-weight);
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -475,12 +473,12 @@ div.jsontree-js-tooltip-value {
|
|||||||
-------------------------------------------------------------------------
|
-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@keyframes fade-in-animation {
|
@keyframes fade-in-animation {
|
||||||
0% {
|
0% {
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
}
|
}
|
||||||
100% {
|
100% {
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*# sourceMappingURL=jsontree.js.css.map */
|
/*# sourceMappingURL=jsontree.js.css.map */
|
||||||
|
|||||||
@@ -1,4 +1,174 @@
|
|||||||
/* PrismJS 1.30.0
|
/* PrismJS 1.30.0
|
||||||
https://prismjs.com/download.html#themes=prism-twilight&languages=markup+yaml&plugins=line-numbers */
|
https://prismjs.com/download.html#themes=prism-twilight&languages=markup+yaml&plugins=line-numbers */
|
||||||
code[class*=language-],pre[class*=language-]{color:#fff;background:0 0;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;text-shadow:0 -.1em .2em #000;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}:not(pre)>code[class*=language-],pre[class*=language-]{background:#141414}pre[class*=language-]{border-radius:.5em;border:.3em solid #545454;box-shadow:1px 1px .5em #000 inset;margin:.5em 0;overflow:auto;padding:1em}pre[class*=language-]::-moz-selection{background:#27292a}pre[class*=language-]::selection{background:#27292a}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:hsla(0,0%,93%,.15)}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:hsla(0,0%,93%,.15)}:not(pre)>code[class*=language-]{border-radius:.3em;border:.13em solid #545454;box-shadow:1px 1px .3em -.1em #000 inset;padding:.15em .2em .05em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#777}.token.punctuation{opacity:.7}.token.namespace{opacity:.7}.token.boolean,.token.deleted,.token.number,.token.tag{color:#ce6849}.token.builtin,.token.constant,.token.keyword,.token.property,.token.selector,.token.symbol{color:#f9ed99}.language-css .token.string,.style .token.string,.token.attr-name,.token.attr-value,.token.char,.token.entity,.token.inserted,.token.operator,.token.string,.token.url,.token.variable{color:#909e6a}.token.atrule{color:#7385a5}.token.important,.token.regex{color:#e8c062}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.language-markup .token.attr-name,.language-markup .token.punctuation,.language-markup .token.tag{color:#ac885c}.token{position:relative;z-index:1}.line-highlight.line-highlight{background:hsla(0,0%,33%,.25);background:linear-gradient(to right,hsla(0,0%,33%,.1) 70%,hsla(0,0%,33%,0));border-bottom:1px dashed #545454;border-top:1px dashed #545454;margin-top:.75em;z-index:0}.line-highlight.line-highlight:before,.line-highlight.line-highlight[data-end]:after{background-color:#8693a6;color:#f4f1ef}
|
code[class*='language-'],
|
||||||
pre[class*=language-].line-numbers{position:relative;padding-left:3.8em;counter-reset:linenumber}pre[class*=language-].line-numbers>code{position:relative;white-space:inherit}.line-numbers .line-numbers-rows{position:absolute;pointer-events:none;top:0;font-size:100%;left:-3.8em;width:3em;letter-spacing:-1px;border-right:1px solid #999;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.line-numbers-rows>span{display:block;counter-increment:linenumber}.line-numbers-rows>span:before{content:counter(linenumber);color:#999;display:block;padding-right:.8em;text-align:right}
|
pre[class*='language-'] {
|
||||||
|
color: #fff;
|
||||||
|
background: 0 0;
|
||||||
|
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
|
||||||
|
font-size: 1em;
|
||||||
|
text-align: left;
|
||||||
|
text-shadow: 0 -0.1em 0.2em #000;
|
||||||
|
white-space: pre;
|
||||||
|
word-spacing: normal;
|
||||||
|
word-break: normal;
|
||||||
|
word-wrap: normal;
|
||||||
|
line-height: 1.5;
|
||||||
|
-moz-tab-size: 4;
|
||||||
|
-o-tab-size: 4;
|
||||||
|
tab-size: 4;
|
||||||
|
-webkit-hyphens: none;
|
||||||
|
-moz-hyphens: none;
|
||||||
|
-ms-hyphens: none;
|
||||||
|
hyphens: none;
|
||||||
|
}
|
||||||
|
:not(pre) > code[class*='language-'],
|
||||||
|
pre[class*='language-'] {
|
||||||
|
background: #141414;
|
||||||
|
}
|
||||||
|
pre[class*='language-'] {
|
||||||
|
border-radius: 0.5em;
|
||||||
|
border: 0.3em solid #545454;
|
||||||
|
box-shadow: 1px 1px 0.5em #000 inset;
|
||||||
|
margin: 0.5em 0;
|
||||||
|
overflow: auto;
|
||||||
|
padding: 1em;
|
||||||
|
}
|
||||||
|
pre[class*='language-']::-moz-selection {
|
||||||
|
background: #27292a;
|
||||||
|
}
|
||||||
|
pre[class*='language-']::selection {
|
||||||
|
background: #27292a;
|
||||||
|
}
|
||||||
|
code[class*='language-'] ::-moz-selection,
|
||||||
|
code[class*='language-']::-moz-selection,
|
||||||
|
pre[class*='language-'] ::-moz-selection,
|
||||||
|
pre[class*='language-']::-moz-selection {
|
||||||
|
text-shadow: none;
|
||||||
|
background: hsla(0, 0%, 93%, 0.15);
|
||||||
|
}
|
||||||
|
code[class*='language-'] ::selection,
|
||||||
|
code[class*='language-']::selection,
|
||||||
|
pre[class*='language-'] ::selection,
|
||||||
|
pre[class*='language-']::selection {
|
||||||
|
text-shadow: none;
|
||||||
|
background: hsla(0, 0%, 93%, 0.15);
|
||||||
|
}
|
||||||
|
:not(pre) > code[class*='language-'] {
|
||||||
|
border-radius: 0.3em;
|
||||||
|
border: 0.13em solid #545454;
|
||||||
|
box-shadow: 1px 1px 0.3em -0.1em #000 inset;
|
||||||
|
padding: 0.15em 0.2em 0.05em;
|
||||||
|
white-space: normal;
|
||||||
|
}
|
||||||
|
.token.cdata,
|
||||||
|
.token.comment,
|
||||||
|
.token.doctype,
|
||||||
|
.token.prolog {
|
||||||
|
color: #777;
|
||||||
|
}
|
||||||
|
.token.punctuation {
|
||||||
|
opacity: 0.7;
|
||||||
|
}
|
||||||
|
.token.namespace {
|
||||||
|
opacity: 0.7;
|
||||||
|
}
|
||||||
|
.token.boolean,
|
||||||
|
.token.deleted,
|
||||||
|
.token.number,
|
||||||
|
.token.tag {
|
||||||
|
color: #ce6849;
|
||||||
|
}
|
||||||
|
.token.builtin,
|
||||||
|
.token.constant,
|
||||||
|
.token.keyword,
|
||||||
|
.token.property,
|
||||||
|
.token.selector,
|
||||||
|
.token.symbol {
|
||||||
|
color: #f9ed99;
|
||||||
|
}
|
||||||
|
.language-css .token.string,
|
||||||
|
.style .token.string,
|
||||||
|
.token.attr-name,
|
||||||
|
.token.attr-value,
|
||||||
|
.token.char,
|
||||||
|
.token.entity,
|
||||||
|
.token.inserted,
|
||||||
|
.token.operator,
|
||||||
|
.token.string,
|
||||||
|
.token.url,
|
||||||
|
.token.variable {
|
||||||
|
color: #909e6a;
|
||||||
|
}
|
||||||
|
.token.atrule {
|
||||||
|
color: #7385a5;
|
||||||
|
}
|
||||||
|
.token.important,
|
||||||
|
.token.regex {
|
||||||
|
color: #e8c062;
|
||||||
|
}
|
||||||
|
.token.bold,
|
||||||
|
.token.important {
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
.token.italic {
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
.token.entity {
|
||||||
|
cursor: help;
|
||||||
|
}
|
||||||
|
.language-markup .token.attr-name,
|
||||||
|
.language-markup .token.punctuation,
|
||||||
|
.language-markup .token.tag {
|
||||||
|
color: #ac885c;
|
||||||
|
}
|
||||||
|
.token {
|
||||||
|
position: relative;
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
.line-highlight.line-highlight {
|
||||||
|
background: hsla(0, 0%, 33%, 0.25);
|
||||||
|
background: linear-gradient(to right, hsla(0, 0%, 33%, 0.1) 70%, hsla(0, 0%, 33%, 0));
|
||||||
|
border-bottom: 1px dashed #545454;
|
||||||
|
border-top: 1px dashed #545454;
|
||||||
|
margin-top: 0.75em;
|
||||||
|
z-index: 0;
|
||||||
|
}
|
||||||
|
.line-highlight.line-highlight:before,
|
||||||
|
.line-highlight.line-highlight[data-end]:after {
|
||||||
|
background-color: #8693a6;
|
||||||
|
color: #f4f1ef;
|
||||||
|
}
|
||||||
|
pre[class*='language-'].line-numbers {
|
||||||
|
position: relative;
|
||||||
|
padding-left: 3.8em;
|
||||||
|
counter-reset: linenumber;
|
||||||
|
}
|
||||||
|
pre[class*='language-'].line-numbers > code {
|
||||||
|
position: relative;
|
||||||
|
white-space: inherit;
|
||||||
|
}
|
||||||
|
.line-numbers .line-numbers-rows {
|
||||||
|
position: absolute;
|
||||||
|
pointer-events: none;
|
||||||
|
top: 0;
|
||||||
|
font-size: 100%;
|
||||||
|
left: -3.8em;
|
||||||
|
width: 3em;
|
||||||
|
letter-spacing: -1px;
|
||||||
|
border-right: 1px solid #999;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-moz-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
.line-numbers-rows > span {
|
||||||
|
display: block;
|
||||||
|
counter-increment: linenumber;
|
||||||
|
}
|
||||||
|
.line-numbers-rows > span:before {
|
||||||
|
content: counter(linenumber);
|
||||||
|
color: #999;
|
||||||
|
display: block;
|
||||||
|
padding-right: 0.8em;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user