deepboard 0.2.0__py3-none-any.whl
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.
- deepboard/__init__.py +1 -0
- deepboard/__version__.py +4 -0
- deepboard/gui/THEME.yml +28 -0
- deepboard/gui/__init__.py +0 -0
- deepboard/gui/assets/artefacts.css +108 -0
- deepboard/gui/assets/base.css +208 -0
- deepboard/gui/assets/base.js +77 -0
- deepboard/gui/assets/charts.css +188 -0
- deepboard/gui/assets/compare.css +90 -0
- deepboard/gui/assets/datagrid.css +120 -0
- deepboard/gui/assets/fileview.css +13 -0
- deepboard/gui/assets/right_panel.css +227 -0
- deepboard/gui/assets/theme.css +85 -0
- deepboard/gui/components/__init__.py +8 -0
- deepboard/gui/components/artefact_group.py +12 -0
- deepboard/gui/components/chart_type.py +22 -0
- deepboard/gui/components/legend.py +34 -0
- deepboard/gui/components/log_selector.py +22 -0
- deepboard/gui/components/modal.py +20 -0
- deepboard/gui/components/smoother.py +21 -0
- deepboard/gui/components/split_selector.py +21 -0
- deepboard/gui/components/stat_line.py +8 -0
- deepboard/gui/entry.py +21 -0
- deepboard/gui/main.py +93 -0
- deepboard/gui/pages/__init__.py +1 -0
- deepboard/gui/pages/compare_page/__init__.py +6 -0
- deepboard/gui/pages/compare_page/compare_page.py +22 -0
- deepboard/gui/pages/compare_page/components/__init__.py +4 -0
- deepboard/gui/pages/compare_page/components/card_list.py +19 -0
- deepboard/gui/pages/compare_page/components/chart.py +54 -0
- deepboard/gui/pages/compare_page/components/compare_setup.py +30 -0
- deepboard/gui/pages/compare_page/components/split_card.py +51 -0
- deepboard/gui/pages/compare_page/components/utils.py +20 -0
- deepboard/gui/pages/compare_page/routes.py +58 -0
- deepboard/gui/pages/main_page/__init__.py +4 -0
- deepboard/gui/pages/main_page/datagrid/__init__.py +5 -0
- deepboard/gui/pages/main_page/datagrid/compare_button.py +21 -0
- deepboard/gui/pages/main_page/datagrid/datagrid.py +67 -0
- deepboard/gui/pages/main_page/datagrid/handlers.py +54 -0
- deepboard/gui/pages/main_page/datagrid/header.py +43 -0
- deepboard/gui/pages/main_page/datagrid/routes.py +112 -0
- deepboard/gui/pages/main_page/datagrid/row.py +20 -0
- deepboard/gui/pages/main_page/datagrid/sortable_column_js.py +45 -0
- deepboard/gui/pages/main_page/datagrid/utils.py +9 -0
- deepboard/gui/pages/main_page/handlers.py +16 -0
- deepboard/gui/pages/main_page/main_page.py +21 -0
- deepboard/gui/pages/main_page/right_panel/__init__.py +12 -0
- deepboard/gui/pages/main_page/right_panel/config.py +57 -0
- deepboard/gui/pages/main_page/right_panel/fragments.py +133 -0
- deepboard/gui/pages/main_page/right_panel/hparams.py +25 -0
- deepboard/gui/pages/main_page/right_panel/images.py +358 -0
- deepboard/gui/pages/main_page/right_panel/run_info.py +86 -0
- deepboard/gui/pages/main_page/right_panel/scalars.py +251 -0
- deepboard/gui/pages/main_page/right_panel/template.py +151 -0
- deepboard/gui/pages/main_page/routes.py +25 -0
- deepboard/gui/pages/not_found.py +3 -0
- deepboard/gui/requirements.txt +5 -0
- deepboard/gui/utils.py +267 -0
- deepboard/resultTable/__init__.py +2 -0
- deepboard/resultTable/cursor.py +20 -0
- deepboard/resultTable/logwritter.py +667 -0
- deepboard/resultTable/resultTable.py +529 -0
- deepboard/resultTable/scalar.py +29 -0
- deepboard/resultTable/table_schema.py +135 -0
- deepboard/resultTable/utils.py +50 -0
- deepboard-0.2.0.dist-info/METADATA +164 -0
- deepboard-0.2.0.dist-info/RECORD +69 -0
- deepboard-0.2.0.dist-info/WHEEL +4 -0
- deepboard-0.2.0.dist-info/entry_points.txt +2 -0
deepboard/__init__.py
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
from .__version__ import __version__
|
deepboard/__version__.py
ADDED
deepboard/gui/THEME.yml
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
COLORS: [
|
2
|
+
"#FF595E", # Bright red
|
3
|
+
"#FFCA3A", # Bright yellow
|
4
|
+
"#8AC926", # Lime green
|
5
|
+
"#1982C4", # Bright blue
|
6
|
+
"#6A4C93", # Vivid purple
|
7
|
+
"#FF9F1C", # Orange
|
8
|
+
"#D7263D", # Crimson
|
9
|
+
"#3A86FF", # Electric blue
|
10
|
+
"#8338EC", # Purple
|
11
|
+
"#FB5607" # Vivid orange-red
|
12
|
+
]
|
13
|
+
|
14
|
+
HIDDEN_COLOR: "#333333" # gray for hidden lines
|
15
|
+
|
16
|
+
PLOTLY_THEME:
|
17
|
+
plot_bgcolor: '#111111'
|
18
|
+
paper_bgcolor: '#111111'
|
19
|
+
font:
|
20
|
+
color: 'white'
|
21
|
+
xaxis:
|
22
|
+
gridcolor: '#333333'
|
23
|
+
zerolinecolor: '#333333'
|
24
|
+
yaxis:
|
25
|
+
gridcolor: '#333333'
|
26
|
+
zerolinecolor: '#333333'
|
27
|
+
|
28
|
+
MAX_DEC: 4 # Maximum number of decimals
|
File without changes
|
@@ -0,0 +1,108 @@
|
|
1
|
+
/*
|
2
|
+
This css file contains classes for all artefacts tabs:
|
3
|
+
- Images
|
4
|
+
- Figures
|
5
|
+
- Text
|
6
|
+
- Html fragments
|
7
|
+
*/
|
8
|
+
|
9
|
+
.artefact-split-select{
|
10
|
+
appearance: none;
|
11
|
+
background-color: inherit;
|
12
|
+
color: var(--sp-color);
|
13
|
+
border: none;
|
14
|
+
/*border-bottom: var(--artefacts-split-option-border);*/
|
15
|
+
padding-left: 36px;
|
16
|
+
padding-right: 24px;
|
17
|
+
margin-bottom: 0;
|
18
|
+
font-size: 1.75em;
|
19
|
+
font-weight: bold;
|
20
|
+
outline: none;
|
21
|
+
transition: border 0.1s ease, box-shadow 0.1s ease;
|
22
|
+
cursor: pointer;
|
23
|
+
|
24
|
+
background-image: url("data:image/svg+xml;charset=US-ASCII,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='10' viewBox='0 0 14 10'%3E%3Cpath fill='%23ccc' d='M7 10L0 0h14z'/%3E%3C/svg%3E");
|
25
|
+
background-repeat: no-repeat;
|
26
|
+
background-position: left 10px center;
|
27
|
+
background-size: 12px;
|
28
|
+
}
|
29
|
+
.artefact-split-option{
|
30
|
+
/* Empty for now */
|
31
|
+
}
|
32
|
+
|
33
|
+
.artefact-stats-column{
|
34
|
+
/* Nothing here yet */
|
35
|
+
}
|
36
|
+
|
37
|
+
.artefact-card-header{
|
38
|
+
display: flex;
|
39
|
+
flex-direction: row;
|
40
|
+
width: 100%;
|
41
|
+
justify-content: space-between;
|
42
|
+
padding-bottom: 1em;
|
43
|
+
border-bottom: var(--artefacts-header-line)
|
44
|
+
}
|
45
|
+
|
46
|
+
.artefact-card{
|
47
|
+
background-color: var(--artefacts-card-bg);
|
48
|
+
box-shadow: var(--artefacts-card-shadow);
|
49
|
+
padding: 1em;
|
50
|
+
border-radius: var(--artefacts-card-radius);
|
51
|
+
display: flex;
|
52
|
+
flex-direction: column;
|
53
|
+
/*Margin top: 1em and bottom: 1em. 0 otherwise*/
|
54
|
+
margin-bottom: 2em;
|
55
|
+
}
|
56
|
+
|
57
|
+
.artefact-group-container{
|
58
|
+
margin-top: 1em;
|
59
|
+
display: flex;
|
60
|
+
flex-direction: row;
|
61
|
+
flex-wrap: wrap;
|
62
|
+
gap: 1em;
|
63
|
+
justify-content: space-evenly;
|
64
|
+
}
|
65
|
+
|
66
|
+
|
67
|
+
.image{
|
68
|
+
width: var(--artefacts-image_size);
|
69
|
+
height: var(--artefacts-image_size);
|
70
|
+
display: inline-block;
|
71
|
+
overflow: hidden;
|
72
|
+
}
|
73
|
+
|
74
|
+
.interactive-image-container{
|
75
|
+
width: 92vw;
|
76
|
+
height: 100vh;
|
77
|
+
overflow: hidden;
|
78
|
+
margin: 20px auto;
|
79
|
+
background: inherit;
|
80
|
+
}
|
81
|
+
.interactive-image{
|
82
|
+
width: 100%;
|
83
|
+
height: 100%;
|
84
|
+
/*transition: transform 0.1s ease;*/
|
85
|
+
transform-origin: center center;
|
86
|
+
}
|
87
|
+
|
88
|
+
.interactive-image img {
|
89
|
+
object-fit: contain;
|
90
|
+
display: block;
|
91
|
+
}
|
92
|
+
|
93
|
+
.fragment-text-container {
|
94
|
+
background-color: var(--fv-bg);
|
95
|
+
padding: 1em;
|
96
|
+
border-radius: 0.25em;
|
97
|
+
overflow: auto;
|
98
|
+
width: 100%;
|
99
|
+
}
|
100
|
+
|
101
|
+
.fragment-text{
|
102
|
+
margin: 0;
|
103
|
+
padding: 0.5em;
|
104
|
+
font-size: 0.8rem;
|
105
|
+
color: var(--artefacts-text-color);
|
106
|
+
font-family: var(--artefacts-text-font), monospace;
|
107
|
+
white-space: pre-wrap;
|
108
|
+
}
|
@@ -0,0 +1,208 @@
|
|
1
|
+
@import url('theme.css');
|
2
|
+
body {
|
3
|
+
margin: 0;
|
4
|
+
font-family: system-ui, sans-serif;
|
5
|
+
background-color:var(--background-color);
|
6
|
+
color: var(--text_color);
|
7
|
+
overflow-y: hidden;
|
8
|
+
overflow-x: hidden;
|
9
|
+
}
|
10
|
+
|
11
|
+
.container {
|
12
|
+
display: flex;
|
13
|
+
}
|
14
|
+
|
15
|
+
|
16
|
+
/*Menu when you right click*/
|
17
|
+
#custom-menu {
|
18
|
+
position: absolute;
|
19
|
+
background-color: var(--menu-bg);
|
20
|
+
border: var(--menu-bg);
|
21
|
+
border-radius: 6px;
|
22
|
+
padding: 0;
|
23
|
+
display: flex;
|
24
|
+
flex-direction: column;
|
25
|
+
z-index: 1000;
|
26
|
+
box-shadow: var(--menu-shadow);
|
27
|
+
visibility: hidden;
|
28
|
+
}
|
29
|
+
|
30
|
+
.dropdown-menu {
|
31
|
+
background-color: var(--menu-bg);
|
32
|
+
color: var(--text_color);
|
33
|
+
padding: 0;
|
34
|
+
width: 200px;
|
35
|
+
font-family: sans-serif;
|
36
|
+
margin: 0;
|
37
|
+
list-style: none;
|
38
|
+
}
|
39
|
+
|
40
|
+
.menu-item {
|
41
|
+
padding: 0.5rem;
|
42
|
+
cursor: pointer;
|
43
|
+
position: relative;
|
44
|
+
white-space: nowrap;
|
45
|
+
}
|
46
|
+
|
47
|
+
.menu-item:hover {
|
48
|
+
background-color: var(--menu-bg-hover);
|
49
|
+
}
|
50
|
+
|
51
|
+
.has-submenu-wrapper {
|
52
|
+
position: relative;
|
53
|
+
}
|
54
|
+
.has-submenu {
|
55
|
+
text-decoration: none;
|
56
|
+
color: inherit;
|
57
|
+
display: block;
|
58
|
+
}
|
59
|
+
.submenu {
|
60
|
+
display: none;
|
61
|
+
position: absolute;
|
62
|
+
top: 0;
|
63
|
+
left: 100%;
|
64
|
+
background-color: var(--menu-bg);
|
65
|
+
border-radius: 6px;
|
66
|
+
padding: 0;
|
67
|
+
list-style: none;
|
68
|
+
min-width: 150px;
|
69
|
+
z-index: 1001;
|
70
|
+
margin-left: 0;
|
71
|
+
max-height: 40vh;
|
72
|
+
overflow-y: scroll;
|
73
|
+
}
|
74
|
+
|
75
|
+
.has-submenu-wrapper:hover .submenu {
|
76
|
+
display: block;
|
77
|
+
}
|
78
|
+
|
79
|
+
.submenu .menu-item:hover {
|
80
|
+
background-color: var(--menu-bg-hover);
|
81
|
+
}
|
82
|
+
|
83
|
+
|
84
|
+
.copy-container {
|
85
|
+
width: 100%;
|
86
|
+
position: relative;
|
87
|
+
display: inline-flex;
|
88
|
+
align-items: center;
|
89
|
+
justify-content: space-between;
|
90
|
+
gap: 8px;
|
91
|
+
cursor: pointer;
|
92
|
+
padding: 0;
|
93
|
+
}
|
94
|
+
|
95
|
+
.copy-icon-container {
|
96
|
+
position: relative;
|
97
|
+
width: 1em; /* match icon size */
|
98
|
+
height: 1em;
|
99
|
+
display: inline-block;
|
100
|
+
}
|
101
|
+
|
102
|
+
/* Overlap icons inside wrapper */
|
103
|
+
.copy-icon {
|
104
|
+
position: absolute;
|
105
|
+
top: 0;
|
106
|
+
left: 0;
|
107
|
+
opacity: 0;
|
108
|
+
visibility: hidden;
|
109
|
+
transition: opacity 0.2s ease;
|
110
|
+
pointer-events: none; /* so they don't block clicks */
|
111
|
+
}
|
112
|
+
|
113
|
+
.copy-container:hover .default-icon {
|
114
|
+
visibility: visible;
|
115
|
+
opacity: 1;
|
116
|
+
}
|
117
|
+
|
118
|
+
.copy-container.copied .default-icon {
|
119
|
+
display: none;
|
120
|
+
}
|
121
|
+
|
122
|
+
.copy-container.copied .check-icon {
|
123
|
+
visibility: visible;
|
124
|
+
opacity: 1;
|
125
|
+
}
|
126
|
+
|
127
|
+
.align-right {
|
128
|
+
display: flex;
|
129
|
+
justify-content: flex-end;
|
130
|
+
}
|
131
|
+
|
132
|
+
|
133
|
+
/*Compare Button*/
|
134
|
+
.compare-button-container {
|
135
|
+
width: 100%;
|
136
|
+
display: flex;
|
137
|
+
justify-content: flex-end; /* aligns content to the right horizontally */
|
138
|
+
}
|
139
|
+
|
140
|
+
.compare-button {
|
141
|
+
margin-top: 0.5rem;
|
142
|
+
display: inline-flex;
|
143
|
+
align-items: center;
|
144
|
+
justify-content: center;
|
145
|
+
padding: 8px 32px;
|
146
|
+
font-size: 1.1rem;
|
147
|
+
font-weight: 600;
|
148
|
+
color: var(--text_color);
|
149
|
+
background-color: var(--primary-color); /* Material purple */
|
150
|
+
border: none;
|
151
|
+
border-radius: 8px;
|
152
|
+
box-shadow: 0 2px 6px var(--button-shadow-color);
|
153
|
+
cursor: pointer;
|
154
|
+
}
|
155
|
+
.compare-button:hover {
|
156
|
+
background-color: var(--primary-color-hover); /* darker on hover */
|
157
|
+
box-shadow: 0 2px 10px var(--button-shadow-color);
|
158
|
+
}
|
159
|
+
|
160
|
+
.compare-button:active {
|
161
|
+
box-shadow: 0 2px 5px var(--button-shadow-color);
|
162
|
+
}
|
163
|
+
|
164
|
+
.center-center{
|
165
|
+
width: 100%;
|
166
|
+
height: 100vh;
|
167
|
+
display: flex;
|
168
|
+
justify-content: center; /* Horizontal centering */
|
169
|
+
align-items: center; /* Vertical centering */
|
170
|
+
}
|
171
|
+
|
172
|
+
.expand {
|
173
|
+
display: flex;
|
174
|
+
width: 100%;
|
175
|
+
justify-content: space-between;
|
176
|
+
}
|
177
|
+
|
178
|
+
img {
|
179
|
+
object-fit: contain;
|
180
|
+
width: 100%;
|
181
|
+
height: 100%;
|
182
|
+
/* Scale without interpolation */
|
183
|
+
image-rendering: pixelated; /* Modern browsers */
|
184
|
+
image-rendering: -moz-crisp-edges; /* Firefox fallback */
|
185
|
+
image-rendering: crisp-edges; /* Webkit fallback */
|
186
|
+
}
|
187
|
+
|
188
|
+
.modal-overlay{
|
189
|
+
position: fixed;
|
190
|
+
top: 0;
|
191
|
+
left: 0;
|
192
|
+
width: 100vw;
|
193
|
+
height: 100vh;
|
194
|
+
background-color: rgba(0, 0, 0, 0.75);
|
195
|
+
z-index: 999; /* Ensure it covers other content */
|
196
|
+
}
|
197
|
+
.modal-overlay.hidden{
|
198
|
+
display: none;
|
199
|
+
}
|
200
|
+
.modal{
|
201
|
+
width: 100%;
|
202
|
+
height: 100%;
|
203
|
+
display: flex;
|
204
|
+
flex-direction: column;
|
205
|
+
justify-content: center;
|
206
|
+
/* Center content vertically */
|
207
|
+
align-items: center;
|
208
|
+
}
|
@@ -0,0 +1,77 @@
|
|
1
|
+
window.addEventListener("contextmenu", function(e) {
|
2
|
+
// Get the target element (the element that was clicked)
|
3
|
+
let element = e.target;
|
4
|
+
|
5
|
+
e.preventDefault(); // Prevent the default browser context menu
|
6
|
+
const ids = [];
|
7
|
+
|
8
|
+
while (element) {
|
9
|
+
if (element.id) {
|
10
|
+
ids.push(element.id);
|
11
|
+
}
|
12
|
+
element = element.parentElement;
|
13
|
+
}
|
14
|
+
|
15
|
+
// You can pass this information to your HTMX request
|
16
|
+
const menu = document.getElementById('custom-menu');
|
17
|
+
menu.style.top = `${e.clientY}px`;
|
18
|
+
menu.style.left = `${e.clientX}px`;
|
19
|
+
|
20
|
+
// Trigger HTMX request to load the menu content
|
21
|
+
// Join ids with ,
|
22
|
+
str_ids = ids.join(",")
|
23
|
+
htmx.ajax('GET', `/get-context-menu?elementIds=${str_ids}&top=${e.clientY}&left=${e.clientX}`, {
|
24
|
+
target: '#custom-menu',
|
25
|
+
swap: 'outerHTML', // Correct usage of swap attribute
|
26
|
+
headers: {
|
27
|
+
'HX-Swap-OOB': 'true' // Use correct OOB header for out-of-band swaps
|
28
|
+
}
|
29
|
+
});
|
30
|
+
});
|
31
|
+
|
32
|
+
// Hide the menu when clicking elsewhere
|
33
|
+
window.addEventListener("click", () => {
|
34
|
+
const menu = document.getElementById('custom-menu');
|
35
|
+
menu.style.visibility = "hidden";
|
36
|
+
});
|
37
|
+
|
38
|
+
|
39
|
+
function copyToClipboard(container) {
|
40
|
+
const text = container.querySelector('.copy-text').innerText;
|
41
|
+
|
42
|
+
navigator.clipboard.writeText(text).then(() => {
|
43
|
+
container.classList.add('copied');
|
44
|
+
setTimeout(() => {
|
45
|
+
container.classList.remove('copied');
|
46
|
+
}, 1200);
|
47
|
+
});
|
48
|
+
}
|
49
|
+
|
50
|
+
|
51
|
+
function shiftClickDataGrid(event){
|
52
|
+
const el = event.target.closest('.table-row');
|
53
|
+
if (!el) return; // Not one of ours
|
54
|
+
if (event.ctrlKey || event.metaKey) {
|
55
|
+
const originalUrl = el.getAttribute('hx-get'); // e.g. "/default-endpoint?runID=3"
|
56
|
+
const url = new URL(originalUrl, window.location.origin); // create full URL to parse
|
57
|
+
const params = url.search;
|
58
|
+
|
59
|
+
// Instead of modifying the attribute, trigger htmx manually with the new URL
|
60
|
+
htmx.ajax('GET', `/shift_click_row${params}`, {target: el.getAttribute('hx-target') || el});
|
61
|
+
|
62
|
+
// Prevent the original click handler from firing
|
63
|
+
event.preventDefault();
|
64
|
+
event.stopPropagation();
|
65
|
+
}
|
66
|
+
}
|
67
|
+
document.addEventListener('click', shiftClickDataGrid);
|
68
|
+
|
69
|
+
// New htmx event: open in a new tab when data-new-tab attribute is present
|
70
|
+
document.addEventListener('htmx:beforeOnLoad', function (event) {
|
71
|
+
const redirectUrl = event.detail.xhr.getResponseHeader('HX-Blank-Redirect');
|
72
|
+
if (redirectUrl && event.detail.elt.hasAttribute('data-new-tab')) {
|
73
|
+
// Prevent htmx from performing the redirect in the current tab
|
74
|
+
console.log("Here")
|
75
|
+
window.open(redirectUrl, '_blank');
|
76
|
+
}
|
77
|
+
});
|
@@ -0,0 +1,188 @@
|
|
1
|
+
.chart {
|
2
|
+
display: flex;
|
3
|
+
flex-direction: column;
|
4
|
+
justify-content: center;
|
5
|
+
align-items: center;
|
6
|
+
width: 100%;
|
7
|
+
/*max-height: 40vh;*/
|
8
|
+
}
|
9
|
+
.chart-container {
|
10
|
+
height: 30vh;
|
11
|
+
width: 100%;
|
12
|
+
display: flex;
|
13
|
+
}
|
14
|
+
|
15
|
+
.chart-container > div {
|
16
|
+
flex: 1;
|
17
|
+
height: 100%;
|
18
|
+
|
19
|
+
}
|
20
|
+
|
21
|
+
.chart-header{
|
22
|
+
|
23
|
+
}
|
24
|
+
|
25
|
+
.chart-title {
|
26
|
+
color: var(--chart-metric-color);
|
27
|
+
font-size: 1.5rem;
|
28
|
+
}
|
29
|
+
|
30
|
+
.chart-toolbox-wrapper {
|
31
|
+
display: flex;
|
32
|
+
|
33
|
+
justify-content: space-between;
|
34
|
+
align-items: center;
|
35
|
+
width: 100%;
|
36
|
+
}
|
37
|
+
|
38
|
+
.chart-toolbox {
|
39
|
+
display: flex;
|
40
|
+
flex-direction: column;
|
41
|
+
justify-content: center;
|
42
|
+
align-items: left;
|
43
|
+
width: 100%;
|
44
|
+
}
|
45
|
+
|
46
|
+
.chart-legend {
|
47
|
+
display: flex;
|
48
|
+
flex-direction: column;
|
49
|
+
justify-content: left;
|
50
|
+
align-items: center;
|
51
|
+
width: 100%;
|
52
|
+
background-color: var(--chart-legend-bg);
|
53
|
+
border-radius: 0.25rem;
|
54
|
+
padding-left: 0;
|
55
|
+
margin-left: 0.5rem;
|
56
|
+
max-height: 20vh;
|
57
|
+
overflow-y: scroll;
|
58
|
+
overflow-x: hidden;
|
59
|
+
}
|
60
|
+
.legend-line {
|
61
|
+
display: flex;
|
62
|
+
justify-content: left;
|
63
|
+
align-items: center;
|
64
|
+
width: 100%;
|
65
|
+
padding: 0.25rem;
|
66
|
+
color: var(--chart-legend-color);
|
67
|
+
list-style-type: none;
|
68
|
+
margin-left: 0;
|
69
|
+
position: relative;
|
70
|
+
cursor: pointer;
|
71
|
+
z-index: 10;
|
72
|
+
}
|
73
|
+
.legend-line:hover {
|
74
|
+
background-color: var(--chart-legend-bg-hover);
|
75
|
+
}
|
76
|
+
.legend-label {
|
77
|
+
font-family: system-ui, sans-serif;
|
78
|
+
text-decoration: none;
|
79
|
+
color: inherit;
|
80
|
+
}
|
81
|
+
|
82
|
+
.legend-icon {
|
83
|
+
width: 1rem;
|
84
|
+
height: 1rem;
|
85
|
+
margin-right: 0.5rem;
|
86
|
+
margin-left: 0.25rem;
|
87
|
+
border-radius: 0.25rem;
|
88
|
+
}
|
89
|
+
|
90
|
+
.chart-legend-title {
|
91
|
+
font-family: system-ui, sans-serif;
|
92
|
+
color: var(--chart-setup-title);
|
93
|
+
padding-bottom: 0;
|
94
|
+
margin-bottom: 0;
|
95
|
+
font-size: 1.5rem;
|
96
|
+
}
|
97
|
+
|
98
|
+
.chart-setup-container {
|
99
|
+
display: flex;
|
100
|
+
justify-content: space-between;
|
101
|
+
align-items: center;
|
102
|
+
width: 100%;
|
103
|
+
padding-left: 0.5rem;
|
104
|
+
}
|
105
|
+
|
106
|
+
.chart-smoother-container{
|
107
|
+
display: flex;
|
108
|
+
justify-content: center;
|
109
|
+
align-items: center;
|
110
|
+
width: 100%;
|
111
|
+
padding-left: 0.5rem;
|
112
|
+
}
|
113
|
+
.chart-smoother {
|
114
|
+
width: 100%;
|
115
|
+
}
|
116
|
+
|
117
|
+
input[type="range"] {
|
118
|
+
width: 80%;
|
119
|
+
max-width: 80%;
|
120
|
+
box-sizing: border-box;
|
121
|
+
}
|
122
|
+
|
123
|
+
.chart-list {
|
124
|
+
width: 100%;
|
125
|
+
padding-left: 0;
|
126
|
+
}
|
127
|
+
.chart-list-item {
|
128
|
+
list-style-type: none;
|
129
|
+
text-decoration: none;
|
130
|
+
margin-left: 0;
|
131
|
+
margin-bottom: 1em;
|
132
|
+
}
|
133
|
+
|
134
|
+
.chart-scalar-title {
|
135
|
+
font-family: system-ui, sans-serif;
|
136
|
+
color: var(--chart-section-title);
|
137
|
+
font-size: 2rem;
|
138
|
+
margin-left: 0.5rem;
|
139
|
+
padding-bottom: 0.5rem;
|
140
|
+
border-bottom: var(--chart-section-title-line); /* adjust thickness and color */
|
141
|
+
margin-bottom: 1rem; /* space below the line */
|
142
|
+
}
|
143
|
+
|
144
|
+
.chart-section {
|
145
|
+
margin-top: 0.5rem;
|
146
|
+
}
|
147
|
+
|
148
|
+
.chart-type-checkbox {
|
149
|
+
appearance: none;
|
150
|
+
width: 20px;
|
151
|
+
height: 20px;
|
152
|
+
border-radius: 6px;
|
153
|
+
background-color: var(--chart-disabled-color); /* light blue background */
|
154
|
+
cursor: pointer;
|
155
|
+
transition: box-shadow 0.2s ease, border-color 0.2s ease;
|
156
|
+
display: inline-block;
|
157
|
+
position: relative;
|
158
|
+
}
|
159
|
+
|
160
|
+
/* Glow animation on hover */
|
161
|
+
.chart-type-checkbox:hover {
|
162
|
+
box-shadow: var(--chart-typebox-shadow); /* DodgerBlue glow */
|
163
|
+
border-color: var(--primary-color-hover); /* Material blue */
|
164
|
+
}
|
165
|
+
|
166
|
+
.chart-type-checkbox:checked {
|
167
|
+
background-color: var(--primary-color); /* blue when checked */
|
168
|
+
border-color: var(--primary-color);
|
169
|
+
}
|
170
|
+
|
171
|
+
|
172
|
+
.setup-title {
|
173
|
+
font-family: system-ui, sans-serif;
|
174
|
+
color: var(--chart-setup-title);
|
175
|
+
font-size: 1.5rem;
|
176
|
+
}
|
177
|
+
|
178
|
+
input[type="range"] {
|
179
|
+
accent-color: var(--primary-color);
|
180
|
+
}
|
181
|
+
|
182
|
+
input[type="range"]::-moz-range-progress {
|
183
|
+
background-color: var(--primary-color);
|
184
|
+
}
|
185
|
+
|
186
|
+
input[type="range"]::-moz-range-track {
|
187
|
+
background-color: var(--chart-disabled-color);
|
188
|
+
}
|
@@ -0,0 +1,90 @@
|
|
1
|
+
.compare-container{
|
2
|
+
display: flex;
|
3
|
+
align-items: center;
|
4
|
+
}
|
5
|
+
.compare-setup-container{
|
6
|
+
width: 25vw;
|
7
|
+
height: 75vh;
|
8
|
+
}
|
9
|
+
.cards-list-container{
|
10
|
+
width: 75vw;
|
11
|
+
height: 100vh;
|
12
|
+
display: flex;
|
13
|
+
flex-direction: column;
|
14
|
+
align-items: center;
|
15
|
+
justify-content: flex-start;
|
16
|
+
overflow-y: scroll;
|
17
|
+
}
|
18
|
+
.setup-card{
|
19
|
+
margin-left: 2em;
|
20
|
+
padding: 2em;
|
21
|
+
height: 100%;
|
22
|
+
border-radius: 10px;
|
23
|
+
background-color: var(--cmp-card-bg);
|
24
|
+
box-shadow: var(--cmp-card-shadow);
|
25
|
+
}
|
26
|
+
.comparison-list {
|
27
|
+
list-style: none;
|
28
|
+
padding-left: 0;
|
29
|
+
margin: 0;
|
30
|
+
width: 90%;
|
31
|
+
}
|
32
|
+
.split-card{
|
33
|
+
margin-top: 2em;
|
34
|
+
margin-bottom: 2em;
|
35
|
+
padding: 2rem;
|
36
|
+
border-radius: 10px;
|
37
|
+
color: var(--cmp-card-color);
|
38
|
+
background-color: var(--cmp-card-bg);
|
39
|
+
box-shadow: var(--cmp-card-shadow);
|
40
|
+
}
|
41
|
+
.split-card.closed{
|
42
|
+
height: auto;
|
43
|
+
}
|
44
|
+
.split-card-header{
|
45
|
+
display: flex;
|
46
|
+
align-items: center;
|
47
|
+
justify-content: flex-start;
|
48
|
+
gap: 2em;
|
49
|
+
}
|
50
|
+
|
51
|
+
.split-card-title{
|
52
|
+
font-family: system-ui, sans-serif;
|
53
|
+
color: var(--cmp-chart-title);
|
54
|
+
font-size: 2rem;
|
55
|
+
margin-left: 0.5rem;
|
56
|
+
}
|
57
|
+
|
58
|
+
.multi-charts-container {
|
59
|
+
margin-top: 2em;
|
60
|
+
display: flex;
|
61
|
+
flex-direction: row;
|
62
|
+
flex-wrap: wrap;
|
63
|
+
justify-content: space-evenly;
|
64
|
+
}
|
65
|
+
.multi-charts-container > * { /*Children of the multi-chart-container will be 2 by rows*/
|
66
|
+
flex: 0 0 48%; /* 2 items per row, with some space between */
|
67
|
+
margin-bottom: 1em; /* Optional: adds spacing between rows */
|
68
|
+
}
|
69
|
+
.accordion-toggle {
|
70
|
+
background-color: rgba(0, 0, 0, 0);
|
71
|
+
border: none;
|
72
|
+
border-radius: 50%;
|
73
|
+
width: 32px;
|
74
|
+
height: 32px;
|
75
|
+
display: inline-flex;
|
76
|
+
align-items: center;
|
77
|
+
justify-content: center;
|
78
|
+
cursor: pointer;
|
79
|
+
font-size: 1.5em;
|
80
|
+
color: var(--cmp-accordion-color);
|
81
|
+
}
|
82
|
+
|
83
|
+
.accordion-toggle:hover {
|
84
|
+
color: var(--cmp-accordion-color-hover);
|
85
|
+
}
|
86
|
+
|
87
|
+
.accordion-toggle.rotated i {
|
88
|
+
transform: rotate(270deg);
|
89
|
+
transition: transform 0.3s ease;
|
90
|
+
}
|