{"id":22136717,"url":"https://github.com/bbalduzz/fluentflet","last_synced_at":"2025-03-17T15:13:30.290Z","repository":{"id":264866673,"uuid":"894495679","full_name":"Bbalduzz/fluentflet","owner":"Bbalduzz","description":"A fluent design widgets library based on winui3 for flet","archived":false,"fork":false,"pushed_at":"2024-12-17T10:27:31.000Z","size":1671,"stargazers_count":30,"open_issues_count":3,"forks_count":7,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-03-02T19:23:13.162Z","etag":null,"topics":["flet","fluent","gui","python","winui3"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Bbalduzz.png","metadata":{"files":{"readme":"README.md","changelog":"changes.md","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-11-26T13:06:49.000Z","updated_at":"2025-02-21T07:43:54.000Z","dependencies_parsed_at":"2025-01-29T15:40:34.409Z","dependency_job_id":null,"html_url":"https://github.com/Bbalduzz/fluentflet","commit_stats":null,"previous_names":["bbalduzz/fluentflet"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Bbalduzz%2Ffluentflet","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Bbalduzz%2Ffluentflet/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Bbalduzz%2Ffluentflet/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Bbalduzz%2Ffluentflet/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Bbalduzz","download_url":"https://codeload.github.com/Bbalduzz/fluentflet/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244056424,"owners_count":20390719,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["flet","fluent","gui","python","winui3"],"created_at":"2024-12-01T19:24:54.746Z","updated_at":"2025-03-17T15:13:30.270Z","avatar_url":"https://github.com/Bbalduzz.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg width=\"50%\" align=\"center\" src=\"https://github.com/user-attachments/assets/01fcda49-a016-47c7-949f-83f35e47bd35\" alt=\"logo\"\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n  \u003cimg width=\"10%\" align=\"center\" src=\"https://github.com/user-attachments/assets/49d157d1-0893-4b81-a812-794e41a2b0a8\" alt=\"logo\"\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003e\n  Fluent Flet\n  \u003c/br\u003e\n  \u003ca href=\"https://pypi.org/project/fluentflet\"\u003e\u003cimg alt=\"PyPI - Version\" src=\"https://img.shields.io/pypi/v/fluentflet?style=for-the-badge\u0026color=%2363cbfb\"\u003e\u003c/a\u003e\n\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  A fluent design widgets library based on Flet \n\u003c/p\u003e\n\n\u003cdiv align=\"center\"\u003e\n    \u003ckbd\u003e\n      \u003cvideo width=\"100%\" align=\"center\" src=\"https://github.com/user-attachments/assets/5952ce87-d679-411e-a050-e58776d1764b\" alt=\"demo\"\u003e\n    \u003c/kbd\u003e\n\u003c/div\u003e\n\n\u003ch1 align=\"left\"\u003e\n  Documentation\n  \u003cimg src=\"https://img.shields.io/badge/prerelease-8FD28F\" alt=\"logo\"\u003e\n\u003c/h1\u003e\n\n### istallation\n\u003e [!IMPORTANT]\n\u003e fluentflet is still in alpha version. this means that there could be bugs and unexpected behaviours\n\n- from [PyPi](https://pypi.org/project/fluentflet)\n```\npip install fluentflet\n```\n- from source\n```\ngit clone https://github.com/Bbalduzz/fluentflet.git\n\ncd fluentflet\n\npy setup.py install\n```\n\n### documentation overview\n\u003cdetails\u003e\n\u003csummary\u003eTable of Contents\u003c/summary\u003e\n\n#### Components\n- [Button](https://github.com/Bbalduzz/fluentflet?tab=readme-ov-file#button-component)\n  - [ButtonVariant](https://github.com/Bbalduzz/fluentflet?tab=readme-ov-file#buttonvariant-enum)\n  - [Button](https://github.com/Bbalduzz/fluentflet?tab=readme-ov-file#button)\n- [Checkbox](https://github.com/Bbalduzz/fluentflet?tab=readme-ov-file#checkbox-component) \n  - [CheckState](https://github.com/Bbalduzz/fluentflet?tab=readme-ov-file#checkstate-enum)\n  - [Checkbox](https://github.com/Bbalduzz/fluentflet?tab=readme-ov-file#checkbox)\n- [Dialog](https://github.com/Bbalduzz/fluentflet?tab=readme-ov-file#dialog-component)\n  - [Dialog](https://github.com/Bbalduzz/fluentflet?tab=readme-ov-file#dialog)\n- [Dropdown](https://github.com/Bbalduzz/fluentflet?tab=readme-ov-file#dropdown-component)\n  - [Dropdown](https://github.com/Bbalduzz/fluentflet?tab=readme-ov-file#dropdown)\n- [Expander](https://github.com/Bbalduzz/fluentflet?tab=readme-ov-file#expander-component)\n  - [Expander](https://github.com/Bbalduzz/fluentflet?tab=readme-ov-file#expander)\n- [ListItem](https://github.com/Bbalduzz/fluentflet?tab=readme-ov-file#listitem-component)\n  - [ListItem](https://github.com/Bbalduzz/fluentflet?tab=readme-ov-file#listitem)\n- [ProgressRing](https://github.com/Bbalduzz/fluentflet?tab=readme-ov-file#progressring-component) \n  - [ProgressRing](https://github.com/Bbalduzz/fluentflet?tab=readme-ov-file#progressring)\n- [Radio](https://github.com/Bbalduzz/fluentflet?tab=readme-ov-file#radio-component)\n  - [Radio](https://github.com/Bbalduzz/fluentflet?tab=readme-ov-file#radio)\n  - [RadioGroup](https://github.com/Bbalduzz/fluentflet?tab=readme-ov-file#radiogroup)\n- [Slider](https://github.com/Bbalduzz/fluentflet?tab=readme-ov-file#slider-component)\n  - [SliderOrientation](https://github.com/Bbalduzz/fluentflet?tab=readme-ov-file#sliderorientation-enum)\n  - [Slider](https://github.com/Bbalduzz/fluentflet?tab=readme-ov-file#slider)\n- [TextBox](https://github.com/Bbalduzz/fluentflet?tab=readme-ov-file#textbox-component)\n  - [TextBox](https://github.com/Bbalduzz/fluentflet?tab=readme-ov-file#textbox)\n- [Toggle](https://github.com/Bbalduzz/fluentflet?tab=readme-ov-file#toggle-component)\n  - [Toggle](https://github.com/Bbalduzz/fluentflet?tab=readme-ov-file#toggle) \n- [Tooltip](https://github.com/Bbalduzz/fluentflet?tab=readme-ov-file#tooltip-component)\n  - [Tooltip](https://github.com/Bbalduzz/fluentflet?tab=readme-ov-file#tooltip)\n- [TreeView](https://github.com/Bbalduzz/fluentflet?tab=readme-ov-file#treeview-components)\n  - [TreeItemData](https://github.com/Bbalduzz/fluentflet?tab=readme-ov-file#treeitemdata) \n  - [TreeViewAbstractModel](https://github.com/Bbalduzz/fluentflet?tab=readme-ov-file#treeviewabstractmodel)\n  - [DictTreeViewModel](https://github.com/Bbalduzz/fluentflet?tab=readme-ov-file#dicttreeviewmodel)\n  - [JSONTreeViewModel](https://github.com/Bbalduzz/fluentflet?tab=readme-ov-file#jsontreeviewmodel)\n  - [TreeView](https://github.com/Bbalduzz/fluentflet?tab=readme-ov-file#treeview)\n- [Toast](https://github.com/Bbalduzz/fluentflet?tab=readme-ov-file#toast-component)\n  - [Enums](https://github.com/Bbalduzz/fluentflet?tab=readme-ov-file#enums)\n    - [ToastPosition](https://github.com/Bbalduzz/fluentflet?tab=readme-ov-file#toastposition)\n    - [ToastVariant](https://github.com/Bbalduzz/fluentflet?tab=readme-ov-file#toastvariant) \n    - [ToastSeverity](https://github.com/Bbalduzz/fluentflet?tab=readme-ov-file#toastseverity)\n    - [ToastActionType](https://github.com/Bbalduzz/fluentflet?tab=readme-ov-file#toastactiontype)\n  - [Toast](https://github.com/Bbalduzz/fluentflet?tab=readme-ov-file#toast)\n  - [Toaster](https://github.com/Bbalduzz/fluentflet?tab=readme-ov-file#toaster)\n\n#### Enhancements  \n- [Page Monkey Patches](https://github.com/Bbalduzz/fluentflet?tab=readme-ov-file#page-monkey-patches)\n- [FluentWindow](https://github.com/Bbalduzz/fluentflet?tab=readme-ov-file#fluentwindow)\n  - [FluentState](https://github.com/Bbalduzz/fluentflet?tab=readme-ov-file#fluentstate)\n  - [FluentWindow](https://github.com/Bbalduzz/fluentflet?tab=readme-ov-file#fluentwindow-1)\n\u003c/details\u003e\n\n## Button Component\n\u003e `fluentflet/components/button.py`\n\n### ButtonVariant (Enum)\n```python\nclass ButtonVariant(Enum):\n    DEFAULT = \"default\"     # Standard button styling\n    ACCENT = \"accent\"       # Primary action/emphasized styling\n    HYPERLINK = \"hyperlink\" # Text-like button styling \n    TOGGLE = \"toggle\"       # Toggleable state button\n```\n\n### Button\n**Purpose**: Implements Fluent Design System button control with multiple variants and styles.\n**Inherits from**: `ft.TextButton`\n\n#### Attributes:\n- `is_toggled: bool = False`. Current toggle state for toggle variant buttons\n- `_variant: ButtonVariant`. Current button style variant\n- `design_system: FluentDesignSystem`. Reference to design system for styling\n- `theme: Theme`. Current theme settings\n\n#### Constructor Parameters:\n- `content: Union[str, ft.Control] = None`. Button content (text or control like icon)\n  - If string: Creates Text control automatically\n  - If control: Uses directly\n- `variant: ButtonVariant = ButtonVariant.DEFAULT`. Button style variant\n- `height: int = 35`. Button height in pixels\n- `custom_color: Optional[str] = None`. Optional color override\n- `design_system: FluentDesignSystem = None`. Design system instance\n- `is_dark_mode: bool = True`. Theme mode selection\n- `**kwargs`. Additional Flet button properties\n\n#### Example Usage:\n```python\nfrom fluentflet.components import Button, ButtonVariant\nfrom fluentflet.utils import FluentIcon, FluentIcons\n\n# Text button\nbasic_button = Button(\n    \"Click Me\", \n    variant=ButtonVariant.DEFAULT,\n    on_click=lambda e: print(\"Clicked!\")\n)\n\n# Icon button with accent\nicon_button = Button(\n    content=FluentIcon(FluentIcons.ADD), \n    variant=ButtonVariant.ACCENT\n)\n\n# Toggle button\ntoggle = Button(\n    \"Toggle Me\",\n    variant=ButtonVariant.TOGGLE,\n    on_click=lambda e: print(f\"Toggled: {toggle.is_toggled}\")\n)\n```\n\n## Checkbox Component\n**Path**: `fluentflet/components/checkbox.py`\n\n### CheckState (Enum)\n```python\nclass CheckState(Enum):\n    UNCHECKED = \"unchecked\"       # Box is empty\n    CHECKED = \"checked\"           # Box has checkmark\n    INDETERMINATE = \"indeterminate\" # Box has dash (mixed state)\n```\n\n### Checkbox\n**Purpose**: Implements tri-state checkbox control with Fluent Design styling.\n**Inherits from**: `ft.Container`\n\n#### Attributes:\n- `state: CheckState`. Current checkbox state\n- `_disabled: bool`. Disabled state tracking\n- `size: int`. Size of the checkbox in pixels\n- `three_state: bool`. Whether indeterminate state is allowed\n\n#### Constructor Parameters:\n- `state: CheckState = CheckState.UNCHECKED`. Initial state\n- `label: str = \"\"`. Optional label text\n- `size: int = 20`. Size in pixels\n- `on_change: Callable[[CheckState], None] = None`. State change callback\n- `disabled: bool = False`. Initial disabled state\n- `three_state: bool = False`. Enable tri-state behavior\n- `design_system: FluentDesignSystem = None`. Design system instance \n- `is_dark_mode: bool = True`. Theme mode\n- `**kwargs`. Additional container properties\n\n#### Example Usage:\n```python\nfrom fluentflet.components import Checkbox, CheckState\n\n# Basic checkbox\ncheckbox = Checkbox(\n    label=\"Enable feature\",\n    on_change=lambda state: print(f\"State: {state}\")\n)\n\n# Tri-state checkbox\ntristate = Checkbox(\n    label=\"Select files\",\n    three_state=True,\n    state=CheckState.INDETERMINATE\n)\n\n# Disabled checkbox \ndisabled = Checkbox(\n    label=\"Unavailable option\",\n    disabled=True,\n    state=CheckState.CHECKED\n)\n```\n\n## Dialog Component\n\u003e `fluentflet/components/dialog.py`\n\n### Dialog\n**Purpose**: Implements a modal dialog overlay with Fluent Design styling.\n**Inherits from**: `ft.Container`\n\n#### Attributes:\n- `dialog_width: int = 400`. Width of dialog in pixels \n- `title_text: str`. Dialog title\n- `_content: ft.Control`. Main dialog content\n- `actions: List[Button]`. Action buttons for dialog\n\n#### Constructor Parameters:\n- `title: str = \"Dialog Title\"`. Dialog header text\n- `content: Optional[ft.Control] = None`. Main content area\n  - Defaults to simple text if not provided\n  - Can be any Flet control\n- `actions: Optional[List[Button]] = None`. Bottom action buttons\n  - Defaults to [\"Action\", \"Close\"] buttons if not provided\n  - Close button automatically included\n\n#### Methods:\n- `show()`: Display the dialog\n  ```python\n  Returns:\n  - None: Updates page overlay\n  ```\n\n- `close_dialog(e: Optional[ft.ControlEvent] = None)`: Hide and remove dialog\n  ```python\n  Returns:\n  - None: Removes from page overlay\n  ```\n\n#### Example Usage:\n```python\nfrom fluentflet.components import Dialog, Button, ButtonVariant\n\n# Simple dialog\ndialog = Dialog(\n    title=\"Confirm Action\",\n    content=ft.Text(\"Are you sure you want to proceed?\")\n)\n\n# Custom dialog with multiple actions\ncustom_dialog = Dialog(\n    title=\"Save Changes\",\n    content=ft.Column([\n        ft.Text(\"Save current changes?\"),\n        ft.TextField(label=\"Comment\")\n    ]),\n    actions=[\n        Button(\"Save\", variant=ButtonVariant.ACCENT),\n        Button(\"Don't Save\"),\n        Button(\"Cancel\")\n    ]\n)\n\n# Show dialog\npage.overlay.append(dialog)\ndialog.show()\n```\n\n## Dropdown Component\n\u003e `fluentflet/components/dropdown.py`\n\n### Dropdown\n**Purpose**: Implements a dropdown select control with Fluent Design styling.\n**Inherits from**: `ft.Container`\n\n#### Attributes:\n- `options: List[Union[str, ft.Control]]`. Available options\n- `max_width: int`. Maximum width of dropdown\n- `selected_value: str`. Currently selected option\n- `is_open: bool`. Dropdown expanded state\n\n#### Constructor Parameters:\n- `options: List[Union[str, ft.Control]]`. List of dropdown options\n  - Can be strings or Flet controls\n  - Must not be empty\n- `max_width: int = 150`. Maximum width in pixels\n- `theme_mode: ft.ThemeMode = ft.ThemeMode.DARK`. Theme selection\n- `on_select: Optional[Callable] = None`. Selection change callback\n- `animated: bool = True`. Enable animations\n- `initial_value: Optional[str] = None`. Initially selected item\n- `**kwargs`. Additional container properties\n\n#### Example Usage:\n```python\nfrom fluentflet.components import Dropdown\n\n# Simple string options\ndropdown = Dropdown(\n    options=[\"Option 1\", \"Option 2\", \"Option 3\"],\n    on_select=lambda value: print(f\"Selected: {value}\")\n)\n\n# Custom control options\ndropdown_with_icons = Dropdown(\n    options=[\n        ft.Row([\n            ft.Icon(ft.icons.SETTINGS),\n            ft.Text(\"Settings\")\n        ]),\n        ft.Row([\n            ft.Icon(ft.icons.PERSON),\n            ft.Text(\"Profile\")\n        ])\n    ],\n    max_width=200\n)\n```\n\n## Expander Component  \n\u003e `fluentflet/components/expander.py`\n\n### Expander\n**Purpose**: Implements collapsible/expandable section with Fluent Design styling.\n**Inherits from**: `ft.Container`\n\n#### Attributes:\n- `_expanded: bool`. Current expansion state\n- `_width: int`. Width of expander\n- `_header: ft.Control`. Header content \n- `_content: ft.Control`. Main content\n- `_content_height: Optional[int]`. Cached content height for animation\n\n#### Constructor Parameters:\n- `header: Union[str, ft.Control]`. Content shown in always-visible header\n  - If string: Creates text control\n  - If control: Uses directly\n- `content: ft.Control`. Content shown when expanded\n- `expand: bool = False`. Initial expanded state\n- `width: int = 600`. Expander width in pixels\n- `is_dark_mode: bool = True`. Theme mode\n- `**kwargs`. Additional container properties\n\n#### Properties:\n- `expanded: bool`. Get/set expanded state\n\n#### Example Usage:\n```python\nfrom fluentflet.components import Expander\n\n# Simple text expander\nexpander = Expander(\n    header=\"Click to Expand\",\n    content=ft.Text(\"Expanded content here\"),\n    expand=False\n)\n\n# Complex expander with custom header\nexpander = Expander(\n    header=ft.Row([\n        ft.Icon(ft.icons.SETTINGS),\n        ft.Text(\"Advanced Settings\")\n    ]),\n    content=ft.Column([\n        ft.TextField(label=\"Setting 1\"),\n        ft.TextField(label=\"Setting 2\")\n    ])\n)\n```\n\n## ListItem Component\n\u003e `fluentflet/components/listitem.py`\n\n### ListItem\n**Purpose**: Implements selectable list item with Fluent Design styling.\n**Inherits from**: `ft.GestureDetector`\n\n#### Class Attributes:\n- `instances: List[ListItem]`. All created instances for selection management\n\n#### Instance Attributes:\n- `item_content: ft.Control`. Item's content\n- `is_hovered: bool`. Hover state\n- `is_pressed: bool`. Press state\n- `_is_selected: bool`. Selection state\n\n#### Constructor Parameters:\n- `content: ft.Control`. Item content\n- `on_click: Optional[Callable] = None`. Click handler\n- `is_dark_mode: bool = True`. Theme mode\n- `selected: bool = False`. Initial selection state\n- `**kwargs`. Additional gesture detector properties\n\n#### Properties:\n- `selected: bool`. Get/set selection state\n\n#### Example Usage:\n```python\nfrom fluentflet.components import ListItem\n\n# Simple list item\nitem = ListItem(\n    content=ft.Text(\"List Item 1\"),\n    on_click=lambda _: print(\"Clicked\")\n)\n\n# Complex list item\nitem = ListItem(\n    content=ft.Row([\n        ft.Icon(ft.icons.PERSON),\n        ft.Column([\n            ft.Text(\"John Doe\"),\n            ft.Text(\"john@example.com\", size=12)\n        ])\n    ]),\n    selected=True\n)\n\n# List of items\nitems_list = ft.ListView(\n    controls=[\n        ListItem(content=ft.Text(f\"Item {i}\"))\n        for i in range(5)\n    ]\n)\n```\n\n## ProgressRing Component\n\u003e `fluentflet/components/progressring.py`\n\n### ProgressRing\n**Purpose**: Implements circular progress indicator with Fluent Design styling.\n**Inherits from**: `ft.ProgressRing`\n\n#### Constructor Parameters:\n- `stroke_width: int = 3`. Width of the ring stroke\n- `value: Optional[float] = None`. Progress value (0.0-1.0 for determinate, None for indeterminate)\n- `**kwargs`. Additional progress ring properties\n\n#### Example Usage:\n```python\nfrom fluentflet.components import ProgressRing\n\n# Indeterminate progress\nloading = ProgressRing()\n\n# Determinate progress\nprogress = ProgressRing(value=0.75)\n\n# Custom styled progress\ncustom = ProgressRing(\n    value=0.5,\n    stroke_width=5,\n    width=100,\n    height=100\n)\n```\n\n## Radio Component\n\u003e`fluentflet/components/radio.py`\n\n### Radio\n**Purpose**: Implements individual radio button control.\n**Inherits from**: `ft.Container`\n\n#### Attributes:\n- `value: Any`. Value associated with radio button\n- `_selected: bool`. Current selection state\n- `_disabled: bool`. Disabled state\n- `is_hovered: bool`. Hover state\n- `is_pressed: bool`. Press state\n- `_radio_group: Optional[RadioGroup]`. Parent radio group\n\n#### Constructor Parameters:\n- `value: Any = None`. Value for this radio option\n- `label: str = \"\"`. Label text\n- `selected: bool = False`. Initial selection\n- `disabled: bool = False`. Disabled state\n- `design_system: FluentDesignSystem = None`. Design system instance\n- `is_dark_mode: bool = True`. Theme mode\n- `**kwargs`. Additional container properties\n\n### RadioGroup\n**Purpose**: Container for managing a group of related radio buttons.\n\n**Inherits from**: `ft.Container`\n\n#### Attributes:\n- `radios: List[Radio]`. Child radio buttons\n- `_value: Any`. Currently selected value\n- `_on_change: Optional[Callable]`. Value change callback\n\n#### Constructor Parameters:\n- `content: ft.Control = None`. Container content\n- `value: Any = None`. Initial selected value\n- `on_change: Optional[Callable] = None`. Value change handler\n- `design_system: FluentDesignSystem = None`. Design system instance\n- `is_dark_mode: bool = True`. Theme mode\n- `**kwargs`. Additional container properties\n\n#### Example Usage:\n```python\nfrom fluentflet.components import Radio, RadioGroup\n\n# Single radio button\nradio = Radio(\n    value=\"option1\",\n    label=\"Option 1\",\n    disabled=False\n)\n\n# Radio group\nradio_group = RadioGroup(\n    content=ft.Column([\n        Radio(value=\"small\", label=\"Small\"),\n        Radio(value=\"medium\", label=\"Medium\"),\n        Radio(value=\"large\", label=\"Large\")\n    ]),\n    value=\"medium\",\n    on_change=lambda value: print(f\"Selected: {value}\")\n)\n```\n\n## Slider Component\n\u003e `fluentflet/components/slider.py`\n\n### SliderOrientation (Enum)\n```python\nclass SliderOrientation(Enum):\n    HORIZONTAL = \"horizontal\"\n    VERTICAL = \"vertical\"\n```\n\n### Slider\n**Purpose**: Implements a draggable slider control with Fluent Design styling.\n**Inherits from**: `ft.Container`\n\n#### Attributes:\n- `current_value: float`. Current slider value\n- `min: float`. Minimum value\n- `max: float`. Maximum value\n- `dragging: bool`. Current drag state\n- `thumb_size: int`. Size of slider thumb\n- `is_hovered: bool`. Hover state\n- `is_pressed: bool`. Press state\n\n#### Constructor Parameters:\n- `value: float = 0`. Initial value\n  - Must be between min and max\n- `min: float = 0`. Minimum value\n- `max: float = 100`. Maximum value\n- `on_change: Optional[Callable[[float], None]] = None`. Value change callback\n- `size: int = 200`. Slider length in pixels\n- `disabled: bool = False`. Disabled state\n- `orientation: SliderOrientation = SliderOrientation.HORIZONTAL`. Slider orientation\n- `is_dark_mode: bool = True`. Theme mode\n- `**kwargs`. Additional container properties\n\n#### Example Usage:\n```python\nfrom fluentflet.components import Slider, SliderOrientation\n\n# Horizontal slider\nslider = Slider(\n    value=50,\n    min=0,\n    max=100,\n    on_change=lambda e: print(f\"Value: {e.current_value}\")\n)\n\n# Vertical slider\nvertical_slider = Slider(\n    value=0.5,\n    min=0,\n    max=1,\n    orientation=SliderOrientation.VERTICAL,\n    size=150\n)\n\n# Custom range slider\ncustom = Slider(\n    value=-50,\n    min=-100,\n    max=100,\n    disabled=False\n)\n```\n\n## TextBox Component\n\u003e `fluentflet/components/textbox.py`\n\n### TextBox\n**Purpose**: Implements text input control with Fluent Design styling.\n**Inherits from**: `ft.Container`\n\n#### Attributes:\n- `textfield: ft.TextField`. Core text input control\n- `bottom_border: ft.Container`. Bottom border with animation\n- `actions_row: ft.Row`. Container for action buttons\n- `default_bgcolor: str`. Default background color\n\n#### Constructor Parameters:\n- `design_system: FluentDesignSystem = FluentDesignSystem()`. Design system instance\n- `placeholder: str = \"TextBox\"`. Placeholder text\n- `prefix: str = None`: Optional text to display before the input area\n- `suffix: str = None`: Optional text to display after the input area\n- `width: int = 200`. Control width\n- `text_size: int = 14`. Font size\n- `height: int = 32`. Control height\n- `password: bool = False`. Password input mode\n- `actions_visible: bool = True`. Show/hide action buttons\n- `**kwargs`. Additional container properties\n\n#### Methods:\n- `add_action(icon: FluentIcons, on_click=None, tooltip: str = None) -\u003e Button`\n  - Adds action button to textbox\n  - Returns the created button\n\n#### Example Usage:\n```python\nfrom fluentflet.components import TextBox\nfrom fluentflet.utils import FluentIcons\n\n# Basic textbox\ntextbox = TextBox(\n    placeholder=\"Enter text\",\n    width=300\n)\n\n# Password textbox\npassword = TextBox(\n    placeholder=\"Password\",\n    password=True\n)\n\n# TextBox with prefix and suffix\nurl_input = TextBox(\n    placeholder=\"Enter domain name\",\n    prefix=\"https://\",\n    suffix=\".com\",\n    width=300\n)\n\n# Textbox with actions\ntextbox_with_actions = TextBox(\n    placeholder=\"Search\",\n    width=400\n)\ntextbox_with_actions.add_action(\n    icon=FluentIcons.SEARCH,\n    on_click=lambda _: print(\"Search clicked\"),\n    tooltip=\"Search\"\n)\ntextbox_with_actions.add_action(\n    icon=FluentIcons.DISMISS,\n    on_click=lambda _: setattr(textbox_with_actions, 'value', ''),\n    tooltip=\"Clear\"\n)\n```\n\n## Toggle Component\n\u003e `fluentflet/components/toggle.py`\n\n### Toggle\n**Purpose**: Implements a toggle switch with Fluent Design styling.\n**Inherits from**: `ft.Container`\n\n#### Attributes:\n- `value: bool`. Current toggle state\n- `on_content: str`. Label text for ON state\n- `off_content: str`. Label text for OFF state\n- `_label: str`. Current label text\n- `_handle_size: int`. Size of toggle handle\n- `_handle_expanded_width: int`. Width when handle is pressed\n\n#### Constructor Parameters:\n- `value: bool = False`. Initial state\n- `label: Union[str, dict] = None`. Label text or dict with on/off states\n  - If string: Same label for both states\n  - If dict: Must have \"on_content\" and \"off_content\" keys\n- `label_position: ft.LabelPosition = ft.LabelPosition.RIGHT`. Label placement\n- `on_change: Optional[Callable[[bool], None]] = None`. State change callback\n- `label_style: Optional[Dict] = None`. Label text styling\n- `disabled: bool = False`. Disabled state\n- `width: int = 40`. Toggle width\n- `height: int = 20`. Toggle height\n- `**kwargs`. Additional container properties\n\n#### Example Usage:\n```python\nfrom fluentflet.components import Toggle\n\n# Simple toggle\ntoggle = Toggle(\n    value=False,\n    label=\"Enable feature\",\n    on_change=lambda state: print(f\"Toggled: {state}\")\n)\n\n# Toggle with different labels\ntoggle = Toggle(\n    value=True,\n    label={\n        \"on_content\": \"Enabled\",\n        \"off_content\": \"Disabled\"\n    }\n)\n\n# Custom styled toggle\ntoggle = Toggle(\n    label=\"Custom toggle\",\n    label_style={\n        \"size\": 16,\n        \"weight\": \"bold\"\n    },\n    width=50,\n    height=25\n)\n```\n\n## Tooltip Component\n\u003e `fluentflet/components/tooltip.py`\n\n### ToolTip\n**Purpose**: Implements hover tooltip with Fluent Design styling.\n**Inherits from**: `ft.Tooltip`\n\n#### Constructor Parameters:\n- `padding: int = 6`. Tooltip padding\n- `border_radius: int = 4`. Corner radius\n- `text_style: ft.TextStyle`. Tooltip text styling\n- `bgcolor: str = \"#2d2d2d\"`. Background color\n- `border: ft.Border`. Border style\n- `prefer_below: bool = False`. Show below target when possible\n- `wait_duration: int = 300`. Delay before showing (ms)\n- `**kwargs`. Additional tooltip properties\n\n#### Example Usage:\n```python\nfrom fluentflet.components import ToolTip, Button\n\n# Basic tooltip\nbutton = Button(\"Hover me\")\ntooltip = ToolTip(\n    message=\"This is a tooltip\",\n    content=button\n)\n\n# Custom styled tooltip\ntooltip = ToolTip(\n    message=\"Custom tooltip\",\n    content=ft.Text(\"Hover for info\"),\n    text_style=ft.TextStyle(\n        size=14,\n        weight=ft.FontWeight.BOLD\n    ),\n    bgcolor=\"#333333\",\n    border_radius=8\n)\n```\n\n## TreeView Components\n\u003e `fluentflet/components/treeview.py`\n\n### TreeItemData\n**Purpose**: Base data structure for tree items.\n\n#### Attributes:\n- `id: str`. Unique identifier for the item\n- `label: str`. Display text\n- `value: Optional[Any] = None`. Associated value\n- `parent_id: Optional[str] = None`. ID of parent item\n- `children: List[TreeItemData] = None`. Child items\n- `metadata: Dict[str, Any] = None`. Additional item data\n\n#### Example Usage:\n```python\nitem = TreeItemData(\n    id=\"root\",\n    label=\"Root Item\",\n    children=[\n        TreeItemData(id=\"child1\", label=\"Child 1\"),\n        TreeItemData(id=\"child2\", label=\"Child 2\")\n    ]\n)\n```\n\n### TreeViewAbstractModel\n**Purpose**: Abstract base class for tree data models.\n**Generic Type**: `T` - Type of raw data\n\n#### Attributes:\n- `items: List[TreeItemData]`. Processed tree items\n- `_raw_data: Optional[T]`. Source data\n\n#### Abstract Methods:\n- `process_data()`: Convert raw data to TreeItemData objects\n\n#### Common Methods:\n- `get_item_by_id(item_id: str) -\u003e Optional[TreeItemData]`\n- `get_root_items() -\u003e List[TreeItemData]`\n- `get_children(parent_id: str) -\u003e List[TreeItemData]`\n\n### DictTreeViewModel\n**Purpose**: Tree model for dictionary data.\n**Inherits from**: `TreeViewAbstractModel[Dict]`\n\n#### Example Usage:\n```python\ndata = {\n    \"Root\": {\n        \"Child1\": {\n            \"GrandChild1\": 1.1,\n            \"GrandChild2\": 1.2\n        },\n        \"Child2\": 2.0\n    }\n}\n\nmodel = DictTreeViewModel()\nmodel.raw_data = data\n```\n\n### JSONTreeViewModel\n**Purpose**: Tree model for JSON array/object data.\n**Inherits from**: `TreeViewAbstractModel[List[Dict]]`\n\n#### Constructor Parameters:\n- `field_mapping: Optional[Dict[str, str]] = None`. Custom field name mapping\n  - Default maps: id, label, value, children\n\n#### Example Usage:\n```python\ndata = [\n    {\n        \"id\": \"1\",\n        \"label\": \"Item 1\",\n        \"children\": [\n            {\n                \"id\": \"1.1\",\n                \"label\": \"Subitem 1.1\"\n            }\n        ]\n    }\n]\n\nmodel = JSONTreeViewModel()\nmodel.raw_data = data\n```\n\n### TreeView\n**Purpose**: Main tree view component with drag-drop support.\n**Inherits from**: `ft.Column`\n\n#### Constructor Parameters:\n- `data: dict`. Source data\n- `model: Optional[TreeViewAbstractModel] = DictTreeViewModel()`. Data model\n- `on_right_click: Optional[Callable] = None`. Right-click handler\n- `is_dark_mode: bool = True`. Theme mode\n\n#### Methods:\n- `handle_item_drop(src_id: str, target_id: str)`: Handle item reordering\n\n#### Example Usage:\n```python\nfrom fluentflet.components import TreeView, DictTreeViewModel\n\n# Basic tree\ndata = {\n    \"Root\": {\n        \"Item1\": 1.0,\n        \"Item2\": {\n            \"SubItem1\": 2.1,\n            \"SubItem2\": 2.2\n        }\n    }\n}\n\ntree = TreeView(\n    data=data,\n    model=DictTreeViewModel(),\n    on_right_click=lambda item: print(f\"Right clicked: {item.label}\")\n)\n\n# Custom model tree\nclass MyModel(TreeViewAbstractModel[List[Dict]]):\n    def process_data(self):\n        for item in self.raw_data:\n            self.items.append(TreeItemData(\n                id=str(item[\"id\"]),\n                label=item[\"name\"],\n                value=item[\"data\"]\n            ))\n\ntree = TreeView(\n    data=my_data,\n    model=MyModel()\n)\n```\n\n## Toast Component\n\u003e `fluentflet/components/toast.py`\n\n### Enums\n\n#### ToastPosition\n```python\nclass ToastPosition(Enum):\n    TOP_LEFT = \"top-left\"\n    TOP_RIGHT = \"top-right\"\n    TOP_CENTER = \"top-center\"\n    BOTTOM_LEFT = \"bottom-left\"\n    BOTTOM_RIGHT = \"bottom-right\"\n    BOTTOM_CENTER = \"bottom-center\"\n```\n\n#### ToastVariant\n```python\nclass ToastVariant(Enum):\n    SINGLE_LINE = \"single-line\"  # Compact single line toast\n    MULTI_LINE = \"multi-line\"    # Expanded multi-line toast\n```\n\n#### ToastSeverity\n```python\nclass ToastSeverity(Enum):\n    INFORMATIONAL = \"informational\"  # Blue info style\n    SUCCESS = \"success\"              # Green success style\n    WARNING = \"warning\"              # Yellow warning style\n    CRITICAL = \"critical\"            # Red error style\n```\n\n#### ToastActionType\n```python\nclass ToastActionType(Enum):\n    NONE = \"none\"          # No action button\n    HYPERLINK = \"hyperlink\"  # Link style action\n    DEFAULT = \"default\"      # Button style action\n```\n\n### Toast\n**Purpose**: Individual toast notification with Fluent Design styling.\n**Inherits from**: `ft.Container`\n\n#### Constructor Parameters:\n- `title: Optional[str] = None`. Toast title text\n- `message: Optional[str] = None`. Toast message text\n- `severity: ToastSeverity | str = ToastSeverity.INFORMATIONAL`. Toast style\n- `variant: ToastVariant | str = ToastVariant.SINGLE_LINE`. Layout style\n- `action_type: ToastActionType | str = ToastActionType.NONE`. Action button type\n- `action_text: Optional[str] = None`. Action button text\n- `action_url: Optional[str] = None`. URL for hyperlink action\n- `on_action: Optional[Callable] = None`. Action click handler\n- `position: ToastPosition | str = ToastPosition.TOP_RIGHT`. Toast position\n- `**kwargs`. Additional container properties\n\n### Toaster\n**Purpose**: Toast notification manager for showing/hiding toasts.\n\n#### Constructor Parameters:\n- `page: ft.Page`. Flet page instance\n- `expand: bool = False`. Auto-expand toasts on hover\n- `position: ToastPosition | str = ToastPosition.TOP_RIGHT`. Default position\n- `theme: str = \"dark\"`. Theme mode\n- `default_toast_duration: int = 3`. Default show duration in seconds\n- `default_offset: int = 20`. Spacing from window edge\n\n#### Methods:\n\n#### show_toast\n```python\ndef show_toast(\n    self,\n    title: Optional[str] = None,\n    message: Optional[str] = None,\n    severity: ToastSeverity | str = ToastSeverity.INFORMATIONAL,\n    variant: ToastVariant | str = ToastVariant.SINGLE_LINE,\n    action_type: ToastActionType | str = ToastActionType.NONE,\n    action_text: Optional[str] = None,\n    action_url: Optional[str] = None,\n    on_action: Optional[Callable] = None,\n    position: Optional[ToastPosition | str] = None,\n    duration: int = 3,\n    toast: Optional[Toast] = None,\n    **kwargs\n) -\u003e None\n```\n\n#### Example Usage:\n```python\nfrom fluentflet.components import Toast, Toaster, ToastSeverity\n\ndef main(page: ft.Page):\n    # Create toaster\n    toaster = Toaster(\n        page=page,\n        position=\"top-right\",\n        default_toast_duration=5\n    )\n\n    # Show simple toast\n    toaster.show_toast(\n        title=\"Success!\",\n        message=\"Operation completed\",\n        severity=ToastSeverity.SUCCESS\n    )\n\n    # Show toast with action\n    toaster.show_toast(\n        title=\"Warning\",\n        message=\"Connection lost\",\n        severity=ToastSeverity.WARNING,\n        action_type=\"default\",\n        action_text=\"Retry\",\n        on_action=lambda: print(\"Retrying...\")\n    )\n\n    # Show custom toast\n    custom_toast = Toast(\n        title=\"Custom Toast\",\n        message=\"With custom styling\",\n        severity=ToastSeverity.INFORMATIONAL,\n        variant=ToastVariant.MULTI_LINE,\n        action_type=ToastActionType.HYPERLINK,\n        action_text=\"Learn More\",\n        action_url=\"https://example.com\"\n    )\n    toaster.show_toast(toast=custom_toast)\n\nft.app(target=main)\n```\n\nThe Toast system provides:\n- Multiple severity levels with appropriate styling\n- Single and multi-line variants\n- Custom action buttons/links\n- Flexible positioning\n- Automatic stacking and animation\n- Hover expansion\n- Duration control\n\n---\n\n# Enhancements\n## Page Monkey Patches\n\u003e `fluentflet/utils/__init__.py`\n\n**Purpose**: Extends Flet's Page class with additional functionality for blur effects and drag-drop support.\n\n### Added Page Properties\n\n#### page.`blur_effect`\n```python\n@property\ndef blur_effect(self) -\u003e bool:\n    \"\"\"Controls window blur effect on Windows\"\"\"\n    return self._blur\n\n@blur_effect.setter\ndef blur_effect(self, value: bool):\n    # Only available on Windows\n    # Enables/disables acrylic blur effect\n```\n\n#### page.`accepts_drops`\n```python\n@property\ndef accepts_drops(self) -\u003e bool:\n    \"\"\"Controls file drop acceptance\"\"\"\n    return self._accepts_drops\n\n@accepts_drops.setter\ndef accepts_drops(self, value: bool):\n    # Enables/disables file drop handling\n```\n\n### Added Page Methods\n\n#### enable_drag_and_drop\n```python\ndef enable_drag_and_drop(\n    files_callback: Optional[Callable[[List[str]], None]] = None,\n    drag_enter_callback: Optional[Callable[[Tuple[int, int]], None]] = None,\n    drag_over_callback: Optional[Callable[[Tuple[int, int]], None]] = None,\n    drag_leave_callback: Optional[Callable[[], None]] = None\n):\n    \"\"\"Enable file drag-drop functionality\n    \n    Parameters:\n    - files_callback: Called with list of dropped file paths\n    - drag_enter_callback: Called with (x,y) when drag enters window\n    - drag_over_callback: Called with (x,y) while dragging over window\n    - drag_leave_callback: Called when drag leaves window\n    \"\"\"\n```\n\nExample Usage:\n```python\ndef on_files_dropped(files):\n    print(\"Files dropped:\", files)\n\ndef on_drag_enter(point):\n    print(f\"Drag entered at {point}\")\n\npage.accepts_drops = True\npage.enable_drag_and_drop(\n    files_callback=on_files_dropped,\n    drag_enter_callback=on_drag_enter\n)\n```\n\n## FluentWindow\n\u003e `fluentflet/window/fluent_window.py`\n\n**Purpose**: Implements a window manager with navigation, routing and state management following Fluent Design.\n\n### NavigationType (Enum)\nenum for controlling navigation layout:\n```python\nclass NavigationType(Enum):\n    STANDARD = auto()  # Original layout that pushes content\n    OVERLAY = auto()   # Navigation overlays the content\n```\n\n### Example Usage:\n```python\nfrom fluentflet import FluentWindow, NavigationType\n\nwindow = FluentWindow(\n    page=page,\n    nav_type=NavigationType.OVERLAY,\n    navigation_items=[\n        {\"icon\": FluentIcons.HOME, \"label\": \"Home\", \"route\": \"/home\"},\n        {\"icon\": FluentIcons.SETTINGS, \"label\": \"Settings\", \"route\": \"/settings\"}\n    ]\n)\n```\n\n### Classes\n\n#### FluentState\n**Purpose**: State management for FluentWindow applications\n\n```python\nclass FluentState:\n    \"\"\"Manages persistent and ephemeral application state\"\"\"\n    \n    def set(self, key: str, value: any, persist: bool = False):\n        \"\"\"Set state value\n        \n        Parameters:\n        - key: State key\n        - value: State value\n        - persist: If True, saves to session storage\n        \"\"\"\n        \n    def get(self, key: str, default=None) -\u003e any:\n        \"\"\"Get state value\"\"\"\n        \n    def subscribe(self, key: str, callback: callable):\n        \"\"\"Subscribe to state changes\"\"\"\n```\n\nExample Usage:\n```python\nclass AppState(FluentState):\n    def _load_initial_state(self):\n        self._state = {\n            \"theme\": \"light\",\n            \"selected_user\": None\n        }\n    \n    def set_theme(self, theme: str):\n        self.set(\"theme\", theme, persist=True)\n\nwindow.state = AppState()\nwindow.state.subscribe(\"theme\", lambda t: print(f\"Theme changed: {t}\"))\n```\n\n#### FluentWindow\n**Purpose**: Main window manager implementing navigation and routing\n\n##### Constructor Parameters:\n- `page: ft.Page`. Flet page instance\n- `navigation_items: Optional[List[Dict]]`. Navigation menu items\n  ```python\n  [\n      {\n          \"icon\": FluentIcons.HOME,  # Icon enum\n          \"label\": \"Home\",           # Display text \n          \"route\": \"/\",              # Optional route\n      }\n  ]\n  ```\n- `nav_type: NavigationType = NavigationType.STANDARD`. Side navigation rail type\n- `bottom_navigation_items: Optional[List[Dict]]`. Bottom nav items\n- `selected_index: int = 0`. Initial selected nav item\n- `window_titlebar: Union[str, Titlebar]`. Window title or titlebar component\n- `colors: Optional[Dict]`. Color overrides\n  ```python\n  {\n      \"nav_bg\": \"#1F1F1F\",\n      \"content_bg\": \"#282828\",\n      \"title_bar_bg\": \"#1F1F1F\",\n      \"icon_color\": \"white\",\n      \"text_color\": \"white\" \n  }\n  ```\n- `nav_width_collapsed: int = 50`. Navigation width when collapsed\n- `nav_width_expanded: int = 200`. Navigation width when expanded\n- `animation_duration: int = 100`. Animation duration in ms\n- `show_back_button: bool = True`. Show navigation back button\n- `state_manager: Type[FluentState] = FluentState`. State manager class\n\n##### Methods:\n\n###### Navigation\n```python\ndef navigate(self, route: str, **params):\n    \"\"\"Navigate to route with optional parameters\n    \n    Parameters:\n    - route: Route path\n    - **params: Route parameters\n    \"\"\"\n\n@route(\"/path\")\ndef view_builder():\n    \"\"\"Route decorator for registering views\"\"\"\n    return ft.Column([...])\n\ndef add_route(self, route: str, view_builder: Callable[..., ft.Control], \n              is_template: bool = False):\n    \"\"\"Register route manually\"\"\"\n```\n\nExample Usage:\n```python\ndef main(page: ft.Page):\n    window = FluentWindow(\n        page,\n        navigation_items=[\n            {\"icon\": FluentIcons.HOME, \"label\": \"Home\", \"route\": \"/\"},\n            {\"icon\": FluentIcons.PEOPLE, \"label\": \"Users\", \"route\": \"/users\"}\n        ]\n    )\n\n    @window.route(\"/\")\n    def home_view():\n        return ft.Column([\n            ft.Text(\"Welcome!\", size=32),\n            Button(\"View Users\", \n                  on_click=lambda _: window.navigate(\"/users\"))\n        ])\n\n    @window.route(\"/users/:user_id\", is_template=True)\n    def user_profile(user_id: str):\n        return ft.Column([\n            ft.Text(f\"User Profile: {user_id}\")\n        ])\n\n    window.navigate(\"/\")\n\nft.app(target=main)\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbbalduzz%2Ffluentflet","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbbalduzz%2Ffluentflet","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbbalduzz%2Ffluentflet/lists"}