fluent-blue 0.1.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.
- fluent_blue-0.1.0/.gitignore +87 -0
- fluent_blue-0.1.0/AGENTS.md +168 -0
- fluent_blue-0.1.0/CHANGELOG.md +23 -0
- fluent_blue-0.1.0/CONTRIBUTING.md +59 -0
- fluent_blue-0.1.0/LICENSE +21 -0
- fluent_blue-0.1.0/PKG-INFO +303 -0
- fluent_blue-0.1.0/README.md +263 -0
- fluent_blue-0.1.0/docs/ai/components/Alert.md +74 -0
- fluent_blue-0.1.0/docs/ai/components/Avatar.md +66 -0
- fluent_blue-0.1.0/docs/ai/components/AvatarGroup.md +58 -0
- fluent_blue-0.1.0/docs/ai/components/Badge.md +64 -0
- fluent_blue-0.1.0/docs/ai/components/BadgeOverlay.md +67 -0
- fluent_blue-0.1.0/docs/ai/components/Breadcrumb.md +64 -0
- fluent_blue-0.1.0/docs/ai/components/Button.md +84 -0
- fluent_blue-0.1.0/docs/ai/components/Calendar.md +75 -0
- fluent_blue-0.1.0/docs/ai/components/Card.md +78 -0
- fluent_blue-0.1.0/docs/ai/components/Checkbox.md +68 -0
- fluent_blue-0.1.0/docs/ai/components/CircularProgress.md +75 -0
- fluent_blue-0.1.0/docs/ai/components/ClearableInput.md +75 -0
- fluent_blue-0.1.0/docs/ai/components/CodeEditor.md +78 -0
- fluent_blue-0.1.0/docs/ai/components/CollapsiblePanel.md +72 -0
- fluent_blue-0.1.0/docs/ai/components/ColorPicker.md +84 -0
- fluent_blue-0.1.0/docs/ai/components/Column.md +73 -0
- fluent_blue-0.1.0/docs/ai/components/ComboBox.md +70 -0
- fluent_blue-0.1.0/docs/ai/components/Command.md +45 -0
- fluent_blue-0.1.0/docs/ai/components/CommandPalette.md +77 -0
- fluent_blue-0.1.0/docs/ai/components/ConfirmDialog.md +89 -0
- fluent_blue-0.1.0/docs/ai/components/ConsoleWidget.md +72 -0
- fluent_blue-0.1.0/docs/ai/components/Container.md +61 -0
- fluent_blue-0.1.0/docs/ai/components/DangerButton.md +77 -0
- fluent_blue-0.1.0/docs/ai/components/DataTable.md +117 -0
- fluent_blue-0.1.0/docs/ai/components/DataTableModel.md +62 -0
- fluent_blue-0.1.0/docs/ai/components/DatePicker.md +85 -0
- fluent_blue-0.1.0/docs/ai/components/Divider.md +56 -0
- fluent_blue-0.1.0/docs/ai/components/Drawer.md +81 -0
- fluent_blue-0.1.0/docs/ai/components/DropdownMenu.md +85 -0
- fluent_blue-0.1.0/docs/ai/components/EmptyState.md +63 -0
- fluent_blue-0.1.0/docs/ai/components/FieldLabel.md +34 -0
- fluent_blue-0.1.0/docs/ai/components/FieldMessage.md +34 -0
- fluent_blue-0.1.0/docs/ai/components/FilePicker.md +71 -0
- fluent_blue-0.1.0/docs/ai/components/FileTree.md +71 -0
- fluent_blue-0.1.0/docs/ai/components/FloatingTooltip.md +40 -0
- fluent_blue-0.1.0/docs/ai/components/FluentWindow.md +65 -0
- fluent_blue-0.1.0/docs/ai/components/FormField.md +78 -0
- fluent_blue-0.1.0/docs/ai/components/GhostButton.md +76 -0
- fluent_blue-0.1.0/docs/ai/components/Grid.md +64 -0
- fluent_blue-0.1.0/docs/ai/components/IconButton.md +81 -0
- fluent_blue-0.1.0/docs/ai/components/ImageViewer.md +80 -0
- fluent_blue-0.1.0/docs/ai/components/Input.md +85 -0
- fluent_blue-0.1.0/docs/ai/components/InputGroup.md +60 -0
- fluent_blue-0.1.0/docs/ai/components/ListItem.md +74 -0
- fluent_blue-0.1.0/docs/ai/components/LoadingButton.md +86 -0
- fluent_blue-0.1.0/docs/ai/components/LoadingOverlay.md +72 -0
- fluent_blue-0.1.0/docs/ai/components/LogViewer.md +77 -0
- fluent_blue-0.1.0/docs/ai/components/Menu.md +74 -0
- fluent_blue-0.1.0/docs/ai/components/MenuItem.md +70 -0
- fluent_blue-0.1.0/docs/ai/components/MessageDialog.md +81 -0
- fluent_blue-0.1.0/docs/ai/components/Modal.md +78 -0
- fluent_blue-0.1.0/docs/ai/components/MultiSelect.md +70 -0
- fluent_blue-0.1.0/docs/ai/components/NavigationBar.md +65 -0
- fluent_blue-0.1.0/docs/ai/components/Notification.md +62 -0
- fluent_blue-0.1.0/docs/ai/components/NumberInput.md +85 -0
- fluent_blue-0.1.0/docs/ai/components/OtpInput.md +73 -0
- fluent_blue-0.1.0/docs/ai/components/OutlineButton.md +76 -0
- fluent_blue-0.1.0/docs/ai/components/Pagination.md +72 -0
- fluent_blue-0.1.0/docs/ai/components/Panel.md +62 -0
- fluent_blue-0.1.0/docs/ai/components/PasswordInput.md +79 -0
- fluent_blue-0.1.0/docs/ai/components/Popover.md +67 -0
- fluent_blue-0.1.0/docs/ai/components/PrimaryButton.md +77 -0
- fluent_blue-0.1.0/docs/ai/components/ProgressBar.md +74 -0
- fluent_blue-0.1.0/docs/ai/components/ProgressDialog.md +90 -0
- fluent_blue-0.1.0/docs/ai/components/RadioButton.md +58 -0
- fluent_blue-0.1.0/docs/ai/components/RadioGroup.md +68 -0
- fluent_blue-0.1.0/docs/ai/components/Result.md +64 -0
- fluent_blue-0.1.0/docs/ai/components/RichTextArea.md +34 -0
- fluent_blue-0.1.0/docs/ai/components/RichTextEditor.md +77 -0
- fluent_blue-0.1.0/docs/ai/components/ScrollArea.md +61 -0
- fluent_blue-0.1.0/docs/ai/components/SearchInput.md +77 -0
- fluent_blue-0.1.0/docs/ai/components/SecondaryButton.md +77 -0
- fluent_blue-0.1.0/docs/ai/components/SegmentedControl.md +66 -0
- fluent_blue-0.1.0/docs/ai/components/Select.md +74 -0
- fluent_blue-0.1.0/docs/ai/components/Sidebar.md +84 -0
- fluent_blue-0.1.0/docs/ai/components/SidebarItem.md +70 -0
- fluent_blue-0.1.0/docs/ai/components/Skeleton.md +58 -0
- fluent_blue-0.1.0/docs/ai/components/Slider.md +65 -0
- fluent_blue-0.1.0/docs/ai/components/Snackbar.md +59 -0
- fluent_blue-0.1.0/docs/ai/components/SpinBox.md +65 -0
- fluent_blue-0.1.0/docs/ai/components/SplitButton.md +75 -0
- fluent_blue-0.1.0/docs/ai/components/Splitter.md +63 -0
- fluent_blue-0.1.0/docs/ai/components/Stack.md +66 -0
- fluent_blue-0.1.0/docs/ai/components/StatisticCard.md +85 -0
- fluent_blue-0.1.0/docs/ai/components/Stepper.md +69 -0
- fluent_blue-0.1.0/docs/ai/components/Switch.md +62 -0
- fluent_blue-0.1.0/docs/ai/components/SyntaxHighlighter.md +46 -0
- fluent_blue-0.1.0/docs/ai/components/TabBar.md +56 -0
- fluent_blue-0.1.0/docs/ai/components/Tabs.md +63 -0
- fluent_blue-0.1.0/docs/ai/components/Tag.md +66 -0
- fluent_blue-0.1.0/docs/ai/components/TagInput.md +74 -0
- fluent_blue-0.1.0/docs/ai/components/Text.md +69 -0
- fluent_blue-0.1.0/docs/ai/components/TextArea.md +73 -0
- fluent_blue-0.1.0/docs/ai/components/TextButton.md +76 -0
- fluent_blue-0.1.0/docs/ai/components/TimePicker.md +84 -0
- fluent_blue-0.1.0/docs/ai/components/TimePopup.md +49 -0
- fluent_blue-0.1.0/docs/ai/components/Timeline.md +64 -0
- fluent_blue-0.1.0/docs/ai/components/TitleBar.md +66 -0
- fluent_blue-0.1.0/docs/ai/components/Toast.md +64 -0
- fluent_blue-0.1.0/docs/ai/components/ToastCard.md +56 -0
- fluent_blue-0.1.0/docs/ai/components/Tooltip.md +67 -0
- fluent_blue-0.1.0/docs/ai/components/TreeView.md +75 -0
- fluent_blue-0.1.0/docs/ai/components/Wizard.md +80 -0
- fluent_blue-0.1.0/docs/ai-agents.md +36 -0
- fluent_blue-0.1.0/docs/api-reference.md +38 -0
- fluent_blue-0.1.0/docs/assets/components/Alert.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/Avatar.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/AvatarGroup.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/Badge.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/BadgeOverlay.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/Breadcrumb.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/Button.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/Calendar.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/Card.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/Checkbox.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/CircularProgress.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/ClearableInput.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/CodeEditor.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/CollapsiblePanel.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/ColorPicker.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/Column.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/ComboBox.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/CommandPalette.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/ConfirmDialog.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/ConsoleWidget.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/Container.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/DangerButton.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/DataTable.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/DatePicker.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/Divider.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/Drawer.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/DropdownMenu.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/EmptyState.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/FilePicker.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/FileTree.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/FluentWindow.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/FormField.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/GhostButton.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/Grid.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/IconButton.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/ImageViewer.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/Input.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/InputGroup.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/ListItem.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/LoadingButton.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/LoadingOverlay.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/LogViewer.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/Menu.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/MenuItem.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/MessageDialog.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/Modal.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/MultiSelect.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/NavigationBar.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/Notification.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/NumberInput.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/OtpInput.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/OutlineButton.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/Pagination.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/Panel.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/PasswordInput.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/Popover.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/PrimaryButton.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/ProgressBar.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/ProgressDialog.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/RadioButton.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/RadioGroup.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/Result.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/RichTextEditor.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/ScrollArea.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/SearchInput.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/SecondaryButton.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/SegmentedControl.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/Select.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/Sidebar.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/SidebarItem.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/Skeleton.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/Slider.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/Snackbar.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/SpinBox.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/SplitButton.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/Splitter.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/Stack.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/StatisticCard.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/Stepper.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/Switch.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/TabBar.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/Tabs.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/Tag.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/TagInput.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/Text.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/TextArea.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/TextButton.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/TimePicker.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/Timeline.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/TitleBar.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/Toast.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/Tooltip.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/TreeView.png +0 -0
- fluent_blue-0.1.0/docs/assets/components/Wizard.png +0 -0
- fluent_blue-0.1.0/docs/assets/screenshots/colors-light.png +0 -0
- fluent_blue-0.1.0/docs/assets/screenshots/component-page-light.png +0 -0
- fluent_blue-0.1.0/docs/assets/screenshots/data-tables-light.png +0 -0
- fluent_blue-0.1.0/docs/assets/screenshots/feedback-overlays-light.png +0 -0
- fluent_blue-0.1.0/docs/assets/screenshots/overview-dark.png +0 -0
- fluent_blue-0.1.0/docs/assets/screenshots/overview-light.png +0 -0
- fluent_blue-0.1.0/docs/assets/screenshots/themes-light.png +0 -0
- fluent_blue-0.1.0/docs/changelog.md +1 -0
- fluent_blue-0.1.0/docs/components/advanced-components.md +500 -0
- fluent_blue-0.1.0/docs/components/buttons.md +376 -0
- fluent_blue-0.1.0/docs/components/data-display.md +641 -0
- fluent_blue-0.1.0/docs/components/data-tables.md +109 -0
- fluent_blue-0.1.0/docs/components/feedback.md +320 -0
- fluent_blue-0.1.0/docs/components/index.md +15 -0
- fluent_blue-0.1.0/docs/components/inputs.md +401 -0
- fluent_blue-0.1.0/docs/components/layout.md +364 -0
- fluent_blue-0.1.0/docs/components/navigation.md +385 -0
- fluent_blue-0.1.0/docs/components/selection.md +342 -0
- fluent_blue-0.1.0/docs/contributing.md +1 -0
- fluent_blue-0.1.0/docs/design-principles.md +35 -0
- fluent_blue-0.1.0/docs/examples.md +22 -0
- fluent_blue-0.1.0/docs/faq.md +31 -0
- fluent_blue-0.1.0/docs/getting-started.md +119 -0
- fluent_blue-0.1.0/docs/index.md +38 -0
- fluent_blue-0.1.0/docs/installation.md +64 -0
- fluent_blue-0.1.0/docs/migration.md +24 -0
- fluent_blue-0.1.0/docs/theming.md +101 -0
- fluent_blue-0.1.0/docs/tokens.md +85 -0
- fluent_blue-0.1.0/docs/troubleshooting.md +49 -0
- fluent_blue-0.1.0/examples/advanced_components.py +79 -0
- fluent_blue-0.1.0/examples/basic_app.py +36 -0
- fluent_blue-0.1.0/examples/dashboard.py +76 -0
- fluent_blue-0.1.0/examples/data_table.py +63 -0
- fluent_blue-0.1.0/examples/forms.py +69 -0
- fluent_blue-0.1.0/examples/projects_app.py +122 -0
- fluent_blue-0.1.0/fluent_blue/__init__.py +27 -0
- fluent_blue-0.1.0/fluent_blue/agent_prompts.py +197 -0
- fluent_blue-0.1.0/fluent_blue/compatibility/__init__.py +4 -0
- fluent_blue-0.1.0/fluent_blue/compatibility/qt.py +108 -0
- fluent_blue-0.1.0/fluent_blue/components/__init__.py +10 -0
- fluent_blue-0.1.0/fluent_blue/components/advanced/__init__.py +10 -0
- fluent_blue-0.1.0/fluent_blue/components/advanced/datetime_pickers.py +380 -0
- fluent_blue-0.1.0/fluent_blue/components/advanced/editors.py +557 -0
- fluent_blue-0.1.0/fluent_blue/components/advanced/pickers.py +344 -0
- fluent_blue-0.1.0/fluent_blue/components/advanced/structure.py +534 -0
- fluent_blue-0.1.0/fluent_blue/components/base.py +124 -0
- fluent_blue-0.1.0/fluent_blue/components/buttons/__init__.py +18 -0
- fluent_blue-0.1.0/fluent_blue/components/buttons/button.py +230 -0
- fluent_blue-0.1.0/fluent_blue/components/buttons/split_button.py +50 -0
- fluent_blue-0.1.0/fluent_blue/components/data/__init__.py +5 -0
- fluent_blue-0.1.0/fluent_blue/components/data/model.py +232 -0
- fluent_blue-0.1.0/fluent_blue/components/data/table.py +473 -0
- fluent_blue-0.1.0/fluent_blue/components/display/__init__.py +12 -0
- fluent_blue-0.1.0/fluent_blue/components/display/card.py +192 -0
- fluent_blue-0.1.0/fluent_blue/components/display/console.py +139 -0
- fluent_blue-0.1.0/fluent_blue/components/display/content.py +387 -0
- fluent_blue-0.1.0/fluent_blue/components/display/media.py +379 -0
- fluent_blue-0.1.0/fluent_blue/components/display/text.py +215 -0
- fluent_blue-0.1.0/fluent_blue/components/feedback/__init__.py +17 -0
- fluent_blue-0.1.0/fluent_blue/components/feedback/feedback.py +566 -0
- fluent_blue-0.1.0/fluent_blue/components/inputs/__init__.py +9 -0
- fluent_blue-0.1.0/fluent_blue/components/inputs/form.py +125 -0
- fluent_blue-0.1.0/fluent_blue/components/inputs/input.py +287 -0
- fluent_blue-0.1.0/fluent_blue/components/inputs/tags_otp.py +286 -0
- fluent_blue-0.1.0/fluent_blue/components/layout/__init__.py +9 -0
- fluent_blue-0.1.0/fluent_blue/components/layout/containers.py +318 -0
- fluent_blue-0.1.0/fluent_blue/components/layout/overlays.py +247 -0
- fluent_blue-0.1.0/fluent_blue/components/layout/window.py +159 -0
- fluent_blue-0.1.0/fluent_blue/components/navigation/__init__.py +10 -0
- fluent_blue-0.1.0/fluent_blue/components/navigation/command_palette.py +185 -0
- fluent_blue-0.1.0/fluent_blue/components/navigation/menu.py +118 -0
- fluent_blue-0.1.0/fluent_blue/components/navigation/sidebar.py +243 -0
- fluent_blue-0.1.0/fluent_blue/components/navigation/wayfinding.py +252 -0
- fluent_blue-0.1.0/fluent_blue/components/popup.py +61 -0
- fluent_blue-0.1.0/fluent_blue/components/selection/__init__.py +8 -0
- fluent_blue-0.1.0/fluent_blue/components/selection/choice.py +242 -0
- fluent_blue-0.1.0/fluent_blue/components/selection/controls.py +317 -0
- fluent_blue-0.1.0/fluent_blue/core/__init__.py +6 -0
- fluent_blue-0.1.0/fluent_blue/core/animations.py +51 -0
- fluent_blue-0.1.0/fluent_blue/core/configuration.py +25 -0
- fluent_blue-0.1.0/fluent_blue/core/palette.py +315 -0
- fluent_blue-0.1.0/fluent_blue/core/theme_manager.py +273 -0
- fluent_blue-0.1.0/fluent_blue/core/tokens.py +175 -0
- fluent_blue-0.1.0/fluent_blue/core/typography.py +57 -0
- fluent_blue-0.1.0/fluent_blue/icons/__init__.py +8 -0
- fluent_blue-0.1.0/fluent_blue/icons/engine.py +137 -0
- fluent_blue-0.1.0/fluent_blue/icons/library.py +147 -0
- fluent_blue-0.1.0/fluent_blue/resources/fonts/Inter-Bold.ttf +0 -0
- fluent_blue-0.1.0/fluent_blue/resources/fonts/Inter-Medium.ttf +0 -0
- fluent_blue-0.1.0/fluent_blue/resources/fonts/Inter-Regular.ttf +0 -0
- fluent_blue-0.1.0/fluent_blue/resources/fonts/Inter-SemiBold.ttf +0 -0
- fluent_blue-0.1.0/fluent_blue/studio/CHANGELOG.md +23 -0
- fluent_blue-0.1.0/fluent_blue/studio/__init__.py +1 -0
- fluent_blue-0.1.0/fluent_blue/studio/app.py +324 -0
- fluent_blue-0.1.0/fluent_blue/studio/art.py +164 -0
- fluent_blue-0.1.0/fluent_blue/studio/catalog/__init__.py +46 -0
- fluent_blue-0.1.0/fluent_blue/studio/catalog/added.py +49 -0
- fluent_blue-0.1.0/fluent_blue/studio/catalog/advanced.py +120 -0
- fluent_blue-0.1.0/fluent_blue/studio/catalog/buttons.py +88 -0
- fluent_blue-0.1.0/fluent_blue/studio/catalog/data_tables.py +43 -0
- fluent_blue-0.1.0/fluent_blue/studio/catalog/display.py +132 -0
- fluent_blue-0.1.0/fluent_blue/studio/catalog/feedback.py +100 -0
- fluent_blue-0.1.0/fluent_blue/studio/catalog/inputs.py +63 -0
- fluent_blue-0.1.0/fluent_blue/studio/catalog/layout.py +82 -0
- fluent_blue-0.1.0/fluent_blue/studio/catalog/navigation.py +105 -0
- fluent_blue-0.1.0/fluent_blue/studio/catalog/selection.py +65 -0
- fluent_blue-0.1.0/fluent_blue/studio/introspect.py +156 -0
- fluent_blue-0.1.0/fluent_blue/studio/pages/__init__.py +1 -0
- fluent_blue-0.1.0/fluent_blue/studio/pages/components.py +217 -0
- fluent_blue-0.1.0/fluent_blue/studio/pages/foundations.py +316 -0
- fluent_blue-0.1.0/fluent_blue/studio/pages/overview.py +669 -0
- fluent_blue-0.1.0/fluent_blue/studio/pages/tools.py +191 -0
- fluent_blue-0.1.0/fluent_blue/themes/__init__.py +4 -0
- fluent_blue-0.1.0/fluent_blue/themes/stylesheet/__init__.py +11 -0
- fluent_blue-0.1.0/fluent_blue/themes/stylesheet/base.py +85 -0
- fluent_blue-0.1.0/fluent_blue/themes/stylesheet/buttons.py +56 -0
- fluent_blue-0.1.0/fluent_blue/themes/stylesheet/context.py +55 -0
- fluent_blue-0.1.0/fluent_blue/themes/stylesheet/data.py +20 -0
- fluent_blue-0.1.0/fluent_blue/themes/stylesheet/display.py +82 -0
- fluent_blue-0.1.0/fluent_blue/themes/stylesheet/feedback.py +30 -0
- fluent_blue-0.1.0/fluent_blue/themes/stylesheet/inputs.py +85 -0
- fluent_blue-0.1.0/fluent_blue/themes/stylesheet/navigation.py +51 -0
- fluent_blue-0.1.0/fluent_blue/themes/stylesheet/selection.py +56 -0
- fluent_blue-0.1.0/fluent_blue/themes/stylesheet/studio.py +26 -0
- fluent_blue-0.1.0/fluent_blue/utilities/__init__.py +0 -0
- fluent_blue-0.1.0/llms.txt +109 -0
- fluent_blue-0.1.0/mkdocs.yml +78 -0
- fluent_blue-0.1.0/pyproject.toml +103 -0
- fluent_blue-0.1.0/scripts/generate_docs.py +131 -0
- fluent_blue-0.1.0/scripts/perf_report.py +70 -0
- fluent_blue-0.1.0/scripts/ui_audit.py +223 -0
- fluent_blue-0.1.0/tests/conftest.py +8 -0
- fluent_blue-0.1.0/tests/test_agent_prompts.py +81 -0
- fluent_blue-0.1.0/tests/test_contrast.py +35 -0
- fluent_blue-0.1.0/tests/test_examples_and_repo.py +61 -0
- fluent_blue-0.1.0/tests/test_interactions.py +179 -0
- fluent_blue-0.1.0/tests/test_overlays_visible.py +106 -0
- fluent_blue-0.1.0/tests/test_overview_layout.py +78 -0
- fluent_blue-0.1.0/tests/test_text_clipping.py +44 -0
- fluent_blue-0.1.0/tests/test_theme_lifecycle.py +54 -0
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# Byte-compiled / optimized / DLL files
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
|
|
6
|
+
# C extensions
|
|
7
|
+
*.so
|
|
8
|
+
|
|
9
|
+
# Distribution / packaging
|
|
10
|
+
.Python
|
|
11
|
+
build/
|
|
12
|
+
develop-eggs/
|
|
13
|
+
dist/
|
|
14
|
+
downloads/
|
|
15
|
+
eggs/
|
|
16
|
+
.eggs/
|
|
17
|
+
lib/
|
|
18
|
+
lib64/
|
|
19
|
+
parts/
|
|
20
|
+
sdist/
|
|
21
|
+
var/
|
|
22
|
+
wheels/
|
|
23
|
+
share/python-wheels/
|
|
24
|
+
*.egg-info/
|
|
25
|
+
.installed.cfg
|
|
26
|
+
*.egg
|
|
27
|
+
MANIFEST
|
|
28
|
+
|
|
29
|
+
# Virtual Environments
|
|
30
|
+
.venv/
|
|
31
|
+
.venv*/
|
|
32
|
+
venv/
|
|
33
|
+
venv*/
|
|
34
|
+
ENV/
|
|
35
|
+
env/
|
|
36
|
+
env*/
|
|
37
|
+
|
|
38
|
+
# IDEs & Editors
|
|
39
|
+
.vscode/
|
|
40
|
+
.idea/
|
|
41
|
+
*.swp
|
|
42
|
+
*.swo
|
|
43
|
+
*~
|
|
44
|
+
.DS_Store
|
|
45
|
+
.AppleDouble
|
|
46
|
+
.LSOverride
|
|
47
|
+
._*
|
|
48
|
+
|
|
49
|
+
# PyQt / PySide specific
|
|
50
|
+
*.pyc
|
|
51
|
+
*.qrc.py
|
|
52
|
+
*_rc.py
|
|
53
|
+
ui_*.py
|
|
54
|
+
!scripts/ui_audit.py
|
|
55
|
+
|
|
56
|
+
# Testing & Coverage
|
|
57
|
+
.tox/
|
|
58
|
+
.nox/
|
|
59
|
+
.coverage
|
|
60
|
+
.coverage.*
|
|
61
|
+
.cache
|
|
62
|
+
nosetests.xml
|
|
63
|
+
coverage.xml
|
|
64
|
+
*.cover
|
|
65
|
+
*.py,cover
|
|
66
|
+
.hypothesis/
|
|
67
|
+
.pytest_cache/
|
|
68
|
+
cover/
|
|
69
|
+
|
|
70
|
+
# Linters & Formatters
|
|
71
|
+
.ruff_cache/
|
|
72
|
+
.mypy_cache/
|
|
73
|
+
.dmypy.json
|
|
74
|
+
dmypy.json
|
|
75
|
+
|
|
76
|
+
# Environment variables & local secrets
|
|
77
|
+
.env
|
|
78
|
+
.env.local
|
|
79
|
+
.env.*.local
|
|
80
|
+
|
|
81
|
+
# Logs
|
|
82
|
+
*.log
|
|
83
|
+
logs/
|
|
84
|
+
prompt.md
|
|
85
|
+
|
|
86
|
+
site/
|
|
87
|
+
.scratch/
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
# Fluent Blue: guide for AI coding agents
|
|
2
|
+
|
|
3
|
+
Fluent Blue is a design system for Python desktop applications on PyQt6 and PySide6.
|
|
4
|
+
|
|
5
|
+
## Rules
|
|
6
|
+
|
|
7
|
+
- Import components from `fluent_blue`, and Qt names from `fluent_blue.compatibility.qt`. Never import `PyQt6` or `PySide6` directly in library code, and never load both in one process.
|
|
8
|
+
- Style through props and design tokens. Do not call `setStyleSheet` on components, and do not hardcode colors, spacing, radii or fonts.
|
|
9
|
+
- Read theme values with `ThemeManager.color("role")`, `.qcolor("role")`, `.spacing(step)`, `.radius("md")` and `.font("role")`. For custom painting, read them inside `paintEvent`.
|
|
10
|
+
- Subclass with `ThemedMixin`, call `self.bind_theme()`, and rebuild cached pixmaps in `refresh_theme()`, so that runtime theme switches work.
|
|
11
|
+
- Never connect a lambda or closure that captures a widget to `ThemeManager` signals: it outlives the widget, and PyQt aborts when it fires. Use `ThemedMixin` or a bound method.
|
|
12
|
+
- Keep theme switches fast: do not rebuild child widgets in `refresh_theme()`, and free one-shot menus and dialogs with `WA_DeleteOnClose` or `finished.connect(dialog.deleteLater)`.
|
|
13
|
+
- Use icon names from `icon_names()`, or add one with `register_icon`. Icon-only controls need a `tooltip`, which also becomes the accessible name.
|
|
14
|
+
- Text needs at least 4.5:1 contrast. Keep keyboard access and visible focus.
|
|
15
|
+
- Fluent Blue signals and methods use `snake_case`. Inherited Qt API stays `camelCase`.
|
|
16
|
+
- Verify your change on both bindings: `FLUENT_BLUE_QT_BINDING=PyQt6 pytest` and `FLUENT_BLUE_QT_BINDING=PySide6 pytest`, then `python scripts/ui_audit.py`. Never report a result you did not run.
|
|
17
|
+
|
|
18
|
+
## Quick start
|
|
19
|
+
|
|
20
|
+
```python
|
|
21
|
+
from fluent_blue import Button, Card, ThemeManager
|
|
22
|
+
from fluent_blue.compatibility.qt import QApplication, QVBoxLayout
|
|
23
|
+
|
|
24
|
+
app = QApplication([])
|
|
25
|
+
ThemeManager.set_theme("light")
|
|
26
|
+
card = Card()
|
|
27
|
+
layout = QVBoxLayout(card)
|
|
28
|
+
layout.addWidget(Button("Get Started", variant="primary"))
|
|
29
|
+
card.show()
|
|
30
|
+
app.exec()
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Component briefs
|
|
34
|
+
|
|
35
|
+
Read the brief for a component before you use or change it. Print one with `python -m fluent_blue.agent_prompts <Name>`.
|
|
36
|
+
|
|
37
|
+
### Buttons
|
|
38
|
+
|
|
39
|
+
- [`Button`](docs/ai/components/Button.md): A push button with variants, sizes, icons and a loading state.
|
|
40
|
+
- [`DangerButton`](docs/ai/components/DangerButton.md): A destructive action, such as deleting data.
|
|
41
|
+
- [`GhostButton`](docs/ai/components/GhostButton.md): A low-emphasis action for toolbars and dense layouts.
|
|
42
|
+
- [`IconButton`](docs/ai/components/IconButton.md): A square icon-only button.
|
|
43
|
+
- [`LoadingButton`](docs/ai/components/LoadingButton.md): A primary button with start() and stop() shortcuts for async work.
|
|
44
|
+
- [`OutlineButton`](docs/ai/components/OutlineButton.md): A brand-tinted action with less weight than PrimaryButton.
|
|
45
|
+
- [`PrimaryButton`](docs/ai/components/PrimaryButton.md): The single most important action in a view.
|
|
46
|
+
- [`SecondaryButton`](docs/ai/components/SecondaryButton.md): A standard action. This is the default look of Button.
|
|
47
|
+
- [`SplitButton`](docs/ai/components/SplitButton.md): Primary action on the left, a menu of related actions on the right.
|
|
48
|
+
- [`TextButton`](docs/ai/components/TextButton.md): A link-like action, typically inline with content.
|
|
49
|
+
|
|
50
|
+
### Inputs
|
|
51
|
+
|
|
52
|
+
- [`ClearableInput`](docs/ai/components/ClearableInput.md): An Input with the clear button on by default.
|
|
53
|
+
- [`FormField`](docs/ai/components/FormField.md): Label, control, helper text and error message as one unit.
|
|
54
|
+
- [`Input`](docs/ai/components/Input.md): A text input with icons, a clear button and validation state.
|
|
55
|
+
- [`InputGroup`](docs/ai/components/InputGroup.md): Joins an input with text or widget addons inside a single border.
|
|
56
|
+
- [`NumberInput`](docs/ai/components/NumberInput.md): A numeric input with bounds, steppers and arrow key support.
|
|
57
|
+
- [`OtpInput`](docs/ai/components/OtpInput.md): A multi-slot numeric OTP / 2FA code entry widget with auto-focus and paste support.
|
|
58
|
+
- [`PasswordInput`](docs/ai/components/PasswordInput.md): A masked input with a visibility toggle.
|
|
59
|
+
- [`SearchInput`](docs/ai/components/SearchInput.md): A clearable search field that debounces typing.
|
|
60
|
+
- [`TagInput`](docs/ai/components/TagInput.md): An input field that converts typed text into removable tags on Enter or comma.
|
|
61
|
+
- [`TextArea`](docs/ai/components/TextArea.md): A multi-line plain text input.
|
|
62
|
+
|
|
63
|
+
### Selection
|
|
64
|
+
|
|
65
|
+
- [`Checkbox`](docs/ai/components/Checkbox.md): A checkbox, with optional indeterminate state.
|
|
66
|
+
- [`ComboBox`](docs/ai/components/ComboBox.md): An editable Select with type-ahead; free text is allowed.
|
|
67
|
+
- [`MultiSelect`](docs/ai/components/MultiSelect.md): Choose any number of values from a checkable popup list.
|
|
68
|
+
- [`RadioButton`](docs/ai/components/RadioButton.md): A radio button. Use RadioGroup for the common case.
|
|
69
|
+
- [`RadioGroup`](docs/ai/components/RadioGroup.md): A set of mutually exclusive radio buttons.
|
|
70
|
+
- [`SegmentedControl`](docs/ai/components/SegmentedControl.md): A compact, mutually exclusive option strip.
|
|
71
|
+
- [`Select`](docs/ai/components/Select.md): Choose one value from a list.
|
|
72
|
+
- [`Slider`](docs/ai/components/Slider.md): A value slider.
|
|
73
|
+
- [`SpinBox`](docs/ai/components/SpinBox.md): An integer input with stepper buttons.
|
|
74
|
+
- [`Switch`](docs/ai/components/Switch.md): An animated on/off toggle.
|
|
75
|
+
|
|
76
|
+
### Navigation
|
|
77
|
+
|
|
78
|
+
- [`Breadcrumb`](docs/ai/components/Breadcrumb.md): A trail of links to parent locations; the last entry is the current page.
|
|
79
|
+
- [`CommandPalette`](docs/ai/components/CommandPalette.md): A searchable command launcher.
|
|
80
|
+
- [`DropdownMenu`](docs/ai/components/DropdownMenu.md): A button that opens a Menu.
|
|
81
|
+
- [`Menu`](docs/ai/components/Menu.md): A popup menu.
|
|
82
|
+
- [`MenuItem`](docs/ai/components/MenuItem.md): A menu entry.
|
|
83
|
+
- [`NavigationBar`](docs/ai/components/NavigationBar.md): A horizontal application bar with title, start, center and end regions.
|
|
84
|
+
- [`Pagination`](docs/ai/components/Pagination.md): Page navigation with ellipsis and optional range text.
|
|
85
|
+
- [`Sidebar`](docs/ai/components/Sidebar.md): A vertical, sectioned, collapsible navigation rail.
|
|
86
|
+
- [`SidebarItem`](docs/ai/components/SidebarItem.md): One navigation entry.
|
|
87
|
+
- [`TabBar`](docs/ai/components/TabBar.md): A standalone tab strip with an underline indicator.
|
|
88
|
+
- [`Tabs`](docs/ai/components/Tabs.md): Tabbed pages built on QTabWidget, using TabBar.
|
|
89
|
+
|
|
90
|
+
### Data Display
|
|
91
|
+
|
|
92
|
+
- [`Avatar`](docs/ai/components/Avatar.md): A user image or initials.
|
|
93
|
+
- [`AvatarGroup`](docs/ai/components/AvatarGroup.md): Overlapping avatars with a "+N" overflow.
|
|
94
|
+
- [`Badge`](docs/ai/components/Badge.md): A small status label or dot.
|
|
95
|
+
- [`BadgeOverlay`](docs/ai/components/BadgeOverlay.md): Wraps any child widget and pins a Badge to its top-right corner.
|
|
96
|
+
- [`Card`](docs/ai/components/Card.md): A content container.
|
|
97
|
+
- [`CircularProgress`](docs/ai/components/CircularProgress.md): A circular progress indicator, which also serves as a spinner.
|
|
98
|
+
- [`ConsoleWidget`](docs/ai/components/ConsoleWidget.md): A high-performance rich console / terminal widget for desktop tools and logging.
|
|
99
|
+
- [`Divider`](docs/ai/components/Divider.md): A separator line, optionally with centered text.
|
|
100
|
+
- [`EmptyState`](docs/ai/components/EmptyState.md): Explains why a view is empty and what to do next.
|
|
101
|
+
- [`ListItem`](docs/ai/components/ListItem.md): One row of a list.
|
|
102
|
+
- [`Popover`](docs/ai/components/Popover.md): A floating panel anchored to a widget. It closes on outside click or Escape.
|
|
103
|
+
- [`ProgressBar`](docs/ai/components/ProgressBar.md): A horizontal progress bar.
|
|
104
|
+
- [`Result`](docs/ai/components/Result.md): The outcome of an operation.
|
|
105
|
+
- [`Skeleton`](docs/ai/components/Skeleton.md): A placeholder with a soft shimmer while content loads. The timer stops while hidden.
|
|
106
|
+
- [`StatisticCard`](docs/ai/components/StatisticCard.md): A headline metric with trend.
|
|
107
|
+
- [`Tag`](docs/ai/components/Tag.md): A compact label for categories, optionally closable.
|
|
108
|
+
- [`Text`](docs/ai/components/Text.md): A label bound to a typography role and a text color role.
|
|
109
|
+
- [`Timeline`](docs/ai/components/Timeline.md): A vertical sequence of events.
|
|
110
|
+
- [`Tooltip`](docs/ai/components/Tooltip.md): Attach a rich, delayed tooltip to a widget. It also appears on keyboard focus.
|
|
111
|
+
|
|
112
|
+
### Data Tables
|
|
113
|
+
|
|
114
|
+
- [`Column`](docs/ai/components/Column.md): Describes one table column.
|
|
115
|
+
- [`DataTable`](docs/ai/components/DataTable.md): A table with sorting, filtering, paging, selection, column control and export.
|
|
116
|
+
|
|
117
|
+
### Feedback
|
|
118
|
+
|
|
119
|
+
- [`Alert`](docs/ai/components/Alert.md): An inline message in the page flow.
|
|
120
|
+
- [`ConfirmDialog`](docs/ai/components/ConfirmDialog.md): Ask the user to confirm an action.
|
|
121
|
+
- [`LoadingOverlay`](docs/ai/components/LoadingOverlay.md): Blocks a widget and shows a spinner while it is busy.
|
|
122
|
+
- [`MessageDialog`](docs/ai/components/MessageDialog.md): A modal with a status icon, a message and buttons.
|
|
123
|
+
- [`Notification`](docs/ai/components/Notification.md): A richer message with a title and an action, which stays until dismissed by default.
|
|
124
|
+
- [`ProgressDialog`](docs/ai/components/ProgressDialog.md): A modal that reports the progress of a long operation.
|
|
125
|
+
- [`Snackbar`](docs/ai/components/Snackbar.md): A single-line message at the bottom center, often offering an undo.
|
|
126
|
+
- [`Toast`](docs/ai/components/Toast.md): A brief, auto-dismissing message in the window's top right corner.
|
|
127
|
+
|
|
128
|
+
### Layout
|
|
129
|
+
|
|
130
|
+
- [`CollapsiblePanel`](docs/ai/components/CollapsiblePanel.md): A panel whose content expands and collapses.
|
|
131
|
+
- [`Container`](docs/ai/components/Container.md): Centers content and limits its width, keeping long lines readable on wide screens.
|
|
132
|
+
- [`Drawer`](docs/ai/components/Drawer.md): A panel that slides in from the edge of a window.
|
|
133
|
+
- [`FluentWindow`](docs/ai/components/FluentWindow.md): A frameless base window styled with Fluent Blue design language.
|
|
134
|
+
- [`Grid`](docs/ai/components/Grid.md): A grid with a fixed column count, or responsive columns from a minimum width.
|
|
135
|
+
- [`Modal`](docs/ai/components/Modal.md): A themed modal dialog over a dimmed parent window.
|
|
136
|
+
- [`Panel`](docs/ai/components/Panel.md): A titled section with a header action area.
|
|
137
|
+
- [`ScrollArea`](docs/ai/components/ScrollArea.md): A frameless scroll area with themed scrollbars and a resizable content widget.
|
|
138
|
+
- [`Splitter`](docs/ai/components/Splitter.md): A resizable split view.
|
|
139
|
+
- [`Stack`](docs/ai/components/Stack.md): Arranges children in a row or column with token spacing.
|
|
140
|
+
- [`TitleBar`](docs/ai/components/TitleBar.md): Custom titlebar with native-like window management buttons, draggable area, and branding.
|
|
141
|
+
|
|
142
|
+
### Advanced Components
|
|
143
|
+
|
|
144
|
+
- [`Calendar`](docs/ai/components/Calendar.md): A month view. Arrow keys move, Enter selects and Page Up/Down change the month.
|
|
145
|
+
- [`CodeEditor`](docs/ai/components/CodeEditor.md): A code editor with line numbers, syntax colors and smart indentation.
|
|
146
|
+
- [`ColorPicker`](docs/ai/components/ColorPicker.md): A swatch button that opens a saturation/value square, hue bar, hex field and presets.
|
|
147
|
+
- [`DatePicker`](docs/ai/components/DatePicker.md): A date field with a popup calendar.
|
|
148
|
+
- [`FilePicker`](docs/ai/components/FilePicker.md): A path field with a browse button and drag and drop.
|
|
149
|
+
- [`FileTree`](docs/ai/components/FileTree.md): A lazily loaded file system tree, using QFileSystemModel.
|
|
150
|
+
- [`ImageViewer`](docs/ai/components/ImageViewer.md): An image viewer with zoom, pan, rotate and fit.
|
|
151
|
+
- [`LogViewer`](docs/ai/components/LogViewer.md): A live log view with level filtering, search and tailing.
|
|
152
|
+
- [`RichTextEditor`](docs/ai/components/RichTextEditor.md): A rich text editor with a formatting toolbar.
|
|
153
|
+
- [`Stepper`](docs/ai/components/Stepper.md): Shows progress through ordered steps. Arrow keys move when clickable.
|
|
154
|
+
- [`TimePicker`](docs/ai/components/TimePicker.md): A time field with hour and minute columns.
|
|
155
|
+
- [`TreeView`](docs/ai/components/TreeView.md): A tree from nested dicts, with built-in filtering.
|
|
156
|
+
- [`Wizard`](docs/ai/components/Wizard.md): A multi-step flow with a stepper, validation and navigation.
|
|
157
|
+
|
|
158
|
+
### Uncatalogued
|
|
159
|
+
|
|
160
|
+
- [`Command`](docs/ai/components/Command.md): An entry in the palette. action runs when the command is chosen.
|
|
161
|
+
- [`DataTableModel`](docs/ai/components/DataTableModel.md): Serves rows after filter, sort and page.
|
|
162
|
+
- [`FieldLabel`](docs/ai/components/FieldLabel.md): The label of a FormField.
|
|
163
|
+
- [`FieldMessage`](docs/ai/components/FieldMessage.md): Helper or validation text under a field.
|
|
164
|
+
- [`FloatingTooltip`](docs/ai/components/FloatingTooltip.md): The window drawn by Tooltip.
|
|
165
|
+
- [`RichTextArea`](docs/ai/components/RichTextArea.md): The editing surface of RichTextEditor.
|
|
166
|
+
- [`SyntaxHighlighter`](docs/ai/components/SyntaxHighlighter.md): Regex-based highlighter whose colors come from theme roles.
|
|
167
|
+
- [`TimePopup`](docs/ai/components/TimePopup.md): Hour and minute columns used by TimePicker.
|
|
168
|
+
- [`ToastCard`](docs/ai/components/ToastCard.md): The card behind Toast, Notification and Snackbar.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes are documented here. The project follows [Semantic Versioning](https://semver.org/); until 1.0, breaking changes bump the minor version.
|
|
4
|
+
|
|
5
|
+
## 0.1.0 - 2026-11-04
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- Design tokens for color, typography, spacing, radius, elevation and motion, with per-theme overrides.
|
|
10
|
+
- Runtime theme engine with light, dark and high-contrast themes, `system` following, and custom theme registration that derives a full ramp from one primary color.
|
|
11
|
+
- An original set of 131 SVG icons with theme-aware rendering, caching and icon registration.
|
|
12
|
+
- 103 components: buttons, inputs, selection, navigation, data display, a model/view `DataTable`, feedback, layout and advanced widgets (`DatePicker`, `Calendar`, `TimePicker`, `ColorPicker`, `FilePicker`, `ImageViewer`, `CodeEditor`, `LogViewer`, `TreeView`, `FileTree`, `Stepper`, `Wizard`, `RichTextEditor`).
|
|
13
|
+
- Fluent Blue Design Studio: an interactive showcase with live previews, generated Properties and Signals tabs, copyable code, an AI Prompt tab, a Themes page with a custom theme builder and a Playground.
|
|
14
|
+
- Briefs for AI coding agents (`AGENTS.md`, `llms.txt`, `docs/ai/components/`), generated from the source and checked by tests.
|
|
15
|
+
- Support for PyQt6 and PySide6 from one code base, tested on both.
|
|
16
|
+
- A UI audit (`scripts/ui_audit.py`) that measures clipped text, overlaps and rendered contrast on every Studio page, and a performance report (`scripts/perf_report.py`).
|
|
17
|
+
- Six runnable examples, documentation built with MkDocs Material, and CI for Linux, Windows and macOS.
|
|
18
|
+
|
|
19
|
+
### Performance
|
|
20
|
+
|
|
21
|
+
- Theme switching restyles the application in one pass and takes about 80 ms with the Studio open; it previously took more than three seconds with every page built.
|
|
22
|
+
- Icons, fonts and parsed colors are cached; hidden widgets refresh lazily when shown.
|
|
23
|
+
- Design Studio builds component pages progressively and frees hidden pages before a theme switch.
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Contributing to Fluent Blue
|
|
2
|
+
|
|
3
|
+
Thank you for helping. This guide explains how the project is organised, what a change needs before it is merged, and how to add a component.
|
|
4
|
+
|
|
5
|
+
## Set up
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
git clone https://github.com/danieldev23/fluent-blue
|
|
9
|
+
cd fluent-blue
|
|
10
|
+
python -m venv .venv-pyqt && .venv-pyqt/bin/pip install -e ".[dev,pyqt6]"
|
|
11
|
+
python -m venv .venv-pyside && .venv-pyside/bin/pip install -e ".[dev,pyside6]"
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
Two environments, because the library must work on both bindings and they cannot share a process.
|
|
15
|
+
|
|
16
|
+
## Before you open a pull request
|
|
17
|
+
|
|
18
|
+
Run all of these. CI runs them too, but it is faster to find problems locally.
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
ruff check .
|
|
22
|
+
.venv-pyqt/bin/pytest
|
|
23
|
+
.venv-pyside/bin/pytest
|
|
24
|
+
QT_QPA_PLATFORM=offscreen .venv-pyqt/bin/python scripts/ui_audit.py --deep
|
|
25
|
+
.venv-pyqt/bin/python -m fluent_blue.agent_prompts --export .
|
|
26
|
+
.venv-pyqt/bin/python scripts/generate_docs.py --markdown-only
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
The last two regenerate files that tests compare against the source. Commit their output.
|
|
30
|
+
|
|
31
|
+
Do not report a result you did not run. If something cannot be verified on your machine, say so in the pull request.
|
|
32
|
+
|
|
33
|
+
## Rules of the code base
|
|
34
|
+
|
|
35
|
+
- Import Qt from `fluent_blue.compatibility.qt`, never from `PyQt6` or `PySide6` directly.
|
|
36
|
+
- Components read design tokens; they never hardcode colors, spacing, radii or fonts, and never call `setStyleSheet`.
|
|
37
|
+
- Styling lives in `fluent_blue/themes/stylesheet/`, keyed by class name and dynamic properties such as `variant`.
|
|
38
|
+
- Custom-painted widgets read `ThemeManager` colors inside `paintEvent`. Cached assets are rebuilt in `refresh_theme()` of a `ThemedMixin` subclass.
|
|
39
|
+
- Never connect a lambda that captures a widget to a `ThemeManager` signal. The connection outlives the widget and aborts the process when it fires.
|
|
40
|
+
- Fluent Blue methods and signals are `snake_case`; inherited Qt API stays `camelCase`.
|
|
41
|
+
- Text must reach 4.5:1 contrast in every built-in theme. `tests/test_contrast.py` checks the token pairs; the UI audit checks rendered pixels.
|
|
42
|
+
- One-shot menus and dialogs free themselves (`WA_DeleteOnClose`, or `finished.connect(dialog.deleteLater)`), so long sessions do not slow down.
|
|
43
|
+
|
|
44
|
+
## Adding a component
|
|
45
|
+
|
|
46
|
+
1. Implement it in the matching `fluent_blue/components/<group>/` module with a docstring that has `Args:` and `Signals:` sections. The documentation, Design Studio and AI briefs are generated from these.
|
|
47
|
+
2. Export it from the group's `__init__.py`.
|
|
48
|
+
3. Add stylesheet rules to `fluent_blue/themes/stylesheet/<group>.py`.
|
|
49
|
+
4. Add a catalog entry in `fluent_blue/studio/catalog/<group>.py`: a runnable snippet that assigns a widget to `demo`, plus one or two usage tips. The snippet is executed by the tests on both bindings and in every theme, shown live in Design Studio, printed in the docs and embedded in the AI brief.
|
|
50
|
+
5. Write tests for behaviour and signals in `tests/`.
|
|
51
|
+
6. Run the checks above and regenerate briefs and docs.
|
|
52
|
+
|
|
53
|
+
## Commit messages
|
|
54
|
+
|
|
55
|
+
Use the imperative mood and explain why, not just what. Reference issues where they exist.
|
|
56
|
+
|
|
57
|
+
## Reporting bugs
|
|
58
|
+
|
|
59
|
+
Open an issue with the binding and versions (`python -c "import fluent_blue as f; print(f.BINDING, f.BINDING_VERSION, f.QT_VERSION)"`), the operating system, a minimal snippet, and what you expected. A screenshot helps for visual problems.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Fluent Blue contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|