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.
Files changed (69) hide show
  1. deepboard/__init__.py +1 -0
  2. deepboard/__version__.py +4 -0
  3. deepboard/gui/THEME.yml +28 -0
  4. deepboard/gui/__init__.py +0 -0
  5. deepboard/gui/assets/artefacts.css +108 -0
  6. deepboard/gui/assets/base.css +208 -0
  7. deepboard/gui/assets/base.js +77 -0
  8. deepboard/gui/assets/charts.css +188 -0
  9. deepboard/gui/assets/compare.css +90 -0
  10. deepboard/gui/assets/datagrid.css +120 -0
  11. deepboard/gui/assets/fileview.css +13 -0
  12. deepboard/gui/assets/right_panel.css +227 -0
  13. deepboard/gui/assets/theme.css +85 -0
  14. deepboard/gui/components/__init__.py +8 -0
  15. deepboard/gui/components/artefact_group.py +12 -0
  16. deepboard/gui/components/chart_type.py +22 -0
  17. deepboard/gui/components/legend.py +34 -0
  18. deepboard/gui/components/log_selector.py +22 -0
  19. deepboard/gui/components/modal.py +20 -0
  20. deepboard/gui/components/smoother.py +21 -0
  21. deepboard/gui/components/split_selector.py +21 -0
  22. deepboard/gui/components/stat_line.py +8 -0
  23. deepboard/gui/entry.py +21 -0
  24. deepboard/gui/main.py +93 -0
  25. deepboard/gui/pages/__init__.py +1 -0
  26. deepboard/gui/pages/compare_page/__init__.py +6 -0
  27. deepboard/gui/pages/compare_page/compare_page.py +22 -0
  28. deepboard/gui/pages/compare_page/components/__init__.py +4 -0
  29. deepboard/gui/pages/compare_page/components/card_list.py +19 -0
  30. deepboard/gui/pages/compare_page/components/chart.py +54 -0
  31. deepboard/gui/pages/compare_page/components/compare_setup.py +30 -0
  32. deepboard/gui/pages/compare_page/components/split_card.py +51 -0
  33. deepboard/gui/pages/compare_page/components/utils.py +20 -0
  34. deepboard/gui/pages/compare_page/routes.py +58 -0
  35. deepboard/gui/pages/main_page/__init__.py +4 -0
  36. deepboard/gui/pages/main_page/datagrid/__init__.py +5 -0
  37. deepboard/gui/pages/main_page/datagrid/compare_button.py +21 -0
  38. deepboard/gui/pages/main_page/datagrid/datagrid.py +67 -0
  39. deepboard/gui/pages/main_page/datagrid/handlers.py +54 -0
  40. deepboard/gui/pages/main_page/datagrid/header.py +43 -0
  41. deepboard/gui/pages/main_page/datagrid/routes.py +112 -0
  42. deepboard/gui/pages/main_page/datagrid/row.py +20 -0
  43. deepboard/gui/pages/main_page/datagrid/sortable_column_js.py +45 -0
  44. deepboard/gui/pages/main_page/datagrid/utils.py +9 -0
  45. deepboard/gui/pages/main_page/handlers.py +16 -0
  46. deepboard/gui/pages/main_page/main_page.py +21 -0
  47. deepboard/gui/pages/main_page/right_panel/__init__.py +12 -0
  48. deepboard/gui/pages/main_page/right_panel/config.py +57 -0
  49. deepboard/gui/pages/main_page/right_panel/fragments.py +133 -0
  50. deepboard/gui/pages/main_page/right_panel/hparams.py +25 -0
  51. deepboard/gui/pages/main_page/right_panel/images.py +358 -0
  52. deepboard/gui/pages/main_page/right_panel/run_info.py +86 -0
  53. deepboard/gui/pages/main_page/right_panel/scalars.py +251 -0
  54. deepboard/gui/pages/main_page/right_panel/template.py +151 -0
  55. deepboard/gui/pages/main_page/routes.py +25 -0
  56. deepboard/gui/pages/not_found.py +3 -0
  57. deepboard/gui/requirements.txt +5 -0
  58. deepboard/gui/utils.py +267 -0
  59. deepboard/resultTable/__init__.py +2 -0
  60. deepboard/resultTable/cursor.py +20 -0
  61. deepboard/resultTable/logwritter.py +667 -0
  62. deepboard/resultTable/resultTable.py +529 -0
  63. deepboard/resultTable/scalar.py +29 -0
  64. deepboard/resultTable/table_schema.py +135 -0
  65. deepboard/resultTable/utils.py +50 -0
  66. deepboard-0.2.0.dist-info/METADATA +164 -0
  67. deepboard-0.2.0.dist-info/RECORD +69 -0
  68. deepboard-0.2.0.dist-info/WHEEL +4 -0
  69. deepboard-0.2.0.dist-info/entry_points.txt +2 -0
deepboard/__init__.py ADDED
@@ -0,0 +1 @@
1
+ from .__version__ import __version__
@@ -0,0 +1,4 @@
1
+ # This file is auto-generated by Hatchling. As such, do not:
2
+ # - modify
3
+ # - track in version control e.g. be sure to add to .gitignore
4
+ __version__ = VERSION = '0.2.0'
@@ -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
+ }