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.
Files changed (104) hide show
  1. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/PKG-INFO +1 -1
  2. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/ui/components/header.py +4 -1
  3. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/ui/interface.py +28 -23
  4. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/ui/styles.css +98 -61
  5. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/pyproject.toml +1 -1
  6. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/LICENSE +0 -0
  7. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/README.md +0 -0
  8. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/__init__.py +0 -0
  9. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/adapters/__init__.py +0 -0
  10. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/adapters/core_adapters/__init__.py +0 -0
  11. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/adapters/core_adapters/continuous_experiment_adapter.py +0 -0
  12. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/adapters/core_adapters/discrete_experiment_adapter.py +0 -0
  13. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/adapters/core_adapters/upload_adapter.py +0 -0
  14. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/adapters/equipment_adapter.py +0 -0
  15. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/config/configuration.yaml +0 -0
  16. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/data/marketplace.yaml +0 -0
  17. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/error_handler/__init__.py +0 -0
  18. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/error_handler/error_holder.py +0 -0
  19. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/error_handler/exceptions.py +0 -0
  20. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/measurement_handler/__init__.py +0 -0
  21. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/measurement_handler/handler.py +0 -0
  22. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/measurement_handler/measurements.yaml +0 -0
  23. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/measurement_handler/terms.py +0 -0
  24. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/.gitkeep +0 -0
  25. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/__init__.py +0 -0
  26. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/input_modules/__init__.py +0 -0
  27. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/input_modules/ble_watcher.py +0 -0
  28. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/input_modules/db_watcher.py +0 -0
  29. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/input_modules/event_watcher.py +0 -0
  30. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/input_modules/external_api_watcher.py +0 -0
  31. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/input_modules/external_event_watcher.py +0 -0
  32. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/input_modules/file_watcher.py +0 -0
  33. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/input_modules/http_watcher.py +0 -0
  34. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/input_modules/modbus_watcher.py +0 -0
  35. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/input_modules/mqtt_external_event_watcher.py +0 -0
  36. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/input_modules/mqtt_watcher.py +0 -0
  37. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/input_modules/opc_watcher.py +0 -0
  38. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/input_modules/polling_watcher.py +0 -0
  39. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/input_modules/simple_watcher.py +0 -0
  40. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/measurement_modules/__init__.py +0 -0
  41. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/measurement_modules/carbon_dioxide.py +0 -0
  42. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/measurement_modules/dissolved_oxygen.py +0 -0
  43. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/measurement_modules/fluorescence.py +0 -0
  44. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/measurement_modules/measurement_module.py +0 -0
  45. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/measurement_modules/optical_density.py +0 -0
  46. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/measurement_modules/ph.py +0 -0
  47. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/measurement_modules/temperature.py +0 -0
  48. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/output_modules/__init__.py +0 -0
  49. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/output_modules/file.py +0 -0
  50. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/output_modules/keydb.py +0 -0
  51. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/output_modules/mqtt.py +0 -0
  52. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/output_modules/output_module.py +0 -0
  53. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/output_modules/sql.py +0 -0
  54. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/output_modules/topic_store.py +0 -0
  55. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/phase_modules/__init__.py +0 -0
  56. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/phase_modules/control.py +0 -0
  57. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/phase_modules/error.py +0 -0
  58. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/phase_modules/external_event_phase.py +0 -0
  59. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/phase_modules/initialisation.py +0 -0
  60. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/phase_modules/measure.py +0 -0
  61. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/phase_modules/phase.py +0 -0
  62. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/phase_modules/start.py +0 -0
  63. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/phase_modules/stop.py +0 -0
  64. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/process_modules/__init__.py +0 -0
  65. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/process_modules/continous_module.py +0 -0
  66. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/process_modules/discrete_module.py +0 -0
  67. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/process_modules/external_event_process.py +0 -0
  68. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/process_modules/process_module.py +0 -0
  69. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/modules/process_modules/upload_module.py +0 -0
  70. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/register/__init__.py +0 -0
  71. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/register/abstract_leaf.py +0 -0
  72. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/register/equipment_actions.yaml +0 -0
  73. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/register/equipment_data.yaml +0 -0
  74. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/register/metadata.py +0 -0
  75. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/register/py.typed +0 -0
  76. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/register/topic_utilities.py +0 -0
  77. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/registry/discovery.py +0 -0
  78. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/registry/loader.py +0 -0
  79. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/registry/registry.py +0 -0
  80. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/registry/utils.py +0 -0
  81. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/start.py +0 -0
  82. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/ui/__init__.py +0 -0
  83. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/ui/adapter_ui_extension.py +0 -0
  84. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/ui/components/__init__.py +0 -0
  85. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/ui/constants.py +0 -0
  86. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/ui/desktop_launcher.py +0 -0
  87. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/ui/images/icon.icns +0 -0
  88. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/ui/images/icon.ico +0 -0
  89. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/ui/images/icon.svg +0 -0
  90. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/ui/markdown/configuration_help.md +0 -0
  91. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/ui/markdown/documentation_main.md +0 -0
  92. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/ui/markdown/documentation_protips.md +0 -0
  93. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/ui/scripts.js +0 -0
  94. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/ui/tabs/__init__.py +0 -0
  95. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/ui/tabs/adapters.py +0 -0
  96. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/ui/tabs/configuration.py +0 -0
  97. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/ui/tabs/documentation.py +0 -0
  98. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/ui/tabs/logs.py +0 -0
  99. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/ui/tabs/monitoring.py +0 -0
  100. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/ui/utils.py +0 -0
  101. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/utility/config_utils.py +0 -0
  102. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/utility/logger/__init__.py +0 -0
  103. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/utility/logger/logger_utils.py +0 -0
  104. {leaf_framework-0.3.0 → leaf_framework-0.4.0}/leaf/utility/running_utilities.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: leaf-framework
3
- Version: 0.3.0
3
+ Version: 0.4.0
4
4
  Summary: Lightweight Adapter Framework (LEAF)
5
5
  License: Apache-2.0
6
6
  License-File: LICENSE
@@ -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 header
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, #6b7280 0%, #4b5563 100%);
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: linear-gradient(135deg, #4b5563 0%, #374151 100%);
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: #6b7280; }
52
- .status-offline { background-color: #9ca3af; }
53
- .status-warning { background-color: #d1d5db; }
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: linear-gradient(135deg, #374151 0%, #1f2937 100%);
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: #2563eb;
373
+ background-color: #f15b25;
337
374
  color: white;
338
375
  }
339
376
  .btn-primary:hover {
340
- background-color: #1d4ed8;
377
+ background-color: #d14e1e;
341
378
  }
342
379
  .dark .btn-primary {
343
- background-color: #3b82f6 !important;
380
+ background-color: #f15b25 !important;
344
381
  }
345
382
  .dark .btn-primary:hover {
346
- background-color: #2563eb !important;
383
+ background-color: #d14e1e !important;
347
384
  }
348
385
 
349
386
  .btn-secondary {
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "leaf-framework"
3
- version = "0.3.0"
3
+ version = "0.4.0"
4
4
  description = "Lightweight Adapter Framework (LEAF)"
5
5
  authors = [
6
6
  "Matthew Crowther <nmc215@ncl.ac.uk>",
File without changes
File without changes