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.
Files changed (346) hide show
  1. fluent_blue-0.1.0/.gitignore +87 -0
  2. fluent_blue-0.1.0/AGENTS.md +168 -0
  3. fluent_blue-0.1.0/CHANGELOG.md +23 -0
  4. fluent_blue-0.1.0/CONTRIBUTING.md +59 -0
  5. fluent_blue-0.1.0/LICENSE +21 -0
  6. fluent_blue-0.1.0/PKG-INFO +303 -0
  7. fluent_blue-0.1.0/README.md +263 -0
  8. fluent_blue-0.1.0/docs/ai/components/Alert.md +74 -0
  9. fluent_blue-0.1.0/docs/ai/components/Avatar.md +66 -0
  10. fluent_blue-0.1.0/docs/ai/components/AvatarGroup.md +58 -0
  11. fluent_blue-0.1.0/docs/ai/components/Badge.md +64 -0
  12. fluent_blue-0.1.0/docs/ai/components/BadgeOverlay.md +67 -0
  13. fluent_blue-0.1.0/docs/ai/components/Breadcrumb.md +64 -0
  14. fluent_blue-0.1.0/docs/ai/components/Button.md +84 -0
  15. fluent_blue-0.1.0/docs/ai/components/Calendar.md +75 -0
  16. fluent_blue-0.1.0/docs/ai/components/Card.md +78 -0
  17. fluent_blue-0.1.0/docs/ai/components/Checkbox.md +68 -0
  18. fluent_blue-0.1.0/docs/ai/components/CircularProgress.md +75 -0
  19. fluent_blue-0.1.0/docs/ai/components/ClearableInput.md +75 -0
  20. fluent_blue-0.1.0/docs/ai/components/CodeEditor.md +78 -0
  21. fluent_blue-0.1.0/docs/ai/components/CollapsiblePanel.md +72 -0
  22. fluent_blue-0.1.0/docs/ai/components/ColorPicker.md +84 -0
  23. fluent_blue-0.1.0/docs/ai/components/Column.md +73 -0
  24. fluent_blue-0.1.0/docs/ai/components/ComboBox.md +70 -0
  25. fluent_blue-0.1.0/docs/ai/components/Command.md +45 -0
  26. fluent_blue-0.1.0/docs/ai/components/CommandPalette.md +77 -0
  27. fluent_blue-0.1.0/docs/ai/components/ConfirmDialog.md +89 -0
  28. fluent_blue-0.1.0/docs/ai/components/ConsoleWidget.md +72 -0
  29. fluent_blue-0.1.0/docs/ai/components/Container.md +61 -0
  30. fluent_blue-0.1.0/docs/ai/components/DangerButton.md +77 -0
  31. fluent_blue-0.1.0/docs/ai/components/DataTable.md +117 -0
  32. fluent_blue-0.1.0/docs/ai/components/DataTableModel.md +62 -0
  33. fluent_blue-0.1.0/docs/ai/components/DatePicker.md +85 -0
  34. fluent_blue-0.1.0/docs/ai/components/Divider.md +56 -0
  35. fluent_blue-0.1.0/docs/ai/components/Drawer.md +81 -0
  36. fluent_blue-0.1.0/docs/ai/components/DropdownMenu.md +85 -0
  37. fluent_blue-0.1.0/docs/ai/components/EmptyState.md +63 -0
  38. fluent_blue-0.1.0/docs/ai/components/FieldLabel.md +34 -0
  39. fluent_blue-0.1.0/docs/ai/components/FieldMessage.md +34 -0
  40. fluent_blue-0.1.0/docs/ai/components/FilePicker.md +71 -0
  41. fluent_blue-0.1.0/docs/ai/components/FileTree.md +71 -0
  42. fluent_blue-0.1.0/docs/ai/components/FloatingTooltip.md +40 -0
  43. fluent_blue-0.1.0/docs/ai/components/FluentWindow.md +65 -0
  44. fluent_blue-0.1.0/docs/ai/components/FormField.md +78 -0
  45. fluent_blue-0.1.0/docs/ai/components/GhostButton.md +76 -0
  46. fluent_blue-0.1.0/docs/ai/components/Grid.md +64 -0
  47. fluent_blue-0.1.0/docs/ai/components/IconButton.md +81 -0
  48. fluent_blue-0.1.0/docs/ai/components/ImageViewer.md +80 -0
  49. fluent_blue-0.1.0/docs/ai/components/Input.md +85 -0
  50. fluent_blue-0.1.0/docs/ai/components/InputGroup.md +60 -0
  51. fluent_blue-0.1.0/docs/ai/components/ListItem.md +74 -0
  52. fluent_blue-0.1.0/docs/ai/components/LoadingButton.md +86 -0
  53. fluent_blue-0.1.0/docs/ai/components/LoadingOverlay.md +72 -0
  54. fluent_blue-0.1.0/docs/ai/components/LogViewer.md +77 -0
  55. fluent_blue-0.1.0/docs/ai/components/Menu.md +74 -0
  56. fluent_blue-0.1.0/docs/ai/components/MenuItem.md +70 -0
  57. fluent_blue-0.1.0/docs/ai/components/MessageDialog.md +81 -0
  58. fluent_blue-0.1.0/docs/ai/components/Modal.md +78 -0
  59. fluent_blue-0.1.0/docs/ai/components/MultiSelect.md +70 -0
  60. fluent_blue-0.1.0/docs/ai/components/NavigationBar.md +65 -0
  61. fluent_blue-0.1.0/docs/ai/components/Notification.md +62 -0
  62. fluent_blue-0.1.0/docs/ai/components/NumberInput.md +85 -0
  63. fluent_blue-0.1.0/docs/ai/components/OtpInput.md +73 -0
  64. fluent_blue-0.1.0/docs/ai/components/OutlineButton.md +76 -0
  65. fluent_blue-0.1.0/docs/ai/components/Pagination.md +72 -0
  66. fluent_blue-0.1.0/docs/ai/components/Panel.md +62 -0
  67. fluent_blue-0.1.0/docs/ai/components/PasswordInput.md +79 -0
  68. fluent_blue-0.1.0/docs/ai/components/Popover.md +67 -0
  69. fluent_blue-0.1.0/docs/ai/components/PrimaryButton.md +77 -0
  70. fluent_blue-0.1.0/docs/ai/components/ProgressBar.md +74 -0
  71. fluent_blue-0.1.0/docs/ai/components/ProgressDialog.md +90 -0
  72. fluent_blue-0.1.0/docs/ai/components/RadioButton.md +58 -0
  73. fluent_blue-0.1.0/docs/ai/components/RadioGroup.md +68 -0
  74. fluent_blue-0.1.0/docs/ai/components/Result.md +64 -0
  75. fluent_blue-0.1.0/docs/ai/components/RichTextArea.md +34 -0
  76. fluent_blue-0.1.0/docs/ai/components/RichTextEditor.md +77 -0
  77. fluent_blue-0.1.0/docs/ai/components/ScrollArea.md +61 -0
  78. fluent_blue-0.1.0/docs/ai/components/SearchInput.md +77 -0
  79. fluent_blue-0.1.0/docs/ai/components/SecondaryButton.md +77 -0
  80. fluent_blue-0.1.0/docs/ai/components/SegmentedControl.md +66 -0
  81. fluent_blue-0.1.0/docs/ai/components/Select.md +74 -0
  82. fluent_blue-0.1.0/docs/ai/components/Sidebar.md +84 -0
  83. fluent_blue-0.1.0/docs/ai/components/SidebarItem.md +70 -0
  84. fluent_blue-0.1.0/docs/ai/components/Skeleton.md +58 -0
  85. fluent_blue-0.1.0/docs/ai/components/Slider.md +65 -0
  86. fluent_blue-0.1.0/docs/ai/components/Snackbar.md +59 -0
  87. fluent_blue-0.1.0/docs/ai/components/SpinBox.md +65 -0
  88. fluent_blue-0.1.0/docs/ai/components/SplitButton.md +75 -0
  89. fluent_blue-0.1.0/docs/ai/components/Splitter.md +63 -0
  90. fluent_blue-0.1.0/docs/ai/components/Stack.md +66 -0
  91. fluent_blue-0.1.0/docs/ai/components/StatisticCard.md +85 -0
  92. fluent_blue-0.1.0/docs/ai/components/Stepper.md +69 -0
  93. fluent_blue-0.1.0/docs/ai/components/Switch.md +62 -0
  94. fluent_blue-0.1.0/docs/ai/components/SyntaxHighlighter.md +46 -0
  95. fluent_blue-0.1.0/docs/ai/components/TabBar.md +56 -0
  96. fluent_blue-0.1.0/docs/ai/components/Tabs.md +63 -0
  97. fluent_blue-0.1.0/docs/ai/components/Tag.md +66 -0
  98. fluent_blue-0.1.0/docs/ai/components/TagInput.md +74 -0
  99. fluent_blue-0.1.0/docs/ai/components/Text.md +69 -0
  100. fluent_blue-0.1.0/docs/ai/components/TextArea.md +73 -0
  101. fluent_blue-0.1.0/docs/ai/components/TextButton.md +76 -0
  102. fluent_blue-0.1.0/docs/ai/components/TimePicker.md +84 -0
  103. fluent_blue-0.1.0/docs/ai/components/TimePopup.md +49 -0
  104. fluent_blue-0.1.0/docs/ai/components/Timeline.md +64 -0
  105. fluent_blue-0.1.0/docs/ai/components/TitleBar.md +66 -0
  106. fluent_blue-0.1.0/docs/ai/components/Toast.md +64 -0
  107. fluent_blue-0.1.0/docs/ai/components/ToastCard.md +56 -0
  108. fluent_blue-0.1.0/docs/ai/components/Tooltip.md +67 -0
  109. fluent_blue-0.1.0/docs/ai/components/TreeView.md +75 -0
  110. fluent_blue-0.1.0/docs/ai/components/Wizard.md +80 -0
  111. fluent_blue-0.1.0/docs/ai-agents.md +36 -0
  112. fluent_blue-0.1.0/docs/api-reference.md +38 -0
  113. fluent_blue-0.1.0/docs/assets/components/Alert.png +0 -0
  114. fluent_blue-0.1.0/docs/assets/components/Avatar.png +0 -0
  115. fluent_blue-0.1.0/docs/assets/components/AvatarGroup.png +0 -0
  116. fluent_blue-0.1.0/docs/assets/components/Badge.png +0 -0
  117. fluent_blue-0.1.0/docs/assets/components/BadgeOverlay.png +0 -0
  118. fluent_blue-0.1.0/docs/assets/components/Breadcrumb.png +0 -0
  119. fluent_blue-0.1.0/docs/assets/components/Button.png +0 -0
  120. fluent_blue-0.1.0/docs/assets/components/Calendar.png +0 -0
  121. fluent_blue-0.1.0/docs/assets/components/Card.png +0 -0
  122. fluent_blue-0.1.0/docs/assets/components/Checkbox.png +0 -0
  123. fluent_blue-0.1.0/docs/assets/components/CircularProgress.png +0 -0
  124. fluent_blue-0.1.0/docs/assets/components/ClearableInput.png +0 -0
  125. fluent_blue-0.1.0/docs/assets/components/CodeEditor.png +0 -0
  126. fluent_blue-0.1.0/docs/assets/components/CollapsiblePanel.png +0 -0
  127. fluent_blue-0.1.0/docs/assets/components/ColorPicker.png +0 -0
  128. fluent_blue-0.1.0/docs/assets/components/Column.png +0 -0
  129. fluent_blue-0.1.0/docs/assets/components/ComboBox.png +0 -0
  130. fluent_blue-0.1.0/docs/assets/components/CommandPalette.png +0 -0
  131. fluent_blue-0.1.0/docs/assets/components/ConfirmDialog.png +0 -0
  132. fluent_blue-0.1.0/docs/assets/components/ConsoleWidget.png +0 -0
  133. fluent_blue-0.1.0/docs/assets/components/Container.png +0 -0
  134. fluent_blue-0.1.0/docs/assets/components/DangerButton.png +0 -0
  135. fluent_blue-0.1.0/docs/assets/components/DataTable.png +0 -0
  136. fluent_blue-0.1.0/docs/assets/components/DatePicker.png +0 -0
  137. fluent_blue-0.1.0/docs/assets/components/Divider.png +0 -0
  138. fluent_blue-0.1.0/docs/assets/components/Drawer.png +0 -0
  139. fluent_blue-0.1.0/docs/assets/components/DropdownMenu.png +0 -0
  140. fluent_blue-0.1.0/docs/assets/components/EmptyState.png +0 -0
  141. fluent_blue-0.1.0/docs/assets/components/FilePicker.png +0 -0
  142. fluent_blue-0.1.0/docs/assets/components/FileTree.png +0 -0
  143. fluent_blue-0.1.0/docs/assets/components/FluentWindow.png +0 -0
  144. fluent_blue-0.1.0/docs/assets/components/FormField.png +0 -0
  145. fluent_blue-0.1.0/docs/assets/components/GhostButton.png +0 -0
  146. fluent_blue-0.1.0/docs/assets/components/Grid.png +0 -0
  147. fluent_blue-0.1.0/docs/assets/components/IconButton.png +0 -0
  148. fluent_blue-0.1.0/docs/assets/components/ImageViewer.png +0 -0
  149. fluent_blue-0.1.0/docs/assets/components/Input.png +0 -0
  150. fluent_blue-0.1.0/docs/assets/components/InputGroup.png +0 -0
  151. fluent_blue-0.1.0/docs/assets/components/ListItem.png +0 -0
  152. fluent_blue-0.1.0/docs/assets/components/LoadingButton.png +0 -0
  153. fluent_blue-0.1.0/docs/assets/components/LoadingOverlay.png +0 -0
  154. fluent_blue-0.1.0/docs/assets/components/LogViewer.png +0 -0
  155. fluent_blue-0.1.0/docs/assets/components/Menu.png +0 -0
  156. fluent_blue-0.1.0/docs/assets/components/MenuItem.png +0 -0
  157. fluent_blue-0.1.0/docs/assets/components/MessageDialog.png +0 -0
  158. fluent_blue-0.1.0/docs/assets/components/Modal.png +0 -0
  159. fluent_blue-0.1.0/docs/assets/components/MultiSelect.png +0 -0
  160. fluent_blue-0.1.0/docs/assets/components/NavigationBar.png +0 -0
  161. fluent_blue-0.1.0/docs/assets/components/Notification.png +0 -0
  162. fluent_blue-0.1.0/docs/assets/components/NumberInput.png +0 -0
  163. fluent_blue-0.1.0/docs/assets/components/OtpInput.png +0 -0
  164. fluent_blue-0.1.0/docs/assets/components/OutlineButton.png +0 -0
  165. fluent_blue-0.1.0/docs/assets/components/Pagination.png +0 -0
  166. fluent_blue-0.1.0/docs/assets/components/Panel.png +0 -0
  167. fluent_blue-0.1.0/docs/assets/components/PasswordInput.png +0 -0
  168. fluent_blue-0.1.0/docs/assets/components/Popover.png +0 -0
  169. fluent_blue-0.1.0/docs/assets/components/PrimaryButton.png +0 -0
  170. fluent_blue-0.1.0/docs/assets/components/ProgressBar.png +0 -0
  171. fluent_blue-0.1.0/docs/assets/components/ProgressDialog.png +0 -0
  172. fluent_blue-0.1.0/docs/assets/components/RadioButton.png +0 -0
  173. fluent_blue-0.1.0/docs/assets/components/RadioGroup.png +0 -0
  174. fluent_blue-0.1.0/docs/assets/components/Result.png +0 -0
  175. fluent_blue-0.1.0/docs/assets/components/RichTextEditor.png +0 -0
  176. fluent_blue-0.1.0/docs/assets/components/ScrollArea.png +0 -0
  177. fluent_blue-0.1.0/docs/assets/components/SearchInput.png +0 -0
  178. fluent_blue-0.1.0/docs/assets/components/SecondaryButton.png +0 -0
  179. fluent_blue-0.1.0/docs/assets/components/SegmentedControl.png +0 -0
  180. fluent_blue-0.1.0/docs/assets/components/Select.png +0 -0
  181. fluent_blue-0.1.0/docs/assets/components/Sidebar.png +0 -0
  182. fluent_blue-0.1.0/docs/assets/components/SidebarItem.png +0 -0
  183. fluent_blue-0.1.0/docs/assets/components/Skeleton.png +0 -0
  184. fluent_blue-0.1.0/docs/assets/components/Slider.png +0 -0
  185. fluent_blue-0.1.0/docs/assets/components/Snackbar.png +0 -0
  186. fluent_blue-0.1.0/docs/assets/components/SpinBox.png +0 -0
  187. fluent_blue-0.1.0/docs/assets/components/SplitButton.png +0 -0
  188. fluent_blue-0.1.0/docs/assets/components/Splitter.png +0 -0
  189. fluent_blue-0.1.0/docs/assets/components/Stack.png +0 -0
  190. fluent_blue-0.1.0/docs/assets/components/StatisticCard.png +0 -0
  191. fluent_blue-0.1.0/docs/assets/components/Stepper.png +0 -0
  192. fluent_blue-0.1.0/docs/assets/components/Switch.png +0 -0
  193. fluent_blue-0.1.0/docs/assets/components/TabBar.png +0 -0
  194. fluent_blue-0.1.0/docs/assets/components/Tabs.png +0 -0
  195. fluent_blue-0.1.0/docs/assets/components/Tag.png +0 -0
  196. fluent_blue-0.1.0/docs/assets/components/TagInput.png +0 -0
  197. fluent_blue-0.1.0/docs/assets/components/Text.png +0 -0
  198. fluent_blue-0.1.0/docs/assets/components/TextArea.png +0 -0
  199. fluent_blue-0.1.0/docs/assets/components/TextButton.png +0 -0
  200. fluent_blue-0.1.0/docs/assets/components/TimePicker.png +0 -0
  201. fluent_blue-0.1.0/docs/assets/components/Timeline.png +0 -0
  202. fluent_blue-0.1.0/docs/assets/components/TitleBar.png +0 -0
  203. fluent_blue-0.1.0/docs/assets/components/Toast.png +0 -0
  204. fluent_blue-0.1.0/docs/assets/components/Tooltip.png +0 -0
  205. fluent_blue-0.1.0/docs/assets/components/TreeView.png +0 -0
  206. fluent_blue-0.1.0/docs/assets/components/Wizard.png +0 -0
  207. fluent_blue-0.1.0/docs/assets/screenshots/colors-light.png +0 -0
  208. fluent_blue-0.1.0/docs/assets/screenshots/component-page-light.png +0 -0
  209. fluent_blue-0.1.0/docs/assets/screenshots/data-tables-light.png +0 -0
  210. fluent_blue-0.1.0/docs/assets/screenshots/feedback-overlays-light.png +0 -0
  211. fluent_blue-0.1.0/docs/assets/screenshots/overview-dark.png +0 -0
  212. fluent_blue-0.1.0/docs/assets/screenshots/overview-light.png +0 -0
  213. fluent_blue-0.1.0/docs/assets/screenshots/themes-light.png +0 -0
  214. fluent_blue-0.1.0/docs/changelog.md +1 -0
  215. fluent_blue-0.1.0/docs/components/advanced-components.md +500 -0
  216. fluent_blue-0.1.0/docs/components/buttons.md +376 -0
  217. fluent_blue-0.1.0/docs/components/data-display.md +641 -0
  218. fluent_blue-0.1.0/docs/components/data-tables.md +109 -0
  219. fluent_blue-0.1.0/docs/components/feedback.md +320 -0
  220. fluent_blue-0.1.0/docs/components/index.md +15 -0
  221. fluent_blue-0.1.0/docs/components/inputs.md +401 -0
  222. fluent_blue-0.1.0/docs/components/layout.md +364 -0
  223. fluent_blue-0.1.0/docs/components/navigation.md +385 -0
  224. fluent_blue-0.1.0/docs/components/selection.md +342 -0
  225. fluent_blue-0.1.0/docs/contributing.md +1 -0
  226. fluent_blue-0.1.0/docs/design-principles.md +35 -0
  227. fluent_blue-0.1.0/docs/examples.md +22 -0
  228. fluent_blue-0.1.0/docs/faq.md +31 -0
  229. fluent_blue-0.1.0/docs/getting-started.md +119 -0
  230. fluent_blue-0.1.0/docs/index.md +38 -0
  231. fluent_blue-0.1.0/docs/installation.md +64 -0
  232. fluent_blue-0.1.0/docs/migration.md +24 -0
  233. fluent_blue-0.1.0/docs/theming.md +101 -0
  234. fluent_blue-0.1.0/docs/tokens.md +85 -0
  235. fluent_blue-0.1.0/docs/troubleshooting.md +49 -0
  236. fluent_blue-0.1.0/examples/advanced_components.py +79 -0
  237. fluent_blue-0.1.0/examples/basic_app.py +36 -0
  238. fluent_blue-0.1.0/examples/dashboard.py +76 -0
  239. fluent_blue-0.1.0/examples/data_table.py +63 -0
  240. fluent_blue-0.1.0/examples/forms.py +69 -0
  241. fluent_blue-0.1.0/examples/projects_app.py +122 -0
  242. fluent_blue-0.1.0/fluent_blue/__init__.py +27 -0
  243. fluent_blue-0.1.0/fluent_blue/agent_prompts.py +197 -0
  244. fluent_blue-0.1.0/fluent_blue/compatibility/__init__.py +4 -0
  245. fluent_blue-0.1.0/fluent_blue/compatibility/qt.py +108 -0
  246. fluent_blue-0.1.0/fluent_blue/components/__init__.py +10 -0
  247. fluent_blue-0.1.0/fluent_blue/components/advanced/__init__.py +10 -0
  248. fluent_blue-0.1.0/fluent_blue/components/advanced/datetime_pickers.py +380 -0
  249. fluent_blue-0.1.0/fluent_blue/components/advanced/editors.py +557 -0
  250. fluent_blue-0.1.0/fluent_blue/components/advanced/pickers.py +344 -0
  251. fluent_blue-0.1.0/fluent_blue/components/advanced/structure.py +534 -0
  252. fluent_blue-0.1.0/fluent_blue/components/base.py +124 -0
  253. fluent_blue-0.1.0/fluent_blue/components/buttons/__init__.py +18 -0
  254. fluent_blue-0.1.0/fluent_blue/components/buttons/button.py +230 -0
  255. fluent_blue-0.1.0/fluent_blue/components/buttons/split_button.py +50 -0
  256. fluent_blue-0.1.0/fluent_blue/components/data/__init__.py +5 -0
  257. fluent_blue-0.1.0/fluent_blue/components/data/model.py +232 -0
  258. fluent_blue-0.1.0/fluent_blue/components/data/table.py +473 -0
  259. fluent_blue-0.1.0/fluent_blue/components/display/__init__.py +12 -0
  260. fluent_blue-0.1.0/fluent_blue/components/display/card.py +192 -0
  261. fluent_blue-0.1.0/fluent_blue/components/display/console.py +139 -0
  262. fluent_blue-0.1.0/fluent_blue/components/display/content.py +387 -0
  263. fluent_blue-0.1.0/fluent_blue/components/display/media.py +379 -0
  264. fluent_blue-0.1.0/fluent_blue/components/display/text.py +215 -0
  265. fluent_blue-0.1.0/fluent_blue/components/feedback/__init__.py +17 -0
  266. fluent_blue-0.1.0/fluent_blue/components/feedback/feedback.py +566 -0
  267. fluent_blue-0.1.0/fluent_blue/components/inputs/__init__.py +9 -0
  268. fluent_blue-0.1.0/fluent_blue/components/inputs/form.py +125 -0
  269. fluent_blue-0.1.0/fluent_blue/components/inputs/input.py +287 -0
  270. fluent_blue-0.1.0/fluent_blue/components/inputs/tags_otp.py +286 -0
  271. fluent_blue-0.1.0/fluent_blue/components/layout/__init__.py +9 -0
  272. fluent_blue-0.1.0/fluent_blue/components/layout/containers.py +318 -0
  273. fluent_blue-0.1.0/fluent_blue/components/layout/overlays.py +247 -0
  274. fluent_blue-0.1.0/fluent_blue/components/layout/window.py +159 -0
  275. fluent_blue-0.1.0/fluent_blue/components/navigation/__init__.py +10 -0
  276. fluent_blue-0.1.0/fluent_blue/components/navigation/command_palette.py +185 -0
  277. fluent_blue-0.1.0/fluent_blue/components/navigation/menu.py +118 -0
  278. fluent_blue-0.1.0/fluent_blue/components/navigation/sidebar.py +243 -0
  279. fluent_blue-0.1.0/fluent_blue/components/navigation/wayfinding.py +252 -0
  280. fluent_blue-0.1.0/fluent_blue/components/popup.py +61 -0
  281. fluent_blue-0.1.0/fluent_blue/components/selection/__init__.py +8 -0
  282. fluent_blue-0.1.0/fluent_blue/components/selection/choice.py +242 -0
  283. fluent_blue-0.1.0/fluent_blue/components/selection/controls.py +317 -0
  284. fluent_blue-0.1.0/fluent_blue/core/__init__.py +6 -0
  285. fluent_blue-0.1.0/fluent_blue/core/animations.py +51 -0
  286. fluent_blue-0.1.0/fluent_blue/core/configuration.py +25 -0
  287. fluent_blue-0.1.0/fluent_blue/core/palette.py +315 -0
  288. fluent_blue-0.1.0/fluent_blue/core/theme_manager.py +273 -0
  289. fluent_blue-0.1.0/fluent_blue/core/tokens.py +175 -0
  290. fluent_blue-0.1.0/fluent_blue/core/typography.py +57 -0
  291. fluent_blue-0.1.0/fluent_blue/icons/__init__.py +8 -0
  292. fluent_blue-0.1.0/fluent_blue/icons/engine.py +137 -0
  293. fluent_blue-0.1.0/fluent_blue/icons/library.py +147 -0
  294. fluent_blue-0.1.0/fluent_blue/resources/fonts/Inter-Bold.ttf +0 -0
  295. fluent_blue-0.1.0/fluent_blue/resources/fonts/Inter-Medium.ttf +0 -0
  296. fluent_blue-0.1.0/fluent_blue/resources/fonts/Inter-Regular.ttf +0 -0
  297. fluent_blue-0.1.0/fluent_blue/resources/fonts/Inter-SemiBold.ttf +0 -0
  298. fluent_blue-0.1.0/fluent_blue/studio/CHANGELOG.md +23 -0
  299. fluent_blue-0.1.0/fluent_blue/studio/__init__.py +1 -0
  300. fluent_blue-0.1.0/fluent_blue/studio/app.py +324 -0
  301. fluent_blue-0.1.0/fluent_blue/studio/art.py +164 -0
  302. fluent_blue-0.1.0/fluent_blue/studio/catalog/__init__.py +46 -0
  303. fluent_blue-0.1.0/fluent_blue/studio/catalog/added.py +49 -0
  304. fluent_blue-0.1.0/fluent_blue/studio/catalog/advanced.py +120 -0
  305. fluent_blue-0.1.0/fluent_blue/studio/catalog/buttons.py +88 -0
  306. fluent_blue-0.1.0/fluent_blue/studio/catalog/data_tables.py +43 -0
  307. fluent_blue-0.1.0/fluent_blue/studio/catalog/display.py +132 -0
  308. fluent_blue-0.1.0/fluent_blue/studio/catalog/feedback.py +100 -0
  309. fluent_blue-0.1.0/fluent_blue/studio/catalog/inputs.py +63 -0
  310. fluent_blue-0.1.0/fluent_blue/studio/catalog/layout.py +82 -0
  311. fluent_blue-0.1.0/fluent_blue/studio/catalog/navigation.py +105 -0
  312. fluent_blue-0.1.0/fluent_blue/studio/catalog/selection.py +65 -0
  313. fluent_blue-0.1.0/fluent_blue/studio/introspect.py +156 -0
  314. fluent_blue-0.1.0/fluent_blue/studio/pages/__init__.py +1 -0
  315. fluent_blue-0.1.0/fluent_blue/studio/pages/components.py +217 -0
  316. fluent_blue-0.1.0/fluent_blue/studio/pages/foundations.py +316 -0
  317. fluent_blue-0.1.0/fluent_blue/studio/pages/overview.py +669 -0
  318. fluent_blue-0.1.0/fluent_blue/studio/pages/tools.py +191 -0
  319. fluent_blue-0.1.0/fluent_blue/themes/__init__.py +4 -0
  320. fluent_blue-0.1.0/fluent_blue/themes/stylesheet/__init__.py +11 -0
  321. fluent_blue-0.1.0/fluent_blue/themes/stylesheet/base.py +85 -0
  322. fluent_blue-0.1.0/fluent_blue/themes/stylesheet/buttons.py +56 -0
  323. fluent_blue-0.1.0/fluent_blue/themes/stylesheet/context.py +55 -0
  324. fluent_blue-0.1.0/fluent_blue/themes/stylesheet/data.py +20 -0
  325. fluent_blue-0.1.0/fluent_blue/themes/stylesheet/display.py +82 -0
  326. fluent_blue-0.1.0/fluent_blue/themes/stylesheet/feedback.py +30 -0
  327. fluent_blue-0.1.0/fluent_blue/themes/stylesheet/inputs.py +85 -0
  328. fluent_blue-0.1.0/fluent_blue/themes/stylesheet/navigation.py +51 -0
  329. fluent_blue-0.1.0/fluent_blue/themes/stylesheet/selection.py +56 -0
  330. fluent_blue-0.1.0/fluent_blue/themes/stylesheet/studio.py +26 -0
  331. fluent_blue-0.1.0/fluent_blue/utilities/__init__.py +0 -0
  332. fluent_blue-0.1.0/llms.txt +109 -0
  333. fluent_blue-0.1.0/mkdocs.yml +78 -0
  334. fluent_blue-0.1.0/pyproject.toml +103 -0
  335. fluent_blue-0.1.0/scripts/generate_docs.py +131 -0
  336. fluent_blue-0.1.0/scripts/perf_report.py +70 -0
  337. fluent_blue-0.1.0/scripts/ui_audit.py +223 -0
  338. fluent_blue-0.1.0/tests/conftest.py +8 -0
  339. fluent_blue-0.1.0/tests/test_agent_prompts.py +81 -0
  340. fluent_blue-0.1.0/tests/test_contrast.py +35 -0
  341. fluent_blue-0.1.0/tests/test_examples_and_repo.py +61 -0
  342. fluent_blue-0.1.0/tests/test_interactions.py +179 -0
  343. fluent_blue-0.1.0/tests/test_overlays_visible.py +106 -0
  344. fluent_blue-0.1.0/tests/test_overview_layout.py +78 -0
  345. fluent_blue-0.1.0/tests/test_text_clipping.py +44 -0
  346. 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.