leaf-framework 0.3.0__tar.gz → 0.4.0__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.
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/PKG-INFO +1 -1
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/ui/components/header.py +4 -1
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/ui/interface.py +28 -23
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/ui/styles.css +98 -61
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/pyproject.toml +1 -1
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/LICENSE +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/README.md +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/__init__.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/adapters/__init__.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/adapters/core_adapters/__init__.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/adapters/core_adapters/continuous_experiment_adapter.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/adapters/core_adapters/discrete_experiment_adapter.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/adapters/core_adapters/upload_adapter.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/adapters/equipment_adapter.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/config/configuration.yaml +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/data/marketplace.yaml +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/error_handler/__init__.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/error_handler/error_holder.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/error_handler/exceptions.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/measurement_handler/__init__.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/measurement_handler/handler.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/measurement_handler/measurements.yaml +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/measurement_handler/terms.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/.gitkeep +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/__init__.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/input_modules/__init__.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/input_modules/ble_watcher.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/input_modules/db_watcher.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/input_modules/event_watcher.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/input_modules/external_api_watcher.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/input_modules/external_event_watcher.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/input_modules/file_watcher.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/input_modules/http_watcher.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/input_modules/modbus_watcher.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/input_modules/mqtt_external_event_watcher.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/input_modules/mqtt_watcher.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/input_modules/opc_watcher.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/input_modules/polling_watcher.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/input_modules/simple_watcher.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/measurement_modules/__init__.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/measurement_modules/carbon_dioxide.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/measurement_modules/dissolved_oxygen.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/measurement_modules/fluorescence.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/measurement_modules/measurement_module.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/measurement_modules/optical_density.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/measurement_modules/ph.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/measurement_modules/temperature.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/output_modules/__init__.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/output_modules/file.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/output_modules/keydb.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/output_modules/mqtt.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/output_modules/output_module.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/output_modules/sql.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/output_modules/topic_store.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/phase_modules/__init__.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/phase_modules/control.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/phase_modules/error.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/phase_modules/external_event_phase.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/phase_modules/initialisation.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/phase_modules/measure.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/phase_modules/phase.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/phase_modules/start.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/phase_modules/stop.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/process_modules/__init__.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/process_modules/continous_module.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/process_modules/discrete_module.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/process_modules/external_event_process.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/process_modules/process_module.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/process_modules/upload_module.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/register/__init__.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/register/abstract_leaf.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/register/equipment_actions.yaml +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/register/equipment_data.yaml +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/register/metadata.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/register/py.typed +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/register/topic_utilities.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/registry/discovery.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/registry/loader.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/registry/registry.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/registry/utils.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/start.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/ui/__init__.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/ui/adapter_ui_extension.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/ui/components/__init__.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/ui/constants.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/ui/desktop_launcher.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/ui/images/icon.icns +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/ui/images/icon.ico +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/ui/images/icon.svg +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/ui/markdown/configuration_help.md +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/ui/markdown/documentation_main.md +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/ui/markdown/documentation_protips.md +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/ui/scripts.js +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/ui/tabs/__init__.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/ui/tabs/adapters.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/ui/tabs/configuration.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/ui/tabs/documentation.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/ui/tabs/logs.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/ui/tabs/monitoring.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/ui/utils.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/utility/config_utils.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/utility/logger/__init__.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/utility/logger/logger_utils.py +0 -0
- {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/utility/running_utilities.py +0 -0
|
@@ -7,17 +7,20 @@ from pathlib import Path
|
|
|
7
7
|
from nicegui import ui
|
|
8
8
|
|
|
9
9
|
|
|
10
|
-
def create_header(dark_mode: ui.dark_mode, curr_dir: Path) -> None:
|
|
10
|
+
def create_header(dark_mode: ui.dark_mode, curr_dir: Path, drawer=None) -> None:
|
|
11
11
|
"""
|
|
12
12
|
Create the LEAF application header with branding and dark mode toggle.
|
|
13
13
|
|
|
14
14
|
Args:
|
|
15
15
|
dark_mode: NiceGUI dark mode instance
|
|
16
16
|
curr_dir: Current directory path for loading assets
|
|
17
|
+
drawer: Optional left drawer to toggle via hamburger menu button
|
|
17
18
|
"""
|
|
18
19
|
with ui.header().classes("leaf-header").style("padding: 16px; color: white;"):
|
|
19
20
|
with ui.row().classes("justify-between items-center w-full"):
|
|
20
21
|
with ui.row().classes("items-center"):
|
|
22
|
+
if drawer is not None:
|
|
23
|
+
ui.button(icon="menu", on_click=drawer.toggle).props("flat round dense color=white").classes("mr-2")
|
|
21
24
|
# Load SVG from images/icon.svg
|
|
22
25
|
svg_path: Path = curr_dir / "images" / "icon.svg"
|
|
23
26
|
if os.path.exists(svg_path):
|
|
@@ -133,12 +133,38 @@ def start_nicegui(port: int = DEFAULT_PORT, config_path: Path | None = None, aut
|
|
|
133
133
|
</script>
|
|
134
134
|
""")
|
|
135
135
|
|
|
136
|
+
# Apply portal color theme
|
|
137
|
+
ui.colors(primary="#f15b25", secondary="#6fd3f2")
|
|
138
|
+
|
|
136
139
|
# Dark mode toggle
|
|
137
140
|
dark = ui.dark_mode()
|
|
138
141
|
|
|
139
|
-
# Create
|
|
142
|
+
# Create left sidebar with vertical tabs
|
|
143
|
+
drawer = ui.left_drawer(value=True).classes("bg-gray-50 border-r border-gray-200 pt-4")
|
|
144
|
+
with drawer:
|
|
145
|
+
with ui.tabs(value=None).props("vertical").classes("w-full leaf-sidebar-tabs") as tabs:
|
|
146
|
+
config_tab: ui.tab = ui.tab("Configuration", icon="settings").classes(TAB_CLASSES)
|
|
147
|
+
logs_tab = ui.tab("Logs", icon="article").classes(TAB_CLASSES)
|
|
148
|
+
docs_tab = ui.tab("Documentation", icon="help").classes(TAB_CLASSES)
|
|
149
|
+
monitor_tab = ui.tab("Monitoring", icon="monitor").classes(TAB_CLASSES)
|
|
150
|
+
adapters_tab = ui.tab("Adapters", icon="extension").classes(TAB_CLASSES)
|
|
151
|
+
|
|
152
|
+
# Dynamically create tabs for adapter UI extensions
|
|
153
|
+
adapter_tabs = []
|
|
154
|
+
for ext in adapter_ui_extensions:
|
|
155
|
+
ui_config = ext["ui_config"]
|
|
156
|
+
tab = ui.tab(ui_config["tab_name"], icon=ui_config.get("tab_icon", "extension")).classes(
|
|
157
|
+
TAB_CLASSES
|
|
158
|
+
)
|
|
159
|
+
adapter_tabs.append((tab, ext))
|
|
160
|
+
logger.debug(f"Created tab for adapter: {ext['adapter_code']}")
|
|
161
|
+
|
|
162
|
+
# Attach event handler to logs tab to scroll to bottom
|
|
163
|
+
logs_tab.on("click", lambda: ui.run_javascript("scrollLogToBottom()"))
|
|
164
|
+
|
|
165
|
+
# Create header with drawer toggle
|
|
140
166
|
logger.debug(f"[PERF] Creating header: {time.time() - start_time:.3f}s")
|
|
141
|
-
create_header(dark, curr_dir)
|
|
167
|
+
create_header(dark, curr_dir, drawer)
|
|
142
168
|
logger.debug(f"[PERF] Header created: {time.time() - start_time:.3f}s")
|
|
143
169
|
|
|
144
170
|
# Show startup error banner if there's an error
|
|
@@ -155,27 +181,6 @@ def start_nicegui(port: int = DEFAULT_PORT, config_path: Path | None = None, aut
|
|
|
155
181
|
"LEAF is running in UI-only mode. Please fix the configuration and restart."
|
|
156
182
|
).classes("text-sm text-red-500 mt-2")
|
|
157
183
|
|
|
158
|
-
# Enhanced tabs with icons
|
|
159
|
-
with ui.tabs().classes("w-full leaf-tabs-container border-b").style("background: inherit;") as tabs:
|
|
160
|
-
config_tab: ui.tab = ui.tab("Configuration", icon="settings").classes(TAB_CLASSES)
|
|
161
|
-
logs_tab = ui.tab("Logs", icon="article").classes(TAB_CLASSES)
|
|
162
|
-
docs_tab = ui.tab("Documentation", icon="help").classes(TAB_CLASSES)
|
|
163
|
-
monitor_tab = ui.tab("Monitoring", icon="monitor").classes(TAB_CLASSES)
|
|
164
|
-
adapters_tab = ui.tab("Adapters", icon="extension").classes(TAB_CLASSES)
|
|
165
|
-
|
|
166
|
-
# Dynamically create tabs for adapter UI extensions
|
|
167
|
-
adapter_tabs = []
|
|
168
|
-
for ext in adapter_ui_extensions:
|
|
169
|
-
ui_config = ext["ui_config"]
|
|
170
|
-
tab = ui.tab(ui_config["tab_name"], icon=ui_config.get("tab_icon", "extension")).classes(
|
|
171
|
-
TAB_CLASSES
|
|
172
|
-
)
|
|
173
|
-
adapter_tabs.append((tab, ext))
|
|
174
|
-
logger.debug(f"Created tab for adapter: {ext['adapter_code']}")
|
|
175
|
-
|
|
176
|
-
# Attach event handler to logs tab to scroll to bottom
|
|
177
|
-
logs_tab.on("click", lambda: ui.run_javascript("scrollLogToBottom()"))
|
|
178
|
-
|
|
179
184
|
logger.debug(f"[PERF] Tabs structure created: {time.time() - start_time:.3f}s")
|
|
180
185
|
|
|
181
186
|
with ui.tab_panels(tabs, value=logs_tab).classes("w-full"):
|
|
@@ -1,12 +1,94 @@
|
|
|
1
|
+
/* ============================================
|
|
2
|
+
LEFT SIDEBAR NAVIGATION
|
|
3
|
+
============================================ */
|
|
4
|
+
|
|
5
|
+
/* Sidebar drawer background */
|
|
6
|
+
.q-drawer .bg-gray-50 {
|
|
7
|
+
background-color: #f9fafb;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/* Vertical tabs container inside sidebar */
|
|
11
|
+
.leaf-sidebar-tabs.q-tabs--vertical {
|
|
12
|
+
background: transparent !important;
|
|
13
|
+
width: 100%;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/* Each sidebar tab item */
|
|
17
|
+
.leaf-sidebar-tabs .q-tab {
|
|
18
|
+
justify-content: flex-start !important;
|
|
19
|
+
padding: 10px 16px !important;
|
|
20
|
+
border-radius: 8px !important;
|
|
21
|
+
margin: 2px 8px !important;
|
|
22
|
+
width: calc(100% - 16px) !important;
|
|
23
|
+
min-height: 44px !important;
|
|
24
|
+
color: #6b7280 !important;
|
|
25
|
+
transition: background 0.15s ease, color 0.15s ease;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.leaf-sidebar-tabs .q-tab:hover {
|
|
29
|
+
background: #f3f4f6 !important;
|
|
30
|
+
color: #374151 !important;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/* Active tab */
|
|
34
|
+
.leaf-sidebar-tabs .q-tab--active {
|
|
35
|
+
background: #fff4f0 !important;
|
|
36
|
+
color: #f15b25 !important;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.leaf-sidebar-tabs .q-tab--active .q-tab__icon,
|
|
40
|
+
.leaf-sidebar-tabs .q-tab--active .q-tab__label {
|
|
41
|
+
color: #f15b25 !important;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/* Hide the default Quasar vertical indicator bar */
|
|
45
|
+
.leaf-sidebar-tabs .q-tab__indicator {
|
|
46
|
+
display: none !important;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/* Tab label alignment */
|
|
50
|
+
.leaf-sidebar-tabs .q-tab__content {
|
|
51
|
+
flex-direction: row !important;
|
|
52
|
+
gap: 10px;
|
|
53
|
+
align-items: center;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
.leaf-sidebar-tabs .q-tab__label {
|
|
57
|
+
font-size: 0.875rem;
|
|
58
|
+
font-weight: 500;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/* Dark mode sidebar */
|
|
62
|
+
.dark .q-drawer {
|
|
63
|
+
background-color: #1f2937 !important;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.dark .leaf-sidebar-tabs .q-tab {
|
|
67
|
+
color: #9ca3af !important;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.dark .leaf-sidebar-tabs .q-tab:hover {
|
|
71
|
+
background: #374151 !important;
|
|
72
|
+
color: #e5e7eb !important;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
.dark .leaf-sidebar-tabs .q-tab--active {
|
|
76
|
+
background: rgba(241, 91, 37, 0.15) !important;
|
|
77
|
+
color: #f15b25 !important;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
.dark .leaf-sidebar-tabs .q-tab--active .q-tab__icon,
|
|
81
|
+
.dark .leaf-sidebar-tabs .q-tab--active .q-tab__label {
|
|
82
|
+
color: #f15b25 !important;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/* ============================================
|
|
86
|
+
END SIDEBAR NAVIGATION
|
|
87
|
+
============================================ */
|
|
88
|
+
|
|
1
89
|
/* Light mode styles */
|
|
2
90
|
.leaf-gradient {
|
|
3
|
-
background: linear-gradient(135deg, #
|
|
4
|
-
}
|
|
5
|
-
.leaf-tabs-container,
|
|
6
|
-
.leaf-tabs-container .q-tabs,
|
|
7
|
-
.leaf-tabs-container .q-tabs__content,
|
|
8
|
-
.leaf-tabs-container .q-tabs--horizontal {
|
|
9
|
-
background: linear-gradient(to right, #f9fafb, #ffffff) !important;
|
|
91
|
+
background: linear-gradient(135deg, #f15b25 0%, #d14e1e 100%);
|
|
10
92
|
}
|
|
11
93
|
.leaf-card,
|
|
12
94
|
.q-card.leaf-card,
|
|
@@ -30,7 +112,7 @@
|
|
|
30
112
|
background-color: transparent !important;
|
|
31
113
|
}
|
|
32
114
|
.leaf-header {
|
|
33
|
-
background:
|
|
115
|
+
background: #1c1c1c;
|
|
34
116
|
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);
|
|
35
117
|
}
|
|
36
118
|
.leaf-tab {
|
|
@@ -48,21 +130,11 @@
|
|
|
48
130
|
margin-right: 8px;
|
|
49
131
|
animation: pulse 2s infinite;
|
|
50
132
|
}
|
|
51
|
-
.status-online { background-color: #
|
|
52
|
-
.status-offline { background-color: #
|
|
53
|
-
.status-warning { background-color: #
|
|
133
|
+
.status-online { background-color: #10b981; }
|
|
134
|
+
.status-offline { background-color: #ef4444; }
|
|
135
|
+
.status-warning { background-color: #f59e0b; }
|
|
54
136
|
|
|
55
137
|
/* Dark mode styles */
|
|
56
|
-
.dark .leaf-tabs-container,
|
|
57
|
-
.dark .leaf-tabs-container .q-tabs,
|
|
58
|
-
.dark .leaf-tabs-container .q-tabs__content,
|
|
59
|
-
.dark .leaf-tabs-container .q-tabs--horizontal,
|
|
60
|
-
.dark .leaf-tabs-container > *,
|
|
61
|
-
.dark .q-tabs.leaf-tabs-container,
|
|
62
|
-
.dark .q-tabs.leaf-tabs-container .q-tabs__content {
|
|
63
|
-
background: linear-gradient(to right, #1f2937, #111827) !important;
|
|
64
|
-
background-color: #1f2937 !important;
|
|
65
|
-
}
|
|
66
138
|
.dark .leaf-card,
|
|
67
139
|
.dark .q-card.leaf-card,
|
|
68
140
|
.dark .nicegui-card.leaf-card {
|
|
@@ -84,7 +156,7 @@
|
|
|
84
156
|
background-color: transparent !important;
|
|
85
157
|
}
|
|
86
158
|
.dark .leaf-header {
|
|
87
|
-
background:
|
|
159
|
+
background: #1c1c1c;
|
|
88
160
|
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);
|
|
89
161
|
}
|
|
90
162
|
.dark .leaf-tab:hover {
|
|
@@ -98,21 +170,6 @@
|
|
|
98
170
|
100% { opacity: 1; }
|
|
99
171
|
}
|
|
100
172
|
|
|
101
|
-
/* Dark mode tab styling - more specific selectors */
|
|
102
|
-
.dark .q-tabs,
|
|
103
|
-
.dark .q-tabs__content,
|
|
104
|
-
.dark .q-tabs .q-tabs__content {
|
|
105
|
-
background: linear-gradient(to right, #1f2937, #111827) !important;
|
|
106
|
-
}
|
|
107
|
-
.dark .q-tab {
|
|
108
|
-
color: #d1d5db !important;
|
|
109
|
-
}
|
|
110
|
-
.dark .q-tab--active {
|
|
111
|
-
color: #f3f4f6 !important;
|
|
112
|
-
}
|
|
113
|
-
.dark .q-tab__indicator {
|
|
114
|
-
background-color: #60a5fa !important;
|
|
115
|
-
}
|
|
116
173
|
|
|
117
174
|
/* Dark mode button styling */
|
|
118
175
|
.dark .bg-gray-50 {
|
|
@@ -207,26 +264,6 @@
|
|
|
207
264
|
border-color: #374151 !important;
|
|
208
265
|
}
|
|
209
266
|
|
|
210
|
-
/* Additional tab bar fixes - nuclear option with multiple selectors */
|
|
211
|
-
.dark .q-tabs--horizontal,
|
|
212
|
-
.dark div.q-tabs,
|
|
213
|
-
.dark [role="tablist"] {
|
|
214
|
-
background: linear-gradient(to right, #1f2937, #111827) !important;
|
|
215
|
-
}
|
|
216
|
-
.dark .q-tabs .q-tab__label {
|
|
217
|
-
color: #d1d5db !important;
|
|
218
|
-
}
|
|
219
|
-
.dark .q-tabs .q-tab--active .q-tab__label {
|
|
220
|
-
color: #f3f4f6 !important;
|
|
221
|
-
}
|
|
222
|
-
/* Force remove any white background from tabs container */
|
|
223
|
-
.dark .w-full.bg-gradient-to-r {
|
|
224
|
-
background: linear-gradient(to right, #1f2937, #111827) !important;
|
|
225
|
-
}
|
|
226
|
-
/* Override any Tailwind utility classes */
|
|
227
|
-
.dark [class*="bg-gradient"] {
|
|
228
|
-
background: linear-gradient(to right, #1f2937, #111827) !important;
|
|
229
|
-
}
|
|
230
267
|
|
|
231
268
|
/* Dark mode CodeMirror editor */
|
|
232
269
|
.dark .cm-editor {
|
|
@@ -333,17 +370,17 @@ body:not(.dark) .text-green-400 {
|
|
|
333
370
|
|
|
334
371
|
/* Button Styles */
|
|
335
372
|
.btn-primary {
|
|
336
|
-
background-color: #
|
|
373
|
+
background-color: #f15b25;
|
|
337
374
|
color: white;
|
|
338
375
|
}
|
|
339
376
|
.btn-primary:hover {
|
|
340
|
-
background-color: #
|
|
377
|
+
background-color: #d14e1e;
|
|
341
378
|
}
|
|
342
379
|
.dark .btn-primary {
|
|
343
|
-
background-color: #
|
|
380
|
+
background-color: #f15b25 !important;
|
|
344
381
|
}
|
|
345
382
|
.dark .btn-primary:hover {
|
|
346
|
-
background-color: #
|
|
383
|
+
background-color: #d14e1e !important;
|
|
347
384
|
}
|
|
348
385
|
|
|
349
386
|
.btn-secondary {
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/input_modules/external_api_watcher.py
RENAMED
|
File without changes
|
{leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/input_modules/external_event_watcher.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/measurement_modules/carbon_dioxide.py
RENAMED
|
File without changes
|
{leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/measurement_modules/dissolved_oxygen.py
RENAMED
|
File without changes
|
{leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/measurement_modules/fluorescence.py
RENAMED
|
File without changes
|
{leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/measurement_modules/measurement_module.py
RENAMED
|
File without changes
|
{leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/measurement_modules/optical_density.py
RENAMED
|
File without changes
|
|
File without changes
|
{leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/measurement_modules/temperature.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/phase_modules/external_event_phase.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/process_modules/continous_module.py
RENAMED
|
File without changes
|
{leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/process_modules/discrete_module.py
RENAMED
|
File without changes
|
{leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/process_modules/external_event_process.py
RENAMED
|
File without changes
|
{leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/process_modules/process_module.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|