sovereign 1.0.0b127.post6__tar.gz → 1.0.0b129__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of sovereign might be problematic. Click here for more details.
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/PKG-INFO +4 -4
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/pyproject.toml +6 -2
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/src/sovereign/app.py +1 -1
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/src/sovereign/rendering.py +7 -9
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/src/sovereign/server.py +4 -3
- sovereign-1.0.0b127.post6/src/sovereign/static/darkmode.js +0 -51
- sovereign-1.0.0b127.post6/src/sovereign/static/node_expression.js +0 -42
- sovereign-1.0.0b127.post6/src/sovereign/static/panel.js +0 -76
- sovereign-1.0.0b127.post6/src/sovereign/static/resources.css +0 -246
- sovereign-1.0.0b127.post6/src/sovereign/static/resources.js +0 -642
- sovereign-1.0.0b127.post6/src/sovereign/static/sass/style.scss +0 -33
- sovereign-1.0.0b127.post6/src/sovereign/static/style.css +0 -16143
- sovereign-1.0.0b127.post6/src/sovereign/static/style.css.map +0 -1
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/README.md +0 -0
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/src/sovereign/__init__.py +0 -0
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/src/sovereign/cache.py +0 -0
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/src/sovereign/constants.py +0 -0
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/src/sovereign/context.py +0 -0
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/src/sovereign/dynamic_config/__init__.py +0 -0
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/src/sovereign/dynamic_config/deser.py +0 -0
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/src/sovereign/dynamic_config/loaders.py +0 -0
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/src/sovereign/error_info.py +0 -0
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/src/sovereign/logging/access_logger.py +0 -0
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/src/sovereign/logging/application_logger.py +0 -0
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/src/sovereign/logging/base_logger.py +0 -0
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/src/sovereign/logging/bootstrapper.py +0 -0
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/src/sovereign/logging/types.py +0 -0
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/src/sovereign/middlewares.py +0 -0
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/src/sovereign/modifiers/__init__.py +0 -0
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/src/sovereign/modifiers/lib.py +0 -0
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/src/sovereign/response_class.py +0 -0
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/src/sovereign/schemas.py +0 -0
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/src/sovereign/sources/__init__.py +0 -0
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/src/sovereign/sources/file.py +0 -0
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/src/sovereign/sources/inline.py +0 -0
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/src/sovereign/sources/lib.py +0 -0
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/src/sovereign/sources/poller.py +0 -0
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/src/sovereign/statistics.py +0 -0
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/src/sovereign/templates/base.html +0 -0
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/src/sovereign/templates/err.html +0 -0
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/src/sovereign/templates/resources.html +0 -0
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/src/sovereign/testing/loaders.py +0 -0
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/src/sovereign/testing/modifiers.py +0 -0
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/src/sovereign/tracing.py +0 -0
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/src/sovereign/utils/__init__.py +0 -0
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/src/sovereign/utils/auth.py +0 -0
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/src/sovereign/utils/crypto/__init__.py +0 -0
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/src/sovereign/utils/crypto/crypto.py +0 -0
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/src/sovereign/utils/crypto/suites/__init__.py +0 -0
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/src/sovereign/utils/crypto/suites/aes_gcm_cipher.py +0 -0
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/src/sovereign/utils/crypto/suites/base_cipher.py +0 -0
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/src/sovereign/utils/crypto/suites/disabled_cipher.py +0 -0
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/src/sovereign/utils/crypto/suites/fernet_cipher.py +0 -0
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/src/sovereign/utils/dictupdate.py +0 -0
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/src/sovereign/utils/eds.py +0 -0
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/src/sovereign/utils/entry_point_loader.py +0 -0
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/src/sovereign/utils/mock.py +0 -0
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/src/sovereign/utils/resources.py +0 -0
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/src/sovereign/utils/templates.py +0 -0
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/src/sovereign/utils/timer.py +0 -0
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/src/sovereign/utils/version_info.py +0 -0
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/src/sovereign/utils/weighted_clusters.py +0 -0
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/src/sovereign/views/__init__.py +0 -0
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/src/sovereign/views/api.py +0 -0
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/src/sovereign/views/crypto.py +0 -0
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/src/sovereign/views/discovery.py +0 -0
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/src/sovereign/views/healthchecks.py +0 -0
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/src/sovereign/views/interface.py +0 -0
- {sovereign-1.0.0b127.post6 → sovereign-1.0.0b129}/src/sovereign/worker.py +0 -0
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: sovereign
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.0b129
|
|
4
4
|
Summary: Envoy Proxy control-plane written in Python
|
|
5
|
-
Home-page: https://pypi.org/project/sovereign/
|
|
6
5
|
License: Apache-2.0
|
|
7
6
|
Keywords: envoy,envoyproxy,control-plane,management,server
|
|
8
7
|
Author: Vasili Syrakis
|
|
@@ -20,6 +19,7 @@ Classifier: Programming Language :: Python :: 3
|
|
|
20
19
|
Classifier: Programming Language :: Python :: 3.11
|
|
21
20
|
Classifier: Programming Language :: Python :: 3.12
|
|
22
21
|
Classifier: Programming Language :: Python :: 3.13
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
23
23
|
Classifier: Programming Language :: Python :: 3.10
|
|
24
24
|
Classifier: Programming Language :: Python :: 3.8
|
|
25
25
|
Classifier: Programming Language :: Python :: 3.9
|
|
@@ -49,7 +49,6 @@ Requires-Dist: jmespath (>=1.0.1,<2.0.0)
|
|
|
49
49
|
Requires-Dist: orjson (>=3.9.15,<4.0.0) ; extra == "orjson"
|
|
50
50
|
Requires-Dist: pydantic (>=2.7.2,<3.0.0)
|
|
51
51
|
Requires-Dist: pydantic-settings (<2.6.0)
|
|
52
|
-
Requires-Dist: redis (<=5.0.0)
|
|
53
52
|
Requires-Dist: requests (>=2.32.4,<3.0.0)
|
|
54
53
|
Requires-Dist: sentry-sdk (>=2.14.0,<3.0.0) ; extra == "sentry"
|
|
55
54
|
Requires-Dist: starlette (>=0.47.2,<0.48.0)
|
|
@@ -60,6 +59,7 @@ Requires-Dist: ujson (>=5.8.0,<6.0.0) ; extra == "ujson"
|
|
|
60
59
|
Requires-Dist: uvicorn (>=0.23.2,<0.24.0)
|
|
61
60
|
Requires-Dist: uvloop (>=0.19.0,<0.20.0)
|
|
62
61
|
Project-URL: Documentation, https://developer.atlassian.com/platform/sovereign/
|
|
62
|
+
Project-URL: Homepage, https://pypi.org/project/sovereign/
|
|
63
63
|
Project-URL: Repository, https://bitbucket.org/atlassian/sovereign/src/master/
|
|
64
64
|
Description-Content-Type: text/markdown
|
|
65
65
|
|
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "sovereign"
|
|
3
|
-
version = "1.0.
|
|
3
|
+
version = "1.0.0b129"
|
|
4
4
|
description = "Envoy Proxy control-plane written in Python"
|
|
5
5
|
license = "Apache-2.0"
|
|
6
6
|
packages = [
|
|
7
|
-
{ include = "sovereign", from = "src", format = "
|
|
7
|
+
{ include = "sovereign", from = "src", format = "wheel" },
|
|
8
|
+
{ include = "sovereign-files", from = "src", format = "wheel" },
|
|
9
|
+
]
|
|
10
|
+
include = [
|
|
11
|
+
{ path = "src/sovereign-files/**/*", format = "wheel" },
|
|
8
12
|
]
|
|
9
13
|
readme = "README.md"
|
|
10
14
|
#include = ["CHANGELOG.md", "CODE_OF_CONDUCT.md"]
|
|
@@ -101,7 +101,7 @@ def init_app() -> FastAPI:
|
|
|
101
101
|
|
|
102
102
|
@application.get("/static/{filename}", summary="Return a static asset")
|
|
103
103
|
async def static(filename: str) -> Response:
|
|
104
|
-
return FileResponse(get_package_file("sovereign", f"static/{filename}")) # type: ignore[arg-type]
|
|
104
|
+
return FileResponse(get_package_file("sovereign-files", f"static/{filename}")) # type: ignore[arg-type]
|
|
105
105
|
|
|
106
106
|
@application.get(
|
|
107
107
|
"/admin/xds_dump",
|
|
@@ -7,8 +7,8 @@ Functions used to render and return discovery responses to Envoy proxies.
|
|
|
7
7
|
The templates are configurable. `todo See ref:Configuration#Templates`
|
|
8
8
|
"""
|
|
9
9
|
|
|
10
|
-
import
|
|
11
|
-
from multiprocessing import Process,
|
|
10
|
+
from concurrent.futures import ThreadPoolExecutor
|
|
11
|
+
from multiprocessing import Process, cpu_count
|
|
12
12
|
from typing import Any, Dict, List
|
|
13
13
|
|
|
14
14
|
import yaml
|
|
@@ -30,7 +30,7 @@ from sovereign.schemas import (
|
|
|
30
30
|
)
|
|
31
31
|
|
|
32
32
|
# limit render jobs to number of cores
|
|
33
|
-
|
|
33
|
+
POOL = ThreadPoolExecutor(max_workers=cpu_count())
|
|
34
34
|
|
|
35
35
|
type_urls = {
|
|
36
36
|
"v2": {
|
|
@@ -59,14 +59,12 @@ class RenderJob(pydantic.BaseModel):
|
|
|
59
59
|
context: dict[str, Any]
|
|
60
60
|
|
|
61
61
|
def spawn(self):
|
|
62
|
-
|
|
63
|
-
t.start()
|
|
62
|
+
POOL.submit(self._run)
|
|
64
63
|
|
|
65
64
|
def _run(self):
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
proc.join()
|
|
65
|
+
proc = Process(target=generate, args=[self])
|
|
66
|
+
proc.start()
|
|
67
|
+
proc.join()
|
|
70
68
|
|
|
71
69
|
|
|
72
70
|
def generate(job: RenderJob) -> None:
|
|
@@ -6,16 +6,15 @@ from pathlib import Path
|
|
|
6
6
|
import uvicorn
|
|
7
7
|
|
|
8
8
|
from sovereign import application_logger as log
|
|
9
|
-
from sovereign.app import app
|
|
10
|
-
from sovereign.worker import worker as worker_app
|
|
11
9
|
from sovereign.schemas import SovereignAsgiConfig, SupervisordConfig
|
|
12
10
|
|
|
13
|
-
|
|
14
11
|
asgi_config = SovereignAsgiConfig()
|
|
15
12
|
supervisord_config = SupervisordConfig()
|
|
16
13
|
|
|
17
14
|
|
|
18
15
|
def web() -> None:
|
|
16
|
+
from sovereign.app import app
|
|
17
|
+
|
|
19
18
|
log.debug("Starting web server")
|
|
20
19
|
uvicorn.run(
|
|
21
20
|
app,
|
|
@@ -30,6 +29,8 @@ def web() -> None:
|
|
|
30
29
|
|
|
31
30
|
|
|
32
31
|
def worker():
|
|
32
|
+
from sovereign.worker import worker as worker_app
|
|
33
|
+
|
|
33
34
|
log.debug("Starting worker")
|
|
34
35
|
uvicorn.run(
|
|
35
36
|
worker_app,
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
document.addEventListener('DOMContentLoaded', function() {
|
|
2
|
-
const darkmode = "theme-dark";
|
|
3
|
-
const lightmode = "theme-light";
|
|
4
|
-
const toggle = document.getElementById('dark-mode-toggle');
|
|
5
|
-
const htmlTag = document.documentElement;
|
|
6
|
-
|
|
7
|
-
function preferredTheme() {
|
|
8
|
-
const preference = localStorage.getItem("theme");
|
|
9
|
-
if (preference) {
|
|
10
|
-
return preference;
|
|
11
|
-
}
|
|
12
|
-
if (window.matchMedia("(prefers-color-scheme: dark)").matches) {
|
|
13
|
-
return "dark";
|
|
14
|
-
} else {
|
|
15
|
-
return "light";
|
|
16
|
-
};
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
function currentTheme() {
|
|
20
|
-
if (htmlTag.classList.contains(darkmode)) {
|
|
21
|
-
return "dark"
|
|
22
|
-
} else {
|
|
23
|
-
return "light"
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
function setTheme(theme) {
|
|
28
|
-
localStorage.setItem("theme", theme);
|
|
29
|
-
if (theme === "dark") {
|
|
30
|
-
htmlTag.classList.remove(lightmode);
|
|
31
|
-
htmlTag.classList.add(darkmode);
|
|
32
|
-
toggle.textContent = '🌘';
|
|
33
|
-
} else {
|
|
34
|
-
htmlTag.classList.remove(darkmode);
|
|
35
|
-
htmlTag.classList.add(lightmode);
|
|
36
|
-
toggle.textContent = '🌞';
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
setTheme(preferredTheme());
|
|
41
|
-
|
|
42
|
-
toggle.addEventListener("click", function() {
|
|
43
|
-
let current = currentTheme();
|
|
44
|
-
console.log("Current theme: " + current);
|
|
45
|
-
if (current === "dark") {
|
|
46
|
-
setTheme("light");
|
|
47
|
-
} else {
|
|
48
|
-
setTheme("dark");
|
|
49
|
-
}
|
|
50
|
-
});
|
|
51
|
-
});
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
const input = document.getElementById('filterInput');
|
|
2
|
-
const inputMessage = document.getElementById('filterMessage');
|
|
3
|
-
const form = document.getElementById('filterForm');
|
|
4
|
-
|
|
5
|
-
function validateInput(inputString) {
|
|
6
|
-
if (!inputString || inputString.trim() === '') {
|
|
7
|
-
return "empty";
|
|
8
|
-
}
|
|
9
|
-
const validationRegex = /^(?:(?:id|cluster|metadata\.[\w\.\=\-]+|locality\.?(?:zone|sub_zone|region))=[a-zA-Z0-9_-]+ ?)*$/;
|
|
10
|
-
return validationRegex.test(inputString);
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
window.addEventListener('DOMContentLoaded', () => {
|
|
14
|
-
const match = document.cookie.match(/(?:^|; )node_expression=([^;]*)/);
|
|
15
|
-
if (match) {
|
|
16
|
-
input.value = match[1];
|
|
17
|
-
}
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
input.addEventListener('input', (event) => {
|
|
21
|
-
const result = validateInput(event.target.value);
|
|
22
|
-
if (result === "empty") {
|
|
23
|
-
input.className = "input is-dark";
|
|
24
|
-
inputMessage.className = "help is-dark";
|
|
25
|
-
inputMessage.innerHTML = "";
|
|
26
|
-
} else if (result === true) {
|
|
27
|
-
input.className = "input is-success";
|
|
28
|
-
inputMessage.className = "help is-success";
|
|
29
|
-
inputMessage.innerHTML = "Press enter to apply filter expression";
|
|
30
|
-
} else {
|
|
31
|
-
input.className = "input is-danger";
|
|
32
|
-
inputMessage.className = "help is-danger";
|
|
33
|
-
inputMessage.innerHTML = "The node filter expression may have no effect, or be invalid";
|
|
34
|
-
}
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
form.addEventListener('submit', (event) => {
|
|
38
|
-
event.preventDefault();
|
|
39
|
-
const value = input.value.trim();
|
|
40
|
-
document.cookie = `node_expression=${value}; path=/ui/resources/; max-age=31536000`;
|
|
41
|
-
location.reload();
|
|
42
|
-
});
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
document.addEventListener('DOMContentLoaded', function() {
|
|
2
|
-
let currentTabFilter = 'all'; // Track the current tab filter
|
|
3
|
-
|
|
4
|
-
function clearSearch() {
|
|
5
|
-
const searchInput = document.getElementById('searchInput');
|
|
6
|
-
if (searchInput) {
|
|
7
|
-
searchInput.value = '';
|
|
8
|
-
}
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
// Function to apply both tab and search filters
|
|
12
|
-
function applyFilters() {
|
|
13
|
-
const searchInput = document.getElementById('searchInput');
|
|
14
|
-
const query = searchInput ? searchInput.value.toLowerCase() : '';
|
|
15
|
-
const virtualHosts = document.querySelectorAll('.virtualhost');
|
|
16
|
-
|
|
17
|
-
virtualHosts.forEach(vh => {
|
|
18
|
-
const text = vh.textContent.toLowerCase();
|
|
19
|
-
const category = vh.getAttribute("data-category");
|
|
20
|
-
|
|
21
|
-
// Check if it passes the tab filter
|
|
22
|
-
const passesTabFilter = (currentTabFilter === 'all') || (category === currentTabFilter);
|
|
23
|
-
|
|
24
|
-
// Check if it passes the search filter
|
|
25
|
-
const passesSearchFilter = query === '' || text.includes(query);
|
|
26
|
-
|
|
27
|
-
// Show only if it passes both filters
|
|
28
|
-
if (passesTabFilter && passesSearchFilter) {
|
|
29
|
-
vh.classList.remove('filtered');
|
|
30
|
-
} else {
|
|
31
|
-
vh.classList.add('filtered');
|
|
32
|
-
}
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
// Function to hide all panels except active
|
|
37
|
-
function updateVisibility() {
|
|
38
|
-
const panelBlocks = document.querySelectorAll('.virtualhost');
|
|
39
|
-
panelBlocks.forEach(block => {
|
|
40
|
-
if (!block.classList.contains('is-active')) {
|
|
41
|
-
block.classList.add('filtered');
|
|
42
|
-
} else {
|
|
43
|
-
block.classList.remove('filtered');
|
|
44
|
-
}
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
updateVisibility();
|
|
48
|
-
|
|
49
|
-
window.filterTabs = function(element, filter) {
|
|
50
|
-
const tabs = document.querySelectorAll('.panel-tabs a');
|
|
51
|
-
tabs.forEach(tab => tab.classList.remove('is-active'));
|
|
52
|
-
element.classList.add('is-active');
|
|
53
|
-
|
|
54
|
-
currentTabFilter = filter; // Update the current tab filter
|
|
55
|
-
|
|
56
|
-
// Clear virtual hosts search input when switching tabs
|
|
57
|
-
const searchInput = document.getElementById('searchInput');
|
|
58
|
-
if (searchInput) {
|
|
59
|
-
searchInput.value = null;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
applyFilters();
|
|
63
|
-
};
|
|
64
|
-
|
|
65
|
-
const searchInput = document.getElementById('searchInput');
|
|
66
|
-
if (searchInput) {
|
|
67
|
-
searchInput.addEventListener('input', function() {
|
|
68
|
-
applyFilters(); // Apply both filters when searching
|
|
69
|
-
});
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
const allTab = document.querySelector('.panel-tabs a.is-active');
|
|
73
|
-
if (allTab) {
|
|
74
|
-
filterTabs(allTab, 'all');
|
|
75
|
-
}
|
|
76
|
-
});
|
|
@@ -1,246 +0,0 @@
|
|
|
1
|
-
/* Resources page styles */
|
|
2
|
-
#filterInput {
|
|
3
|
-
font-family: monospace;
|
|
4
|
-
}
|
|
5
|
-
|
|
6
|
-
.filtered {
|
|
7
|
-
display: none;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
.tooltip {
|
|
11
|
-
position: relative;
|
|
12
|
-
display: inline-block;
|
|
13
|
-
cursor: help;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
.tooltip .tooltip-text {
|
|
17
|
-
visibility: hidden;
|
|
18
|
-
width: 220px;
|
|
19
|
-
background-color: #363636;
|
|
20
|
-
color: #fff;
|
|
21
|
-
text-align: left;
|
|
22
|
-
padding: 0.5rem;
|
|
23
|
-
border-radius: 6px;
|
|
24
|
-
position: absolute;
|
|
25
|
-
z-index: 1;
|
|
26
|
-
top: 125%;
|
|
27
|
-
left: 50%;
|
|
28
|
-
margin-left: -110px;
|
|
29
|
-
opacity: 0;
|
|
30
|
-
transition: opacity 0.3s;
|
|
31
|
-
font-size: 0.875rem;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
.tooltip:hover .tooltip-text {
|
|
35
|
-
visibility: visible;
|
|
36
|
-
opacity: 1;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/* Side panel styles - using Bulma-compatible approach */
|
|
40
|
-
.side-panel {
|
|
41
|
-
position: fixed;
|
|
42
|
-
top: 0;
|
|
43
|
-
right: -100%;
|
|
44
|
-
width: 95%;
|
|
45
|
-
max-width: 1200px;
|
|
46
|
-
min-width: 400px;
|
|
47
|
-
height: 100vh;
|
|
48
|
-
z-index: 1000;
|
|
49
|
-
transition: right 0.3s ease-in-out;
|
|
50
|
-
overflow-y: auto;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
.side-panel.is-active {
|
|
54
|
-
right: 0;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/* Responsive side panel sizing */
|
|
58
|
-
@media (min-width: 768px) {
|
|
59
|
-
.side-panel { width: 75%; right: -75%; }
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
@media (min-width: 1024px) {
|
|
63
|
-
.side-panel { width: 65%; right: -65%; }
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
@media (min-width: 1400px) {
|
|
67
|
-
.side-panel { width: 55%; right: -55%; }
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
@media (min-width: 1600px) {
|
|
71
|
-
.side-panel { width: 50%; right: -50%; }
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
@media (max-width: 480px) {
|
|
75
|
-
.side-panel { width: 95%; min-width: 300px; right: -95%; }
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
.json-container {
|
|
79
|
-
position: relative;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
.json-header {
|
|
83
|
-
padding: 1rem;
|
|
84
|
-
border-bottom: 1px solid #555;
|
|
85
|
-
background-color: #2d2d2d;
|
|
86
|
-
display: flex;
|
|
87
|
-
justify-content: space-between;
|
|
88
|
-
align-items: center;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
.json-content {
|
|
92
|
-
background-color: #1e1e1e;
|
|
93
|
-
border: none;
|
|
94
|
-
border-radius: 0;
|
|
95
|
-
padding: 1rem;
|
|
96
|
-
font-family: 'JetBrains Mono', 'Fira Code', 'SF Mono', 'Monaco', 'Inconsolata', 'Roboto Mono', 'Source Code Pro', 'Menlo', 'Consolas', monospace;
|
|
97
|
-
font-size: 0.875rem;
|
|
98
|
-
line-height: 1.5;
|
|
99
|
-
white-space: pre-wrap;
|
|
100
|
-
word-wrap: break-word;
|
|
101
|
-
max-height: calc(100vh - 250px);
|
|
102
|
-
overflow-y: auto;
|
|
103
|
-
color: #d4d4d4;
|
|
104
|
-
margin: 0;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
/* JSON Syntax Highlighting - VS Code Dark+ theme colors */
|
|
108
|
-
.json-key {
|
|
109
|
-
color: #9cdcfe;
|
|
110
|
-
font-weight: 400;
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
.json-string {
|
|
114
|
-
color: #ce9178;
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
.json-number {
|
|
118
|
-
color: #b5cea8;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
.json-boolean {
|
|
122
|
-
color: #569cd6;
|
|
123
|
-
font-weight: 500;
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
.json-null {
|
|
127
|
-
color: #569cd6;
|
|
128
|
-
font-weight: 500;
|
|
129
|
-
font-style: italic;
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
.json-punctuation {
|
|
133
|
-
color: #d4d4d4;
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
/* Improve readability */
|
|
137
|
-
.json-content::-webkit-scrollbar {
|
|
138
|
-
width: 8px;
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
.json-content::-webkit-scrollbar-track {
|
|
142
|
-
background: #2d2d2d;
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
.json-content::-webkit-scrollbar-thumb {
|
|
146
|
-
background: #555;
|
|
147
|
-
border-radius: 4px;
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
.json-content::-webkit-scrollbar-thumb:hover {
|
|
151
|
-
background: #666;
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
/* Collapsible JSON */
|
|
155
|
-
.json-toggle {
|
|
156
|
-
cursor: pointer;
|
|
157
|
-
user-select: none;
|
|
158
|
-
color: #808080;
|
|
159
|
-
margin-right: 0.25rem;
|
|
160
|
-
font-family: monospace;
|
|
161
|
-
font-size: 0.875rem;
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
.json-toggle:hover {
|
|
165
|
-
color: #fff;
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
.json-collapsible {
|
|
169
|
-
margin-left: 1rem;
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
.json-collapsed {
|
|
173
|
-
display: none;
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
.loading-spinner {
|
|
177
|
-
display: inline-block;
|
|
178
|
-
width: 20px;
|
|
179
|
-
height: 20px;
|
|
180
|
-
border: 3px solid #f3f3f3;
|
|
181
|
-
border-top: 3px solid #433fca;
|
|
182
|
-
border-radius: 50%;
|
|
183
|
-
animation: spin 1s linear infinite;
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
@keyframes spin {
|
|
187
|
-
0% { transform: rotate(0deg); }
|
|
188
|
-
100% { transform: rotate(360deg); }
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
/* Prevent body scroll when side panel is open */
|
|
192
|
-
body.side-panel-open {
|
|
193
|
-
overflow: hidden;
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
/* Backdrop overlay for side panel */
|
|
197
|
-
.side-panel-backdrop {
|
|
198
|
-
position: fixed;
|
|
199
|
-
top: 0;
|
|
200
|
-
left: 0;
|
|
201
|
-
width: 100%;
|
|
202
|
-
height: 100%;
|
|
203
|
-
background-color: rgba(0, 0, 0, 0.5);
|
|
204
|
-
z-index: 999;
|
|
205
|
-
opacity: 0;
|
|
206
|
-
visibility: hidden;
|
|
207
|
-
transition: opacity 0.3s ease-in-out, visibility 0.3s ease-in-out;
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
.side-panel-backdrop.is-active {
|
|
211
|
-
opacity: 1;
|
|
212
|
-
visibility: visible;
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
/* Show backdrop on smaller screens */
|
|
216
|
-
@media (max-width: 1024px) {
|
|
217
|
-
.side-panel-backdrop.is-active {
|
|
218
|
-
opacity: 1;
|
|
219
|
-
visibility: visible;
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
/* Minimal custom styles - using Bulma classes for most styling */
|
|
224
|
-
.json-chunk-controls {
|
|
225
|
-
background-color: #2d2d2d;
|
|
226
|
-
border-bottom: 1px solid #555;
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
/* Preferences details styling */
|
|
230
|
-
details summary {
|
|
231
|
-
list-style: none;
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
details summary::-webkit-details-marker {
|
|
235
|
-
display: none;
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
details summary::before {
|
|
239
|
-
content: "▶";
|
|
240
|
-
margin-right: 0.5rem;
|
|
241
|
-
transition: transform 0.2s;
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
details[open] summary::before {
|
|
245
|
-
transform: rotate(90deg);
|
|
246
|
-
}
|