diff --git a/fletx/cli/templates/project/.gitignore b/fletx/cli/templates/project/.gitignore new file mode 100644 index 0000000..b9f53fe --- /dev/null +++ b/fletx/cli/templates/project/.gitignore @@ -0,0 +1,15 @@ +# Python-generated files +**__pycache__/ +*.py[oc] +build/ +dist/ +wheels/ +*.egg-info + +# Virtual environments +.venv +.environments +*.lock +.env + +.DS_Store \ No newline at end of file diff --git a/fletx/cli/templates/project/app/utils/__init__.py b/fletx/cli/templates/project/app/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/fletx/cli/templates/project/app/utils/theme.py b/fletx/cli/templates/project/app/utils/theme.py new file mode 100644 index 0000000..eb67ff3 --- /dev/null +++ b/fletx/cli/templates/project/app/utils/theme.py @@ -0,0 +1,47 @@ +import flet as ft + +#### APP LIGHT THEME +light_theme = ft.Theme( + color_scheme=ft.ColorScheme( + primary="#4F46E5", # Indigo 600 (accent color) + primary_container="#EEF2FF", # Light indigo background + secondary="#64748B", # Slate 500 + secondary_container="#F1F5F9", # Light slate background + surface="#FFFFFF", + background="#F9FAFB", + error="#DC2626", # Red 600 + on_primary="#FFFFFF", + on_secondary="#FFFFFF", + on_surface="#1F2937", # Gray 800 (text on white) + on_background="#1F2937", + on_error="#FFFFFF" + ), + use_material3=True, + scaffold_bgcolor = "#F9FAFB", + visual_density=ft.VisualDensity.COMFORTABLE, + font_family="Roboto" +) + + +#### APP DARK THEME +dark_theme = ft.Theme( + color_scheme=ft.ColorScheme( + primary="#4F46E5", # Indigo 500 + primary_container = "#FCECD5", # Indigo background + secondary="#94A3B8", # Slate 400 + secondary_container="#253745", # Dark slate background + surface="#16191C", # Gray 900 + background="#191918", # Gray 950 + error="#F87171", # Red 400 + on_primary="#FFFFFF", + on_secondary="#000000", + on_surface="#E5E7EB", # Gray 200 + on_background="#E5E7EB", + on_error="#000000" + ), + # brightness=ft.Brightness.DARK, + scaffold_bgcolor = "#0F1319", + use_material3=True, + visual_density=ft.VisualDensity.COMFORTABLE, + font_family="Roboto" +) \ No newline at end of file diff --git a/fletx/cli/templates/project/main.py.tpl b/fletx/cli/templates/project/main.py.tpl index afe6c20..0221589 100644 --- a/fletx/cli/templates/project/main.py.tpl +++ b/fletx/cli/templates/project/main.py.tpl @@ -10,6 +10,7 @@ Version: {{ version }} import flet as ft from fletx.app import FletXApp from app.routes import {{ project_name | pascal_case }}Router +from app.utils.theme import light_theme, dark_theme def main(): """Main entry point for the {{ project_name | pascal_case }} application.""" @@ -23,14 +24,12 @@ def main(): # App Configuration app = FletXApp( - title="{{ project_name | pascal_case }}", + title = "{{ project_name | pascal_case }}", initial_route = "/", debug = True, - theme = ft.Theme(color_scheme_seed = ft.Colors.GREEN), - dark_theme = ft.Theme( - color_scheme_seed = ft.Colors.BLUE_800, - scaffold_bgcolor = ft.Colors.BLACK - ), + theme = light_theme, + dark_theme = dark_theme, + theme_mode= ft.ThemeMode.SYSTEM, window_config = { "width": 400, "height": 810, diff --git a/fletx/cli/templates/project/pyproject.toml.tpl b/fletx/cli/templates/project/pyproject.toml.tpl index e81fb74..1e05f11 100644 --- a/fletx/cli/templates/project/pyproject.toml.tpl +++ b/fletx/cli/templates/project/pyproject.toml.tpl @@ -5,6 +5,8 @@ description = "{{ description }}" readme = "README.md" authors = [{ name = "{{ author }}", email = "" }] requires-python = ">={{ python_version }}" + +# Dependencies dependencies = [ "fletxr=={{ fletx_version }}", "flet[all]==0.28.3", diff --git a/fletx/utils/__init__.py b/fletx/utils/__init__.py index 902f5ad..4a5e198 100644 --- a/fletx/utils/__init__.py +++ b/fletx/utils/__init__.py @@ -7,6 +7,7 @@ from importlib import import_module from fletx.utils.context import AppContext +from fletx.utils.logger import SharedLogger # FletX Logger Utility def get_logger(name: str) -> logging.Logger: @@ -16,8 +17,11 @@ def get_logger(name: str) -> logging.Logger: if base_logger is None: # Fallback if the context is not initialized - logger = logging.getLogger(name) - logger.addHandler(logging.NullHandler()) + SharedLogger._initialize_logger( + name = 'FletX', + ) + + logger = SharedLogger.get_logger(__name__) return logger return base_logger.getChild(name) diff --git a/fletx/utils/logger.py b/fletx/utils/logger.py index df4b347..03d8e52 100644 --- a/fletx/utils/logger.py +++ b/fletx/utils/logger.py @@ -18,7 +18,8 @@ class SharedLogger: _logger: Optional[logging.Logger] = None _lock = threading.Lock() debug_mode = os.getenv('FLETX_DEBUG','0') == '1' - _env_log_level = os.getenv('FLETX_LOG_LEVEL', 'NOTSET').upper() + _env_log_level = os.getenv('FLETX_LOG_LEVEL', 'INFO').upper() + _logging_enabled = os.getenv('FLETX_ENABLE_LOGGING','0') == '1' @classmethod def get_logger(cls, name: str = "FletX") -> logging.Logger: @@ -35,10 +36,14 @@ def logger(self) -> logging.Logger: return self.get_logger() @classmethod - def _initialize_logger(cls, name: str,debug: bool = False): + def _initialize_logger(cls, name: str,debug: bool = debug_mode): """One-time logger configuration""" + # Setup debug mode + cls.debug_mode = debug + logger = logging.getLogger(name) + # Determine level: env overrides, else fallback to debug flag level_name = cls._env_log_level if cls._env_log_level in { 'CRITICAL','ERROR','WARNING','INFO','DEBUG','NOTSET' @@ -57,17 +62,20 @@ def _initialize_logger(cls, name: str,debug: bool = False): handler.setLevel(level) logger.addHandler(handler) + # Enable or disable logging + logging.disable(logging.CRITICAL) if not cls._logging_enabled else logging.disable(logging.NOTSET) + cls._logger = logger def debug(self, message: str): """Log a debug message""" - if self.debug_mode: - self.logger.debug(message) + # if self.debug_mode: + self.logger.debug(message) def info(self, message: str): """Log an info level message""" - if self.logger.isEnabledFor(logging.INFO): - self.logger.info(message) + # if self.logger.isEnabledFor(logging.INFO): + self.logger.info(message) def warning(self, message: str): """Log a warning level message"""