kinemotion 0.13.0__tar.gz → 0.14.1__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.

Potentially problematic release.


This version of kinemotion might be problematic. Click here for more details.

Files changed (83) hide show
  1. kinemotion-0.14.1/.github/workflows/docs.yml +65 -0
  2. {kinemotion-0.13.0 → kinemotion-0.14.1}/.gitignore +3 -0
  3. kinemotion-0.14.1/.readthedocs.yml +22 -0
  4. {kinemotion-0.13.0 → kinemotion-0.14.1}/CHANGELOG.md +16 -0
  5. {kinemotion-0.13.0 → kinemotion-0.14.1}/PKG-INFO +1 -1
  6. kinemotion-0.14.1/docs/api/cmj.md +87 -0
  7. kinemotion-0.14.1/docs/api/core.md +81 -0
  8. kinemotion-0.14.1/docs/api/dropjump.md +81 -0
  9. kinemotion-0.14.1/docs/api/overview.md +73 -0
  10. {kinemotion-0.13.0 → kinemotion-0.14.1}/docs/guides/camera-setup.md +1 -1
  11. kinemotion-0.14.1/docs/index.md +54 -0
  12. {kinemotion-0.13.0 → kinemotion-0.14.1}/docs/translations/es/camera-setup.md +1 -1
  13. kinemotion-0.14.1/mkdocs.yml +99 -0
  14. {kinemotion-0.13.0 → kinemotion-0.14.1}/pyproject.toml +4 -1
  15. kinemotion-0.14.1/requirements-docs.txt +4 -0
  16. {kinemotion-0.13.0 → kinemotion-0.14.1}/uv.lock +253 -1
  17. {kinemotion-0.13.0 → kinemotion-0.14.1}/.dockerignore +0 -0
  18. {kinemotion-0.13.0 → kinemotion-0.14.1}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  19. {kinemotion-0.13.0 → kinemotion-0.14.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  20. {kinemotion-0.13.0 → kinemotion-0.14.1}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  21. {kinemotion-0.13.0 → kinemotion-0.14.1}/.github/pull_request_template.md +0 -0
  22. {kinemotion-0.13.0 → kinemotion-0.14.1}/.github/workflows/release.yml +0 -0
  23. {kinemotion-0.13.0 → kinemotion-0.14.1}/.pre-commit-config.yaml +0 -0
  24. {kinemotion-0.13.0 → kinemotion-0.14.1}/.tool-versions +0 -0
  25. {kinemotion-0.13.0 → kinemotion-0.14.1}/CLAUDE.md +0 -0
  26. {kinemotion-0.13.0 → kinemotion-0.14.1}/CODE_OF_CONDUCT.md +0 -0
  27. {kinemotion-0.13.0 → kinemotion-0.14.1}/CONTRIBUTING.md +0 -0
  28. {kinemotion-0.13.0 → kinemotion-0.14.1}/Dockerfile +0 -0
  29. {kinemotion-0.13.0 → kinemotion-0.14.1}/GEMINI.md +0 -0
  30. {kinemotion-0.13.0 → kinemotion-0.14.1}/LICENSE +0 -0
  31. {kinemotion-0.13.0 → kinemotion-0.14.1}/README.md +0 -0
  32. {kinemotion-0.13.0 → kinemotion-0.14.1}/SECURITY.md +0 -0
  33. {kinemotion-0.13.0 → kinemotion-0.14.1}/docs/README.md +0 -0
  34. {kinemotion-0.13.0 → kinemotion-0.14.1}/docs/development/errors-findings.md +0 -0
  35. {kinemotion-0.13.0 → kinemotion-0.14.1}/docs/development/validation-plan.md +0 -0
  36. {kinemotion-0.13.0 → kinemotion-0.14.1}/docs/guides/bulk-processing.md +0 -0
  37. {kinemotion-0.13.0 → kinemotion-0.14.1}/docs/guides/cmj-guide.md +0 -0
  38. {kinemotion-0.13.0 → kinemotion-0.14.1}/docs/reference/parameters.md +0 -0
  39. {kinemotion-0.13.0 → kinemotion-0.14.1}/docs/reference/pose-systems.md +0 -0
  40. {kinemotion-0.13.0 → kinemotion-0.14.1}/docs/research/sports-biomechanics-pose-estimation.md +0 -0
  41. {kinemotion-0.13.0 → kinemotion-0.14.1}/docs/technical/framerate.md +0 -0
  42. {kinemotion-0.13.0 → kinemotion-0.14.1}/docs/technical/imu-metadata.md +0 -0
  43. {kinemotion-0.13.0 → kinemotion-0.14.1}/docs/technical/real-time-analysis.md +0 -0
  44. {kinemotion-0.13.0 → kinemotion-0.14.1}/docs/technical/triple-extension.md +0 -0
  45. {kinemotion-0.13.0 → kinemotion-0.14.1}/examples/bulk/README.md +0 -0
  46. {kinemotion-0.13.0 → kinemotion-0.14.1}/examples/bulk/bulk_processing.py +0 -0
  47. {kinemotion-0.13.0 → kinemotion-0.14.1}/examples/bulk/simple_example.py +0 -0
  48. {kinemotion-0.13.0 → kinemotion-0.14.1}/examples/programmatic_usage.py +0 -0
  49. {kinemotion-0.13.0 → kinemotion-0.14.1}/samples/cmjs/README.md +0 -0
  50. {kinemotion-0.13.0 → kinemotion-0.14.1}/src/kinemotion/__init__.py +0 -0
  51. {kinemotion-0.13.0 → kinemotion-0.14.1}/src/kinemotion/api.py +0 -0
  52. {kinemotion-0.13.0 → kinemotion-0.14.1}/src/kinemotion/cli.py +0 -0
  53. {kinemotion-0.13.0 → kinemotion-0.14.1}/src/kinemotion/cmj/__init__.py +0 -0
  54. {kinemotion-0.13.0 → kinemotion-0.14.1}/src/kinemotion/cmj/analysis.py +0 -0
  55. {kinemotion-0.13.0 → kinemotion-0.14.1}/src/kinemotion/cmj/cli.py +0 -0
  56. {kinemotion-0.13.0 → kinemotion-0.14.1}/src/kinemotion/cmj/debug_overlay.py +0 -0
  57. {kinemotion-0.13.0 → kinemotion-0.14.1}/src/kinemotion/cmj/joint_angles.py +0 -0
  58. {kinemotion-0.13.0 → kinemotion-0.14.1}/src/kinemotion/cmj/kinematics.py +0 -0
  59. {kinemotion-0.13.0 → kinemotion-0.14.1}/src/kinemotion/core/__init__.py +0 -0
  60. {kinemotion-0.13.0 → kinemotion-0.14.1}/src/kinemotion/core/auto_tuning.py +0 -0
  61. {kinemotion-0.13.0 → kinemotion-0.14.1}/src/kinemotion/core/cli_utils.py +0 -0
  62. {kinemotion-0.13.0 → kinemotion-0.14.1}/src/kinemotion/core/debug_overlay_utils.py +0 -0
  63. {kinemotion-0.13.0 → kinemotion-0.14.1}/src/kinemotion/core/filtering.py +0 -0
  64. {kinemotion-0.13.0 → kinemotion-0.14.1}/src/kinemotion/core/pose.py +0 -0
  65. {kinemotion-0.13.0 → kinemotion-0.14.1}/src/kinemotion/core/smoothing.py +0 -0
  66. {kinemotion-0.13.0 → kinemotion-0.14.1}/src/kinemotion/core/video_io.py +0 -0
  67. {kinemotion-0.13.0 → kinemotion-0.14.1}/src/kinemotion/dropjump/__init__.py +0 -0
  68. {kinemotion-0.13.0 → kinemotion-0.14.1}/src/kinemotion/dropjump/analysis.py +0 -0
  69. {kinemotion-0.13.0 → kinemotion-0.14.1}/src/kinemotion/dropjump/cli.py +0 -0
  70. {kinemotion-0.13.0 → kinemotion-0.14.1}/src/kinemotion/dropjump/debug_overlay.py +0 -0
  71. {kinemotion-0.13.0 → kinemotion-0.14.1}/src/kinemotion/dropjump/kinematics.py +0 -0
  72. {kinemotion-0.13.0 → kinemotion-0.14.1}/src/kinemotion/py.typed +0 -0
  73. {kinemotion-0.13.0 → kinemotion-0.14.1}/tests/__init__.py +0 -0
  74. {kinemotion-0.13.0 → kinemotion-0.14.1}/tests/test_adaptive_threshold.py +0 -0
  75. {kinemotion-0.13.0 → kinemotion-0.14.1}/tests/test_api.py +0 -0
  76. {kinemotion-0.13.0 → kinemotion-0.14.1}/tests/test_aspect_ratio.py +0 -0
  77. {kinemotion-0.13.0 → kinemotion-0.14.1}/tests/test_cmj_analysis.py +0 -0
  78. {kinemotion-0.13.0 → kinemotion-0.14.1}/tests/test_cmj_kinematics.py +0 -0
  79. {kinemotion-0.13.0 → kinemotion-0.14.1}/tests/test_com_estimation.py +0 -0
  80. {kinemotion-0.13.0 → kinemotion-0.14.1}/tests/test_contact_detection.py +0 -0
  81. {kinemotion-0.13.0 → kinemotion-0.14.1}/tests/test_filtering.py +0 -0
  82. {kinemotion-0.13.0 → kinemotion-0.14.1}/tests/test_kinematics.py +0 -0
  83. {kinemotion-0.13.0 → kinemotion-0.14.1}/tests/test_polyorder.py +0 -0
@@ -0,0 +1,65 @@
1
+ name: Documentation
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+ release:
9
+ types: [published]
10
+ workflow_dispatch:
11
+
12
+ jobs:
13
+ build:
14
+ runs-on: ubuntu-latest
15
+ steps:
16
+ - uses: actions/checkout@v4
17
+
18
+ - name: Set up Python
19
+ uses: actions/setup-python@v5
20
+ with:
21
+ python-version: "3.12"
22
+
23
+ - name: Install uv
24
+ uses: astral-sh/setup-uv@v3
25
+ with:
26
+ enable-cache: true
27
+
28
+ - name: Install dependencies
29
+ run: |
30
+ uv sync --frozen
31
+
32
+ - name: Build documentation
33
+ run: |
34
+ uv run mkdocs build --strict
35
+
36
+ - name: Upload docs artifact
37
+ uses: actions/upload-artifact@v4
38
+ with:
39
+ name: docs
40
+ path: site/
41
+
42
+ deploy:
43
+ if: github.event_name == 'release'
44
+ needs: build
45
+ runs-on: ubuntu-latest
46
+ permissions:
47
+ contents: write
48
+ steps:
49
+ - uses: actions/checkout@v4
50
+
51
+ - name: Set up Python
52
+ uses: actions/setup-python@v5
53
+ with:
54
+ python-version: "3.12"
55
+
56
+ - name: Install uv
57
+ uses: astral-sh/setup-uv@v3
58
+
59
+ - name: Install dependencies
60
+ run: |
61
+ uv sync --frozen
62
+
63
+ - name: Deploy to GitHub Pages
64
+ run: |
65
+ uv run mkdocs gh-deploy --force
@@ -50,6 +50,9 @@ htmlcov/
50
50
  *.csv
51
51
  !pyproject.toml
52
52
 
53
+ # Documentation build output
54
+ site/
55
+
53
56
  # Logs
54
57
  *.log
55
58
  combined.log
@@ -0,0 +1,22 @@
1
+ # Read the Docs configuration file
2
+ # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
3
+
4
+ version: 2
5
+
6
+ # Build documentation with MkDocs
7
+ mkdocs:
8
+ configuration: mkdocs.yml
9
+ fail_on_warning: false
10
+
11
+ # Build environment
12
+ build:
13
+ os: ubuntu-22.04
14
+ tools:
15
+ python: "3.12"
16
+
17
+ # Python configuration
18
+ python:
19
+ install:
20
+ - method: pip
21
+ path: .
22
+ - requirements: requirements-docs.txt
@@ -7,6 +7,22 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  <!-- version list -->
9
9
 
10
+ ## v0.14.1 (2025-11-06)
11
+
12
+ ### Bug Fixes
13
+
14
+ - **docs**: Resolve Read the Docs build failure with Material theme
15
+ ([`8c0b998`](https://github.com/feniix/kinemotion/commit/8c0b99876ab948300b0b9a773848c11474b23c03))
16
+
17
+
18
+ ## v0.14.0 (2025-11-06)
19
+
20
+ ### Features
21
+
22
+ - **docs**: Add MkDocs documentation with auto-generated API reference
23
+ ([`cb5cd31`](https://github.com/feniix/kinemotion/commit/cb5cd313e43c6ba0c95c8e77b5651e7c86c73902))
24
+
25
+
10
26
  ## v0.13.0 (2025-11-06)
11
27
 
12
28
  ### Documentation
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kinemotion
3
- Version: 0.13.0
3
+ Version: 0.14.1
4
4
  Summary: Video-based kinematic analysis for athletic performance
5
5
  Project-URL: Homepage, https://github.com/feniix/kinemotion
6
6
  Project-URL: Repository, https://github.com/feniix/kinemotion
@@ -0,0 +1,87 @@
1
+ # CMJ API
2
+
3
+ The CMJ API provides functions for analyzing counter movement jump videos and extracting kinematic metrics including triple extension analysis.
4
+
5
+ ## Quick Example
6
+
7
+ ```python
8
+ from kinemotion import process_cmj_video
9
+
10
+ metrics = process_cmj_video(
11
+ video_path="cmj.mp4",
12
+ output_path="debug.mp4", # optional
13
+ smoothing=True
14
+ )
15
+
16
+ print(f"Jump height: {metrics.jump_height:.2f}m")
17
+ print(f"Flight time: {metrics.flight_time:.3f}s")
18
+ print(f"Countermovement depth: {metrics.countermovement_depth:.3f}m")
19
+ print(f"Triple extension: {metrics.triple_extension_percentage:.1f}%")
20
+ ```
21
+
22
+ ## Main Functions
23
+
24
+ ::: kinemotion.api.process_cmj_video
25
+ options:
26
+ show_root_heading: true
27
+ show_source: false
28
+
29
+ ::: kinemotion.api.process_cmj_videos_bulk
30
+ options:
31
+ show_root_heading: true
32
+ show_source: false
33
+
34
+ ## Configuration
35
+
36
+ ::: kinemotion.api.CMJVideoConfig
37
+ options:
38
+ show_root_heading: true
39
+ show_source: false
40
+
41
+ ## Results
42
+
43
+ ::: kinemotion.api.CMJVideoResult
44
+ options:
45
+ show_root_heading: true
46
+ show_source: false
47
+
48
+ ## Metrics
49
+
50
+ ::: kinemotion.cmj.kinematics.CMJMetrics
51
+ options:
52
+ show_root_heading: true
53
+ show_source: false
54
+
55
+ ## Key Differences from Drop Jump
56
+
57
+ ### No Calibration Required
58
+
59
+ Unlike drop jumps, CMJ analysis doesn't require a `drop_height` parameter. All measurements are relative to the starting position.
60
+
61
+ ### Backward Search Algorithm
62
+
63
+ CMJ detection uses a backward search algorithm starting from the peak height, making it more robust than forward search.
64
+
65
+ ### Signed Velocity
66
+
67
+ CMJ analysis uses signed velocity (direction matters) to distinguish upward vs downward motion phases.
68
+
69
+ ### Lateral View Required
70
+
71
+ CMJ analysis requires a lateral (side) view for accurate depth and triple extension measurements. Front view will not work due to parallax errors.
72
+
73
+ ## Triple Extension Analysis
74
+
75
+ The CMJ API includes detailed triple extension analysis:
76
+
77
+ ```python
78
+ metrics = process_cmj_video("cmj.mp4")
79
+
80
+ # Triple extension metrics
81
+ print(f"Hip extension: {metrics.hip_extension_angle:.1f}°")
82
+ print(f"Knee extension: {metrics.knee_extension_angle:.1f}°")
83
+ print(f"Ankle plantar flexion: {metrics.ankle_plantar_flexion_angle:.1f}°")
84
+ print(f"Overall triple extension: {metrics.triple_extension_percentage:.1f}%")
85
+ ```
86
+
87
+ See [Triple Extension Technical Documentation](../technical/triple-extension.md) for biomechanics details.
@@ -0,0 +1,81 @@
1
+ # Core Utilities
2
+
3
+ Lower-level utilities for advanced usage and custom analysis pipelines.
4
+
5
+ ## Pose Detection
6
+
7
+ ::: kinemotion.core.pose.PoseTracker
8
+ options:
9
+ show_root_heading: true
10
+ show_source: false
11
+
12
+ ::: kinemotion.core.pose.compute_center_of_mass
13
+ options:
14
+ show_root_heading: true
15
+ show_source: false
16
+
17
+ ## Smoothing & Filtering
18
+
19
+ ::: kinemotion.core.smoothing.smooth_landmarks
20
+ options:
21
+ show_root_heading: true
22
+ show_source: false
23
+
24
+ ::: kinemotion.core.smoothing.smooth_landmarks_advanced
25
+ options:
26
+ show_root_heading: true
27
+ show_source: false
28
+
29
+ ## Video Processing
30
+
31
+ ::: kinemotion.core.video_io.VideoProcessor
32
+ options:
33
+ show_root_heading: true
34
+ show_source: false
35
+
36
+ ## Auto-Tuning
37
+
38
+ ::: kinemotion.core.auto_tuning.auto_tune_parameters
39
+ options:
40
+ show_root_heading: true
41
+ show_source: false
42
+
43
+ ::: kinemotion.core.auto_tuning.analyze_video_sample
44
+ options:
45
+ show_root_heading: true
46
+ show_source: false
47
+
48
+ ::: kinemotion.core.auto_tuning.QualityPreset
49
+ options:
50
+ show_root_heading: true
51
+ show_source: false
52
+
53
+ ## Usage Example
54
+
55
+ ```python
56
+ from kinemotion.core.pose import PoseTracker
57
+ from kinemotion.core.smoothing import smooth_landmarks
58
+ from kinemotion.core.video_io import VideoProcessor
59
+
60
+ # Initialize pose tracker
61
+ tracker = PoseTracker(
62
+ min_detection_confidence=0.5,
63
+ min_tracking_confidence=0.5
64
+ )
65
+
66
+ # Process video
67
+ video = VideoProcessor("video.mp4")
68
+ landmarks = []
69
+
70
+ for frame in video:
71
+ result = tracker.process_frame(frame)
72
+ if result:
73
+ landmarks.append(result)
74
+
75
+ # Apply smoothing
76
+ smoothed = smooth_landmarks(
77
+ landmarks,
78
+ window_length=13,
79
+ polyorder=3
80
+ )
81
+ ```
@@ -0,0 +1,81 @@
1
+ # Drop Jump API
2
+
3
+ The drop jump API provides functions for analyzing drop jump videos and extracting kinematic metrics.
4
+
5
+ ## Quick Example
6
+
7
+ ```python
8
+ from kinemotion import process_video
9
+
10
+ metrics = process_video(
11
+ video_path="dropjump.mp4",
12
+ drop_height=0.40, # meters
13
+ output_path="debug.mp4", # optional
14
+ smoothing=True
15
+ )
16
+
17
+ print(f"Ground contact time: {metrics.ground_contact_time:.3f}s")
18
+ print(f"Flight time: {metrics.flight_time:.3f}s")
19
+ print(f"RSI: {metrics.reactive_strength_index:.2f}")
20
+ ```
21
+
22
+ ## Main Functions
23
+
24
+ ::: kinemotion.api.process_video
25
+ options:
26
+ show_root_heading: true
27
+ show_source: false
28
+
29
+ ::: kinemotion.api.process_videos_bulk
30
+ options:
31
+ show_root_heading: true
32
+ show_source: false
33
+
34
+ ## Configuration
35
+
36
+ ::: kinemotion.api.VideoConfig
37
+ options:
38
+ show_root_heading: true
39
+ show_source: false
40
+
41
+ ## Results
42
+
43
+ ::: kinemotion.api.VideoResult
44
+ options:
45
+ show_root_heading: true
46
+ show_source: false
47
+
48
+ ## Metrics
49
+
50
+ ::: kinemotion.dropjump.kinematics.DropJumpMetrics
51
+ options:
52
+ show_root_heading: true
53
+ show_source: false
54
+
55
+ ## Key Parameters
56
+
57
+ ### drop_height
58
+
59
+ **Required.** The height of the drop box in meters. This is critical for accurate velocity calculations.
60
+
61
+ ```python
62
+ metrics = process_video("video.mp4", drop_height=0.40) # 40cm box
63
+ ```
64
+
65
+ ### smoothing
66
+
67
+ Apply Savitzky-Golay smoothing to landmark positions before analysis. Reduces noise but may slightly delay event detection.
68
+
69
+ Default: `True`
70
+
71
+ ### output_path
72
+
73
+ Path to write debug video with overlay visualization. If not provided, no debug video is created.
74
+
75
+ ```python
76
+ metrics = process_video(
77
+ "video.mp4",
78
+ drop_height=0.40,
79
+ output_path="debug.mp4"
80
+ )
81
+ ```
@@ -0,0 +1,73 @@
1
+ # API Overview
2
+
3
+ Kinemotion provides a Python API for video-based kinematic analysis. The API is organized around two main jump types:
4
+
5
+ ## Main Functions
6
+
7
+ ### Drop Jump Analysis
8
+
9
+ Process drop jump videos and extract kinematic metrics:
10
+
11
+ - `process_video()` - Analyze a single drop jump video
12
+ - `process_videos_bulk()` - Batch process multiple drop jump videos
13
+ - `VideoConfig` - Configuration for drop jump analysis
14
+ - `VideoResult` - Results from drop jump analysis
15
+ - `DropJumpMetrics` - Kinematic metrics for drop jumps
16
+
17
+ See [Drop Jump API](dropjump.md) for detailed documentation.
18
+
19
+ ### CMJ Analysis
20
+
21
+ Process counter movement jump videos and extract kinematic metrics:
22
+
23
+ - `process_cmj_video()` - Analyze a single CMJ video
24
+ - `process_cmj_videos_bulk()` - Batch process multiple CMJ videos
25
+ - `CMJVideoConfig` - Configuration for CMJ analysis
26
+ - `CMJVideoResult` - Results from CMJ analysis
27
+ - `CMJMetrics` - Kinematic metrics for CMJs
28
+
29
+ See [CMJ API](cmj.md) for detailed documentation.
30
+
31
+ ## Basic Usage
32
+
33
+ ```python
34
+ from kinemotion import process_video, process_cmj_video
35
+
36
+ # Drop jump analysis
37
+ drop_metrics = process_video("dropjump.mp4", drop_height=0.40)
38
+
39
+ # CMJ analysis
40
+ cmj_metrics = process_cmj_video("cmj.mp4")
41
+ ```
42
+
43
+ ## Batch Processing
44
+
45
+ ```python
46
+ from kinemotion import process_videos_bulk, process_cmj_videos_bulk
47
+
48
+ # Batch drop jump analysis
49
+ results = process_videos_bulk(
50
+ video_paths=["video1.mp4", "video2.mp4"],
51
+ drop_height=0.40,
52
+ output_dir="results/",
53
+ workers=4
54
+ )
55
+
56
+ # Batch CMJ analysis
57
+ cmj_results = process_cmj_videos_bulk(
58
+ video_paths=["cmj1.mp4", "cmj2.mp4"],
59
+ output_dir="results/",
60
+ workers=4
61
+ )
62
+ ```
63
+
64
+ ## Core Utilities
65
+
66
+ For advanced usage, you can access lower-level utilities:
67
+
68
+ - Pose detection and tracking
69
+ - Velocity computation
70
+ - Smoothing and filtering
71
+ - Video I/O with rotation handling
72
+
73
+ See [Core Utilities](core.md) for detailed documentation.
@@ -941,7 +941,7 @@ ______________________________________________________________________
941
941
  - **[Pose Systems Quick Reference](../reference/pose-systems.md)** - System comparison guide
942
942
  - [CLI Parameters Guide](../reference/parameters.md) - Analysis parameters
943
943
  - [CMJ Guide](cmj-guide.md) - Counter-movement jump specifics
944
- - Main [CLAUDE.md](../../CLAUDE.md) - Complete project documentation
944
+ - [CLAUDE.md](https://github.com/feniix/kinemotion/blob/main/CLAUDE.md) - Complete project documentation (GitHub)
945
945
 
946
946
  ______________________________________________________________________
947
947
 
@@ -0,0 +1,54 @@
1
+ # Quick Start
2
+
3
+ Kinemotion provides video-based kinematic analysis for athletic performance using MediaPipe pose tracking.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ pip install kinemotion
9
+ ```
10
+
11
+ ## Supported Jump Types
12
+
13
+ - **Drop Jump**: Ground contact time, flight time, reactive strength index
14
+ - **Counter Movement Jump (CMJ)**: Jump height, flight time, countermovement depth, triple extension
15
+
16
+ ## Quick Examples
17
+
18
+ ### Drop Jump Analysis
19
+
20
+ ```bash
21
+ kinemotion dropjump-analyze video.mp4 --drop-height 0.40
22
+ ```
23
+
24
+ Or via Python API:
25
+
26
+ ```python
27
+ from kinemotion import process_video
28
+
29
+ metrics = process_video("video.mp4", drop_height=0.40)
30
+ print(f"Ground contact time: {metrics.ground_contact_time:.3f}s")
31
+ print(f"RSI: {metrics.reactive_strength_index:.2f}")
32
+ ```
33
+
34
+ ### CMJ Analysis
35
+
36
+ ```bash
37
+ kinemotion cmj-analyze video.mp4
38
+ ```
39
+
40
+ Or via Python API:
41
+
42
+ ```python
43
+ from kinemotion import process_cmj_video
44
+
45
+ metrics = process_cmj_video("video.mp4")
46
+ print(f"Jump height: {metrics.jump_height:.2f}m")
47
+ print(f"Flight time: {metrics.flight_time:.3f}s")
48
+ ```
49
+
50
+ ## Next Steps
51
+
52
+ - [CMJ Analysis Guide](guides/cmj-guide.md) - Detailed guide for CMJ analysis
53
+ - [Camera Setup](guides/camera-setup.md) - How to set up your camera for best results
54
+ - [API Reference](api/overview.md) - Complete API documentation
@@ -941,7 +941,7 @@ ______________________________________________________________________
941
941
  - **[Referencia Rápida de Sistemas de Pose](../../reference/pose-systems.md)** - Guía de comparación de sistemas
942
942
  - [Guía de Parámetros CLI](../../reference/parameters.md) - Parámetros de análisis
943
943
  - [Guía CMJ](../../guides/cmj-guide.md) - Especificaciones de salto con contramovimiento
944
- - [CLAUDE.md](../../../CLAUDE.md) principal - Documentación completa del proyecto
944
+ - [CLAUDE.md](https://github.com/feniix/kinemotion/blob/main/CLAUDE.md) principal - Documentación completa del proyecto (GitHub)
945
945
 
946
946
  ______________________________________________________________________
947
947
 
@@ -0,0 +1,99 @@
1
+ site_name: Kinemotion
2
+ site_description: Video-based kinematic analysis for athletic performance
3
+ site_author: Sebastian Otaegui
4
+ site_url: https://kinemotion.readthedocs.io
5
+ repo_url: https://github.com/feniix/kinemotion
6
+ repo_name: feniix/kinemotion
7
+ edit_uri: edit/main/docs/
8
+
9
+ theme:
10
+ name: material
11
+ palette:
12
+ # Light mode
13
+ - scheme: default
14
+ primary: indigo
15
+ accent: indigo
16
+ toggle:
17
+ icon: material/brightness-7
18
+ name: Switch to dark mode
19
+ # Dark mode
20
+ - scheme: slate
21
+ primary: indigo
22
+ accent: indigo
23
+ toggle:
24
+ icon: material/brightness-4
25
+ name: Switch to light mode
26
+ features:
27
+ - navigation.tabs
28
+ - navigation.sections
29
+ - navigation.top
30
+ - navigation.tracking
31
+ - search.suggest
32
+ - search.highlight
33
+ - content.code.copy
34
+ - content.code.annotate
35
+
36
+ plugins:
37
+ - search
38
+ - mkdocstrings:
39
+ handlers:
40
+ python:
41
+ options:
42
+ docstring_style: google
43
+ show_source: true
44
+ show_root_heading: true
45
+ show_root_full_path: false
46
+ show_symbol_type_heading: true
47
+ show_symbol_type_toc: true
48
+ signature_crossrefs: true
49
+ separate_signature: true
50
+ merge_init_into_class: true
51
+
52
+ markdown_extensions:
53
+ - admonition
54
+ - pymdownx.details
55
+ - pymdownx.superfences
56
+ - pymdownx.highlight:
57
+ anchor_linenums: true
58
+ - pymdownx.inlinehilite
59
+ - pymdownx.snippets
60
+ - pymdownx.tabbed:
61
+ alternate_style: true
62
+ - tables
63
+ - toc:
64
+ permalink: true
65
+
66
+ nav:
67
+ - Home: index.md
68
+ - Guides:
69
+ - CMJ Analysis: guides/cmj-guide.md
70
+ - Camera Setup: guides/camera-setup.md
71
+ - Bulk Processing: guides/bulk-processing.md
72
+ - Reference:
73
+ - CLI Parameters: reference/parameters.md
74
+ - Pose Systems: reference/pose-systems.md
75
+ - API Reference:
76
+ - Overview: api/overview.md
77
+ - Drop Jump API: api/dropjump.md
78
+ - CMJ API: api/cmj.md
79
+ - Core Utilities: api/core.md
80
+ - Technical:
81
+ - Triple Extension: technical/triple-extension.md
82
+ - Framerate: technical/framerate.md
83
+ - Real-time Analysis: technical/real-time-analysis.md
84
+ - IMU Metadata: technical/imu-metadata.md
85
+ - Research:
86
+ - Sports Biomechanics: research/sports-biomechanics-pose-estimation.md
87
+ - Development:
88
+ - Validation Plan: development/validation-plan.md
89
+ - Error Findings: development/errors-findings.md
90
+ - Translations:
91
+ - Español:
92
+ - Configuración de Cámara: translations/es/camera-setup.md
93
+
94
+ # Exclude files from the documentation build
95
+ exclude_docs: |
96
+ README.md
97
+
98
+ watch:
99
+ - src/kinemotion
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "kinemotion"
3
- version = "0.13.0"
3
+ version = "0.14.1"
4
4
  description = "Video-based kinematic analysis for athletic performance"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10,<3.13"
@@ -55,6 +55,9 @@ dev = [
55
55
  "pyright>=1.1.380",
56
56
  "pre-commit>=3.6.0",
57
57
  "python-semantic-release>=9.8.2",
58
+ "mkdocs>=1.5.0",
59
+ "mkdocs-material>=9.5.0",
60
+ "mkdocstrings[python]>=0.24.0",
58
61
  ]
59
62
 
60
63
 
@@ -0,0 +1,4 @@
1
+ # Documentation dependencies for Read the Docs
2
+ mkdocs>=1.5.0
3
+ mkdocs-material>=9.5.0
4
+ mkdocstrings[python]>=0.24.0
@@ -40,6 +40,27 @@ wheels = [
40
40
  { url = "https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl", hash = "sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373", size = 67615, upload-time = "2025-10-06T13:54:43.17Z" },
41
41
  ]
42
42
 
43
+ [[package]]
44
+ name = "babel"
45
+ version = "2.17.0"
46
+ source = { registry = "https://pypi.org/simple" }
47
+ sdist = { url = "https://files.pythonhosted.org/packages/7d/6b/d52e42361e1aa00709585ecc30b3f9684b3ab62530771402248b1b1d6240/babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d", size = 9951852, upload-time = "2025-02-01T15:17:41.026Z" }
48
+ wheels = [
49
+ { url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537, upload-time = "2025-02-01T15:17:37.39Z" },
50
+ ]
51
+
52
+ [[package]]
53
+ name = "backrefs"
54
+ version = "5.9"
55
+ source = { registry = "https://pypi.org/simple" }
56
+ sdist = { url = "https://files.pythonhosted.org/packages/eb/a7/312f673df6a79003279e1f55619abbe7daebbb87c17c976ddc0345c04c7b/backrefs-5.9.tar.gz", hash = "sha256:808548cb708d66b82ee231f962cb36faaf4f2baab032f2fbb783e9c2fdddaa59", size = 5765857, upload-time = "2025-06-22T19:34:13.97Z" }
57
+ wheels = [
58
+ { url = "https://files.pythonhosted.org/packages/19/4d/798dc1f30468134906575156c089c492cf79b5a5fd373f07fe26c4d046bf/backrefs-5.9-py310-none-any.whl", hash = "sha256:db8e8ba0e9de81fcd635f440deab5ae5f2591b54ac1ebe0550a2ca063488cd9f", size = 380267, upload-time = "2025-06-22T19:34:05.252Z" },
59
+ { url = "https://files.pythonhosted.org/packages/55/07/f0b3375bf0d06014e9787797e6b7cc02b38ac9ff9726ccfe834d94e9991e/backrefs-5.9-py311-none-any.whl", hash = "sha256:6907635edebbe9b2dc3de3a2befff44d74f30a4562adbb8b36f21252ea19c5cf", size = 392072, upload-time = "2025-06-22T19:34:06.743Z" },
60
+ { url = "https://files.pythonhosted.org/packages/9d/12/4f345407259dd60a0997107758ba3f221cf89a9b5a0f8ed5b961aef97253/backrefs-5.9-py312-none-any.whl", hash = "sha256:7fdf9771f63e6028d7fee7e0c497c81abda597ea45d6b8f89e8ad76994f5befa", size = 397947, upload-time = "2025-06-22T19:34:08.172Z" },
61
+ { url = "https://files.pythonhosted.org/packages/41/ff/392bff89415399a979be4a65357a41d92729ae8580a66073d8ec8d810f98/backrefs-5.9-py39-none-any.whl", hash = "sha256:f48ee18f6252b8f5777a22a00a09a85de0ca931658f1dd96d4406a34f3748c60", size = 380265, upload-time = "2025-06-22T19:34:12.405Z" },
62
+ ]
63
+
43
64
  [[package]]
44
65
  name = "black"
45
66
  version = "25.9.0"
@@ -427,6 +448,18 @@ wheels = [
427
448
  { url = "https://files.pythonhosted.org/packages/c7/93/0dd45cd283c32dea1545151d8c3637b4b8c53cdb3a625aeb2885b184d74d/fonttools-4.60.1-py3-none-any.whl", hash = "sha256:906306ac7afe2156fcf0042173d6ebbb05416af70f6b370967b47f8f00103bbb", size = 1143175, upload-time = "2025-09-29T21:13:24.134Z" },
428
449
  ]
429
450
 
451
+ [[package]]
452
+ name = "ghp-import"
453
+ version = "2.1.0"
454
+ source = { registry = "https://pypi.org/simple" }
455
+ dependencies = [
456
+ { name = "python-dateutil" },
457
+ ]
458
+ sdist = { url = "https://files.pythonhosted.org/packages/d9/29/d40217cbe2f6b1359e00c6c307bb3fc876ba74068cbab3dde77f03ca0dc4/ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343", size = 10943, upload-time = "2022-05-02T15:47:16.11Z" }
459
+ wheels = [
460
+ { url = "https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619", size = 11034, upload-time = "2022-05-02T15:47:14.552Z" },
461
+ ]
462
+
430
463
  [[package]]
431
464
  name = "gitdb"
432
465
  version = "4.0.12"
@@ -451,6 +484,18 @@ wheels = [
451
484
  { url = "https://files.pythonhosted.org/packages/01/61/d4b89fec821f72385526e1b9d9a3a0385dda4a72b206d28049e2c7cd39b8/gitpython-3.1.45-py3-none-any.whl", hash = "sha256:8908cb2e02fb3b93b7eb0f2827125cb699869470432cc885f019b8fd0fccff77", size = 208168, upload-time = "2025-07-24T03:45:52.517Z" },
452
485
  ]
453
486
 
487
+ [[package]]
488
+ name = "griffe"
489
+ version = "1.14.0"
490
+ source = { registry = "https://pypi.org/simple" }
491
+ dependencies = [
492
+ { name = "colorama" },
493
+ ]
494
+ sdist = { url = "https://files.pythonhosted.org/packages/ec/d7/6c09dd7ce4c7837e4cdb11dce980cb45ae3cd87677298dc3b781b6bce7d3/griffe-1.14.0.tar.gz", hash = "sha256:9d2a15c1eca966d68e00517de5d69dd1bc5c9f2335ef6c1775362ba5b8651a13", size = 424684, upload-time = "2025-09-05T15:02:29.167Z" }
495
+ wheels = [
496
+ { url = "https://files.pythonhosted.org/packages/2a/b1/9ff6578d789a89812ff21e4e0f80ffae20a65d5dd84e7a17873fe3b365be/griffe-1.14.0-py3-none-any.whl", hash = "sha256:0e9d52832cccf0f7188cfe585ba962d2674b241c01916d780925df34873bceb0", size = 144439, upload-time = "2025-09-05T15:02:27.511Z" },
497
+ ]
498
+
454
499
  [[package]]
455
500
  name = "identify"
456
501
  version = "2.6.15"
@@ -603,7 +648,7 @@ wheels = [
603
648
 
604
649
  [[package]]
605
650
  name = "kinemotion"
606
- version = "0.13.0"
651
+ version = "0.14.1"
607
652
  source = { editable = "." }
608
653
  dependencies = [
609
654
  { name = "click" },
@@ -617,6 +662,9 @@ dependencies = [
617
662
  [package.dev-dependencies]
618
663
  dev = [
619
664
  { name = "black" },
665
+ { name = "mkdocs" },
666
+ { name = "mkdocs-material" },
667
+ { name = "mkdocstrings", extra = ["python"] },
620
668
  { name = "pre-commit" },
621
669
  { name = "pyright" },
622
670
  { name = "pytest" },
@@ -636,6 +684,9 @@ requires-dist = [
636
684
  [package.metadata.requires-dev]
637
685
  dev = [
638
686
  { name = "black", specifier = ">=23.12.0" },
687
+ { name = "mkdocs", specifier = ">=1.5.0" },
688
+ { name = "mkdocs-material", specifier = ">=9.5.0" },
689
+ { name = "mkdocstrings", extras = ["python"], specifier = ">=0.24.0" },
639
690
  { name = "pre-commit", specifier = ">=3.6.0" },
640
691
  { name = "pyright", specifier = ">=1.1.380" },
641
692
  { name = "pytest", specifier = ">=7.4.3" },
@@ -700,6 +751,15 @@ wheels = [
700
751
  { url = "https://files.pythonhosted.org/packages/da/e9/0d4add7873a73e462aeb45c036a2dead2562b825aa46ba326727b3f31016/kiwisolver-1.4.9-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:fb940820c63a9590d31d88b815e7a3aa5915cad3ce735ab45f0c730b39547de1", size = 73929, upload-time = "2025-08-10T21:27:48.236Z" },
701
752
  ]
702
753
 
754
+ [[package]]
755
+ name = "markdown"
756
+ version = "3.10"
757
+ source = { registry = "https://pypi.org/simple" }
758
+ sdist = { url = "https://files.pythonhosted.org/packages/7d/ab/7dd27d9d863b3376fcf23a5a13cb5d024aed1db46f963f1b5735ae43b3be/markdown-3.10.tar.gz", hash = "sha256:37062d4f2aa4b2b6b32aefb80faa300f82cc790cb949a35b8caede34f2b68c0e", size = 364931, upload-time = "2025-11-03T19:51:15.007Z" }
759
+ wheels = [
760
+ { url = "https://files.pythonhosted.org/packages/70/81/54e3ce63502cd085a0c556652a4e1b919c45a446bd1e5300e10c44c8c521/markdown-3.10-py3-none-any.whl", hash = "sha256:b5b99d6951e2e4948d939255596523444c0e677c669700b1d17aa4a8a464cb7c", size = 107678, upload-time = "2025-11-03T19:51:13.887Z" },
761
+ ]
762
+
703
763
  [[package]]
704
764
  name = "markdown-it-py"
705
765
  version = "4.0.0"
@@ -842,6 +902,135 @@ wheels = [
842
902
  { url = "https://files.pythonhosted.org/packages/b7/79/b77808f8195f229ef0c15875540dfdd36724748a4b3de53d993f23336839/mediapipe-0.10.21-cp312-cp312-win_amd64.whl", hash = "sha256:d07b5e69308411161286ea4e48be2ea3e9ab62745143fcb0cb4acced0517e341", size = 50967082, upload-time = "2025-02-06T19:07:26.979Z" },
843
903
  ]
844
904
 
905
+ [[package]]
906
+ name = "mergedeep"
907
+ version = "1.3.4"
908
+ source = { registry = "https://pypi.org/simple" }
909
+ sdist = { url = "https://files.pythonhosted.org/packages/3a/41/580bb4006e3ed0361b8151a01d324fb03f420815446c7def45d02f74c270/mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8", size = 4661, upload-time = "2021-02-05T18:55:30.623Z" }
910
+ wheels = [
911
+ { url = "https://files.pythonhosted.org/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307", size = 6354, upload-time = "2021-02-05T18:55:29.583Z" },
912
+ ]
913
+
914
+ [[package]]
915
+ name = "mkdocs"
916
+ version = "1.6.1"
917
+ source = { registry = "https://pypi.org/simple" }
918
+ dependencies = [
919
+ { name = "click" },
920
+ { name = "colorama", marker = "sys_platform == 'win32'" },
921
+ { name = "ghp-import" },
922
+ { name = "jinja2" },
923
+ { name = "markdown" },
924
+ { name = "markupsafe" },
925
+ { name = "mergedeep" },
926
+ { name = "mkdocs-get-deps" },
927
+ { name = "packaging" },
928
+ { name = "pathspec" },
929
+ { name = "pyyaml" },
930
+ { name = "pyyaml-env-tag" },
931
+ { name = "watchdog" },
932
+ ]
933
+ sdist = { url = "https://files.pythonhosted.org/packages/bc/c6/bbd4f061bd16b378247f12953ffcb04786a618ce5e904b8c5a01a0309061/mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2", size = 3889159, upload-time = "2024-08-30T12:24:06.899Z" }
934
+ wheels = [
935
+ { url = "https://files.pythonhosted.org/packages/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e", size = 3864451, upload-time = "2024-08-30T12:24:05.054Z" },
936
+ ]
937
+
938
+ [[package]]
939
+ name = "mkdocs-autorefs"
940
+ version = "1.4.3"
941
+ source = { registry = "https://pypi.org/simple" }
942
+ dependencies = [
943
+ { name = "markdown" },
944
+ { name = "markupsafe" },
945
+ { name = "mkdocs" },
946
+ ]
947
+ sdist = { url = "https://files.pythonhosted.org/packages/51/fa/9124cd63d822e2bcbea1450ae68cdc3faf3655c69b455f3a7ed36ce6c628/mkdocs_autorefs-1.4.3.tar.gz", hash = "sha256:beee715b254455c4aa93b6ef3c67579c399ca092259cc41b7d9342573ff1fc75", size = 55425, upload-time = "2025-08-26T14:23:17.223Z" }
948
+ wheels = [
949
+ { url = "https://files.pythonhosted.org/packages/9f/4d/7123b6fa2278000688ebd338e2a06d16870aaf9eceae6ba047ea05f92df1/mkdocs_autorefs-1.4.3-py3-none-any.whl", hash = "sha256:469d85eb3114801d08e9cc55d102b3ba65917a869b893403b8987b601cf55dc9", size = 25034, upload-time = "2025-08-26T14:23:15.906Z" },
950
+ ]
951
+
952
+ [[package]]
953
+ name = "mkdocs-get-deps"
954
+ version = "0.2.0"
955
+ source = { registry = "https://pypi.org/simple" }
956
+ dependencies = [
957
+ { name = "mergedeep" },
958
+ { name = "platformdirs" },
959
+ { name = "pyyaml" },
960
+ ]
961
+ sdist = { url = "https://files.pythonhosted.org/packages/98/f5/ed29cd50067784976f25ed0ed6fcd3c2ce9eb90650aa3b2796ddf7b6870b/mkdocs_get_deps-0.2.0.tar.gz", hash = "sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c", size = 10239, upload-time = "2023-11-20T17:51:09.981Z" }
962
+ wheels = [
963
+ { url = "https://files.pythonhosted.org/packages/9f/d4/029f984e8d3f3b6b726bd33cafc473b75e9e44c0f7e80a5b29abc466bdea/mkdocs_get_deps-0.2.0-py3-none-any.whl", hash = "sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134", size = 9521, upload-time = "2023-11-20T17:51:08.587Z" },
964
+ ]
965
+
966
+ [[package]]
967
+ name = "mkdocs-material"
968
+ version = "9.6.23"
969
+ source = { registry = "https://pypi.org/simple" }
970
+ dependencies = [
971
+ { name = "babel" },
972
+ { name = "backrefs" },
973
+ { name = "colorama" },
974
+ { name = "jinja2" },
975
+ { name = "markdown" },
976
+ { name = "mkdocs" },
977
+ { name = "mkdocs-material-extensions" },
978
+ { name = "paginate" },
979
+ { name = "pygments" },
980
+ { name = "pymdown-extensions" },
981
+ { name = "requests" },
982
+ ]
983
+ sdist = { url = "https://files.pythonhosted.org/packages/57/de/cc1d5139c2782b1a49e1ed1845b3298ed6076b9ba1c740ad7c952d8ffcf9/mkdocs_material-9.6.23.tar.gz", hash = "sha256:62ebc9cdbe90e1ae4f4e9b16a6aa5c69b93474c7b9e79ebc0b11b87f9f055e00", size = 4048130, upload-time = "2025-11-01T16:33:11.782Z" }
984
+ wheels = [
985
+ { url = "https://files.pythonhosted.org/packages/f5/df/bc583e857174b0dc6df67d555123533f09e7e1ac0f3fae7693fb6840c0a3/mkdocs_material-9.6.23-py3-none-any.whl", hash = "sha256:3bf3f1d82d269f3a14ed6897bfc3a844cc05e1dc38045386691b91d7e6945332", size = 9210689, upload-time = "2025-11-01T16:33:08.196Z" },
986
+ ]
987
+
988
+ [[package]]
989
+ name = "mkdocs-material-extensions"
990
+ version = "1.3.1"
991
+ source = { registry = "https://pypi.org/simple" }
992
+ sdist = { url = "https://files.pythonhosted.org/packages/79/9b/9b4c96d6593b2a541e1cb8b34899a6d021d208bb357042823d4d2cabdbe7/mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443", size = 11847, upload-time = "2023-11-22T19:09:45.208Z" }
993
+ wheels = [
994
+ { url = "https://files.pythonhosted.org/packages/5b/54/662a4743aa81d9582ee9339d4ffa3c8fd40a4965e033d77b9da9774d3960/mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31", size = 8728, upload-time = "2023-11-22T19:09:43.465Z" },
995
+ ]
996
+
997
+ [[package]]
998
+ name = "mkdocstrings"
999
+ version = "0.30.1"
1000
+ source = { registry = "https://pypi.org/simple" }
1001
+ dependencies = [
1002
+ { name = "jinja2" },
1003
+ { name = "markdown" },
1004
+ { name = "markupsafe" },
1005
+ { name = "mkdocs" },
1006
+ { name = "mkdocs-autorefs" },
1007
+ { name = "pymdown-extensions" },
1008
+ ]
1009
+ sdist = { url = "https://files.pythonhosted.org/packages/c5/33/2fa3243439f794e685d3e694590d28469a9b8ea733af4b48c250a3ffc9a0/mkdocstrings-0.30.1.tar.gz", hash = "sha256:84a007aae9b707fb0aebfc9da23db4b26fc9ab562eb56e335e9ec480cb19744f", size = 106350, upload-time = "2025-09-19T10:49:26.446Z" }
1010
+ wheels = [
1011
+ { url = "https://files.pythonhosted.org/packages/7b/2c/f0dc4e1ee7f618f5bff7e05898d20bf8b6e7fa612038f768bfa295f136a4/mkdocstrings-0.30.1-py3-none-any.whl", hash = "sha256:41bd71f284ca4d44a668816193e4025c950b002252081e387433656ae9a70a82", size = 36704, upload-time = "2025-09-19T10:49:24.805Z" },
1012
+ ]
1013
+
1014
+ [package.optional-dependencies]
1015
+ python = [
1016
+ { name = "mkdocstrings-python" },
1017
+ ]
1018
+
1019
+ [[package]]
1020
+ name = "mkdocstrings-python"
1021
+ version = "1.18.2"
1022
+ source = { registry = "https://pypi.org/simple" }
1023
+ dependencies = [
1024
+ { name = "griffe" },
1025
+ { name = "mkdocs-autorefs" },
1026
+ { name = "mkdocstrings" },
1027
+ { name = "typing-extensions", marker = "python_full_version < '3.11'" },
1028
+ ]
1029
+ sdist = { url = "https://files.pythonhosted.org/packages/95/ae/58ab2bfbee2792e92a98b97e872f7c003deb903071f75d8d83aa55db28fa/mkdocstrings_python-1.18.2.tar.gz", hash = "sha256:4ad536920a07b6336f50d4c6d5603316fafb1172c5c882370cbbc954770ad323", size = 207972, upload-time = "2025-08-28T16:11:19.847Z" }
1030
+ wheels = [
1031
+ { url = "https://files.pythonhosted.org/packages/d5/8f/ce008599d9adebf33ed144e7736914385e8537f5fc686fdb7cceb8c22431/mkdocstrings_python-1.18.2-py3-none-any.whl", hash = "sha256:944fe6deb8f08f33fa936d538233c4036e9f53e840994f6146e8e94eb71b600d", size = 138215, upload-time = "2025-08-28T16:11:18.176Z" },
1032
+ ]
1033
+
845
1034
  [[package]]
846
1035
  name = "ml-dtypes"
847
1036
  version = "0.5.3"
@@ -969,6 +1158,15 @@ wheels = [
969
1158
  { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" },
970
1159
  ]
971
1160
 
1161
+ [[package]]
1162
+ name = "paginate"
1163
+ version = "0.5.7"
1164
+ source = { registry = "https://pypi.org/simple" }
1165
+ sdist = { url = "https://files.pythonhosted.org/packages/ec/46/68dde5b6bc00c1296ec6466ab27dddede6aec9af1b99090e1107091b3b84/paginate-0.5.7.tar.gz", hash = "sha256:22bd083ab41e1a8b4f3690544afb2c60c25e5c9a63a30fa2f483f6c60c8e5945", size = 19252, upload-time = "2024-08-25T14:17:24.139Z" }
1166
+ wheels = [
1167
+ { url = "https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl", hash = "sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591", size = 13746, upload-time = "2024-08-25T14:17:22.55Z" },
1168
+ ]
1169
+
972
1170
  [[package]]
973
1171
  name = "pathspec"
974
1172
  version = "0.12.1"
@@ -1183,6 +1381,19 @@ wheels = [
1183
1381
  { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" },
1184
1382
  ]
1185
1383
 
1384
+ [[package]]
1385
+ name = "pymdown-extensions"
1386
+ version = "10.16.1"
1387
+ source = { registry = "https://pypi.org/simple" }
1388
+ dependencies = [
1389
+ { name = "markdown" },
1390
+ { name = "pyyaml" },
1391
+ ]
1392
+ sdist = { url = "https://files.pythonhosted.org/packages/55/b3/6d2b3f149bc5413b0a29761c2c5832d8ce904a1d7f621e86616d96f505cc/pymdown_extensions-10.16.1.tar.gz", hash = "sha256:aace82bcccba3efc03e25d584e6a22d27a8e17caa3f4dd9f207e49b787aa9a91", size = 853277, upload-time = "2025-07-28T16:19:34.167Z" }
1393
+ wheels = [
1394
+ { url = "https://files.pythonhosted.org/packages/e4/06/43084e6cbd4b3bc0e80f6be743b2e79fbc6eed8de9ad8c629939fa55d972/pymdown_extensions-10.16.1-py3-none-any.whl", hash = "sha256:d6ba157a6c03146a7fb122b2b9a121300056384eafeec9c9f9e584adfdb2a32d", size = 266178, upload-time = "2025-07-28T16:19:31.401Z" },
1395
+ ]
1396
+
1186
1397
  [[package]]
1187
1398
  name = "pyparsing"
1188
1399
  version = "3.2.5"
@@ -1317,6 +1528,18 @@ wheels = [
1317
1528
  { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" },
1318
1529
  ]
1319
1530
 
1531
+ [[package]]
1532
+ name = "pyyaml-env-tag"
1533
+ version = "1.1"
1534
+ source = { registry = "https://pypi.org/simple" }
1535
+ dependencies = [
1536
+ { name = "pyyaml" },
1537
+ ]
1538
+ sdist = { url = "https://files.pythonhosted.org/packages/eb/2e/79c822141bfd05a853236b504869ebc6b70159afc570e1d5a20641782eaa/pyyaml_env_tag-1.1.tar.gz", hash = "sha256:2eb38b75a2d21ee0475d6d97ec19c63287a7e140231e4214969d0eac923cd7ff", size = 5737, upload-time = "2025-05-13T15:24:01.64Z" }
1539
+ wheels = [
1540
+ { url = "https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl", hash = "sha256:17109e1a528561e32f026364712fee1264bc2ea6715120891174ed1b980d2e04", size = 4722, upload-time = "2025-05-13T15:23:59.629Z" },
1541
+ ]
1542
+
1320
1543
  [[package]]
1321
1544
  name = "requests"
1322
1545
  version = "2.32.5"
@@ -1618,6 +1841,35 @@ wheels = [
1618
1841
  { url = "https://files.pythonhosted.org/packages/27/73/d9a94da0e9d470a543c1b9d3ccbceb0f59455983088e727b8a1824ed90fb/virtualenv-20.35.3-py3-none-any.whl", hash = "sha256:63d106565078d8c8d0b206d48080f938a8b25361e19432d2c9db40d2899c810a", size = 5981061, upload-time = "2025-10-10T21:23:30.433Z" },
1619
1842
  ]
1620
1843
 
1844
+ [[package]]
1845
+ name = "watchdog"
1846
+ version = "6.0.0"
1847
+ source = { registry = "https://pypi.org/simple" }
1848
+ sdist = { url = "https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282", size = 131220, upload-time = "2024-11-01T14:07:13.037Z" }
1849
+ wheels = [
1850
+ { url = "https://files.pythonhosted.org/packages/0c/56/90994d789c61df619bfc5ce2ecdabd5eeff564e1eb47512bd01b5e019569/watchdog-6.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d1cdb490583ebd691c012b3d6dae011000fe42edb7a82ece80965b42abd61f26", size = 96390, upload-time = "2024-11-01T14:06:24.793Z" },
1851
+ { url = "https://files.pythonhosted.org/packages/55/46/9a67ee697342ddf3c6daa97e3a587a56d6c4052f881ed926a849fcf7371c/watchdog-6.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc64ab3bdb6a04d69d4023b29422170b74681784ffb9463ed4870cf2f3e66112", size = 88389, upload-time = "2024-11-01T14:06:27.112Z" },
1852
+ { url = "https://files.pythonhosted.org/packages/44/65/91b0985747c52064d8701e1075eb96f8c40a79df889e59a399453adfb882/watchdog-6.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c897ac1b55c5a1461e16dae288d22bb2e412ba9807df8397a635d88f671d36c3", size = 89020, upload-time = "2024-11-01T14:06:29.876Z" },
1853
+ { url = "https://files.pythonhosted.org/packages/e0/24/d9be5cd6642a6aa68352ded4b4b10fb0d7889cb7f45814fb92cecd35f101/watchdog-6.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6eb11feb5a0d452ee41f824e271ca311a09e250441c262ca2fd7ebcf2461a06c", size = 96393, upload-time = "2024-11-01T14:06:31.756Z" },
1854
+ { url = "https://files.pythonhosted.org/packages/63/7a/6013b0d8dbc56adca7fdd4f0beed381c59f6752341b12fa0886fa7afc78b/watchdog-6.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ef810fbf7b781a5a593894e4f439773830bdecb885e6880d957d5b9382a960d2", size = 88392, upload-time = "2024-11-01T14:06:32.99Z" },
1855
+ { url = "https://files.pythonhosted.org/packages/d1/40/b75381494851556de56281e053700e46bff5b37bf4c7267e858640af5a7f/watchdog-6.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:afd0fe1b2270917c5e23c2a65ce50c2a4abb63daafb0d419fde368e272a76b7c", size = 89019, upload-time = "2024-11-01T14:06:34.963Z" },
1856
+ { url = "https://files.pythonhosted.org/packages/39/ea/3930d07dafc9e286ed356a679aa02d777c06e9bfd1164fa7c19c288a5483/watchdog-6.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bdd4e6f14b8b18c334febb9c4425a878a2ac20efd1e0b231978e7b150f92a948", size = 96471, upload-time = "2024-11-01T14:06:37.745Z" },
1857
+ { url = "https://files.pythonhosted.org/packages/12/87/48361531f70b1f87928b045df868a9fd4e253d9ae087fa4cf3f7113be363/watchdog-6.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c7c15dda13c4eb00d6fb6fc508b3c0ed88b9d5d374056b239c4ad1611125c860", size = 88449, upload-time = "2024-11-01T14:06:39.748Z" },
1858
+ { url = "https://files.pythonhosted.org/packages/5b/7e/8f322f5e600812e6f9a31b75d242631068ca8f4ef0582dd3ae6e72daecc8/watchdog-6.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f10cb2d5902447c7d0da897e2c6768bca89174d0c6e1e30abec5421af97a5b0", size = 89054, upload-time = "2024-11-01T14:06:41.009Z" },
1859
+ { url = "https://files.pythonhosted.org/packages/30/ad/d17b5d42e28a8b91f8ed01cb949da092827afb9995d4559fd448d0472763/watchdog-6.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:c7ac31a19f4545dd92fc25d200694098f42c9a8e391bc00bdd362c5736dbf881", size = 87902, upload-time = "2024-11-01T14:06:53.119Z" },
1860
+ { url = "https://files.pythonhosted.org/packages/5c/ca/c3649991d140ff6ab67bfc85ab42b165ead119c9e12211e08089d763ece5/watchdog-6.0.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9513f27a1a582d9808cf21a07dae516f0fab1cf2d7683a742c498b93eedabb11", size = 88380, upload-time = "2024-11-01T14:06:55.19Z" },
1861
+ { url = "https://files.pythonhosted.org/packages/a9/c7/ca4bf3e518cb57a686b2feb4f55a1892fd9a3dd13f470fca14e00f80ea36/watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13", size = 79079, upload-time = "2024-11-01T14:06:59.472Z" },
1862
+ { url = "https://files.pythonhosted.org/packages/5c/51/d46dc9332f9a647593c947b4b88e2381c8dfc0942d15b8edc0310fa4abb1/watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379", size = 79078, upload-time = "2024-11-01T14:07:01.431Z" },
1863
+ { url = "https://files.pythonhosted.org/packages/d4/57/04edbf5e169cd318d5f07b4766fee38e825d64b6913ca157ca32d1a42267/watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e", size = 79076, upload-time = "2024-11-01T14:07:02.568Z" },
1864
+ { url = "https://files.pythonhosted.org/packages/ab/cc/da8422b300e13cb187d2203f20b9253e91058aaf7db65b74142013478e66/watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f", size = 79077, upload-time = "2024-11-01T14:07:03.893Z" },
1865
+ { url = "https://files.pythonhosted.org/packages/2c/3b/b8964e04ae1a025c44ba8e4291f86e97fac443bca31de8bd98d3263d2fcf/watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26", size = 79078, upload-time = "2024-11-01T14:07:05.189Z" },
1866
+ { url = "https://files.pythonhosted.org/packages/62/ae/a696eb424bedff7407801c257d4b1afda455fe40821a2be430e173660e81/watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c", size = 79077, upload-time = "2024-11-01T14:07:06.376Z" },
1867
+ { url = "https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2", size = 79078, upload-time = "2024-11-01T14:07:07.547Z" },
1868
+ { url = "https://files.pythonhosted.org/packages/07/f6/d0e5b343768e8bcb4cda79f0f2f55051bf26177ecd5651f84c07567461cf/watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a", size = 79065, upload-time = "2024-11-01T14:07:09.525Z" },
1869
+ { url = "https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680", size = 79070, upload-time = "2024-11-01T14:07:10.686Z" },
1870
+ { url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067, upload-time = "2024-11-01T14:07:11.845Z" },
1871
+ ]
1872
+
1621
1873
  [[package]]
1622
1874
  name = "wrapt"
1623
1875
  version = "1.17.3"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes