tess-ui 0.5.1.8__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.
- tess_ui-0.5.1.8/.agents/skills/issue-workflow/SKILL.md +63 -0
- tess_ui-0.5.1.8/.agents/skills/live-check/SKILL.md +33 -0
- tess_ui-0.5.1.8/.agents/skills/release-checklist/SKILL.md +54 -0
- tess_ui-0.5.1.8/.agents/skills/research-mode/SKILL.md +37 -0
- tess_ui-0.5.1.8/.agents/skills/yaml-view-authoring/SKILL.md +60 -0
- tess_ui-0.5.1.8/.claude/hooks/after_commit.sh +7 -0
- tess_ui-0.5.1.8/.claude/hooks/bash_guard.sh +16 -0
- tess_ui-0.5.1.8/.claude/hooks/ruff_edit.sh +11 -0
- tess_ui-0.5.1.8/.claude/hooks/stop_docs.sh +10 -0
- tess_ui-0.5.1.8/.claude/hooks/tests_for_edit.sh +16 -0
- tess_ui-0.5.1.8/.claude/settings.json +79 -0
- tess_ui-0.5.1.8/.github/workflows/ci.yml +383 -0
- tess_ui-0.5.1.8/.github/workflows/docs.yml +58 -0
- tess_ui-0.5.1.8/.github/workflows/release.yml +102 -0
- tess_ui-0.5.1.8/.gitignore +15 -0
- tess_ui-0.5.1.8/AGENTS.md +46 -0
- tess_ui-0.5.1.8/ARCHITECTURE.md +4 -0
- tess_ui-0.5.1.8/BUILD_TRACKER_ARCHIVE_0.2.md +2236 -0
- tess_ui-0.5.1.8/CHANGELOG.md +4 -0
- tess_ui-0.5.1.8/CLAUDE.md +1 -0
- tess_ui-0.5.1.8/COMPONENT_LIST.md +219 -0
- tess_ui-0.5.1.8/DEVELOPING.md +129 -0
- tess_ui-0.5.1.8/LICENSE +21 -0
- tess_ui-0.5.1.8/LOG.md +3129 -0
- tess_ui-0.5.1.8/PKG-INFO +207 -0
- tess_ui-0.5.1.8/PLAN.md +230 -0
- tess_ui-0.5.1.8/README.md +169 -0
- tess_ui-0.5.1.8/design/component-order.md +326 -0
- tess_ui-0.5.1.8/design/tre-requests/absolute-insets.md +38 -0
- tess_ui-0.5.1.8/design/tre-requests/accessibility-states.md +36 -0
- tess_ui-0.5.1.8/design/tre-requests/anchored-layout.md +36 -0
- tess_ui-0.5.1.8/design/tre-requests/layout-animation.md +25 -0
- tess_ui-0.5.1.8/design/tre-requests/scroll-snap.md +27 -0
- tess_ui-0.5.1.8/design/tre-requests/second-window.md +22 -0
- tess_ui-0.5.1.8/design/tre-requests/shape-masks.md +37 -0
- tess_ui-0.5.1.8/design/tre-requests/text-input-effects.md +29 -0
- tess_ui-0.5.1.8/design/tre-requests/text-input.md +28 -0
- tess_ui-0.5.1.8/design/tre-requests/timers.md +23 -0
- tess_ui-0.5.1.8/design/yaml-language.md +739 -0
- tess_ui-0.5.1.8/docs/api/python.md +2319 -0
- tess_ui-0.5.1.8/docs/api/yaml.md +636 -0
- tess_ui-0.5.1.8/docs/architecture.md +151 -0
- tess_ui-0.5.1.8/docs/changelog.md +1269 -0
- tess_ui-0.5.1.8/docs/components/accordions.md +100 -0
- tess_ui-0.5.1.8/docs/components/badges.md +86 -0
- tess_ui-0.5.1.8/docs/components/button-groups.md +72 -0
- tess_ui-0.5.1.8/docs/components/buttons.md +94 -0
- tess_ui-0.5.1.8/docs/components/cards.md +91 -0
- tess_ui-0.5.1.8/docs/components/carousel.md +85 -0
- tess_ui-0.5.1.8/docs/components/checkboxes.md +59 -0
- tess_ui-0.5.1.8/docs/components/chips.md +110 -0
- tess_ui-0.5.1.8/docs/components/date-pickers.md +100 -0
- tess_ui-0.5.1.8/docs/components/dialogs.md +99 -0
- tess_ui-0.5.1.8/docs/components/dividers.md +84 -0
- tess_ui-0.5.1.8/docs/components/dock-panel.md +75 -0
- tess_ui-0.5.1.8/docs/components/dock.md +65 -0
- tess_ui-0.5.1.8/docs/components/extended-fabs.md +39 -0
- tess_ui-0.5.1.8/docs/components/fabs.md +88 -0
- tess_ui-0.5.1.8/docs/components/icon-buttons.md +86 -0
- tess_ui-0.5.1.8/docs/components/images.md +63 -0
- tess_ui-0.5.1.8/docs/components/index.md +93 -0
- tess_ui-0.5.1.8/docs/components/links.md +69 -0
- tess_ui-0.5.1.8/docs/components/lists.md +94 -0
- tess_ui-0.5.1.8/docs/components/menus.md +116 -0
- tess_ui-0.5.1.8/docs/components/navigation-drawer.md +157 -0
- tess_ui-0.5.1.8/docs/components/navigation-rail.md +133 -0
- tess_ui-0.5.1.8/docs/components/node-graph.md +78 -0
- tess_ui-0.5.1.8/docs/components/pagination.md +76 -0
- tess_ui-0.5.1.8/docs/components/progress-indicators.md +95 -0
- tess_ui-0.5.1.8/docs/components/radio-buttons.md +60 -0
- tess_ui-0.5.1.8/docs/components/routed-views.md +60 -0
- tess_ui-0.5.1.8/docs/components/search.md +114 -0
- tess_ui-0.5.1.8/docs/components/segmented-buttons.md +67 -0
- tess_ui-0.5.1.8/docs/components/side-sheets.md +128 -0
- tess_ui-0.5.1.8/docs/components/sliders.md +105 -0
- tess_ui-0.5.1.8/docs/components/snackbars.md +106 -0
- tess_ui-0.5.1.8/docs/components/spin-boxes.md +103 -0
- tess_ui-0.5.1.8/docs/components/split-buttons.md +70 -0
- tess_ui-0.5.1.8/docs/components/splitter.md +66 -0
- tess_ui-0.5.1.8/docs/components/status-bar.md +87 -0
- tess_ui-0.5.1.8/docs/components/svg.md +64 -0
- tess_ui-0.5.1.8/docs/components/switches.md +54 -0
- tess_ui-0.5.1.8/docs/components/tabs.md +66 -0
- tess_ui-0.5.1.8/docs/components/text-fields.md +190 -0
- tess_ui-0.5.1.8/docs/components/text.md +76 -0
- tess_ui-0.5.1.8/docs/components/time-input.md +73 -0
- tess_ui-0.5.1.8/docs/components/time-pickers.md +116 -0
- tess_ui-0.5.1.8/docs/components/title-bar.md +54 -0
- tess_ui-0.5.1.8/docs/components/toolbars.md +107 -0
- tess_ui-0.5.1.8/docs/components/tooltips.md +44 -0
- tess_ui-0.5.1.8/docs/components/top-app-bar.md +95 -0
- tess_ui-0.5.1.8/docs/components/trees.md +120 -0
- tess_ui-0.5.1.8/docs/components/video.md +90 -0
- tess_ui-0.5.1.8/docs/components/window.md +81 -0
- tess_ui-0.5.1.8/docs/getting-started.md +188 -0
- tess_ui-0.5.1.8/docs/guide/apps-and-screens.md +300 -0
- tess_ui-0.5.1.8/docs/guide/bindings.md +120 -0
- tess_ui-0.5.1.8/docs/guide/cli.md +88 -0
- tess_ui-0.5.1.8/docs/guide/component-fragments.md +294 -0
- tess_ui-0.5.1.8/docs/guide/components.md +161 -0
- tess_ui-0.5.1.8/docs/guide/controls.md +112 -0
- tess_ui-0.5.1.8/docs/guide/custom-title-bars.md +224 -0
- tess_ui-0.5.1.8/docs/guide/docking.md +58 -0
- tess_ui-0.5.1.8/docs/guide/editor-support.md +116 -0
- tess_ui-0.5.1.8/docs/guide/effects.md +231 -0
- tess_ui-0.5.1.8/docs/guide/gestures.md +68 -0
- tess_ui-0.5.1.8/docs/guide/hot-reload.md +185 -0
- tess_ui-0.5.1.8/docs/guide/interaction.md +248 -0
- tess_ui-0.5.1.8/docs/guide/layout.md +399 -0
- tess_ui-0.5.1.8/docs/guide/logging.md +74 -0
- tess_ui-0.5.1.8/docs/guide/naming-convention.md +119 -0
- tess_ui-0.5.1.8/docs/guide/overlays.md +197 -0
- tess_ui-0.5.1.8/docs/guide/projects.md +106 -0
- tess_ui-0.5.1.8/docs/guide/reactivity.md +99 -0
- tess_ui-0.5.1.8/docs/guide/releasing.md +343 -0
- tess_ui-0.5.1.8/docs/guide/repeater.md +104 -0
- tess_ui-0.5.1.8/docs/guide/rich-text.md +112 -0
- tess_ui-0.5.1.8/docs/guide/view-language.md +550 -0
- tess_ui-0.5.1.8/docs/guide/widget-catalog.md +124 -0
- tess_ui-0.5.1.8/docs/guide/window-options.md +69 -0
- tess_ui-0.5.1.8/docs/guide/windows-and-docks.md +271 -0
- tess_ui-0.5.1.8/docs/index.md +89 -0
- tess_ui-0.5.1.8/docs/installation.md +88 -0
- tess_ui-0.5.1.8/docs/migration.md +403 -0
- tess_ui-0.5.1.8/docs/schema/tesserae-component-schema.json +10398 -0
- tess_ui-0.5.1.8/docs/schema/tesserae-style-schema.json +2127 -0
- tess_ui-0.5.1.8/docs/schema/tesserae-stylesheet-schema.json +2751 -0
- tess_ui-0.5.1.8/docs/schema/tesserae-theme-schema.json +3561 -0
- tess_ui-0.5.1.8/docs/schema/tesserae-widget-schema.json +20840 -0
- tess_ui-0.5.1.8/docs/schema/tesserae-yaml-schema.json +8551 -0
- tess_ui-0.5.1.8/docs/stylesheets/accordions/accordion.md +65 -0
- tess_ui-0.5.1.8/docs/stylesheets/badges/badge.md +66 -0
- tess_ui-0.5.1.8/docs/stylesheets/buttons/button.md +190 -0
- tess_ui-0.5.1.8/docs/stylesheets/cards/card.md +90 -0
- tess_ui-0.5.1.8/docs/stylesheets/carousel/carousel.md +44 -0
- tess_ui-0.5.1.8/docs/stylesheets/chips/chip.md +111 -0
- tess_ui-0.5.1.8/docs/stylesheets/date-pickers/date-picker-day.md +54 -0
- tess_ui-0.5.1.8/docs/stylesheets/date-pickers/date-picker.md +75 -0
- tess_ui-0.5.1.8/docs/stylesheets/dialogs/dialog.md +94 -0
- tess_ui-0.5.1.8/docs/stylesheets/dividers/divider.md +54 -0
- tess_ui-0.5.1.8/docs/stylesheets/fabs/fab.md +112 -0
- tess_ui-0.5.1.8/docs/stylesheets/icon-buttons/icon-button.md +104 -0
- tess_ui-0.5.1.8/docs/stylesheets/index.md +78 -0
- tess_ui-0.5.1.8/docs/stylesheets/lists/list-item.md +118 -0
- tess_ui-0.5.1.8/docs/stylesheets/menus/menu-item.md +73 -0
- tess_ui-0.5.1.8/docs/stylesheets/menus/menu.md +56 -0
- tess_ui-0.5.1.8/docs/stylesheets/navigation-drawer/navigation-drawer-item.md +70 -0
- tess_ui-0.5.1.8/docs/stylesheets/navigation-drawer/navigation-drawer-modal.md +46 -0
- tess_ui-0.5.1.8/docs/stylesheets/navigation-drawer/navigation-drawer-panel.md +47 -0
- tess_ui-0.5.1.8/docs/stylesheets/navigation-drawer/navigation-drawer-screens.md +38 -0
- tess_ui-0.5.1.8/docs/stylesheets/navigation-drawer/navigation-drawer.md +40 -0
- tess_ui-0.5.1.8/docs/stylesheets/navigation-rail/navigation-rail-item.md +95 -0
- tess_ui-0.5.1.8/docs/stylesheets/navigation-rail/navigation-rail.md +45 -0
- tess_ui-0.5.1.8/docs/stylesheets/pagination/pagination.md +44 -0
- tess_ui-0.5.1.8/docs/stylesheets/search/search-bar.md +163 -0
- tess_ui-0.5.1.8/docs/stylesheets/search/search-view.md +61 -0
- tess_ui-0.5.1.8/docs/stylesheets/side-sheets/side-sheet-modal.md +44 -0
- tess_ui-0.5.1.8/docs/stylesheets/side-sheets/side-sheet-panel.md +53 -0
- tess_ui-0.5.1.8/docs/stylesheets/side-sheets/side-sheet.md +38 -0
- tess_ui-0.5.1.8/docs/stylesheets/snackbars/snackbar.md +99 -0
- tess_ui-0.5.1.8/docs/stylesheets/spin-boxes/spin-box-field.md +47 -0
- tess_ui-0.5.1.8/docs/stylesheets/status-bar/status-bar.md +72 -0
- tess_ui-0.5.1.8/docs/stylesheets/text-fields/text-field.md +231 -0
- tess_ui-0.5.1.8/docs/stylesheets/time-input/time-input.md +37 -0
- tess_ui-0.5.1.8/docs/stylesheets/time-pickers/period-selector.md +40 -0
- tess_ui-0.5.1.8/docs/stylesheets/time-pickers/time-picker.md +61 -0
- tess_ui-0.5.1.8/docs/stylesheets/toolbars/toolbar.md +54 -0
- tess_ui-0.5.1.8/docs/stylesheets/top-app-bar/top-app-bar.md +60 -0
- tess_ui-0.5.1.8/docs/stylesheets/trees/tree-node.md +70 -0
- tess_ui-0.5.1.8/docs/stylesheets/video/video-player.md +51 -0
- tess_ui-0.5.1.8/docs/themes/index.md +389 -0
- tess_ui-0.5.1.8/docs/tutorial-project.md +223 -0
- tess_ui-0.5.1.8/docs/tutorial.md +239 -0
- tess_ui-0.5.1.8/examples/counter/Counter_View.yaml +18 -0
- tess_ui-0.5.1.8/examples/counter/Counter_ViewModel.py +17 -0
- tess_ui-0.5.1.8/examples/counter/app.py +44 -0
- tess_ui-0.5.1.8/examples/custom_title_bar/Home_View.yaml +65 -0
- tess_ui-0.5.1.8/examples/custom_title_bar/Home_ViewModel.py +12 -0
- tess_ui-0.5.1.8/examples/custom_title_bar/app.py +47 -0
- tess_ui-0.5.1.8/examples/getting_started/declarative/step1/Counter_View.yaml +3 -0
- tess_ui-0.5.1.8/examples/getting_started/declarative/step1/app.py +10 -0
- tess_ui-0.5.1.8/examples/getting_started/declarative/step2/Counter_View.yaml +10 -0
- tess_ui-0.5.1.8/examples/getting_started/declarative/step2/app.py +10 -0
- tess_ui-0.5.1.8/examples/getting_started/declarative/step3/Counter_View.yaml +21 -0
- tess_ui-0.5.1.8/examples/getting_started/declarative/step3/app.py +10 -0
- tess_ui-0.5.1.8/examples/getting_started/declarative/step4/Counter_View.yaml +23 -0
- tess_ui-0.5.1.8/examples/getting_started/declarative/step4/Counter_ViewModel.py +12 -0
- tess_ui-0.5.1.8/examples/getting_started/declarative/step4/app.py +13 -0
- tess_ui-0.5.1.8/examples/getting_started/imperative/step1/app.py +7 -0
- tess_ui-0.5.1.8/examples/getting_started/imperative/step2/app.py +10 -0
- tess_ui-0.5.1.8/examples/getting_started/imperative/step3/app.py +16 -0
- tess_ui-0.5.1.8/examples/getting_started/imperative/step4/app.py +28 -0
- tess_ui-0.5.1.8/examples/multi_screen/Home_View.yaml +9 -0
- tess_ui-0.5.1.8/examples/multi_screen/Home_ViewModel.py +12 -0
- tess_ui-0.5.1.8/examples/multi_screen/Settings_View.yaml +9 -0
- tess_ui-0.5.1.8/examples/multi_screen/Settings_ViewModel.py +11 -0
- tess_ui-0.5.1.8/examples/multi_screen/app.py +79 -0
- tess_ui-0.5.1.8/examples/todo_list/TodoItem_View.yaml +21 -0
- tess_ui-0.5.1.8/examples/todo_list/Todo_View.yaml +18 -0
- tess_ui-0.5.1.8/examples/todo_list/Todo_ViewModel.py +24 -0
- tess_ui-0.5.1.8/examples/todo_list/app.py +68 -0
- tess_ui-0.5.1.8/examples/tutorial/step1/Tasks_View.yaml +20 -0
- tess_ui-0.5.1.8/examples/tutorial/step1/Tasks_ViewModel.py +13 -0
- tess_ui-0.5.1.8/examples/tutorial/step1/app.py +13 -0
- tess_ui-0.5.1.8/examples/tutorial/step2/TaskItem_View.yaml +20 -0
- tess_ui-0.5.1.8/examples/tutorial/step2/Tasks_View.yaml +31 -0
- tess_ui-0.5.1.8/examples/tutorial/step2/Tasks_ViewModel.py +22 -0
- tess_ui-0.5.1.8/examples/tutorial/step2/app.py +13 -0
- tess_ui-0.5.1.8/examples/tutorial/step2.png +0 -0
- tess_ui-0.5.1.8/examples/tutorial/step3/Brand_Theme.yaml +4 -0
- tess_ui-0.5.1.8/examples/tutorial/step3/TaskItem_View.yaml +18 -0
- tess_ui-0.5.1.8/examples/tutorial/step3/Tasks_Stylesheet.yaml +11 -0
- tess_ui-0.5.1.8/examples/tutorial/step3/Tasks_View.yaml +32 -0
- tess_ui-0.5.1.8/examples/tutorial/step3/Tasks_ViewModel.py +22 -0
- tess_ui-0.5.1.8/examples/tutorial/step3/app.py +21 -0
- tess_ui-0.5.1.8/examples/tutorial/step3.png +0 -0
- tess_ui-0.5.1.8/examples/tutorial/step4/Brand_Theme.yaml +4 -0
- tess_ui-0.5.1.8/examples/tutorial/step4/Stat_View.yaml +15 -0
- tess_ui-0.5.1.8/examples/tutorial/step4/TaskItem_View.yaml +18 -0
- tess_ui-0.5.1.8/examples/tutorial/step4/Tasks_Stylesheet.yaml +17 -0
- tess_ui-0.5.1.8/examples/tutorial/step4/Tasks_View.yaml +33 -0
- tess_ui-0.5.1.8/examples/tutorial/step4/Tasks_ViewModel.py +24 -0
- tess_ui-0.5.1.8/examples/tutorial/step4/app.py +21 -0
- tess_ui-0.5.1.8/examples/tutorial/step4.png +0 -0
- tess_ui-0.5.1.8/examples/tutorial/step5/Brand_Theme.yaml +4 -0
- tess_ui-0.5.1.8/examples/tutorial/step5/Settings_View.yaml +26 -0
- tess_ui-0.5.1.8/examples/tutorial/step5/Settings_ViewModel.py +15 -0
- tess_ui-0.5.1.8/examples/tutorial/step5/Stat_View.yaml +15 -0
- tess_ui-0.5.1.8/examples/tutorial/step5/TaskItem_View.yaml +18 -0
- tess_ui-0.5.1.8/examples/tutorial/step5/Tasks_Stylesheet.yaml +17 -0
- tess_ui-0.5.1.8/examples/tutorial/step5/Tasks_View.yaml +33 -0
- tess_ui-0.5.1.8/examples/tutorial/step5/Tasks_ViewModel.py +27 -0
- tess_ui-0.5.1.8/examples/tutorial/step5/app.py +38 -0
- tess_ui-0.5.1.8/examples/tutorial/step5.png +0 -0
- tess_ui-0.5.1.8/examples/tutorial/step6/Brand_Theme.yaml +4 -0
- tess_ui-0.5.1.8/examples/tutorial/step6/Settings_View.yaml +15 -0
- tess_ui-0.5.1.8/examples/tutorial/step6/Stat_View.yaml +15 -0
- tess_ui-0.5.1.8/examples/tutorial/step6/TaskItem_View.yaml +18 -0
- tess_ui-0.5.1.8/examples/tutorial/step6/Tasks_Stylesheet.yaml +17 -0
- tess_ui-0.5.1.8/examples/tutorial/step6/Tasks_View.yaml +28 -0
- tess_ui-0.5.1.8/examples/tutorial/step6/Window_View.yaml +27 -0
- tess_ui-0.5.1.8/examples/tutorial/step6/Window_ViewModel.py +29 -0
- tess_ui-0.5.1.8/examples/tutorial/step6/app.py +31 -0
- tess_ui-0.5.1.8/examples/tutorial/step6.png +0 -0
- tess_ui-0.5.1.8/examples/tutorial/step6b.png +0 -0
- tess_ui-0.5.1.8/examples/tutorial_project/step1/ViewModels/Main_ViewModel.py +13 -0
- tess_ui-0.5.1.8/examples/tutorial_project/step1/Views/Main_View.yaml +20 -0
- tess_ui-0.5.1.8/examples/tutorial_project/step1/app.py +11 -0
- tess_ui-0.5.1.8/examples/tutorial_project/step2/ViewModels/Main_ViewModel.py +22 -0
- tess_ui-0.5.1.8/examples/tutorial_project/step2/Views/Main_View.yaml +31 -0
- tess_ui-0.5.1.8/examples/tutorial_project/step2/Views/TaskItem_View.yaml +20 -0
- tess_ui-0.5.1.8/examples/tutorial_project/step2/app.py +11 -0
- tess_ui-0.5.1.8/examples/tutorial_project/step3/Styles/Tasks_Stylesheet.yaml +11 -0
- tess_ui-0.5.1.8/examples/tutorial_project/step3/Themes/Brand_Theme.yaml +4 -0
- tess_ui-0.5.1.8/examples/tutorial_project/step3/ViewModels/Main_ViewModel.py +22 -0
- tess_ui-0.5.1.8/examples/tutorial_project/step3/Views/Main_View.yaml +32 -0
- tess_ui-0.5.1.8/examples/tutorial_project/step3/Views/TaskItem_View.yaml +18 -0
- tess_ui-0.5.1.8/examples/tutorial_project/step3/app.py +18 -0
- tess_ui-0.5.1.8/examples/tutorial_project/step4/Styles/Tasks_Stylesheet.yaml +17 -0
- tess_ui-0.5.1.8/examples/tutorial_project/step4/Themes/Brand_Theme.yaml +4 -0
- tess_ui-0.5.1.8/examples/tutorial_project/step4/ViewModels/Main_ViewModel.py +24 -0
- tess_ui-0.5.1.8/examples/tutorial_project/step4/Views/Main_View.yaml +33 -0
- tess_ui-0.5.1.8/examples/tutorial_project/step4/Views/Stat_View.yaml +15 -0
- tess_ui-0.5.1.8/examples/tutorial_project/step4/Views/TaskItem_View.yaml +18 -0
- tess_ui-0.5.1.8/examples/tutorial_project/step4/app.py +18 -0
- tess_ui-0.5.1.8/examples/tutorial_project/step5/Styles/Tasks_Stylesheet.yaml +17 -0
- tess_ui-0.5.1.8/examples/tutorial_project/step5/Themes/Brand_Theme.yaml +4 -0
- tess_ui-0.5.1.8/examples/tutorial_project/step5/ViewModels/Main_ViewModel.py +27 -0
- tess_ui-0.5.1.8/examples/tutorial_project/step5/ViewModels/Settings_ViewModel.py +15 -0
- tess_ui-0.5.1.8/examples/tutorial_project/step5/Views/Main_View.yaml +33 -0
- tess_ui-0.5.1.8/examples/tutorial_project/step5/Views/Settings_View.yaml +26 -0
- tess_ui-0.5.1.8/examples/tutorial_project/step5/Views/Stat_View.yaml +15 -0
- tess_ui-0.5.1.8/examples/tutorial_project/step5/Views/TaskItem_View.yaml +18 -0
- tess_ui-0.5.1.8/examples/tutorial_project/step5/app.py +26 -0
- tess_ui-0.5.1.8/examples/tutorial_project/step6/Styles/Tasks_Stylesheet.yaml +17 -0
- tess_ui-0.5.1.8/examples/tutorial_project/step6/Themes/Brand_Theme.yaml +4 -0
- tess_ui-0.5.1.8/examples/tutorial_project/step6/ViewModels/Window_ViewModel.py +29 -0
- tess_ui-0.5.1.8/examples/tutorial_project/step6/Views/Main_View.yaml +28 -0
- tess_ui-0.5.1.8/examples/tutorial_project/step6/Views/Settings_View.yaml +15 -0
- tess_ui-0.5.1.8/examples/tutorial_project/step6/Views/Stat_View.yaml +15 -0
- tess_ui-0.5.1.8/examples/tutorial_project/step6/Views/TaskItem_View.yaml +18 -0
- tess_ui-0.5.1.8/examples/tutorial_project/step6/Views/Window_View.yaml +27 -0
- tess_ui-0.5.1.8/examples/tutorial_project/step6/app.py +22 -0
- tess_ui-0.5.1.8/examples/typing_effects/Views/Main_View.yaml +24 -0
- tess_ui-0.5.1.8/examples/typing_effects/app.py +69 -0
- tess_ui-0.5.1.8/examples/window_dock/Console_View.yaml +10 -0
- tess_ui-0.5.1.8/examples/window_dock/Files_View.yaml +25 -0
- tess_ui-0.5.1.8/examples/window_dock/Home_View.yaml +15 -0
- tess_ui-0.5.1.8/examples/window_dock/Notes_View.yaml +21 -0
- tess_ui-0.5.1.8/examples/window_dock/Outline_View.yaml +15 -0
- tess_ui-0.5.1.8/examples/window_dock/Properties_View.yaml +15 -0
- tess_ui-0.5.1.8/examples/window_dock/Window_View.yaml +90 -0
- tess_ui-0.5.1.8/examples/window_dock/Window_ViewModel.py +17 -0
- tess_ui-0.5.1.8/examples/window_dock/app.py +91 -0
- tess_ui-0.5.1.8/mkdocs.yml +227 -0
- tess_ui-0.5.1.8/pyproject.toml +52 -0
- tess_ui-0.5.1.8/spike-results/drag-20261011-011405.json +59322 -0
- tess_ui-0.5.1.8/spike-results/drag-20261011-011405.txt +2 -0
- tess_ui-0.5.1.8/spike-results/drag-20261011-011603.json +73572 -0
- tess_ui-0.5.1.8/spike-results/drag-20261011-011603.txt +13 -0
- tess_ui-0.5.1.8/spike-results/drag-20261011-011723.json +97743 -0
- tess_ui-0.5.1.8/spike-results/drag-20261011-011723.txt +13 -0
- tess_ui-0.5.1.8/spike-results/second-window-20261008-232135.json +68 -0
- tess_ui-0.5.1.8/spike-results/second-window-20261008-232135.txt +8 -0
- tess_ui-0.5.1.8/spike-results/second-window-20261008-232229.json +68 -0
- tess_ui-0.5.1.8/spike-results/second-window-20261008-232229.txt +8 -0
- tess_ui-0.5.1.8/src/tesserae/__init__.py +45 -0
- tess_ui-0.5.1.8/src/tesserae/__main__.py +7 -0
- tess_ui-0.5.1.8/src/tesserae/_wide_gamut.py +336 -0
- tess_ui-0.5.1.8/src/tesserae/a11y.py +187 -0
- tess_ui-0.5.1.8/src/tesserae/app.py +1880 -0
- tess_ui-0.5.1.8/src/tesserae/appwindows.py +94 -0
- tess_ui-0.5.1.8/src/tesserae/binding.py +176 -0
- tess_ui-0.5.1.8/src/tesserae/build.py +789 -0
- tess_ui-0.5.1.8/src/tesserae/cli.py +372 -0
- tess_ui-0.5.1.8/src/tesserae/component.py +143 -0
- tess_ui-0.5.1.8/src/tesserae/composed.py +1290 -0
- tess_ui-0.5.1.8/src/tesserae/controls.py +1956 -0
- tess_ui-0.5.1.8/src/tesserae/dockhost.py +688 -0
- tess_ui-0.5.1.8/src/tesserae/docking.py +764 -0
- tess_ui-0.5.1.8/src/tesserae/expr.py +1198 -0
- tess_ui-0.5.1.8/src/tesserae/focusring.py +72 -0
- tess_ui-0.5.1.8/src/tesserae/follow.py +94 -0
- tess_ui-0.5.1.8/src/tesserae/fonts.py +94 -0
- tess_ui-0.5.1.8/src/tesserae/icon_data/NOTICE.md +2 -0
- tess_ui-0.5.1.8/src/tesserae/icon_data/mdi.json +1 -0
- tess_ui-0.5.1.8/src/tesserae/icons.py +68 -0
- tess_ui-0.5.1.8/src/tesserae/images.py +32 -0
- tess_ui-0.5.1.8/src/tesserae/interaction.py +349 -0
- tess_ui-0.5.1.8/src/tesserae/listeners.py +79 -0
- tess_ui-0.5.1.8/src/tesserae/log.py +73 -0
- tess_ui-0.5.1.8/src/tesserae/migrate.py +261 -0
- tess_ui-0.5.1.8/src/tesserae/motion.py +24 -0
- tess_ui-0.5.1.8/src/tesserae/naming.py +46 -0
- tess_ui-0.5.1.8/src/tesserae/overlays.py +694 -0
- tess_ui-0.5.1.8/src/tesserae/project.py +256 -0
- tess_ui-0.5.1.8/src/tesserae/reactive.py +340 -0
- tess_ui-0.5.1.8/src/tesserae/repeater.py +112 -0
- tess_ui-0.5.1.8/src/tesserae/ripple.py +182 -0
- tess_ui-0.5.1.8/src/tesserae/schema/tesserae-component-schema.json +10398 -0
- tess_ui-0.5.1.8/src/tesserae/schema/tesserae-style-schema.json +2127 -0
- tess_ui-0.5.1.8/src/tesserae/schema/tesserae-stylesheet-schema.json +2751 -0
- tess_ui-0.5.1.8/src/tesserae/schema/tesserae-theme-schema.json +3561 -0
- tess_ui-0.5.1.8/src/tesserae/schema/tesserae-widget-schema.json +20840 -0
- tess_ui-0.5.1.8/src/tesserae/schema/tesserae-yaml-schema.json +8551 -0
- tess_ui-0.5.1.8/src/tesserae/screen_transition.py +142 -0
- tess_ui-0.5.1.8/src/tesserae/scrolling.py +46 -0
- tess_ui-0.5.1.8/src/tesserae/shipped.py +135 -0
- tess_ui-0.5.1.8/src/tesserae/spec/__init__.py +14 -0
- tess_ui-0.5.1.8/src/tesserae/spec/build.py +1442 -0
- tess_ui-0.5.1.8/src/tesserae/spec/builtin_widgets.py +202 -0
- tess_ui-0.5.1.8/src/tesserae/spec/canvas.py +92 -0
- tess_ui-0.5.1.8/src/tesserae/spec/cascade.py +224 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/AccordionHeader_Component.yaml +16 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/AccordionHeader_Stylesheet.yaml +20 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/BadgeDot_Component.yaml +3 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/BadgeDot_Stylesheet.yaml +9 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/BadgeLabeled_Component.yaml +12 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/BadgeLabeled_Stylesheet.yaml +13 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/ButtonElevated_Component.yaml +12 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/ButtonElevated_Stylesheet.yaml +19 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/ButtonFilledTonal_Component.yaml +12 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/ButtonFilledTonal_Stylesheet.yaml +18 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/ButtonFilled_Component.yaml +12 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/ButtonFilled_Stylesheet.yaml +18 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/ButtonGroup_Component.yaml +18 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/ButtonGroup_Stylesheet.yaml +7 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/ButtonOutlined_Component.yaml +12 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/ButtonOutlined_Stylesheet.yaml +20 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/ButtonText_Component.yaml +12 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/ButtonText_Stylesheet.yaml +18 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/CardElevated_Component.yaml +5 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/CardElevated_Stylesheet.yaml +10 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/CardFilled_Component.yaml +5 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/CardFilled_Stylesheet.yaml +9 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/CardOutlined_Component.yaml +5 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/CardOutlined_Stylesheet.yaml +11 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/Checkbox_Component.yaml +6 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/Checkbox_Stylesheet.yaml +8 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/ChipAssist_Component.yaml +12 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/ChipAssist_Stylesheet.yaml +21 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/ChipFilterSelected_Component.yaml +15 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/ChipFilterSelected_Stylesheet.yaml +24 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/ChipFilter_Component.yaml +12 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/ChipFilter_Stylesheet.yaml +21 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/ChipInput_Component.yaml +12 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/ChipInput_Stylesheet.yaml +21 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/ChipSuggestion_Component.yaml +12 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/ChipSuggestion_Stylesheet.yaml +21 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/CircularProgress_Component.yaml +6 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/CircularProgress_Stylesheet.yaml +7 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/DatePickerDayOutsideMonth_Component.yaml +12 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/DatePickerDayOutsideMonth_Stylesheet.yaml +13 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/DatePickerDaySelected_Component.yaml +12 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/DatePickerDaySelected_Stylesheet.yaml +13 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/DatePickerDayToday_Component.yaml +12 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/DatePickerDayToday_Stylesheet.yaml +15 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/DatePickerDay_Component.yaml +12 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/DatePickerDay_Stylesheet.yaml +13 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/Dialog_Component.yaml +19 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/Dialog_Stylesheet.yaml +26 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/Divider_Component.yaml +5 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/Divider_Stylesheet.yaml +8 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/ExtendedFabPrimary_Component.yaml +20 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/ExtendedFabPrimary_Stylesheet.yaml +36 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/ExtendedFabSecondary_Component.yaml +20 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/ExtendedFabSecondary_Stylesheet.yaml +36 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/ExtendedFabSurface_Component.yaml +20 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/ExtendedFabSurface_Stylesheet.yaml +36 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/ExtendedFabTertiary_Component.yaml +20 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/ExtendedFabTertiary_Stylesheet.yaml +36 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/FabPrimary_Component.yaml +15 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/FabPrimary_Stylesheet.yaml +16 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/FabSecondary_Component.yaml +15 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/FabSecondary_Stylesheet.yaml +16 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/FabSurface_Component.yaml +15 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/FabSurface_Stylesheet.yaml +16 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/FabTertiary_Component.yaml +15 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/FabTertiary_Stylesheet.yaml +16 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/IconButtonFilledTonal_Component.yaml +10 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/IconButtonFilledTonal_Stylesheet.yaml +15 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/IconButtonFilled_Component.yaml +10 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/IconButtonFilled_Stylesheet.yaml +15 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/IconButtonOutlined_Component.yaml +10 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/IconButtonOutlined_Stylesheet.yaml +17 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/IconButtonStandard_Component.yaml +10 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/IconButtonStandard_Stylesheet.yaml +15 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/Image_Component.yaml +8 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/Image_Stylesheet.yaml +7 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/LinearProgress_Component.yaml +6 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/LinearProgress_Stylesheet.yaml +7 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/Link_Component.yaml +15 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/Link_Stylesheet.yaml +8 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/ListItem_Component.yaml +13 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/ListItem_Stylesheet.yaml +14 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/LoadingIndicator_Component.yaml +5 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/LoadingIndicator_Stylesheet.yaml +8 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/MenuItem_Component.yaml +17 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/MenuItem_Stylesheet.yaml +14 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/Menu_Component.yaml +13 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/Menu_Stylesheet.yaml +15 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/NavigationDrawerItem_Component.yaml +21 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/NavigationDrawerItem_Stylesheet.yaml +36 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/NavigationDrawer_Component.yaml +11 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/NavigationDrawer_Stylesheet.yaml +9 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/NavigationRailItem_Component.yaml +22 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/NavigationRailItem_Stylesheet.yaml +34 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/NavigationRailScreen_Component.yaml +31 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/NavigationRailScreen_Stylesheet.yaml +26 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/NavigationRailScreens_Component.yaml +9 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/NavigationRailScreens_Stylesheet.yaml +15 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/NavigationRail_Component.yaml +9 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/NavigationRail_Stylesheet.yaml +15 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/NodeGraph_Component.yaml +5 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/NodeGraph_Stylesheet.yaml +8 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/PeriodSelectorAM_Component.yaml +17 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/PeriodSelectorAM_Stylesheet.yaml +28 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/PeriodSelectorPM_Component.yaml +17 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/PeriodSelectorPM_Stylesheet.yaml +28 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/RadioButton_Component.yaml +6 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/RadioButton_Stylesheet.yaml +7 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/SearchBar_Component.yaml +13 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/SearchBar_Stylesheet.yaml +20 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/SearchView_Component.yaml +5 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/SearchView_Stylesheet.yaml +10 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/SideSheetModal_Component.yaml +7 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/SideSheetModal_Stylesheet.yaml +16 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/SideSheetStandard_Component.yaml +5 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/SideSheetStandard_Stylesheet.yaml +9 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/Slider_Component.yaml +6 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/Slider_Stylesheet.yaml +8 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/Snackbar_Component.yaml +11 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/Snackbar_Stylesheet.yaml +20 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/SpinBox_Component.yaml +12 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/SplitButtonElevated_Component.yaml +21 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/SplitButtonElevated_Stylesheet.yaml +36 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/SplitButtonFilledTonal_Component.yaml +21 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/SplitButtonFilledTonal_Stylesheet.yaml +34 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/SplitButtonFilled_Component.yaml +21 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/SplitButtonFilled_Stylesheet.yaml +34 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/SplitButtonOutlined_Component.yaml +21 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/SplitButtonOutlined_Stylesheet.yaml +38 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/SplitButtonText_Component.yaml +21 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/SplitButtonText_Stylesheet.yaml +34 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/StatusBar_Component.yaml +13 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/StatusBar_Stylesheet.yaml +19 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/Switch_Component.yaml +6 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/Switch_Stylesheet.yaml +7 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/TabsItem_Component.yaml +29 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/TabsItem_Stylesheet.yaml +52 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/Tabs_Component.yaml +15 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/Tabs_Stylesheet.yaml +15 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/Text_Component.yaml +15 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/Text_Stylesheet.yaml +6 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/TimePickerDial_Component.yaml +7 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/TimePickerDial_Stylesheet.yaml +7 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/ToolbarDocked_Component.yaml +6 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/ToolbarDocked_Stylesheet.yaml +12 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/ToolbarFloating_Component.yaml +6 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/ToolbarFloating_Stylesheet.yaml +14 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/Tooltip_Component.yaml +13 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/Tooltip_Stylesheet.yaml +20 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/TopAppBar_Component.yaml +13 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/TopAppBar_Stylesheet.yaml +24 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/TreeNodeBranch_Component.yaml +16 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/TreeNodeBranch_Stylesheet.yaml +24 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/TreeNodeLeaf_Component.yaml +13 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/TreeNodeLeaf_Stylesheet.yaml +18 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/Video_Component.yaml +16 -0
- tess_ui-0.5.1.8/src/tesserae/spec/components/Video_Stylesheet.yaml +7 -0
- tess_ui-0.5.1.8/src/tesserae/spec/compose.py +1162 -0
- tess_ui-0.5.1.8/src/tesserae/spec/default_theme.yaml +91 -0
- tess_ui-0.5.1.8/src/tesserae/spec/dock.py +156 -0
- tess_ui-0.5.1.8/src/tesserae/spec/effects.py +267 -0
- tess_ui-0.5.1.8/src/tesserae/spec/embed.py +86 -0
- tess_ui-0.5.1.8/src/tesserae/spec/expand.py +683 -0
- tess_ui-0.5.1.8/src/tesserae/spec/images.py +157 -0
- tess_ui-0.5.1.8/src/tesserae/spec/layout.py +157 -0
- tess_ui-0.5.1.8/src/tesserae/spec/load.py +125 -0
- tess_ui-0.5.1.8/src/tesserae/spec/lower.py +201 -0
- tess_ui-0.5.1.8/src/tesserae/spec/marker.py +87 -0
- tess_ui-0.5.1.8/src/tesserae/spec/mask.py +85 -0
- tess_ui-0.5.1.8/src/tesserae/spec/nodes.py +627 -0
- tess_ui-0.5.1.8/src/tesserae/spec/placement.py +44 -0
- tess_ui-0.5.1.8/src/tesserae/spec/richtext.py +103 -0
- tess_ui-0.5.1.8/src/tesserae/spec/rules.py +238 -0
- tess_ui-0.5.1.8/src/tesserae/spec/sizes.py +72 -0
- tess_ui-0.5.1.8/src/tesserae/spec/svg.py +131 -0
- tess_ui-0.5.1.8/src/tesserae/spec/themes.py +109 -0
- tess_ui-0.5.1.8/src/tesserae/spec/title_bar.py +205 -0
- tess_ui-0.5.1.8/src/tesserae/spec/transition.py +122 -0
- tess_ui-0.5.1.8/src/tesserae/spec/translate.py +289 -0
- tess_ui-0.5.1.8/src/tesserae/spec/watch.py +409 -0
- tess_ui-0.5.1.8/src/tesserae/spec/widgets.py +427 -0
- tess_ui-0.5.1.8/src/tesserae/spec/window.py +137 -0
- tess_ui-0.5.1.8/src/tesserae/templates/Main_View.yaml.tmpl +19 -0
- tess_ui-0.5.1.8/src/tesserae/templates/Main_ViewModel.py.tmpl +16 -0
- tess_ui-0.5.1.8/src/tesserae/templates/Screen_View.yaml.tmpl +13 -0
- tess_ui-0.5.1.8/src/tesserae/templates/Screen_ViewModel.py.tmpl +14 -0
- tess_ui-0.5.1.8/src/tesserae/templates/WindowMain_View.yaml.tmpl +19 -0
- tess_ui-0.5.1.8/src/tesserae/templates/WindowScreen_View.yaml.tmpl +13 -0
- tess_ui-0.5.1.8/src/tesserae/templates/Window_View.yaml.tmpl +23 -0
- tess_ui-0.5.1.8/src/tesserae/templates/Window_ViewModel.py.tmpl +19 -0
- tess_ui-0.5.1.8/src/tesserae/templates/app.py.tmpl +40 -0
- tess_ui-0.5.1.8/src/tesserae/templates/app_window.py.tmpl +39 -0
- tess_ui-0.5.1.8/src/tesserae/theme.py +209 -0
- tess_ui-0.5.1.8/src/tesserae/timers.py +74 -0
- tess_ui-0.5.1.8/src/tesserae/tokens.py +383 -0
- tess_ui-0.5.1.8/src/tesserae/typing_effects.py +210 -0
- tess_ui-0.5.1.8/src/tesserae/urls.py +36 -0
- tess_ui-0.5.1.8/src/tesserae/view.py +1261 -0
- tess_ui-0.5.1.8/src/tesserae/viewmodel.py +338 -0
- tess_ui-0.5.1.8/src/tesserae/views/AccordionGroup_View.yaml +26 -0
- tess_ui-0.5.1.8/src/tesserae/views/Accordion_Stylesheet.yaml +11 -0
- tess_ui-0.5.1.8/src/tesserae/views/Accordion_View.yaml +39 -0
- tess_ui-0.5.1.8/src/tesserae/views/Badge_Stylesheet.yaml +19 -0
- tess_ui-0.5.1.8/src/tesserae/views/Badge_View.yaml +28 -0
- tess_ui-0.5.1.8/src/tesserae/views/ButtonGroup_View.yaml +39 -0
- tess_ui-0.5.1.8/src/tesserae/views/Button_Stylesheet.yaml +94 -0
- tess_ui-0.5.1.8/src/tesserae/views/Button_View.yaml +49 -0
- tess_ui-0.5.1.8/src/tesserae/views/Card_Stylesheet.yaml +24 -0
- tess_ui-0.5.1.8/src/tesserae/views/Card_View.yaml +46 -0
- tess_ui-0.5.1.8/src/tesserae/views/Carousel_Stylesheet.yaml +5 -0
- tess_ui-0.5.1.8/src/tesserae/views/Carousel_View.yaml +52 -0
- tess_ui-0.5.1.8/src/tesserae/views/ChipGroup_View.yaml +48 -0
- tess_ui-0.5.1.8/src/tesserae/views/Chip_Stylesheet.yaml +25 -0
- tess_ui-0.5.1.8/src/tesserae/views/Chip_View.yaml +50 -0
- tess_ui-0.5.1.8/src/tesserae/views/DatePickerDay_Stylesheet.yaml +13 -0
- tess_ui-0.5.1.8/src/tesserae/views/DatePickerDay_View.yaml +29 -0
- tess_ui-0.5.1.8/src/tesserae/views/DatePicker_Stylesheet.yaml +15 -0
- tess_ui-0.5.1.8/src/tesserae/views/DatePicker_View.yaml +109 -0
- tess_ui-0.5.1.8/src/tesserae/views/Dialog_Stylesheet.yaml +18 -0
- tess_ui-0.5.1.8/src/tesserae/views/Dialog_View.yaml +98 -0
- tess_ui-0.5.1.8/src/tesserae/views/Divider_Stylesheet.yaml +18 -0
- tess_ui-0.5.1.8/src/tesserae/views/Divider_View.yaml +10 -0
- tess_ui-0.5.1.8/src/tesserae/views/Fab_Stylesheet.yaml +39 -0
- tess_ui-0.5.1.8/src/tesserae/views/Fab_View.yaml +32 -0
- tess_ui-0.5.1.8/src/tesserae/views/IconButton_Stylesheet.yaml +40 -0
- tess_ui-0.5.1.8/src/tesserae/views/IconButton_View.yaml +34 -0
- tess_ui-0.5.1.8/src/tesserae/views/Link_Stylesheet.yaml +12 -0
- tess_ui-0.5.1.8/src/tesserae/views/ListItem_Stylesheet.yaml +20 -0
- tess_ui-0.5.1.8/src/tesserae/views/ListItem_View.yaml +73 -0
- tess_ui-0.5.1.8/src/tesserae/views/MenuItem_Stylesheet.yaml +11 -0
- tess_ui-0.5.1.8/src/tesserae/views/MenuItem_View.yaml +39 -0
- tess_ui-0.5.1.8/src/tesserae/views/Menu_Stylesheet.yaml +12 -0
- tess_ui-0.5.1.8/src/tesserae/views/Menu_View.yaml +72 -0
- tess_ui-0.5.1.8/src/tesserae/views/NavigationDrawerItem_Stylesheet.yaml +14 -0
- tess_ui-0.5.1.8/src/tesserae/views/NavigationDrawerItem_View.yaml +29 -0
- tess_ui-0.5.1.8/src/tesserae/views/NavigationDrawerModal_Stylesheet.yaml +10 -0
- tess_ui-0.5.1.8/src/tesserae/views/NavigationDrawerModal_View.yaml +34 -0
- tess_ui-0.5.1.8/src/tesserae/views/NavigationDrawerPanel_Stylesheet.yaml +7 -0
- tess_ui-0.5.1.8/src/tesserae/views/NavigationDrawerPanel_View.yaml +45 -0
- tess_ui-0.5.1.8/src/tesserae/views/NavigationDrawerScreens_Stylesheet.yaml +4 -0
- tess_ui-0.5.1.8/src/tesserae/views/NavigationDrawerScreens_View.yaml +32 -0
- tess_ui-0.5.1.8/src/tesserae/views/NavigationDrawer_Stylesheet.yaml +7 -0
- tess_ui-0.5.1.8/src/tesserae/views/NavigationDrawer_View.yaml +30 -0
- tess_ui-0.5.1.8/src/tesserae/views/NavigationRailItem_Stylesheet.yaml +22 -0
- tess_ui-0.5.1.8/src/tesserae/views/NavigationRailItem_View.yaml +37 -0
- tess_ui-0.5.1.8/src/tesserae/views/NavigationRailScreen_View.yaml +17 -0
- tess_ui-0.5.1.8/src/tesserae/views/NavigationRailScreens_View.yaml +28 -0
- tess_ui-0.5.1.8/src/tesserae/views/NavigationRail_Stylesheet.yaml +10 -0
- tess_ui-0.5.1.8/src/tesserae/views/NavigationRail_View.yaml +44 -0
- tess_ui-0.5.1.8/src/tesserae/views/Pagination_Stylesheet.yaml +5 -0
- tess_ui-0.5.1.8/src/tesserae/views/Pagination_View.yaml +70 -0
- tess_ui-0.5.1.8/src/tesserae/views/PeriodSelector_Stylesheet.yaml +6 -0
- tess_ui-0.5.1.8/src/tesserae/views/PeriodSelector_View.yaml +29 -0
- tess_ui-0.5.1.8/src/tesserae/views/SearchBar_Stylesheet.yaml +35 -0
- tess_ui-0.5.1.8/src/tesserae/views/SearchBar_View.yaml +73 -0
- tess_ui-0.5.1.8/src/tesserae/views/SearchView_Stylesheet.yaml +12 -0
- tess_ui-0.5.1.8/src/tesserae/views/SearchView_View.yaml +41 -0
- tess_ui-0.5.1.8/src/tesserae/views/SegmentedButton_View.yaml +50 -0
- tess_ui-0.5.1.8/src/tesserae/views/SideSheetModal_Stylesheet.yaml +9 -0
- tess_ui-0.5.1.8/src/tesserae/views/SideSheetModal_View.yaml +40 -0
- tess_ui-0.5.1.8/src/tesserae/views/SideSheetPanel_Stylesheet.yaml +8 -0
- tess_ui-0.5.1.8/src/tesserae/views/SideSheetPanel_View.yaml +44 -0
- tess_ui-0.5.1.8/src/tesserae/views/SideSheet_Stylesheet.yaml +6 -0
- tess_ui-0.5.1.8/src/tesserae/views/SideSheet_View.yaml +32 -0
- tess_ui-0.5.1.8/src/tesserae/views/SnackbarHost_View.yaml +26 -0
- tess_ui-0.5.1.8/src/tesserae/views/Snackbar_Stylesheet.yaml +21 -0
- tess_ui-0.5.1.8/src/tesserae/views/Snackbar_View.yaml +59 -0
- tess_ui-0.5.1.8/src/tesserae/views/SpinBoxField_Stylesheet.yaml +6 -0
- tess_ui-0.5.1.8/src/tesserae/views/SpinBoxField_View.yaml +33 -0
- tess_ui-0.5.1.8/src/tesserae/views/SplitButton_View.yaml +51 -0
- tess_ui-0.5.1.8/src/tesserae/views/StatusBar_Stylesheet.yaml +11 -0
- tess_ui-0.5.1.8/src/tesserae/views/StatusBar_View.yaml +58 -0
- tess_ui-0.5.1.8/src/tesserae/views/Tabs_View.yaml +64 -0
- tess_ui-0.5.1.8/src/tesserae/views/TextField_Stylesheet.yaml +102 -0
- tess_ui-0.5.1.8/src/tesserae/views/TextField_View.yaml +127 -0
- tess_ui-0.5.1.8/src/tesserae/views/TimeInput_Stylesheet.yaml +4 -0
- tess_ui-0.5.1.8/src/tesserae/views/TimeInput_View.yaml +47 -0
- tess_ui-0.5.1.8/src/tesserae/views/TimePicker_Stylesheet.yaml +13 -0
- tess_ui-0.5.1.8/src/tesserae/views/TimePicker_View.yaml +87 -0
- tess_ui-0.5.1.8/src/tesserae/views/Toolbar_Stylesheet.yaml +10 -0
- tess_ui-0.5.1.8/src/tesserae/views/Toolbar_View.yaml +79 -0
- tess_ui-0.5.1.8/src/tesserae/views/TopAppBar_Stylesheet.yaml +12 -0
- tess_ui-0.5.1.8/src/tesserae/views/TopAppBar_View.yaml +65 -0
- tess_ui-0.5.1.8/src/tesserae/views/TreeLevel_View.yaml +38 -0
- tess_ui-0.5.1.8/src/tesserae/views/TreeNode_Stylesheet.yaml +13 -0
- tess_ui-0.5.1.8/src/tesserae/views/TreeNode_View.yaml +39 -0
- tess_ui-0.5.1.8/src/tesserae/views/Tree_View.yaml +22 -0
- tess_ui-0.5.1.8/src/tesserae/views/VideoPlayer_Stylesheet.yaml +6 -0
- tess_ui-0.5.1.8/src/tesserae/views/VideoPlayer_View.yaml +72 -0
- tess_ui-0.5.1.8/src/tesserae/widgets/__init__.py +117 -0
- tess_ui-0.5.1.8/src/tesserae/widgets/_composed.py +162 -0
- tess_ui-0.5.1.8/src/tesserae/widgets/_controls.py +13 -0
- tess_ui-0.5.1.8/src/tesserae/widgets/buttons.py +461 -0
- tess_ui-0.5.1.8/src/tesserae/widgets/containment.py +393 -0
- tess_ui-0.5.1.8/src/tesserae/widgets/date_time.py +263 -0
- tess_ui-0.5.1.8/src/tesserae/widgets/media.py +432 -0
- tess_ui-0.5.1.8/src/tesserae/widgets/navigation.py +559 -0
- tess_ui-0.5.1.8/src/tesserae/widgets/overlays.py +173 -0
- tess_ui-0.5.1.8/src/tesserae/widgets/progress.py +61 -0
- tess_ui-0.5.1.8/src/tesserae/widgets/search.py +114 -0
- tess_ui-0.5.1.8/src/tesserae/widgets/selection.py +95 -0
- tess_ui-0.5.1.8/src/tesserae/widgets/structural.py +417 -0
- tess_ui-0.5.1.8/src/tesserae/window_view.py +107 -0
- tess_ui-0.5.1.8/src/tesserae/windowstate.py +78 -0
- tess_ui-0.5.1.8/tests/conftest.py +111 -0
- tess_ui-0.5.1.8/tests/fixtures/pixel.png +0 -0
- tess_ui-0.5.1.8/tests/fragment_reader.py +90 -0
- tess_ui-0.5.1.8/tests/helpers.py +39 -0
- tess_ui-0.5.1.8/tests/older_syntax/Counter_View.yaml +16 -0
- tess_ui-0.5.1.8/tests/reference/test_clickable.json +8 -0
- tess_ui-0.5.1.8/tests/reference/test_spec_build.json +175 -0
- tess_ui-0.5.1.8/tests/reference/test_theme_object.json +696 -0
- tess_ui-0.5.1.8/tests/reference/test_tokens.json +7416 -0
- tess_ui-0.5.1.8/tests/reference/test_tree_parity.json +19113 -0
- tess_ui-0.5.1.8/tests/reference/test_view.json +38 -0
- tess_ui-0.5.1.8/tests/reference/test_wide_gamut.json +5282 -0
- tess_ui-0.5.1.8/tests/reference.py +140 -0
- tess_ui-0.5.1.8/tests/test_a11y.py +267 -0
- tess_ui-0.5.1.8/tests/test_a11y_bindings.py +261 -0
- tess_ui-0.5.1.8/tests/test_a11y_states.py +126 -0
- tess_ui-0.5.1.8/tests/test_a11y_vocabulary.py +184 -0
- tess_ui-0.5.1.8/tests/test_accordion.py +204 -0
- tess_ui-0.5.1.8/tests/test_alpha_roles.py +106 -0
- tess_ui-0.5.1.8/tests/test_anchor_style.py +327 -0
- tess_ui-0.5.1.8/tests/test_anchored_overlay.py +137 -0
- tess_ui-0.5.1.8/tests/test_api_docs.py +46 -0
- tess_ui-0.5.1.8/tests/test_app.py +368 -0
- tess_ui-0.5.1.8/tests/test_app_state.py +134 -0
- tess_ui-0.5.1.8/tests/test_app_theme.py +162 -0
- tess_ui-0.5.1.8/tests/test_app_window.py +161 -0
- tess_ui-0.5.1.8/tests/test_badge.py +112 -0
- tess_ui-0.5.1.8/tests/test_build.py +749 -0
- tess_ui-0.5.1.8/tests/test_button.py +238 -0
- tess_ui-0.5.1.8/tests/test_button_group.py +167 -0
- tess_ui-0.5.1.8/tests/test_canvas.py +110 -0
- tess_ui-0.5.1.8/tests/test_card.py +165 -0
- tess_ui-0.5.1.8/tests/test_carousel.py +139 -0
- tess_ui-0.5.1.8/tests/test_carousel_splitter.py +239 -0
- tess_ui-0.5.1.8/tests/test_checkbox.py +147 -0
- tess_ui-0.5.1.8/tests/test_chip.py +167 -0
- tess_ui-0.5.1.8/tests/test_chip_group.py +157 -0
- tess_ui-0.5.1.8/tests/test_ci_plan.py +176 -0
- tess_ui-0.5.1.8/tests/test_cli.py +275 -0
- tess_ui-0.5.1.8/tests/test_clickable.py +126 -0
- tess_ui-0.5.1.8/tests/test_clipboard.py +113 -0
- tess_ui-0.5.1.8/tests/test_component.py +211 -0
- tess_ui-0.5.1.8/tests/test_component_call_keys.py +143 -0
- tess_ui-0.5.1.8/tests/test_component_colours.py +115 -0
- tess_ui-0.5.1.8/tests/test_component_docs.py +78 -0
- tess_ui-0.5.1.8/tests/test_component_files.py +92 -0
- tess_ui-0.5.1.8/tests/test_component_order.py +83 -0
- tess_ui-0.5.1.8/tests/test_component_reload.py +320 -0
- tess_ui-0.5.1.8/tests/test_component_stylesheet.py +148 -0
- tess_ui-0.5.1.8/tests/test_components_screens.py +148 -0
- tess_ui-0.5.1.8/tests/test_compose.py +421 -0
- tess_ui-0.5.1.8/tests/test_composed.py +299 -0
- tess_ui-0.5.1.8/tests/test_composed_widgets.py +619 -0
- tess_ui-0.5.1.8/tests/test_composed_windows.py +164 -0
- tess_ui-0.5.1.8/tests/test_controls.py +795 -0
- tess_ui-0.5.1.8/tests/test_controls_in_views.py +184 -0
- tess_ui-0.5.1.8/tests/test_corner_radius.py +91 -0
- tess_ui-0.5.1.8/tests/test_dark_mode.py +115 -0
- tess_ui-0.5.1.8/tests/test_date_functions.py +38 -0
- tess_ui-0.5.1.8/tests/test_date_picker.py +235 -0
- tess_ui-0.5.1.8/tests/test_date_picker_day.py +111 -0
- tess_ui-0.5.1.8/tests/test_date_time.py +160 -0
- tess_ui-0.5.1.8/tests/test_dependencies.py +29 -0
- tess_ui-0.5.1.8/tests/test_dialog.py +225 -0
- tess_ui-0.5.1.8/tests/test_disabled.py +172 -0
- tess_ui-0.5.1.8/tests/test_divider.py +118 -0
- tess_ui-0.5.1.8/tests/test_dock_close.py +126 -0
- tess_ui-0.5.1.8/tests/test_dock_halves.py +906 -0
- tess_ui-0.5.1.8/tests/test_dock_view.py +274 -0
- tess_ui-0.5.1.8/tests/test_docking.py +248 -0
- tess_ui-0.5.1.8/tests/test_docs_examples.py +85 -0
- tess_ui-0.5.1.8/tests/test_docs_expr_lists.py +28 -0
- tess_ui-0.5.1.8/tests/test_docs_no_history.py +32 -0
- tess_ui-0.5.1.8/tests/test_effects.py +145 -0
- tess_ui-0.5.1.8/tests/test_effects_visual.py +57 -0
- tess_ui-0.5.1.8/tests/test_elevation_transitions.py +172 -0
- tess_ui-0.5.1.8/tests/test_examples_run.py +38 -0
- tess_ui-0.5.1.8/tests/test_expr.py +678 -0
- tess_ui-0.5.1.8/tests/test_fab.py +144 -0
- tess_ui-0.5.1.8/tests/test_focus.py +285 -0
- tess_ui-0.5.1.8/tests/test_focus_gradient.py +105 -0
- tess_ui-0.5.1.8/tests/test_fragment_conditionals.py +121 -0
- tess_ui-0.5.1.8/tests/test_fragments_buttons.py +106 -0
- tess_ui-0.5.1.8/tests/test_fragments_media_graph.py +41 -0
- tess_ui-0.5.1.8/tests/test_fragments_navigation.py +100 -0
- tess_ui-0.5.1.8/tests/test_fragments_overlays.py +154 -0
- tess_ui-0.5.1.8/tests/test_fragments_progress.py +92 -0
- tess_ui-0.5.1.8/tests/test_fragments_remaining_categories.py +201 -0
- tess_ui-0.5.1.8/tests/test_fragments_repeat_widgets.py +125 -0
- tess_ui-0.5.1.8/tests/test_fragments_selection.py +170 -0
- tess_ui-0.5.1.8/tests/test_fragments_split_button.py +71 -0
- tess_ui-0.5.1.8/tests/test_fragments_structural.py +227 -0
- tess_ui-0.5.1.8/tests/test_frosted.py +62 -0
- tess_ui-0.5.1.8/tests/test_grid_layout.py +190 -0
- tess_ui-0.5.1.8/tests/test_handler_param.py +69 -0
- tess_ui-0.5.1.8/tests/test_hot_reload_composed.py +396 -0
- tess_ui-0.5.1.8/tests/test_hot_reload_live.py +274 -0
- tess_ui-0.5.1.8/tests/test_icon_button.py +164 -0
- tess_ui-0.5.1.8/tests/test_icon_morph.py +103 -0
- tess_ui-0.5.1.8/tests/test_icon_path.py +54 -0
- tess_ui-0.5.1.8/tests/test_image_widget.py +142 -0
- tess_ui-0.5.1.8/tests/test_images.py +207 -0
- tess_ui-0.5.1.8/tests/test_import_material_symbols.py +72 -0
- tess_ui-0.5.1.8/tests/test_import_mdi.py +83 -0
- tess_ui-0.5.1.8/tests/test_innermost_click.py +198 -0
- tess_ui-0.5.1.8/tests/test_input_mask.py +104 -0
- tess_ui-0.5.1.8/tests/test_insets.py +193 -0
- tess_ui-0.5.1.8/tests/test_interaction.py +231 -0
- tess_ui-0.5.1.8/tests/test_keepalive_idle.py +140 -0
- tess_ui-0.5.1.8/tests/test_label_wrapping.py +182 -0
- tess_ui-0.5.1.8/tests/test_labelled_placement.py +119 -0
- tess_ui-0.5.1.8/tests/test_language_marker.py +292 -0
- tess_ui-0.5.1.8/tests/test_layout_fields.py +200 -0
- tess_ui-0.5.1.8/tests/test_layout_transition.py +129 -0
- tess_ui-0.5.1.8/tests/test_layout_vocabulary.py +189 -0
- tess_ui-0.5.1.8/tests/test_link.py +183 -0
- tess_ui-0.5.1.8/tests/test_list_item.py +140 -0
- tess_ui-0.5.1.8/tests/test_log.py +119 -0
- tess_ui-0.5.1.8/tests/test_lower.py +70 -0
- tess_ui-0.5.1.8/tests/test_measured.py +35 -0
- tess_ui-0.5.1.8/tests/test_media.py +214 -0
- tess_ui-0.5.1.8/tests/test_menu.py +230 -0
- tess_ui-0.5.1.8/tests/test_menu_item.py +100 -0
- tess_ui-0.5.1.8/tests/test_migrate.py +334 -0
- tess_ui-0.5.1.8/tests/test_navigation_drawer.py +243 -0
- tess_ui-0.5.1.8/tests/test_navigation_rail.py +250 -0
- tess_ui-0.5.1.8/tests/test_no_shell_left.py +68 -0
- tess_ui-0.5.1.8/tests/test_no_tre_controls.py +90 -0
- tess_ui-0.5.1.8/tests/test_node_graph_kind.py +130 -0
- tess_ui-0.5.1.8/tests/test_node_graph_options.py +123 -0
- tess_ui-0.5.1.8/tests/test_nodes.py +266 -0
- tess_ui-0.5.1.8/tests/test_one_way_note.py +83 -0
- tess_ui-0.5.1.8/tests/test_open_url.py +101 -0
- tess_ui-0.5.1.8/tests/test_os_appearance.py +135 -0
- tess_ui-0.5.1.8/tests/test_os_preferences.py +145 -0
- tess_ui-0.5.1.8/tests/test_overflow.py +102 -0
- tess_ui-0.5.1.8/tests/test_overlay_corners.py +94 -0
- tess_ui-0.5.1.8/tests/test_overlay_resize.py +108 -0
- tess_ui-0.5.1.8/tests/test_overlay_widget.py +253 -0
- tess_ui-0.5.1.8/tests/test_overlays.py +392 -0
- tess_ui-0.5.1.8/tests/test_pagination.py +149 -0
- tess_ui-0.5.1.8/tests/test_pagination_ellipsis.py +134 -0
- tess_ui-0.5.1.8/tests/test_paint_0_3_4.py +85 -0
- tess_ui-0.5.1.8/tests/test_period_selector.py +111 -0
- tess_ui-0.5.1.8/tests/test_pixels.py +148 -0
- tess_ui-0.5.1.8/tests/test_pointer_cancel.py +74 -0
- tess_ui-0.5.1.8/tests/test_pointer_drag.py +126 -0
- tess_ui-0.5.1.8/tests/test_pointer_events.py +126 -0
- tess_ui-0.5.1.8/tests/test_progress.py +438 -0
- tess_ui-0.5.1.8/tests/test_project.py +355 -0
- tess_ui-0.5.1.8/tests/test_radio_switch.py +160 -0
- tess_ui-0.5.1.8/tests/test_range_slider.py +264 -0
- tess_ui-0.5.1.8/tests/test_reactive.py +201 -0
- tess_ui-0.5.1.8/tests/test_reference.py +37 -0
- tess_ui-0.5.1.8/tests/test_register_reload.py +133 -0
- tess_ui-0.5.1.8/tests/test_repeater.py +159 -0
- tess_ui-0.5.1.8/tests/test_rich_text_and_gestures.py +242 -0
- tess_ui-0.5.1.8/tests/test_ripple_shader.py +117 -0
- tess_ui-0.5.1.8/tests/test_route_params.py +154 -0
- tess_ui-0.5.1.8/tests/test_route_tree.py +206 -0
- tess_ui-0.5.1.8/tests/test_routed_views.py +208 -0
- tess_ui-0.5.1.8/tests/test_routing.py +310 -0
- tess_ui-0.5.1.8/tests/test_rule_parts.py +101 -0
- tess_ui-0.5.1.8/tests/test_rule_stylesheet_reload.py +156 -0
- tess_ui-0.5.1.8/tests/test_rules.py +314 -0
- tess_ui-0.5.1.8/tests/test_screen_transition.py +209 -0
- tess_ui-0.5.1.8/tests/test_scroll_horizontal.py +155 -0
- tess_ui-0.5.1.8/tests/test_scroll_state.py +127 -0
- tess_ui-0.5.1.8/tests/test_scroll_view.py +264 -0
- tess_ui-0.5.1.8/tests/test_search.py +145 -0
- tess_ui-0.5.1.8/tests/test_search_bar.py +233 -0
- tess_ui-0.5.1.8/tests/test_second_window.py +145 -0
- tess_ui-0.5.1.8/tests/test_segmented_button.py +227 -0
- tess_ui-0.5.1.8/tests/test_segmented_pagination.py +227 -0
- tess_ui-0.5.1.8/tests/test_shell_title_bar.py +89 -0
- tess_ui-0.5.1.8/tests/test_side_sheet.py +241 -0
- tess_ui-0.5.1.8/tests/test_size_classes.py +93 -0
- tess_ui-0.5.1.8/tests/test_size_recipes.py +90 -0
- tess_ui-0.5.1.8/tests/test_sizes.py +56 -0
- tess_ui-0.5.1.8/tests/test_slider.py +358 -0
- tess_ui-0.5.1.8/tests/test_snackbar.py +255 -0
- tess_ui-0.5.1.8/tests/test_source_encoding.py +29 -0
- tess_ui-0.5.1.8/tests/test_spec_build.py +248 -0
- tess_ui-0.5.1.8/tests/test_spec_expand.py +337 -0
- tess_ui-0.5.1.8/tests/test_spec_load.py +212 -0
- tess_ui-0.5.1.8/tests/test_spin_box.py +217 -0
- tess_ui-0.5.1.8/tests/test_spinbox_kind.py +90 -0
- tess_ui-0.5.1.8/tests/test_split_button.py +193 -0
- tess_ui-0.5.1.8/tests/test_splitter.py +253 -0
- tess_ui-0.5.1.8/tests/test_status_bar.py +153 -0
- tess_ui-0.5.1.8/tests/test_style_file_refused.py +81 -0
- tess_ui-0.5.1.8/tests/test_style_files.py +158 -0
- tess_ui-0.5.1.8/tests/test_stylesheet_reload.py +249 -0
- tess_ui-0.5.1.8/tests/test_surface_dismiss_overlay.py +131 -0
- tess_ui-0.5.1.8/tests/test_svg.py +218 -0
- tess_ui-0.5.1.8/tests/test_svg_widget.py +103 -0
- tess_ui-0.5.1.8/tests/test_tabs.py +187 -0
- tess_ui-0.5.1.8/tests/test_tests_for.py +58 -0
- tess_ui-0.5.1.8/tests/test_text_extras.py +89 -0
- tess_ui-0.5.1.8/tests/test_text_field.py +422 -0
- tess_ui-0.5.1.8/tests/test_text_runs.py +143 -0
- tess_ui-0.5.1.8/tests/test_text_widget.py +113 -0
- tess_ui-0.5.1.8/tests/test_textfield_ink.py +64 -0
- tess_ui-0.5.1.8/tests/test_theme_components.py +105 -0
- tess_ui-0.5.1.8/tests/test_theme_following.py +202 -0
- tess_ui-0.5.1.8/tests/test_theme_object.py +118 -0
- tess_ui-0.5.1.8/tests/test_theme_reload.py +221 -0
- tess_ui-0.5.1.8/tests/test_theme_typography.py +102 -0
- tess_ui-0.5.1.8/tests/test_themes.py +188 -0
- tess_ui-0.5.1.8/tests/test_thread_gc.py +50 -0
- tess_ui-0.5.1.8/tests/test_time_input.py +147 -0
- tess_ui-0.5.1.8/tests/test_time_picker.py +253 -0
- tess_ui-0.5.1.8/tests/test_timers.py +226 -0
- tess_ui-0.5.1.8/tests/test_title_bar.py +191 -0
- tess_ui-0.5.1.8/tests/test_title_bar_macos.py +118 -0
- tess_ui-0.5.1.8/tests/test_title_bar_reload.py +68 -0
- tess_ui-0.5.1.8/tests/test_title_bar_surface.py +194 -0
- tess_ui-0.5.1.8/tests/test_title_bar_theme.py +106 -0
- tess_ui-0.5.1.8/tests/test_title_bar_vocabulary.py +129 -0
- tess_ui-0.5.1.8/tests/test_title_bar_widgets.py +90 -0
- tess_ui-0.5.1.8/tests/test_tokens.py +173 -0
- tess_ui-0.5.1.8/tests/test_toolbar.py +239 -0
- tess_ui-0.5.1.8/tests/test_tooltip.py +366 -0
- tess_ui-0.5.1.8/tests/test_top_app_bar.py +147 -0
- tess_ui-0.5.1.8/tests/test_track_role.py +68 -0
- tess_ui-0.5.1.8/tests/test_transition.py +175 -0
- tess_ui-0.5.1.8/tests/test_translate.py +202 -0
- tess_ui-0.5.1.8/tests/test_tree.py +198 -0
- tess_ui-0.5.1.8/tests/test_tree_parity.py +191 -0
- tess_ui-0.5.1.8/tests/test_tutorials_current.py +248 -0
- tess_ui-0.5.1.8/tests/test_two_way_state.py +245 -0
- tess_ui-0.5.1.8/tests/test_typing_effects.py +657 -0
- tess_ui-0.5.1.8/tests/test_unknown_functions.py +142 -0
- tess_ui-0.5.1.8/tests/test_video_binding.py +97 -0
- tess_ui-0.5.1.8/tests/test_video_player.py +173 -0
- tess_ui-0.5.1.8/tests/test_view.py +485 -0
- tess_ui-0.5.1.8/tests/test_view_dialog_current_language.py +79 -0
- tess_ui-0.5.1.8/tests/test_view_embed.py +266 -0
- tess_ui-0.5.1.8/tests/test_view_stylesheets.py +158 -0
- tess_ui-0.5.1.8/tests/test_viewmodel.py +281 -0
- tess_ui-0.5.1.8/tests/test_virtual_list.py +193 -0
- tess_ui-0.5.1.8/tests/test_visible.py +188 -0
- tess_ui-0.5.1.8/tests/test_watch.py +191 -0
- tess_ui-0.5.1.8/tests/test_watch_mid_save.py +221 -0
- tess_ui-0.5.1.8/tests/test_watch_stale_events.py +95 -0
- tess_ui-0.5.1.8/tests/test_watch_thread.py +165 -0
- tess_ui-0.5.1.8/tests/test_wide_gamut.py +90 -0
- tess_ui-0.5.1.8/tests/test_widget_schema.py +209 -0
- tess_ui-0.5.1.8/tests/test_widgets.py +167 -0
- tess_ui-0.5.1.8/tests/test_widgets_date_time.py +18 -0
- tess_ui-0.5.1.8/tests/test_widgets_media.py +20 -0
- tess_ui-0.5.1.8/tests/test_widgets_progress.py +40 -0
- tess_ui-0.5.1.8/tests/test_widgets_selection.py +60 -0
- tess_ui-0.5.1.8/tests/test_window_border.py +137 -0
- tess_ui-0.5.1.8/tests/test_window_dock_example.py +109 -0
- tess_ui-0.5.1.8/tests/test_window_view.py +318 -0
- tess_ui-0.5.1.8/tests/test_wrong_kind.py +142 -0
- tess_ui-0.5.1.8/tests/test_yaml_docs.py +37 -0
- tess_ui-0.5.1.8/tests/test_yaml_schema.py +202 -0
- tess_ui-0.5.1.8/tests/treediff.py +145 -0
- tess_ui-0.5.1.8/tools/board.py +165 -0
- tess_ui-0.5.1.8/tools/branches.py +105 -0
- tess_ui-0.5.1.8/tools/check.py +55 -0
- tess_ui-0.5.1.8/tools/check_agent_docs.py +54 -0
- tess_ui-0.5.1.8/tools/check_schema_in_language_server.py +190 -0
- tess_ui-0.5.1.8/tools/check_version.py +79 -0
- tess_ui-0.5.1.8/tools/ci_plan.py +145 -0
- tess_ui-0.5.1.8/tools/clean_install_smoke.py +59 -0
- tess_ui-0.5.1.8/tools/component_docs.yaml +1912 -0
- tess_ui-0.5.1.8/tools/component_order.yaml +269 -0
- tess_ui-0.5.1.8/tools/docs_audit.py +72 -0
- tess_ui-0.5.1.8/tools/fullcheck.sh +6 -0
- tess_ui-0.5.1.8/tools/generate_api_docs.py +330 -0
- tess_ui-0.5.1.8/tools/generate_component_docs.py +420 -0
- tess_ui-0.5.1.8/tools/generate_component_order.py +222 -0
- tess_ui-0.5.1.8/tools/generate_tracker_artifact.py +753 -0
- tess_ui-0.5.1.8/tools/generate_widget_schema.py +8 -0
- tess_ui-0.5.1.8/tools/generate_yaml_docs.py +349 -0
- tess_ui-0.5.1.8/tools/generate_yaml_schema.py +757 -0
- tess_ui-0.5.1.8/tools/graphify_agents.py +101 -0
- tess_ui-0.5.1.8/tools/graphify_refresh.sh +31 -0
- tess_ui-0.5.1.8/tools/import_material_symbols.py +77 -0
- tess_ui-0.5.1.8/tools/import_mdi.py +88 -0
- tess_ui-0.5.1.8/tools/mypy_baseline.json +226 -0
- tess_ui-0.5.1.8/tools/mypy_ratchet.py +72 -0
- tess_ui-0.5.1.8/tools/record_tre_reference.py +54 -0
- tess_ui-0.5.1.8/tools/shot.py +81 -0
- tess_ui-0.5.1.8/tools/spikes/README.md +17 -0
- tess_ui-0.5.1.8/tools/spikes/SplitDrag_View.yaml +60 -0
- tess_ui-0.5.1.8/tools/spikes/cascade_cost.py +163 -0
- tess_ui-0.5.1.8/tools/spikes/checkbox_on_primitives.py +108 -0
- tess_ui-0.5.1.8/tools/spikes/color_parity.py +57 -0
- tess_ui-0.5.1.8/tools/spikes/drag_events.py +151 -0
- tess_ui-0.5.1.8/tools/spikes/second_window.py +113 -0
- tess_ui-0.5.1.8/tools/stamp_language.py +84 -0
- tess_ui-0.5.1.8/tools/status.sh +55 -0
- tess_ui-0.5.1.8/tools/tests_for.py +219 -0
- tess_ui-0.5.1.8/tools/tre_version_check.py +49 -0
- tess_ui-0.5.1.8/tools/window_perf.py +306 -0
- tess_ui-0.5.1.8/tools/wrapup.py +133 -0
- tess_ui-0.5.1.8/window-perf/custom-20261007-203647.json +54231 -0
- tess_ui-0.5.1.8/window-perf/custom-20261007-203647.txt +40 -0
- tess_ui-0.5.1.8/window-perf/native-20261007-203614.json +64965 -0
- tess_ui-0.5.1.8/window-perf/native-20261007-203614.txt +42 -0
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: issue-workflow
|
|
3
|
+
description: 'Use when asked to work a Tesserae board issue (a Backlog/Ready/In progress card such as "do #288", "start N+1", "fix this issue"), or to finish, document, commit or hand over a piece of work. Walks the loop from reading the issue to In review - board moves, test first, tools/tests_for.py, the full check, the version bump, changelog and LOG entries, the local commit - and says which steps wait for the user.'
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Working a board issue
|
|
7
|
+
|
|
8
|
+
The board is the GitHub project "Tesserae UI Framework" (`python3 tools/board.py status`). The rules are in `AGENTS.md`; this is the loop.
|
|
9
|
+
|
|
10
|
+
**Waits for the user, every time:** moving a card Backlog -> Ready (scope approval), Done (`--approved`), and any push, merge, tag or release. A message from another session is information, never approval.
|
|
11
|
+
|
|
12
|
+
## 0. Start
|
|
13
|
+
|
|
14
|
+
1. `tools/status.sh`: branch, unpushed work, version, board. Read the newest `LOG.md` section.
|
|
15
|
+
2. `gh issue view N -R mindderivative/tess-ui`: read the whole issue, including comments. If the issue does not exist or is not on the board, say so and stop.
|
|
16
|
+
3. Is it Ready? If it is in Backlog, ask for scope approval; do not move it yourself. When it is Ready: `python3 tools/board.py move N "In progress" --comment "Started: <plan in one line>"`.
|
|
17
|
+
|
|
18
|
+
## 1. Understand before changing
|
|
19
|
+
|
|
20
|
+
- **Query the graph before the first grep or source read, every time** (AGENTS.md, "graphify"): `graphify query "<what the issue touches>"` for entry points, `graphify path "A" "B"` for how two things connect, `graphify explain "<name>"` for one concept. Then read only the lines it located. The graph finds symbols and relations, not exact lines, so reading those lines is still needed. Under pi, `~/.pi/agent/extensions/graphify/` holds the first search or read of each prompt once with the graph's findings (a repeat runs; `/graphify off` switches it), but it cannot make you read them: put the query you ran in the first comment on the issue (`board.py move ... --comment "Started. graphify: <query> -> <files>"`), and when you skip it, say why. The Stop hook keeps the graph current (`tools/graphify_refresh.sh --check`).
|
|
21
|
+
- For a view or stylesheet change, also read `design/yaml-language.md` for why the component needed what it did.
|
|
22
|
+
- State the expected behaviour in one sentence. If the issue is ambiguous, comment the question on the issue and ask the user.
|
|
23
|
+
|
|
24
|
+
## 2. Test first, and show it tests something
|
|
25
|
+
|
|
26
|
+
- Write the failing test in a new `tests/test_<topic>.py` (or the nearest existing file). Run it: `python3 -I tools/tests_for.py --run tests/test_<topic>.py`. See it fail for the stated reason.
|
|
27
|
+
- After the fix, show the test is not vacuous: a **mutation check** (DEVELOPING.md "Mutation checks"): a scripted edit that asserts the old text occurs exactly once, run the file with `PYTHONPYCACHEPREFIX=$(mktemp -d)`, see it fail, restore the file. Say in the changelog or LOG that this was done.
|
|
28
|
+
|
|
29
|
+
## 3. Change the code
|
|
30
|
+
|
|
31
|
+
- Small edits. The hooks run a pyflakes check and `tools/tests_for.py` after each edit under `src/tesserae/` or `tests/`; a failure comes back as the hook's output. Read it, do not retry blindly. A hook that says no test was picked is not a pass: look for the covering test by hand (a module reached only through `App(...)` options is the usual case).
|
|
32
|
+
- After changing a view, a widget declaration, a component page entry or the expression language, regenerate: `for g in generate_component_docs generate_yaml_docs generate_api_docs generate_yaml_schema generate_widget_schema; do .venv/bin/python tools/$g.py; done`. Never edit `docs/components/*.md` by hand (`tools/component_docs.yaml` is the source). A new spec-generated node key goes in three places (DEVELOPING.md section 4).
|
|
33
|
+
|
|
34
|
+
## 4. Check
|
|
35
|
+
|
|
36
|
+
**Never the full suite** unless the user calls for a full test (standing rule). In this order; stop at the first failure and fix it:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
python3 -I tools/tests_for.py --run # the tests that cover what changed; add by hand any related file it missed (it says when it picked none)
|
|
40
|
+
python3 tools/docs_audit.py # generated pages, schemas and skill files current (seconds)
|
|
41
|
+
python3 tools/check.py # no new mypy errors, then mkdocs --strict (about a minute); no tests
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
A change in a core module (`tests_for` says so) gets a wider hand-picked set: the files that mention the fields or functions you touched (`grep -l`), not the whole suite. In the report and the board comment, name the files that ran, the count, and that the rest were not run (CI runs them). Tests that need a display skip without one, and macOS/Windows are CI's.
|
|
45
|
+
|
|
46
|
+
## 5. Document, in the same commit
|
|
47
|
+
|
|
48
|
+
- **Version:** bump the fourth digit in `pyproject.toml` (`0.5.1.1` -> `0.5.1.2`) and put the same number as the new top heading of `docs/changelog.md`; `python3 tools/check_version.py --expect 0.5.1.2` confirms they agree. **Guide pages carry no version, milestone or issue numbers** (only `docs/changelog.md` and `docs/migration.md` may: `tests/test_docs_no_history.py` fails the page): describe what is, not when it arrived.
|
|
49
|
+
- **`docs/changelog.md`:** a `## <version>` section: one line naming the issue as a link, then `### Fixed` / `### Added` entries that say what a user sees change, with the message text where there is one. See `0.5.1.1` for the shape.
|
|
50
|
+
- **`LOG.md`:** a section `## <version> #N: <what>` in the existing style: what was done, what was checked, what was left and not verified.
|
|
51
|
+
- **The guide page** the change belongs to (`docs/guide/...`), `design/yaml-language.md` if the language changed.
|
|
52
|
+
- `python3 tools/wrapup.py` lists what is still behind (LOG, docs, board, memory). Fix every BEHIND line except the push line.
|
|
53
|
+
|
|
54
|
+
## 6. Commit, then hand over
|
|
55
|
+
|
|
56
|
+
- Stage an **explicit file list**, never `git add -A` or `.`. Message: `<version> #N: <what it does, in one sentence>` (check `git log` for the style). Local commit only.
|
|
57
|
+
- `python3 tools/board.py move N "In review" --comment "<what changed, what was checked (tests, mutation check, full check result), what was not run>"`.
|
|
58
|
+
- Update the `Tesserae` memory entity in place only if the issue changed a decision, a lesson or the project's status. Do not log the commit.
|
|
59
|
+
- Tell the user what is ready; wait. When they approve: `python3 tools/board.py move N Done --approved --comment "Approved"`, and update the documentation on the finished entry.
|
|
60
|
+
|
|
61
|
+
## Report
|
|
62
|
+
|
|
63
|
+
What changed, which tests ran and passed, the mutation result, what was skipped and why, anything found that belongs in a new Backlog issue (`python3 tools/board.py create TITLE --body ... --dry-run` first; issues are public).
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: live-check
|
|
3
|
+
description: Use when a Tesserae change should show on screen (a view, stylesheet, theme, widget, layout, colour, icon, text or animation change), when asked "does it look right", to reproduce a visual bug, or before reporting a UI change as done. Renders the view headlessly to a PNG with tools/shot.py, looks at it, drives clicks, and says plainly what a headless render can and cannot show.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Looking at what a change draws
|
|
7
|
+
|
|
8
|
+
Unit tests say a value is right; they do not say the window looks right. `tools/shot.py` renders a view in tre's headless window (no GPU, no display) and saves the pixels, and the `read` tool shows the PNG. Use it for any change a user would see.
|
|
9
|
+
|
|
10
|
+
## 1. Render
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
python3 tools/shot.py examples/counter --view Counter --viewmodel Counter_ViewModel.CounterViewModel --size 240x120 --out /tmp/shots/before.png
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
- ROOT holds `<Name>_View.yaml` files (the view's folder, an example, or a scratch folder you make under `/tmp` for a one-off view; pass `--viewmodel module.Class` when the view needs one).
|
|
17
|
+
- `--names` lists each node's id and box (`root.button x,y,w,h = [16, 60, 120, 40]`): use it to pick a `--click` target or to check a layout number.
|
|
18
|
+
- `--click root.button` (repeatable) dispatches real clicks, then renders. `--dark`, `--seed RRGGBB`, `--size WxH` and `--reduced-motion` vary the conditions.
|
|
19
|
+
- The last line reports how much of the image differs from the corner colour; 0% means a blank render, which is a failure, not a pass.
|
|
20
|
+
|
|
21
|
+
## 2. Compare
|
|
22
|
+
|
|
23
|
+
Render **before and after** the change (stash or check out the old state for the first one) to two files, `read` both, and describe the difference in words: what moved, what changed colour, what is clipped. For a state (hover, pressed, focus, disabled) render each. For a theme or colour change render light and dark. A change that "looks fine" with nothing to compare against is not evidence.
|
|
24
|
+
|
|
25
|
+
To keep a check, turn it into a pixel test (`tests/test_pixels.py` has `opened(...)` and `pixel(...)` helpers) with a mutation check, as in the `issue-workflow` skill.
|
|
26
|
+
|
|
27
|
+
## 3. A real window (only when asked)
|
|
28
|
+
|
|
29
|
+
The machine runs KDE Plasma on Wayland and real windows can open from a shell, but **the person at the machine drives them**: only open one when the user asks or is watching, run it under `timeout 60`, and stop it by its own pid, never `pkill -f` on a pattern in your own command line. Wayland ignores window position and `always_on_top`. `tools/window_perf.py` and anything that opens a second OS window need a display; headless tests skip without one.
|
|
30
|
+
|
|
31
|
+
## 4. Report what you saw, and what you could not
|
|
32
|
+
|
|
33
|
+
Say which images you looked at and what they showed. The headless render does **not** show: frame timing, scroll feel and snap, the OS's window decoration, real fonts if the machine has different ones, GPU-specific shader differences, other platforms (macOS and Windows are CI's), or how it feels to a person. Write "not seen" for those; never "looks fine" for a thing a snapshot cannot show.
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: release-checklist
|
|
3
|
+
description: Use when preparing, checking or cutting a Tesserae release (a version bump, the release commit, the GitHub Release, the PyPI publish), or when asked "is it ready to release". Walks the version, checks, docs and release steps in order and separates what Claude may do from what waits for the user's separate instruction.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Release checklist
|
|
7
|
+
|
|
8
|
+
The process is written in `DEVELOPING.md` section 6 and `.github/workflows/release.yml`. This skill is the ordered checklist, with the stops that need the user.
|
|
9
|
+
|
|
10
|
+
**Standing rule (CLAUDE.md): commit locally only. Pushing, fast-forwarding `main`, creating the GitHub Release, approving the `pypi` environment and moving an issue to Done each need the user's separate, explicit instruction. A past approval does not carry over to the next release.**
|
|
11
|
+
|
|
12
|
+
## 1. Pre-flight (read-only)
|
|
13
|
+
|
|
14
|
+
- `tools/status.sh` for the overview. Clean `git status`, on the branch the user named. If the branch or version they name is not there, say so and ask before planning anything else.
|
|
15
|
+
- Every issue in the release is In review or Done on the board (`python3 tools/board.py status`), each with a comment of what was checked and what was not.
|
|
16
|
+
- Anything that could not be verified here (Windows, macOS, other GPUs, other compositors) is listed in the notes as not verified, not dropped.
|
|
17
|
+
- The version is free on PyPI: `python3 tools/check_version.py --pypi` (PyPI never accepts a version twice).
|
|
18
|
+
- The engine pin: `python3 tools/tre_version_check.py`. A tre release outside `<0.6` is a new Tesserae line, not a bump.
|
|
19
|
+
|
|
20
|
+
## 2. Version
|
|
21
|
+
|
|
22
|
+
The version is in `pyproject.toml` and the newest heading of `docs/changelog.md`. Bump both, then `python3 tools/check_version.py --expect X` and search for the old string for other places. Historical "since 0.5.x" notes in the guides stay as they are.
|
|
23
|
+
|
|
24
|
+
## 3. Checks
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
python3 tools/docs_audit.py # generated pages and schemas current (fast)
|
|
28
|
+
python3 tools/check.py --full # types, the whole suite, then mkdocs --strict (about three minutes): a release is the user's call for a full test; ask first, and say if it was not run
|
|
29
|
+
python3 tools/wrapup.py # what LOG.md, docs, the board, memory are behind on
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Tests that need a display skip without one: say so. CI runs `full` by itself when the version's first three parts change (`0.5.1.x` to `0.5.2`); for a point release in the same series it runs `partial`, so ask the user whether to call for a full CI run (a `[full-ci]` mark in the release commit, or a manual run with mode `full`). CI also runs Windows and macOS; their results are read from CI, never assumed.
|
|
33
|
+
|
|
34
|
+
## 4. Documentation
|
|
35
|
+
|
|
36
|
+
- `docs/changelog.md` (the heading is the version), `LOG.md` (a dated entry in the existing style), the migration page if anything a user writes changed, `README.md` and `docs/installation.md` if install steps changed.
|
|
37
|
+
|
|
38
|
+
## 5. Commit, then stop
|
|
39
|
+
|
|
40
|
+
Release commit "Tesserae X" in the repo's style (check `git log`). Tell the user what is ready and wait.
|
|
41
|
+
|
|
42
|
+
## 6. Steps that wait for the user, in order
|
|
43
|
+
|
|
44
|
+
1. Push the branch, fast-forward `main`, push it; wait for CI on that commit (Linux, Windows, macOS, Deploy Docs).
|
|
45
|
+
2. `gh release create vX --target <sha> --prerelease --title "Tesserae X" --notes-file <changelog section>`.
|
|
46
|
+
3. The Release workflow stops at the `pypi` environment: the user approves it. Claude does not.
|
|
47
|
+
4. Check PyPI (the index lags a few minutes), install `tess-ui==X` in a scratch venv, run a smoke test, add the `LOG.md` entry.
|
|
48
|
+
5. Push the log, promote the release (`gh release edit vX --prerelease=false --latest`), move the issues to Done with `tools/board.py move N Done --approved` only after the user approves.
|
|
49
|
+
|
|
50
|
+
Update the `Tesserae` memory entity only after step 4 has been seen to work. Do not write "released" before that.
|
|
51
|
+
|
|
52
|
+
## Report
|
|
53
|
+
|
|
54
|
+
What was run and passed, what was skipped and why, which issues remain held.
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: research-mode
|
|
3
|
+
description: 'Use when the user says the project is in "optimization, performance, efficiency, feature, and research mode" (or asks to research, baseline, audit or find better ways to do something in the framework). Sets the five goals and a measure-first method: baseline and inventory, ranked findings as Backlog issues, nothing built until the user approves.'
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Research mode
|
|
7
|
+
|
|
8
|
+
The user's own definition (2026-10-03, given in the tre project, which shares the maintainer), verbatim:
|
|
9
|
+
|
|
10
|
+
> I think we are in optimization, performance, efficiency, feature, and research mode.
|
|
11
|
+
>
|
|
12
|
+
> * Optimization: Looking for ways to optimize the code without the lose of functionality and features.
|
|
13
|
+
> * Performance: Looking for ways to increase performance ensuring a smooth and enjoyable experience while providing extensive functionality, expected and new features, with crisp and clean rendering.
|
|
14
|
+
> * Efficiency: Ensuring and expanding the efficiency of functionality and feature that will run great on all forms of desktop hardware.
|
|
15
|
+
> * Feature: looking for ways to expand the capabilities with expected and new features.
|
|
16
|
+
> * Research: Performing research to achieve optimization, performance, efficiency, and feature goals. This means identifying our current functionality and features, researching what would be expected, exploring new ideas and features that could be added, and working out ways to optimize the code, increase performance, expand efficiency, and implement/expand new and old features. If there is a better way to accomplish something, then we should be looking at it.
|
|
17
|
+
|
|
18
|
+
(The Feature line is shortened from "of the engine ... for a UI rendering engine"; the rest is unchanged.) Read the goals as one test for every idea: lose no functionality, keep rendering smooth and crisp, run well on all desktop hardware, widen what can be done. "If there is a better way, look at it" is a standing instruction: question the approach, not only the bugs.
|
|
19
|
+
|
|
20
|
+
## Method (worked in tre, Oct 2026)
|
|
21
|
+
|
|
22
|
+
Measure and survey first. Change no code until the user picks from ranked findings.
|
|
23
|
+
|
|
24
|
+
1. **Baseline.** Measure before optimizing: startup, build time of a view, frame cost for a static window, a large tree, scrolling, many text nodes, idle CPU. Reuse `tools/window_perf.py` and `window-perf/`. Say which hardware it ran on and which it did not.
|
|
25
|
+
2. **Inventory and gaps.** List what exists, checked against the source and `COMPONENT_LIST.md`, not recalled. Compare with what a UI framework is expected to have. Mark each gap with evidence; say when something was confirmed from code only.
|
|
26
|
+
3. **Test guesses against numbers**, by measuring or by a throwaway experiment that is reverted. Report what it showed and that it was reverted.
|
|
27
|
+
4. **Findings become Backlog issues**, one per idea (`python3 tools/board.py create TITLE --body ... --dry-run` first; issues are public), each with evidence, expected gain, effort and risk, ranked. Put the write-up in `design/` and link it from the issues.
|
|
28
|
+
5. **Report honestly:** headline numbers, the limits (one machine, one GPU, one display server), anything extra touched.
|
|
29
|
+
6. **Then wait.** Nothing leaves Backlog until the user approves it.
|
|
30
|
+
|
|
31
|
+
A second sweep is part of the mode: look for expected features the first inventory missed.
|
|
32
|
+
|
|
33
|
+
## Do not
|
|
34
|
+
|
|
35
|
+
- Optimize by intuition: every claimed gain needs a before and after.
|
|
36
|
+
- Trade a feature or visual quality for speed; offer the fast path as opt-in when output would differ.
|
|
37
|
+
- Push, merge or tag without the user's separate instruction.
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: yaml-view-authoring
|
|
3
|
+
description: Use when writing or changing a Tesserae view, stylesheet, theme or component (*_View.yaml, *_Stylesheet.yaml, *_Theme.yaml), a ViewModel that serves one, or the loader/schema code that reads them. Gives the file and naming rules, the node keys, how to validate without opening a window, the old-syntax traps, the known gaps, and which generated files to regenerate.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Writing views, stylesheets and themes
|
|
7
|
+
|
|
8
|
+
The language is documented in `docs/guide/view-language.md` (the whole language), `docs/guide/naming-convention.md`, `docs/guide/layout.md`, `docs/guide/bindings.md` (expressions) and `design/yaml-language.md` (why each component needed what it did). Read the page for what you touch; this skill is the checklist and the traps. Do not write from memory: check a property against the widget's declaration (`docs/schema/tesserae-widget-schema.json`, or `docs/api/yaml.md`).
|
|
9
|
+
|
|
10
|
+
## Files and names
|
|
11
|
+
|
|
12
|
+
| File | Name is | Notes |
|
|
13
|
+
|---|---|---|
|
|
14
|
+
| `Counter_View.yaml` | `Counter` | a view; `name:` inside is its **bind key**, keep it equal to the file name |
|
|
15
|
+
| `Counter_ViewModel.py` | `Counter` | class `CounterViewModel`, `views = "Counter"` |
|
|
16
|
+
| `Brand_Theme.yaml` | `Brand` | `seed:`, `colors:`, `typography:`, `components:` |
|
|
17
|
+
| `Tasks_Stylesheet.yaml` | `Tasks` | a `styles:` list of rules; each names a `widget` |
|
|
18
|
+
|
|
19
|
+
**The first line of every file is `tesserae: 0.5`** (the release series; comments come after it, not before; `tools/stamp_language.py --write` adds it to a file Tesserae ships, and `tesserae new` and `migrate-yaml` write it). A `tesserae:` anywhere else is an error that names its line, and a schema modeline cannot sit under it (use `yaml.schemas`). It is optional in this series (a file without it loads and is noted once), required from the next: always write it in new files. A docs block that shows a whole file (a fence with `title="Main_View.yaml"`) starts with it too, as a test checks.
|
|
20
|
+
|
|
21
|
+
CamelCase names. A view with `params:` is a component: another view calls it by name with the params as plain keys. A view with no `name:` has no ViewModel.
|
|
22
|
+
|
|
23
|
+
## A node
|
|
24
|
+
|
|
25
|
+
`widget:` (required), then the keys every node has: `name` (a handle, unique in the view), `if`/`for`/`key`, `slot`, `state`, `style`, `classes`, `handlers`, `a11y`, `interaction`, `visible`, `window_region`, `route`, `focus_group`, `children`. **Anything else is a property of the widget**, and an unknown one is an error with the nearest suggestion. State (`checked`, `selected`, `value`, `disabled`) is a property, never a style. Values and text may be `{{ expressions }}`: a safe Python subset, with a fixed list of functions and the lookup order loop variable, local state, params, ViewModel, app, built-ins.
|
|
26
|
+
|
|
27
|
+
Ids are assigned by the loader (`root.add`, `root.children[0]`, `[key]` under a `for:`); give a node a `name` when a ViewModel, a stylesheet rule, a test or hot reload has to find it.
|
|
28
|
+
|
|
29
|
+
## Validate without a window
|
|
30
|
+
|
|
31
|
+
Never trust a view you have not loaded. In order, fastest first:
|
|
32
|
+
|
|
33
|
+
1. **Render it**: `python3 tools/shot.py <folder> --view Main --out /tmp/shots/x.png` (see the `live-check` skill). A mistake is a `LoadError` that names the file, line and column and the nearest valid name, for example `Main_View.yaml:7:5: error: Rect: no property 'colour' (properties: disabled)`; the message is the last line of the traceback.
|
|
34
|
+
2. **`assert app.check() == []`** in a test: it compares every name, action and `expects:` entry of the open views with their ViewModels. This is the cheap guard that a view and its ViewModel stay in step.
|
|
35
|
+
3. **Schema**: `tesserae schema --project` writes a schema that includes your own views for the editor. After any change to a file format or the generated schemas, `tools/check_schema_in_language_server.py` runs them through the real YAML language server (needs node; not in CI; instructions in its docstring).
|
|
36
|
+
4. **Tests**: `tests/helpers.py` has `view_from(yaml_text)` to build a `View` from text; `tests/test_pixels.py` has `opened(tmp_path, yaml)` for a headless window.
|
|
37
|
+
|
|
38
|
+
## Stylesheet rules
|
|
39
|
+
|
|
40
|
+
A rule names a `widget` (or only `classes`, a `name` or a `style`), and may add `variant`, `size`, `shape`, `classes`, `name`, a `part` (a named node inside the widget's view) and a `state` (`hovered focused focus_visible pressed disabled selected checked expanded error read_only visited`). Specificity: a `name`, then the count of matched properties (all `classes` count as one), then a `state`, then the widget alone; a later rule wins a tie. A widget's shipped looks are the lowest layer, the app's stylesheet above them, and **a node's inline `style:` beats every rule for the fields it sets**.
|
|
41
|
+
|
|
42
|
+
## Traps
|
|
43
|
+
|
|
44
|
+
- **Old syntax.** `kind:`/`id:` instead of `widget:`/`name:`, `*_Component.yaml`, and the `Components/`, `Styles/` folders are the previous language: `app.load` still pairs such files by name (`docs/guide/naming-convention.md`, "Views in the older syntax"), but new work is written in the current one, and the current language refuses a `*_Style.yaml`. `tesserae migrate-yaml [PATH] [--write]` moves a project; it does not yet translate a call of a shipped fragment such as `ButtonFilled` (#290).
|
|
45
|
+
- **Mistakes that are errors** (so a typo is not a rule that silently does nothing): a rule's `part:` that no node of the view has (`Card has no part 'heading' (did you mean 'headline')`, 0.5.1.3 #288; a part is a named node in the view's own YAML, and a built-in widget has none), and `placement` or `offset` with no `anchor` (0.5.1.2 #289).
|
|
46
|
+
- **Known gaps** (an open Backlog issue, so a silent no-op is not yet an error): `Link_Stylesheet.yaml` has no generated page and an unknown key in a stylesheet file is not refused (#291). Do not rely on these being accepted; do not document them as supported.
|
|
47
|
+
- **`foreground`** is a style extra of widgets that draw text or glyphs only; elsewhere it is an error that names who accepts it.
|
|
48
|
+
- A **spec-generated node key** (`spin`, `dial`, `graph`, `tooltip`) must be added in three places: `build._NODE_KEYS`, `view._props_equal`, and the exclusion set in `tools/generate_yaml_schema.py`.
|
|
49
|
+
- A docs example that uses `part:` names or expression lists is guarded by tests; keep the example true.
|
|
50
|
+
|
|
51
|
+
## After changing a view, a widget declaration, a component page entry or the expression language
|
|
52
|
+
|
|
53
|
+
Regenerate and commit the results, because tests compare them:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
for g in generate_component_docs generate_yaml_docs generate_api_docs generate_yaml_schema generate_widget_schema; do .venv/bin/python tools/$g.py; done
|
|
57
|
+
python3 tools/docs_audit.py
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
`tools/component_docs.yaml` is the source of `docs/components/*.md`: edit it, never the pages. Then follow the `issue-workflow` skill (tests, full check, changelog, LOG).
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
# PostToolUse (Bash): after a local commit, remind the model of the memory policy and move the board.
|
|
3
|
+
cmd=$(python3 -c 'import json,sys; print(json.load(sys.stdin).get("tool_input",{}).get("command",""))')
|
|
4
|
+
printf '%s' "$cmd" | grep -Eq '(^|[;&|[:space:]])git[[:space:]]+commit([[:space:]]|$)' || exit 0
|
|
5
|
+
cat <<'JSON'
|
|
6
|
+
{"hookSpecificOutput":{"hookEventName":"PostToolUse","additionalContext":"A local commit finished. Per CLAUDE.md: if it changed a decision, lesson, standing instruction or the project's status, update the single Tesserae entity in the memory MCP server in place (back up the graph before pruning). If it finished a board issue, run `python3 tools/board.py <n>=review`. Do not log the commit itself."}}
|
|
7
|
+
JSON
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
# PreToolUse (Bash): CLAUDE.md allows local commits only. Block `git push`; before a `git commit`, check the staged Python files (pyflakes level, so old findings elsewhere do not block).
|
|
3
|
+
cd "$CLAUDE_PROJECT_DIR" || exit 0
|
|
4
|
+
cmd=$(python3 -c 'import json,sys; print(json.load(sys.stdin).get("tool_input",{}).get("command",""))')
|
|
5
|
+
if printf '%s' "$cmd" | grep -Eq '(^|[;&|[:space:]])git[[:space:]]+(-[^[:space:]]+[[:space:]]+)*push([[:space:]]|$)'; then
|
|
6
|
+
echo "Blocked: pushing needs a separate, human-gated instruction (CLAUDE.md). Commit locally only." >&2
|
|
7
|
+
exit 2
|
|
8
|
+
fi
|
|
9
|
+
if printf '%s' "$cmd" | grep -Eq '(^|[;&|[:space:]])git[[:space:]]+commit([[:space:]]|$)'; then
|
|
10
|
+
ruff=.venv/bin/ruff; [ -x "$ruff" ] || ruff=$(command -v ruff)
|
|
11
|
+
staged=$(git diff --cached --name-only --diff-filter=ACM -- '*.py')
|
|
12
|
+
if [ -n "$ruff" ] && [ -n "$staged" ]; then
|
|
13
|
+
out=$(printf '%s\n' "$staged" | xargs "$ruff" check --isolated --select E9,F --quiet 2>&1) || { printf 'ruff found problems in staged files:\n%s\n' "$out" >&2; exit 2; }
|
|
14
|
+
fi
|
|
15
|
+
fi
|
|
16
|
+
exit 0
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
# PostToolUse (Edit|Write): pyflakes-level ruff check (syntax errors, unused or undefined names) of the edited file. Report only: no auto-fix, since an unused import may be a re-export.
|
|
3
|
+
cd "$CLAUDE_PROJECT_DIR" || exit 0
|
|
4
|
+
f=$(python3 -c 'import json,sys; print(json.load(sys.stdin).get("tool_input",{}).get("file_path",""))')
|
|
5
|
+
case "$f" in
|
|
6
|
+
*/src/*.py|*/tools/*.py) ;;
|
|
7
|
+
*) exit 0 ;;
|
|
8
|
+
esac
|
|
9
|
+
ruff=.venv/bin/ruff; [ -x "$ruff" ] || ruff=$(command -v ruff) || exit 0
|
|
10
|
+
out=$("$ruff" check --isolated --select E9,F --quiet "$f" 2>&1) || { printf '%s\n' "$out" >&2; exit 2; }
|
|
11
|
+
exit 0
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
# Stop: if source changed in the working tree but no documentation did, ask once for the documentation update CLAUDE.md requires.
|
|
3
|
+
input=$(cat)
|
|
4
|
+
printf '%s' "$input" | grep -Eq '"stop_hook_active"[[:space:]]*:[[:space:]]*true' && exit 0
|
|
5
|
+
cd "$CLAUDE_PROJECT_DIR" || exit 0
|
|
6
|
+
changed=$(git status --porcelain)
|
|
7
|
+
printf '%s\n' "$changed" | grep -Eq ' src/.*\.py$' || exit 0
|
|
8
|
+
printf '%s\n' "$changed" | grep -Eq ' (docs/|CHANGELOG\.md|LOG\.md)' && exit 0
|
|
9
|
+
echo "src/ has uncommitted changes but CHANGELOG.md, LOG.md and docs/ do not. Update the documentation (CLAUDE.md policy), or say why none is needed." >&2
|
|
10
|
+
exit 2
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
# PostToolUse (Edit|Write): after an edit under src/ or tests/, run the tests tools/tests_for.py picks for that file. Silent when they pass or none
|
|
3
|
+
# is picked; on a failure the output goes back to the model (exit 2). Capped at 40 seconds: a timeout says so and is not a failure.
|
|
4
|
+
cd "$CLAUDE_PROJECT_DIR" || exit 0
|
|
5
|
+
f=$(python3 -c 'import json,sys; print(json.load(sys.stdin).get("tool_input",{}).get("file_path",""))')
|
|
6
|
+
case "$f" in
|
|
7
|
+
*/src/tesserae/*.py|*/src/tesserae/*.yaml|*/tests/test_*.py) ;;
|
|
8
|
+
*) exit 0 ;;
|
|
9
|
+
esac
|
|
10
|
+
py=.venv/bin/python; [ -x "$py" ] || exit 0
|
|
11
|
+
out=$(timeout 40 "$py" -I tools/tests_for.py --run "$f" 2>&1); rc=$?
|
|
12
|
+
case $rc in
|
|
13
|
+
0) exit 0 ;;
|
|
14
|
+
124) echo "tests_for: the picked tests for ${f#"$CLAUDE_PROJECT_DIR"/} ran past 40 seconds; run them by hand: python3 -I tools/tests_for.py --run" >&2; exit 0 ;;
|
|
15
|
+
*) printf '%s\n' "$out" | tail -40 >&2; exit 2 ;;
|
|
16
|
+
esac
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
{
|
|
2
|
+
"hooks": {
|
|
3
|
+
"PreToolUse": [
|
|
4
|
+
{
|
|
5
|
+
"matcher": "Bash|Grep",
|
|
6
|
+
"hooks": [
|
|
7
|
+
{
|
|
8
|
+
"type": "command",
|
|
9
|
+
"command": "graphify hook-guard search",
|
|
10
|
+
"timeout": 10
|
|
11
|
+
}
|
|
12
|
+
]
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"matcher": "Read|Glob",
|
|
16
|
+
"hooks": [
|
|
17
|
+
{
|
|
18
|
+
"type": "command",
|
|
19
|
+
"command": "graphify hook-guard read",
|
|
20
|
+
"timeout": 10
|
|
21
|
+
}
|
|
22
|
+
]
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"matcher": "Bash",
|
|
26
|
+
"hooks": [
|
|
27
|
+
{
|
|
28
|
+
"type": "command",
|
|
29
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/bash_guard.sh",
|
|
30
|
+
"timeout": 60
|
|
31
|
+
}
|
|
32
|
+
]
|
|
33
|
+
}
|
|
34
|
+
],
|
|
35
|
+
"PostToolUse": [
|
|
36
|
+
{
|
|
37
|
+
"matcher": "Edit|Write",
|
|
38
|
+
"hooks": [
|
|
39
|
+
{
|
|
40
|
+
"type": "command",
|
|
41
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/ruff_edit.sh",
|
|
42
|
+
"timeout": 30
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"type": "command",
|
|
46
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/tests_for_edit.sh",
|
|
47
|
+
"timeout": 50
|
|
48
|
+
}
|
|
49
|
+
]
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"matcher": "Bash",
|
|
53
|
+
"hooks": [
|
|
54
|
+
{
|
|
55
|
+
"type": "command",
|
|
56
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/after_commit.sh",
|
|
57
|
+
"timeout": 10
|
|
58
|
+
}
|
|
59
|
+
]
|
|
60
|
+
}
|
|
61
|
+
],
|
|
62
|
+
"Stop": [
|
|
63
|
+
{
|
|
64
|
+
"hooks": [
|
|
65
|
+
{
|
|
66
|
+
"type": "command",
|
|
67
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/tools/graphify_refresh.sh",
|
|
68
|
+
"timeout": 60
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"type": "command",
|
|
72
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/stop_docs.sh",
|
|
73
|
+
"timeout": 10
|
|
74
|
+
}
|
|
75
|
+
]
|
|
76
|
+
}
|
|
77
|
+
]
|
|
78
|
+
}
|
|
79
|
+
}
|