sli-ui-toolkit 0.2.7__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 (196) hide show
  1. sli_ui_toolkit-0.2.7/PKG-INFO +156 -0
  2. sli_ui_toolkit-0.2.7/README.md +140 -0
  3. sli_ui_toolkit-0.2.7/pyproject.toml +38 -0
  4. sli_ui_toolkit-0.2.7/setup.cfg +4 -0
  5. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/__init__.py +72 -0
  6. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/_version.py +1 -0
  7. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/config.py +63 -0
  8. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/core/__init__.py +7 -0
  9. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/core/logging.py +99 -0
  10. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/i18n.py +253 -0
  11. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/icons.py +56 -0
  12. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/managers.py +13 -0
  13. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/palettes.py +176 -0
  14. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/dark/add.svg +1 -0
  15. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/dark/add_circle.svg +5 -0
  16. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/dark/calendar.svg +1 -0
  17. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/dark/chart.svg +5 -0
  18. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/dark/check.svg +1 -0
  19. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/dark/chevron-down.svg +1 -0
  20. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/dark/delete.svg +1 -0
  21. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/dark/download.svg +1 -0
  22. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/dark/edit.svg +1 -0
  23. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/dark/folder_open.svg +1 -0
  24. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/dark/help.svg +1 -0
  25. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/dark/incognito.svg +1 -0
  26. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/dark/photo.svg +1 -0
  27. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/dark/quick_save.svg +55 -0
  28. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/dark/remove.svg +1 -0
  29. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/dark/save.svg +1 -0
  30. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/dark/settings.svg +1 -0
  31. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/dark/sync.svg +1 -0
  32. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/dark/text-manipulator.svg +76 -0
  33. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/light/add.svg +1 -0
  34. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/light/add_circle.svg +5 -0
  35. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/light/calendar.svg +1 -0
  36. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/light/chart.svg +5 -0
  37. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/light/check.svg +1 -0
  38. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/light/chevron-down.svg +1 -0
  39. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/light/delete.svg +1 -0
  40. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/light/download.svg +1 -0
  41. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/light/edit.svg +1 -0
  42. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/light/folder_open.svg +1 -0
  43. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/light/help.svg +1 -0
  44. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/light/incognito.svg +1 -0
  45. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/light/photo.svg +1 -0
  46. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/light/quick_save.svg +16 -0
  47. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/light/remove.svg +1 -0
  48. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/light/save.svg +1 -0
  49. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/light/settings.svg +1 -0
  50. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/light/sync.svg +1 -0
  51. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/light/text-manipulator.svg +76 -0
  52. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/services.py +12 -0
  53. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/style.py +20 -0
  54. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/theme.py +4 -0
  55. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/__init__.py +2 -0
  56. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/dialogs/__init__.py +13 -0
  57. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/dialogs/dialog_helpers.py +115 -0
  58. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/in_window_surface.py +205 -0
  59. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/managers/__init__.py +13 -0
  60. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/managers/flyout_manager.py +259 -0
  61. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/managers/flyout_timer_service.py +102 -0
  62. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/managers/icon_manager.py +44 -0
  63. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/managers/theme_manager.py +220 -0
  64. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/services/__init__.py +19 -0
  65. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/services/dragdrop_service.py +213 -0
  66. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/services/icon_service.py +100 -0
  67. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/services/window_prewarm.py +47 -0
  68. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/__init__.py +2 -0
  69. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/atomic/__init__.py +57 -0
  70. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/atomic/checkbox.py +344 -0
  71. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/atomic/combobox.py +5 -0
  72. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/atomic/comboboxes.py +5 -0
  73. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/atomic/custom_group_widget.py +148 -0
  74. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/atomic/custom_line_edit.py +218 -0
  75. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/atomic/drop_zone_label.py +147 -0
  76. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/atomic/instances_counter_button.py +256 -0
  77. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/atomic/loading_spinner.py +59 -0
  78. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/atomic/minimalist_scrollbar.py +270 -0
  79. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/atomic/radio.py +244 -0
  80. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/atomic/slider.py +227 -0
  81. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/atomic/spinbox.py +132 -0
  82. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/atomic/switch.py +301 -0
  83. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/atomic/text_labels.py +350 -0
  84. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/atomic/time_line_edit.py +377 -0
  85. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/atomic/tooltips.py +311 -0
  86. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/buttons/__init__.py +4 -0
  87. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/buttons/_dropdown_menu.py +307 -0
  88. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/buttons/button.py +811 -0
  89. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/buttons/button_group.py +97 -0
  90. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/buttons/capabilities/__init__.py +17 -0
  91. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/buttons/capabilities/base.py +27 -0
  92. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/buttons/capabilities/long_press.py +61 -0
  93. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/buttons/capabilities/menu.py +57 -0
  94. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/buttons/capabilities/scroll.py +203 -0
  95. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/buttons/content.py +255 -0
  96. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/buttons/context.py +41 -0
  97. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/buttons/layers/__init__.py +18 -0
  98. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/buttons/layers/_base.py +17 -0
  99. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/buttons/layers/background.py +87 -0
  100. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/buttons/layers/badge.py +107 -0
  101. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/buttons/layers/content.py +16 -0
  102. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/buttons/layers/strikethrough.py +22 -0
  103. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/buttons/layers/underline.py +81 -0
  104. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/buttons/painter.py +132 -0
  105. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/buttons/state.py +17 -0
  106. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/buttons/variants.py +178 -0
  107. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/comboboxes/__init__.py +4 -0
  108. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/comboboxes/_models.py +15 -0
  109. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/comboboxes/_overlay.py +323 -0
  110. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/comboboxes/_search.py +78 -0
  111. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/comboboxes/combo_box.py +671 -0
  112. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/comboboxes/scrollable_combobox.py +261 -0
  113. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/__init__.py +103 -0
  114. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/base_flyout.py +407 -0
  115. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/calendar_widget/__init__.py +21 -0
  116. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/calendar_widget/day_button.py +128 -0
  117. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/calendar_widget/models.py +94 -0
  118. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/calendar_widget/widget.py +574 -0
  119. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/color_swatch.py +79 -0
  120. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/dialog_shell.py +64 -0
  121. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/drag_ghost_widget.py +45 -0
  122. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/help_sections.py +83 -0
  123. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/icon_action_flyout.py +185 -0
  124. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/indexed_toggle_flyout.py +120 -0
  125. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/log_console_widget.py +204 -0
  126. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/markdown_help_dialog.py +527 -0
  127. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/preview_panel.py +115 -0
  128. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/process_console_widget.py +250 -0
  129. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/sidebar_nav_list.py +105 -0
  130. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/simple_options_flyout.py +429 -0
  131. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/sunburst_chart/__init__.py +17 -0
  132. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/sunburst_chart/chart_widget.py +205 -0
  133. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/sunburst_chart/models.py +23 -0
  134. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/sunburst_chart/segment_item.py +115 -0
  135. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/timeline_widget/__init__.py +11 -0
  136. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/timeline_widget/i18n.py +28 -0
  137. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/timeline_widget/interaction.py +171 -0
  138. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/timeline_widget/layout.py +553 -0
  139. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/timeline_widget/models.py +72 -0
  140. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/timeline_widget/primitives.py +161 -0
  141. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/timeline_widget/render.py +704 -0
  142. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/timeline_widget/theme.py +137 -0
  143. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/timeline_widget/viewport.py +397 -0
  144. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/timeline_widget/widget.py +503 -0
  145. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/toast.py +498 -0
  146. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/unified_flyout/__init__.py +109 -0
  147. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/unified_flyout/bootstrap.py +157 -0
  148. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/unified_flyout/common.py +32 -0
  149. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/unified_flyout/content.py +48 -0
  150. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/unified_flyout/delegate.py +362 -0
  151. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/unified_flyout/dragdrop.py +43 -0
  152. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/unified_flyout/layout.py +462 -0
  153. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/unified_flyout/model.py +120 -0
  154. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/unified_flyout/overlay_list_view.py +122 -0
  155. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/unified_flyout/panel.py +622 -0
  156. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/unified_flyout/refresh.py +121 -0
  157. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/unified_flyout/session.py +116 -0
  158. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/unified_flyout/simple_adapter.py +139 -0
  159. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/unified_flyout/style.py +100 -0
  160. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/helpers/__init__.py +31 -0
  161. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/helpers/editable_text.py +41 -0
  162. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/helpers/hover_coordinator.py +131 -0
  163. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/helpers/icon_pixmap.py +111 -0
  164. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/helpers/overlay_geometry.py +52 -0
  165. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/helpers/shadow_painter.py +20 -0
  166. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/helpers/underline_painter.py +151 -0
  167. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/helpers/wheel_scroll_policy.py +41 -0
  168. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/list_items/__init__.py +4 -0
  169. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/list_items/editable_list_item.py +64 -0
  170. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/list_items/rating_item.py +450 -0
  171. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/overlays/__init__.py +4 -0
  172. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/overlays/drag_drop_overlay.py +131 -0
  173. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/overlays/paste_direction_overlay.py +276 -0
  174. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/style_bridge.py +129 -0
  175. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/utils/__init__.py +4 -0
  176. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/utils/file_utils.py +28 -0
  177. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/utils/paths.py +12 -0
  178. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/widgets.py +151 -0
  179. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/workers/__init__.py +3 -0
  180. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/workers/generic_worker.py +48 -0
  181. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit.egg-info/PKG-INFO +156 -0
  182. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit.egg-info/SOURCES.txt +194 -0
  183. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit.egg-info/dependency_links.txt +1 -0
  184. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit.egg-info/requires.txt +6 -0
  185. sli_ui_toolkit-0.2.7/src/sli_ui_toolkit.egg-info/top_level.txt +1 -0
  186. sli_ui_toolkit-0.2.7/tests/test_button_custom_bg.py +67 -0
  187. sli_ui_toolkit-0.2.7/tests/test_button_underline.py +61 -0
  188. sli_ui_toolkit-0.2.7/tests/test_contrast.py +106 -0
  189. sli_ui_toolkit-0.2.7/tests/test_hover_coordinator.py +44 -0
  190. sli_ui_toolkit-0.2.7/tests/test_i18n.py +28 -0
  191. sli_ui_toolkit-0.2.7/tests/test_icons.py +22 -0
  192. sli_ui_toolkit-0.2.7/tests/test_keyboard.py +131 -0
  193. sli_ui_toolkit-0.2.7/tests/test_public_api.py +40 -0
  194. sli_ui_toolkit-0.2.7/tests/test_theme.py +27 -0
  195. sli_ui_toolkit-0.2.7/tests/test_version.py +14 -0
  196. sli_ui_toolkit-0.2.7/tests/test_widgets_smoke.py +51 -0
@@ -0,0 +1,156 @@
1
+ Metadata-Version: 2.4
2
+ Name: sli-ui-toolkit
3
+ Version: 0.2.7
4
+ Summary: Reusable PyQt UI toolkit primitives for SLI desktop tools.
5
+ Author: Loganavter
6
+ License: MIT
7
+ Project-URL: Repository, https://github.com/Loganavter/sli-ui-toolkit
8
+ Project-URL: Issues, https://github.com/Loganavter/sli-ui-toolkit/issues
9
+ Requires-Python: >=3.10
10
+ Description-Content-Type: text/markdown
11
+ Requires-Dist: PyQt6>=6.6
12
+ Requires-Dist: markdown>=3.4
13
+ Provides-Extra: dev
14
+ Requires-Dist: pytest>=7; extra == "dev"
15
+ Requires-Dist: pytest-qt>=4.2; extra == "dev"
16
+
17
+ # SLI UI Toolkit
18
+
19
+ `sli-ui-toolkit` is a reusable PyQt6 widget and UI-support library.
20
+ SLI stands for **Shared Lightweight Interface**.
21
+
22
+ It was extracted from two production apps, Improve-ImgSLI and Tkonverter.
23
+ That history is still visible in some widget choices and naming, but the
24
+ package is maintained as a general-purpose toolkit: host-specific behavior is
25
+ kept outside the library and injected through configuration hooks.
26
+
27
+ Use it when you want:
28
+
29
+ - custom-painted compact controls;
30
+ - a unified button system;
31
+ - theme-aware widgets and flyouts;
32
+ - app-injected icons, translations, and overlay behavior.
33
+
34
+ ## Start Here
35
+
36
+ This file is the integration entry point, not the full reference.
37
+
38
+ - Full public API: [docs/API_CATALOG.md](docs/API_CATALOG.md)
39
+ - Internal structure: [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)
40
+ - Visual conventions: [docs/DESIGN_LANGUAGE.md](docs/DESIGN_LANGUAGE.md)
41
+ - Docs index: [docs/README.md](docs/README.md)
42
+
43
+ ## Import Layers
44
+
45
+ Use these import layers on purpose:
46
+
47
+ - `sli_ui_toolkit`
48
+ Small top-level bootstrap surface.
49
+ - `sli_ui_toolkit.widgets`
50
+ Main public widget catalog.
51
+ - `sli_ui_toolkit.i18n`
52
+ Translation manager and helpers.
53
+ - `sli_ui_toolkit.icons`
54
+ Icon resolver configuration.
55
+ - `sli_ui_toolkit.theme`
56
+ Theme manager.
57
+ - `sli_ui_toolkit.managers`
58
+ Flyout and timer helpers.
59
+ - `sli_ui_toolkit.services`
60
+ Utility services such as prewarm helpers.
61
+
62
+ If you are building app UI, most of the time you want `sli_ui_toolkit.widgets`.
63
+
64
+ ## Configuration Hooks
65
+
66
+ App-specific behavior is injected at startup:
67
+
68
+ - `configure_icon_resolver(...)`
69
+ - `configure_toolkit(...)`
70
+ - `configure_i18n(...)`
71
+
72
+ These hooks keep the toolkit reusable while letting the host app supply:
73
+
74
+ - icon lookup;
75
+ - translation roots;
76
+ - overlay-layer resolution;
77
+ - timing constants.
78
+
79
+ ## Quick Start
80
+
81
+ ```python
82
+ from pathlib import Path
83
+
84
+ from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout
85
+
86
+ from sli_ui_toolkit import FlyoutTimingConfig, configure_i18n, configure_toolkit
87
+ from sli_ui_toolkit.icons import configure_icon_resolver
88
+ from sli_ui_toolkit.theme import ThemeManager
89
+ from sli_ui_toolkit.widgets import Button, ComboBox, install_application_tooltips
90
+
91
+ app = QApplication([])
92
+
93
+ theme = ThemeManager.get_instance()
94
+ theme.register_palettes(light_palette={...}, dark_palette={...})
95
+ theme.register_qss_path(str(Path("resources/qss/app.qss")))
96
+ theme.set_theme("light", app)
97
+
98
+ configure_icon_resolver(resolver=my_icon_lookup)
99
+
100
+ configure_toolkit(
101
+ timings=FlyoutTimingConfig(
102
+ transient_auto_hide_delay_ms=300,
103
+ flyout_animation_duration_ms=150,
104
+ text_settings_flyout_animation_duration_ms=150,
105
+ ),
106
+ overlay_resolver=lambda widget: getattr(widget.window(), "overlay_layer", None),
107
+ )
108
+
109
+ configure_i18n(i18n_root=Path("resources/i18n"))
110
+ install_application_tooltips(app)
111
+
112
+ window = QWidget()
113
+ layout = QVBoxLayout(window)
114
+
115
+ save_button = Button("save", text="Save", variant="primary")
116
+ mode_combo = ComboBox()
117
+ mode_combo.addItems(["Fast", "Balanced", "Quality"])
118
+
119
+ layout.addWidget(save_button)
120
+ layout.addWidget(mode_combo)
121
+ window.show()
122
+
123
+ app.exec()
124
+ ```
125
+
126
+ Flyouts, button dropdown menus, and similar in-window surfaces use
127
+ `overlay_resolver` when a host app provides an overlay layer. The resolved
128
+ object should expose `host`, `attach(widget)`, `anchor_rect(anchor)`, and
129
+ `clamp_rect(rect, margin=...)`. If no overlay layer is resolved, button dropdown
130
+ menus fall back to the top-level window and position themselves in window
131
+ coordinates. Menu surfaces are painted from `flyout.background` /
132
+ `flyout.border`; individual rows only use `list_item.background.hover` for the
133
+ hovered or current item.
134
+
135
+ ## First Widgets To Reach For
136
+
137
+ - `Button`
138
+ Unified icon/text/toggle/menu/scrollable button system.
139
+ - `ComboBox`
140
+ Custom-painted combo box with popup, search, and keyboard navigation.
141
+ - `CustomLineEdit`
142
+ Themed editable text field.
143
+ - `SidebarDialogShell`
144
+ Settings/help style dialog shell.
145
+ - `ScrollableDialogPage`
146
+ Scrollable dialog page container.
147
+ - `MarkdownHelpDialog`
148
+ Reusable markdown help/documentation dialog.
149
+
150
+ Usage details live in [docs/API_CATALOG.md](docs/API_CATALOG.md).
151
+
152
+ ## Notes
153
+
154
+ - `ComboBox` is a custom widget, not a full `QComboBox` drop-in replacement.
155
+ - The toolkit is designed around custom-painted controls, not QSS-skinned stock widgets.
156
+ - App-specific icons and translations should stay outside the toolkit and be injected through configuration.
@@ -0,0 +1,140 @@
1
+ # SLI UI Toolkit
2
+
3
+ `sli-ui-toolkit` is a reusable PyQt6 widget and UI-support library.
4
+ SLI stands for **Shared Lightweight Interface**.
5
+
6
+ It was extracted from two production apps, Improve-ImgSLI and Tkonverter.
7
+ That history is still visible in some widget choices and naming, but the
8
+ package is maintained as a general-purpose toolkit: host-specific behavior is
9
+ kept outside the library and injected through configuration hooks.
10
+
11
+ Use it when you want:
12
+
13
+ - custom-painted compact controls;
14
+ - a unified button system;
15
+ - theme-aware widgets and flyouts;
16
+ - app-injected icons, translations, and overlay behavior.
17
+
18
+ ## Start Here
19
+
20
+ This file is the integration entry point, not the full reference.
21
+
22
+ - Full public API: [docs/API_CATALOG.md](docs/API_CATALOG.md)
23
+ - Internal structure: [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)
24
+ - Visual conventions: [docs/DESIGN_LANGUAGE.md](docs/DESIGN_LANGUAGE.md)
25
+ - Docs index: [docs/README.md](docs/README.md)
26
+
27
+ ## Import Layers
28
+
29
+ Use these import layers on purpose:
30
+
31
+ - `sli_ui_toolkit`
32
+ Small top-level bootstrap surface.
33
+ - `sli_ui_toolkit.widgets`
34
+ Main public widget catalog.
35
+ - `sli_ui_toolkit.i18n`
36
+ Translation manager and helpers.
37
+ - `sli_ui_toolkit.icons`
38
+ Icon resolver configuration.
39
+ - `sli_ui_toolkit.theme`
40
+ Theme manager.
41
+ - `sli_ui_toolkit.managers`
42
+ Flyout and timer helpers.
43
+ - `sli_ui_toolkit.services`
44
+ Utility services such as prewarm helpers.
45
+
46
+ If you are building app UI, most of the time you want `sli_ui_toolkit.widgets`.
47
+
48
+ ## Configuration Hooks
49
+
50
+ App-specific behavior is injected at startup:
51
+
52
+ - `configure_icon_resolver(...)`
53
+ - `configure_toolkit(...)`
54
+ - `configure_i18n(...)`
55
+
56
+ These hooks keep the toolkit reusable while letting the host app supply:
57
+
58
+ - icon lookup;
59
+ - translation roots;
60
+ - overlay-layer resolution;
61
+ - timing constants.
62
+
63
+ ## Quick Start
64
+
65
+ ```python
66
+ from pathlib import Path
67
+
68
+ from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout
69
+
70
+ from sli_ui_toolkit import FlyoutTimingConfig, configure_i18n, configure_toolkit
71
+ from sli_ui_toolkit.icons import configure_icon_resolver
72
+ from sli_ui_toolkit.theme import ThemeManager
73
+ from sli_ui_toolkit.widgets import Button, ComboBox, install_application_tooltips
74
+
75
+ app = QApplication([])
76
+
77
+ theme = ThemeManager.get_instance()
78
+ theme.register_palettes(light_palette={...}, dark_palette={...})
79
+ theme.register_qss_path(str(Path("resources/qss/app.qss")))
80
+ theme.set_theme("light", app)
81
+
82
+ configure_icon_resolver(resolver=my_icon_lookup)
83
+
84
+ configure_toolkit(
85
+ timings=FlyoutTimingConfig(
86
+ transient_auto_hide_delay_ms=300,
87
+ flyout_animation_duration_ms=150,
88
+ text_settings_flyout_animation_duration_ms=150,
89
+ ),
90
+ overlay_resolver=lambda widget: getattr(widget.window(), "overlay_layer", None),
91
+ )
92
+
93
+ configure_i18n(i18n_root=Path("resources/i18n"))
94
+ install_application_tooltips(app)
95
+
96
+ window = QWidget()
97
+ layout = QVBoxLayout(window)
98
+
99
+ save_button = Button("save", text="Save", variant="primary")
100
+ mode_combo = ComboBox()
101
+ mode_combo.addItems(["Fast", "Balanced", "Quality"])
102
+
103
+ layout.addWidget(save_button)
104
+ layout.addWidget(mode_combo)
105
+ window.show()
106
+
107
+ app.exec()
108
+ ```
109
+
110
+ Flyouts, button dropdown menus, and similar in-window surfaces use
111
+ `overlay_resolver` when a host app provides an overlay layer. The resolved
112
+ object should expose `host`, `attach(widget)`, `anchor_rect(anchor)`, and
113
+ `clamp_rect(rect, margin=...)`. If no overlay layer is resolved, button dropdown
114
+ menus fall back to the top-level window and position themselves in window
115
+ coordinates. Menu surfaces are painted from `flyout.background` /
116
+ `flyout.border`; individual rows only use `list_item.background.hover` for the
117
+ hovered or current item.
118
+
119
+ ## First Widgets To Reach For
120
+
121
+ - `Button`
122
+ Unified icon/text/toggle/menu/scrollable button system.
123
+ - `ComboBox`
124
+ Custom-painted combo box with popup, search, and keyboard navigation.
125
+ - `CustomLineEdit`
126
+ Themed editable text field.
127
+ - `SidebarDialogShell`
128
+ Settings/help style dialog shell.
129
+ - `ScrollableDialogPage`
130
+ Scrollable dialog page container.
131
+ - `MarkdownHelpDialog`
132
+ Reusable markdown help/documentation dialog.
133
+
134
+ Usage details live in [docs/API_CATALOG.md](docs/API_CATALOG.md).
135
+
136
+ ## Notes
137
+
138
+ - `ComboBox` is a custom widget, not a full `QComboBox` drop-in replacement.
139
+ - The toolkit is designed around custom-painted controls, not QSS-skinned stock widgets.
140
+ - App-specific icons and translations should stay outside the toolkit and be injected through configuration.
@@ -0,0 +1,38 @@
1
+ [build-system]
2
+ requires = ["setuptools>=69", "wheel"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "sli-ui-toolkit"
7
+ version = "0.2.7"
8
+ description = "Reusable PyQt UI toolkit primitives for SLI desktop tools."
9
+ readme = "README.md"
10
+ requires-python = ">=3.10"
11
+ dependencies = [
12
+ "PyQt6>=6.6",
13
+ "markdown>=3.4",
14
+ ]
15
+ license = { text = "MIT" }
16
+ authors = [
17
+ { name = "Loganavter" },
18
+ ]
19
+
20
+ [project.optional-dependencies]
21
+ dev = [
22
+ "pytest>=7",
23
+ "pytest-qt>=4.2",
24
+ ]
25
+
26
+ [project.urls]
27
+ Repository = "https://github.com/Loganavter/sli-ui-toolkit"
28
+ Issues = "https://github.com/Loganavter/sli-ui-toolkit/issues"
29
+
30
+ [tool.setuptools.packages.find]
31
+ where = ["src"]
32
+
33
+ [tool.setuptools.package-data]
34
+ "sli_ui_toolkit" = ["resources/assets/icons/*.svg", "resources/assets/icons/light/*.svg", "resources/assets/icons/dark/*.svg"]
35
+
36
+ [tool.pytest.ini_options]
37
+ testpaths = ["tests"]
38
+ addopts = "-q"
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1,72 @@
1
+ """Reusable PyQt toolkit primitives."""
2
+
3
+ from sli_ui_toolkit._version import __version__
4
+ from sli_ui_toolkit.config import FlyoutTimingConfig, configure_toolkit
5
+ from sli_ui_toolkit.palettes import FLUENT_LIGHT, FLUENT_DARK
6
+ from sli_ui_toolkit.core.logging import (
7
+ get_log_directory,
8
+ setup_logging,
9
+ setup_simple_logging,
10
+ )
11
+ from sli_ui_toolkit.i18n import (
12
+ ToolkitTranslationEvents,
13
+ TranslationManager,
14
+ configure_i18n,
15
+ emit_language_changed,
16
+ get_current_language,
17
+ tr,
18
+ translation_events,
19
+ )
20
+ from sli_ui_toolkit.utils.file_utils import get_unique_filepath
21
+ from sli_ui_toolkit.utils.paths import resource_path
22
+ from sli_ui_toolkit.workers.generic_worker import GenericWorker, WorkerSignals
23
+ from sli_ui_toolkit.theme import ThemeManager
24
+ from sli_ui_toolkit.widgets import (
25
+ Label,
26
+ LabelConfig,
27
+ LabelVariantSpec,
28
+ application_tooltips_enabled,
29
+ get_label_variant,
30
+ install_application_tooltips,
31
+ register_label_variant,
32
+ set_application_tooltips_enabled,
33
+ )
34
+ from sli_ui_toolkit.style import (
35
+ WidgetStyleTokens,
36
+ read_widget_style,
37
+ update_widget_style,
38
+ )
39
+
40
+ __all__ = [
41
+ "__version__",
42
+ "GenericWorker",
43
+ "WorkerSignals",
44
+ "ThemeManager",
45
+ "Label",
46
+ "LabelConfig",
47
+ "LabelVariantSpec",
48
+ "get_label_variant",
49
+ "register_label_variant",
50
+ "application_tooltips_enabled",
51
+ "install_application_tooltips",
52
+ "set_application_tooltips_enabled",
53
+ "WidgetStyleTokens",
54
+ "read_widget_style",
55
+ "update_widget_style",
56
+ "FlyoutTimingConfig",
57
+ "ToolkitTranslationEvents",
58
+ "TranslationManager",
59
+ "configure_i18n",
60
+ "configure_toolkit",
61
+ "emit_language_changed",
62
+ "get_log_directory",
63
+ "get_current_language",
64
+ "get_unique_filepath",
65
+ "resource_path",
66
+ "setup_logging",
67
+ "setup_simple_logging",
68
+ "tr",
69
+ "translation_events",
70
+ "FLUENT_LIGHT",
71
+ "FLUENT_DARK",
72
+ ]
@@ -0,0 +1 @@
1
+ __version__ = "0.2.7"
@@ -0,0 +1,63 @@
1
+ from __future__ import annotations
2
+
3
+ from collections.abc import Callable
4
+ from dataclasses import dataclass
5
+
6
+ @dataclass(slots=True)
7
+ class FlyoutTimingConfig:
8
+ transient_auto_hide_delay_ms: int = 180
9
+ flyout_animation_duration_ms: int = 160
10
+ text_settings_flyout_animation_duration_ms: int = 180
11
+
12
+ _timings = FlyoutTimingConfig()
13
+ _overlay_resolver: Callable[[object | None], object | None] | None = None
14
+ _rating_gesture_factory: Callable[..., object] | None = None
15
+ _dragdrop_service_getter: Callable[[], object | None] | None = None
16
+
17
+ def configure_toolkit(
18
+ *,
19
+ timings: FlyoutTimingConfig | None = None,
20
+ overlay_resolver: Callable[[object | None], object | None] | None = None,
21
+ rating_gesture_factory: Callable[..., object] | None = None,
22
+ dragdrop_service_getter: Callable[[], object | None] | None = None,
23
+ ) -> None:
24
+ global _timings, _overlay_resolver, _rating_gesture_factory, _dragdrop_service_getter
25
+ if timings is not None:
26
+ _timings = timings
27
+ if overlay_resolver is not None:
28
+ _overlay_resolver = overlay_resolver
29
+ if rating_gesture_factory is not None:
30
+ _rating_gesture_factory = rating_gesture_factory
31
+ if dragdrop_service_getter is not None:
32
+ _dragdrop_service_getter = dragdrop_service_getter
33
+
34
+ def get_flyout_timings() -> FlyoutTimingConfig:
35
+ return _timings
36
+
37
+ def resolve_overlay_layer(widget: object | None):
38
+ if _overlay_resolver is None:
39
+ return None
40
+ try:
41
+ return _overlay_resolver(widget)
42
+ except Exception:
43
+ return None
44
+
45
+ def create_rating_gesture(**kwargs):
46
+ if _rating_gesture_factory is None:
47
+ return None
48
+ try:
49
+ return _rating_gesture_factory(**kwargs)
50
+ except Exception:
51
+ return None
52
+
53
+ def get_dragdrop_service():
54
+ if _dragdrop_service_getter is None:
55
+ from sli_ui_toolkit.ui.services.dragdrop_service import ToolkitDragDropService
56
+
57
+ return ToolkitDragDropService.get_instance()
58
+ try:
59
+ return _dragdrop_service_getter()
60
+ except Exception:
61
+ from sli_ui_toolkit.ui.services.dragdrop_service import ToolkitDragDropService
62
+
63
+ return ToolkitDragDropService.get_instance()
@@ -0,0 +1,7 @@
1
+ from sli_ui_toolkit.core.logging import (
2
+ get_log_directory,
3
+ setup_logging,
4
+ setup_simple_logging,
5
+ )
6
+
7
+ __all__ = ["get_log_directory", "setup_logging", "setup_simple_logging"]
@@ -0,0 +1,99 @@
1
+ import logging
2
+ import os
3
+ import sys
4
+
5
+ def get_log_directory(app_name: str) -> str:
6
+ logger = logging.getLogger(app_name)
7
+
8
+ if sys.platform == "win32":
9
+ app_data_dir = os.getenv("APPDATA")
10
+ if not app_data_dir:
11
+ app_data_dir = os.path.expanduser("~")
12
+ logger.warning(
13
+ "Could not find APPDATA env variable, falling back to home directory."
14
+ )
15
+ return os.path.join(app_data_dir, app_name)
16
+
17
+ if sys.platform == "darwin":
18
+ return os.path.join(
19
+ os.path.expanduser("~/Library/Application Support"), app_name
20
+ )
21
+
22
+ xdg_data_home = os.getenv("XDG_DATA_HOME", os.path.expanduser("~/.local/share"))
23
+ return os.path.join(xdg_data_home, app_name)
24
+
25
+ def setup_logging(
26
+ app_name: str, debug_enabled: bool = False, debug_env_var: str | None = None
27
+ ) -> None:
28
+ logger = logging.getLogger(app_name)
29
+
30
+ if debug_env_var:
31
+ suppress_debug = (
32
+ os.getenv(f"{debug_env_var.replace('_DEBUG', '_SUPPRESS_DEBUG')}", "0")
33
+ == "1"
34
+ )
35
+ if suppress_debug:
36
+ debug_enabled = False
37
+ elif os.getenv(debug_env_var, "0") == "1":
38
+ debug_enabled = True
39
+
40
+ level = logging.DEBUG if debug_enabled else logging.INFO
41
+
42
+ if logger.handlers:
43
+ logger.setLevel(level)
44
+ for handler in logger.handlers:
45
+ handler.setLevel(level)
46
+ return
47
+
48
+ logger.setLevel(level)
49
+ formatter = logging.Formatter(
50
+ "%(asctime)s - [%(levelname)s] - (%(filename)s:%(lineno)d) - %(message)s"
51
+ )
52
+
53
+ stream_handler = logging.StreamHandler(sys.stdout)
54
+ stream_handler.setFormatter(formatter)
55
+ stream_handler.setLevel(level)
56
+ logger.addHandler(stream_handler)
57
+
58
+ try:
59
+ log_dir = get_log_directory(app_name)
60
+ os.makedirs(log_dir, exist_ok=True)
61
+ log_file_path = os.path.join(log_dir, "log.txt")
62
+
63
+ file_handler = logging.FileHandler(log_file_path, mode="w", encoding="utf-8")
64
+ file_handler.setFormatter(formatter)
65
+ file_handler.setLevel(level)
66
+ logger.addHandler(file_handler)
67
+
68
+ logging.getLogger("markdown").setLevel(logging.WARNING)
69
+ logging.getLogger("markdown.extensions").setLevel(logging.WARNING)
70
+ except Exception:
71
+ logger.error(
72
+ "FATAL: Failed to set up file logger. Continuing with console-only logging.",
73
+ exc_info=True,
74
+ )
75
+
76
+ def setup_simple_logging(app_name: str, level: int = logging.WARNING) -> None:
77
+ root_logger = logging.getLogger()
78
+ root_logger.setLevel(level)
79
+
80
+ for handler in root_logger.handlers[:]:
81
+ root_logger.removeHandler(handler)
82
+
83
+ formatter = logging.Formatter(
84
+ "%(asctime)s - %(name)s - %(levelname)s - %(message)s",
85
+ datefmt="%Y-%m-%d %H:%M:%S",
86
+ )
87
+
88
+ console_handler = logging.StreamHandler()
89
+ console_handler.setLevel(level)
90
+ console_handler.setFormatter(formatter)
91
+
92
+ root_logger.addHandler(console_handler)
93
+
94
+ app_logger = logging.getLogger(app_name)
95
+ app_logger.setLevel(level)
96
+
97
+ logging.getLogger("markdown").setLevel(logging.WARNING)
98
+ logging.getLogger("markdown.extensions").setLevel(logging.WARNING)
99
+