plotjs 0.0.5__tar.gz → 0.0.7__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. {plotjs-0.0.5 → plotjs-0.0.7}/.github/workflows/doc.yaml +1 -1
  2. plotjs-0.0.7/.github/workflows/lint.yaml +29 -0
  3. plotjs-0.0.7/.github/workflows/tests-browser.yaml +42 -0
  4. {plotjs-0.0.5 → plotjs-0.0.7}/.github/workflows/tests-js.yaml +4 -4
  5. {plotjs-0.0.5 → plotjs-0.0.7}/.github/workflows/tests-python.yaml +2 -2
  6. {plotjs-0.0.5 → plotjs-0.0.7}/.gitignore +3 -2
  7. plotjs-0.0.7/AGENTS.md +221 -0
  8. {plotjs-0.0.5/plotjs.egg-info → plotjs-0.0.7}/PKG-INFO +2 -2
  9. plotjs-0.0.7/bun.lock +307 -0
  10. {plotjs-0.0.5 → plotjs-0.0.7}/docs/developers/contributing.md +19 -6
  11. {plotjs-0.0.5 → plotjs-0.0.7}/docs/developers/svg-parser-reference.md +35 -29
  12. {plotjs-0.0.5 → plotjs-0.0.7}/docs/guides/embed-graphs/index.md +1 -1
  13. {plotjs-0.0.5 → plotjs-0.0.7}/docs/iframes/CSS-2.html +324 -324
  14. {plotjs-0.0.5 → plotjs-0.0.7}/docs/iframes/CSS.html +324 -324
  15. {plotjs-0.0.5 → plotjs-0.0.7}/docs/iframes/area-natural-disasters.html +18 -18
  16. {plotjs-0.0.5 → plotjs-0.0.7}/docs/iframes/bug.html +179 -179
  17. {plotjs-0.0.5 → plotjs-0.0.7}/docs/iframes/javascript.html +324 -324
  18. {plotjs-0.0.5 → plotjs-0.0.7}/docs/iframes/javascript2.html +182 -182
  19. {plotjs-0.0.5 → plotjs-0.0.7}/docs/iframes/quickstart.html +324 -324
  20. {plotjs-0.0.5 → plotjs-0.0.7}/docs/iframes/quickstart10.html +179 -179
  21. {plotjs-0.0.5 → plotjs-0.0.7}/docs/iframes/quickstart11.html +944 -944
  22. {plotjs-0.0.5 → plotjs-0.0.7}/docs/iframes/quickstart2.html +324 -324
  23. {plotjs-0.0.5 → plotjs-0.0.7}/docs/iframes/quickstart3.html +324 -324
  24. {plotjs-0.0.5 → plotjs-0.0.7}/docs/iframes/quickstart4.html +324 -324
  25. plotjs-0.0.7/docs/iframes/quickstart5.html +1595 -0
  26. {plotjs-0.0.5 → plotjs-0.0.7}/docs/iframes/quickstart6.html +25 -25
  27. {plotjs-0.0.5 → plotjs-0.0.7}/docs/iframes/quickstart7.html +182 -182
  28. {plotjs-0.0.5 → plotjs-0.0.7}/docs/iframes/quickstart8.html +23 -23
  29. {plotjs-0.0.5 → plotjs-0.0.7}/docs/iframes/quickstart9.html +639 -639
  30. plotjs-0.0.7/docs/iframes/random-walk-1.html +39128 -0
  31. {plotjs-0.0.5 → plotjs-0.0.7}/docs/index.md +44 -11
  32. {plotjs-0.0.5 → plotjs-0.0.7}/docs/index.qmd +30 -11
  33. plotjs-0.0.7/docs/reference/css.md +17 -0
  34. plotjs-0.0.5/Makefile → plotjs-0.0.7/justfile +11 -4
  35. {plotjs-0.0.5 → plotjs-0.0.7}/overrides/partials/footer.html +1 -1
  36. {plotjs-0.0.5 → plotjs-0.0.7}/package.json +2 -4
  37. {plotjs-0.0.5 → plotjs-0.0.7}/plotjs/__init__.py +1 -1
  38. {plotjs-0.0.5 → plotjs-0.0.7}/plotjs/main.py +56 -27
  39. {plotjs-0.0.5 → plotjs-0.0.7}/plotjs/static/plotparser.js +155 -22
  40. plotjs-0.0.7/plotjs/static/template.html +155 -0
  41. {plotjs-0.0.5 → plotjs-0.0.7}/plotjs/utils.py +12 -1
  42. {plotjs-0.0.5 → plotjs-0.0.7/plotjs.egg-info}/PKG-INFO +2 -2
  43. {plotjs-0.0.5 → plotjs-0.0.7}/plotjs.egg-info/SOURCES.txt +14 -5
  44. {plotjs-0.0.5 → plotjs-0.0.7}/pyproject.toml +3 -2
  45. plotjs-0.0.7/pytest.ini +7 -0
  46. plotjs-0.0.7/tests/test-browser/README.md +120 -0
  47. plotjs-0.0.7/tests/test-browser/conftest.py +60 -0
  48. plotjs-0.0.7/tests/test-browser/test_interactions.py +297 -0
  49. plotjs-0.0.7/tests/test-browser/test_rendering.py +165 -0
  50. {plotjs-0.0.5 → plotjs-0.0.7}/tests/test-javascript/ParserSelectors.test.js +10 -11
  51. {plotjs-0.0.5 → plotjs-0.0.7}/tests/test-javascript/ParserSetHover.test.js +19 -13
  52. plotjs-0.0.7/tests/test-python/__init__.py +0 -0
  53. plotjs-0.0.5/tests/test-python/test_css_and_js_utils.py → plotjs-0.0.7/tests/test-python/test_css.py +35 -22
  54. plotjs-0.0.7/tests/test-python/test_js.py +96 -0
  55. {plotjs-0.0.5 → plotjs-0.0.7}/tests/test-python/test_main.py +1 -1
  56. plotjs-0.0.7/uv.lock +3427 -0
  57. plotjs-0.0.5/.github/workflows/lint.yaml +0 -29
  58. plotjs-0.0.5/docs/iframes/quickstart5.html +0 -1551
  59. plotjs-0.0.5/docs/iframes/random-walk-1.html +0 -39191
  60. plotjs-0.0.5/docs/reference/css.md +0 -13
  61. plotjs-0.0.5/package-lock.json +0 -3659
  62. plotjs-0.0.5/plotjs/static/template.html +0 -103
  63. plotjs-0.0.5/vitest.config.js +0 -9
  64. {plotjs-0.0.5 → plotjs-0.0.7}/.coverage +0 -0
  65. {plotjs-0.0.5 → plotjs-0.0.7}/.gitattributes +0 -0
  66. {plotjs-0.0.5 → plotjs-0.0.7}/.github/workflows/pypi.yaml +0 -0
  67. {plotjs-0.0.5 → plotjs-0.0.7}/.github/workflows/type.yaml +0 -0
  68. {plotjs-0.0.5 → plotjs-0.0.7}/.pre-commit-config.yaml +0 -0
  69. {plotjs-0.0.5 → plotjs-0.0.7}/LICENSE +0 -0
  70. {plotjs-0.0.5 → plotjs-0.0.7}/README.md +0 -0
  71. {plotjs-0.0.5 → plotjs-0.0.7}/coverage-badge.svg +0 -0
  72. {plotjs-0.0.5 → plotjs-0.0.7}/docs/developers/overview.md +0 -0
  73. {plotjs-0.0.5 → plotjs-0.0.7}/docs/developers/parsing-matplotlib-svg.md +0 -0
  74. {plotjs-0.0.5 → plotjs-0.0.7}/docs/gallery/index.md +0 -0
  75. {plotjs-0.0.5 → plotjs-0.0.7}/docs/gallery/index.qmd +0 -0
  76. {plotjs-0.0.5 → plotjs-0.0.7}/docs/guides/advanced/advanced.py +0 -0
  77. {plotjs-0.0.5 → plotjs-0.0.7}/docs/guides/advanced/index.md +0 -0
  78. {plotjs-0.0.5 → plotjs-0.0.7}/docs/guides/css/CSS.py +0 -0
  79. {plotjs-0.0.5 → plotjs-0.0.7}/docs/guides/css/index.md +0 -0
  80. {plotjs-0.0.5 → plotjs-0.0.7}/docs/guides/javascript/index.md +0 -0
  81. {plotjs-0.0.5 → plotjs-0.0.7}/docs/guides/javascript/javascript.py +0 -0
  82. {plotjs-0.0.5 → plotjs-0.0.7}/docs/guides/troubleshooting/index.md +0 -0
  83. {plotjs-0.0.5 → plotjs-0.0.7}/docs/img/how-it-works-1.png +0 -0
  84. {plotjs-0.0.5 → plotjs-0.0.7}/docs/img/how-it-works-2.png +0 -0
  85. {plotjs-0.0.5 → plotjs-0.0.7}/docs/img/overview.png +0 -0
  86. {plotjs-0.0.5 → plotjs-0.0.7}/docs/index_files/figure-commonmark/cell-3-output-1.png +0 -0
  87. {plotjs-0.0.5 → plotjs-0.0.7}/docs/reference/datasets.md +0 -0
  88. {plotjs-0.0.5 → plotjs-0.0.7}/docs/reference/javascript.md +0 -0
  89. {plotjs-0.0.5 → plotjs-0.0.7}/docs/reference/plotjs.md +0 -0
  90. {plotjs-0.0.5 → plotjs-0.0.7}/docs/static/style.css +0 -0
  91. {plotjs-0.0.5 → plotjs-0.0.7}/docs/stylesheets/style.css +0 -0
  92. {plotjs-0.0.5 → plotjs-0.0.7}/mkdocs.yaml +0 -0
  93. {plotjs-0.0.5 → plotjs-0.0.7}/plotjs/css.py +0 -0
  94. {plotjs-0.0.5 → plotjs-0.0.7}/plotjs/data/__init__.py +0 -0
  95. {plotjs-0.0.5 → plotjs-0.0.7}/plotjs/data/datasets.py +0 -0
  96. {plotjs-0.0.5 → plotjs-0.0.7}/plotjs/data/iris.csv +0 -0
  97. {plotjs-0.0.5 → plotjs-0.0.7}/plotjs/data/mtcars.csv +0 -0
  98. {plotjs-0.0.5 → plotjs-0.0.7}/plotjs/data/titanic.csv +0 -0
  99. {plotjs-0.0.5 → plotjs-0.0.7}/plotjs/javascript.py +0 -0
  100. {plotjs-0.0.5 → plotjs-0.0.7}/plotjs/static/default.css +0 -0
  101. {plotjs-0.0.5 → plotjs-0.0.7}/plotjs.egg-info/dependency_links.txt +0 -0
  102. {plotjs-0.0.5 → plotjs-0.0.7}/plotjs.egg-info/requires.txt +0 -0
  103. {plotjs-0.0.5 → plotjs-0.0.7}/plotjs.egg-info/top_level.txt +0 -0
  104. {plotjs-0.0.5 → plotjs-0.0.7}/setup.cfg +0 -0
  105. {plotjs-0.0.5/tests/test-python → plotjs-0.0.7/tests/test-browser}/__init__.py +0 -0
  106. {plotjs-0.0.5 → plotjs-0.0.7}/tests/test-python/static/script.js +0 -0
  107. {plotjs-0.0.5 → plotjs-0.0.7}/tests/test-python/static/script2.js +0 -0
  108. {plotjs-0.0.5 → plotjs-0.0.7}/tests/test-python/static/style-invalid.css +0 -0
  109. {plotjs-0.0.5 → plotjs-0.0.7}/tests/test-python/static/style.css +0 -0
  110. {plotjs-0.0.5 → plotjs-0.0.7}/tests/test-python/test_data.py +0 -0
  111. {plotjs-0.0.5 → plotjs-0.0.7}/tests/test-python/test_other_utils.py +0 -0
  112. /plotjs-0.0.5/tests/test-python/test_magic_plot.py → /plotjs-0.0.7/tests/test-python/test_plotjs.py +0 -0
@@ -1,4 +1,4 @@
1
- name: ci
1
+ name: Build and deploy doc
2
2
 
3
3
  on:
4
4
  push:
@@ -0,0 +1,29 @@
1
+ name: Check code formatting
2
+
3
+ on:
4
+ pull_request:
5
+ branches: [main]
6
+ push:
7
+ branches: [main]
8
+
9
+ jobs:
10
+ check-formatting:
11
+ runs-on: ubuntu-latest
12
+
13
+ steps:
14
+ - name: Checkout repository
15
+ uses: actions/checkout@v4
16
+
17
+ - name: Install uv
18
+ uses: astral-sh/setup-uv@v5
19
+ with:
20
+ enable-cache: true
21
+
22
+ - name: Install the project
23
+ run: uv sync --all-groups
24
+
25
+ - name: Run Ruff format check
26
+ run: uv run ruff format --check .
27
+
28
+ - name: Run Ruff linting and auto-fix
29
+ run: uv run ruff check --fix .
@@ -0,0 +1,42 @@
1
+ name: Tests Browser
2
+
3
+ on:
4
+ pull_request:
5
+ branches: [main]
6
+ push:
7
+ branches: [main]
8
+
9
+ jobs:
10
+ browser-tests:
11
+ runs-on: ubuntu-latest
12
+ strategy:
13
+ matrix:
14
+ python-version: ["3.10", "3.13"]
15
+ env:
16
+ UV_PYTHON: ${{ matrix.python-version }}
17
+
18
+ steps:
19
+ - uses: actions/checkout@v4
20
+
21
+ - name: Install uv
22
+ uses: astral-sh/setup-uv@v5
23
+ with:
24
+ enable-cache: true
25
+
26
+ - name: Install the project
27
+ run: uv sync --all-groups
28
+
29
+ - name: Install Playwright browsers
30
+ run: uv run playwright install --with-deps chromium
31
+
32
+ - name: Run browser tests
33
+ run: uv run pytest tests/test-browser/ -v
34
+
35
+ - name: Upload test artifacts on failure
36
+ if: failure()
37
+ uses: actions/upload-artifact@v4
38
+ with:
39
+ name: browser-test-artifacts-${{ matrix.python-version }}
40
+ path: |
41
+ /tmp/pytest-of-*/
42
+ retention-days: 7
@@ -11,8 +11,8 @@ jobs:
11
11
  runs-on: ubuntu-latest
12
12
  steps:
13
13
  - uses: actions/checkout@v4
14
- - uses: actions/setup-node@v4
14
+ - uses: oven-sh/setup-bun@v2
15
15
  with:
16
- node-version: 20
17
- - run: npm install
18
- - run: npm test
16
+ bun-version: latest
17
+ - run: bun install
18
+ - run: bun test
@@ -26,5 +26,5 @@ jobs:
26
26
  - name: Install the project
27
27
  run: uv sync --all-groups
28
28
 
29
- - name: Run tests
30
- run: uv run pytest
29
+ - name: Run unit tests (excluding browser tests)
30
+ run: uv run pytest tests/test-python/ -v
@@ -5,7 +5,6 @@ dist/
5
5
  wheels/
6
6
  *.egg-info
7
7
  .env
8
- uv.lock
9
8
 
10
9
  .venv/
11
10
  venv/
@@ -29,8 +28,10 @@ sandbox/
29
28
  *.svg
30
29
  !coverage-badge.svg
31
30
 
32
- scripts/release.sh
31
+ release.sh
33
32
 
34
33
  /.quarto/
35
34
 
36
35
  node_modules
36
+ bun.lockb
37
+ .claude/
plotjs-0.0.7/AGENTS.md ADDED
@@ -0,0 +1,221 @@
1
+ # PlotJS - LLM Reference Guide
2
+
3
+ ## Project Overview
4
+
5
+ PlotJS is a Python package that transforms static matplotlib charts into interactive web visualizations. It exports matplotlib figures as SVG, parses them with JavaScript, and adds browser-based interactivity (tooltips, hover effects, grouping) without requiring chart re-serialization.
6
+
7
+ **Core Philosophy:** Leverage matplotlib's native SVG output + JavaScript DOM manipulation instead of recreating charts in D3/Altair.
8
+
9
+ ## Quick Architecture
10
+
11
+ ```
12
+ Matplotlib Figure → SVG Export (Python) → HTML Template (Jinja2) → Interactive Browser
13
+ ```
14
+
15
+ ### Workflow:
16
+
17
+ 1. **Python (PlotJS class):** Captures matplotlib figure as SVG string, collects tooltip/styling metadata
18
+ 2. **Jinja2 Template:** Injects SVG + CSS + JavaScript parser + configuration into HTML
19
+ 3. **Browser (PlotSVGParser):** Parses SVG structure to identify plot elements, attaches hover interactivity
20
+
21
+ ## Key Components
22
+
23
+ ### Python Module (`/plotjs/`)
24
+
25
+ **`main.py`** - Core `PlotJS` class with method chaining
26
+
27
+ - `__init__(fig, **savefig_kws)` - Converts matplotlib figure to SVG
28
+ - `add_tooltip(labels, groups, hover_nearest, ax)` - Configure hover tooltips
29
+ - `add_css(from_string)` - Add custom CSS styling
30
+ - `add_javascript(from_string)` - Add custom JavaScript
31
+ - `save(file_path)` / `as_html()` - Export to file or return HTML string
32
+ - Internal: `_set_plot_data_json()`, `_set_html()` - Prepare template data
33
+
34
+ **`css.py`** - CSS utilities
35
+
36
+ - `from_dict(css_dict)` - Convert Python dict to CSS
37
+ - `from_file(css_file)` - Load external CSS
38
+ - `is_css_like(s)` - Validate CSS syntax
39
+
40
+ **`javascript.py`** - JavaScript utilities
41
+
42
+ - `from_file(javascript_file)` - Load external JavaScript
43
+
44
+ **`utils.py`** - Internal helpers
45
+
46
+ - `_vector_to_list(vector, name)` - Convert pandas/numpy/lists using Narwhals
47
+ - `_get_and_sanitize_js(file_path, after_pattern)` - Extract JS code
48
+
49
+ **`data/datasets.py`** - Sample datasets (iris, mtcars, titanic) with Narwhals support
50
+
51
+ ### Static Assets (`/plotjs/static/`)
52
+
53
+ **`template.html`** - Jinja2 template structure
54
+
55
+ - Injects: `{{ svg }}`, `{{ default_css }}`, `{{ additional_css }}`, `{{ js_parser }}`, `{{ plot_data_json }}`
56
+ - Creates tooltip container and event handling
57
+
58
+ **`plotparser.js`** - `PlotSVGParser` JavaScript class
59
+
60
+ - `findBars(svg, axes_class)` - Select bar chart elements
61
+ - `findPoints(svg, axes_class, tooltip_groups)` - Select scatter points
62
+ - `findLines(svg, axes_class)` - Select line chart elements
63
+ - `findAreas(svg, axes_class)` - Select filled area elements
64
+ - `nearestElementFromMouse(mouseX, mouseY, elements)` - Hover nearest detection
65
+ - `setHoverEffect(...)` - Attach mouseover handlers, show tooltips
66
+
67
+ **`default.css`** - Base styling for tooltips and hover states
68
+
69
+ ## Technical Implementation Details
70
+
71
+ ### SVG Parsing Strategy
72
+
73
+ Challenge: Identify plot elements in SVG without metadata.
74
+
75
+ Solution: Pattern-based CSS selectors targeting matplotlib's SVG structure:
76
+
77
+ | Element | SVG Pattern | Selector |
78
+ | -------------- | -------------------------------------- | -------------------------------------------------------- |
79
+ | Scatter Points | `<g id="PathCollection_N"> <use>` | `g#axes_class g[id^="PathCollection"] use` |
80
+ | Lines | `<g id="line2d_N"> <path>` | `g#axes_class g[id^="line2d"] path` (exclude axis lines) |
81
+ | Bars | `<g id="patch_N"> <path>` | `g#axes_class g[id^="patch"] path[clip-path]` |
82
+ | Areas | `<g id="FillBetweenPolyCollection_N">` | `g#axes_class g[id^="FillBetweenPolyCollection"] path` |
83
+
84
+ ### Data Flow: Python → JavaScript
85
+
86
+ 1. Python collects configuration:
87
+
88
+ ```python
89
+ plot_data_json = {
90
+ "tooltip_labels": [...],
91
+ "tooltip_groups": [...],
92
+ "tooltip_x_shift": 10,
93
+ "tooltip_y_shift": -10,
94
+ "hover_nearest": False,
95
+ "axes": {"axes_1": {...}, "axes_2": {...}}
96
+ }
97
+ ```
98
+
99
+ 2. Jinja2 injects as JSON in HTML template
100
+
101
+ 3. JavaScript accesses via `plot_data["axes"]["axes_1"]["tooltip_labels"]`
102
+
103
+ ### Method Chaining
104
+
105
+ All methods return `self` for fluent API:
106
+
107
+ ```python
108
+ PlotJS(fig).add_tooltip(...).add_css(...).save(...)
109
+ ```
110
+
111
+ ### Multiple Axes Support
112
+
113
+ Each axes processed independently via `ax` parameter:
114
+
115
+ ```python
116
+ PlotJS(fig).add_tooltip(labels1, ax=ax1).add_tooltip(labels2, ax=ax2).save(...)
117
+ ```
118
+
119
+ ### Reproducibility
120
+
121
+ Optional `seed` parameter ensures deterministic UUID generation for consistent output.
122
+
123
+ ## File Structure
124
+
125
+ ```
126
+ plotjs/
127
+ ├── __init__.py # Package exports
128
+ ├── main.py # Core PlotJS class (330 lines)
129
+ ├── css.py # CSS utilities (100 lines)
130
+ ├── javascript.py # JavaScript utilities (23 lines)
131
+ ├── utils.py # Internal helpers (43 lines)
132
+ ├── data/
133
+ │ ├── datasets.py # Sample datasets with Narwhals
134
+ │ └── *.csv # Data files
135
+ └── static/
136
+ ├── template.html # Jinja2 HTML template (104 lines)
137
+ ├── plotparser.js # SVG parser class (229 lines)
138
+ └── default.css # Default styles (41 lines)
139
+
140
+ tests/
141
+ ├── test-python/ # Python unit tests
142
+ └── test-javascript/ # JavaScript unit tests (vitest + jsdom)
143
+
144
+ docs/ # Comprehensive documentation
145
+ ├── index.md # Quickstart
146
+ ├── guides/ # CSS, JavaScript, advanced usage
147
+ ├── developers/ # Architecture, SVG parsing details
148
+ └── reference/ # API reference
149
+ ```
150
+
151
+ ## Dependencies
152
+
153
+ **Python:**
154
+
155
+ - matplotlib >= 3.10.0 (SVG export)
156
+ - jinja2 >= 3.0.0 (HTML templating)
157
+ - narwhals >= 2.0.0 (dataframe abstraction)
158
+
159
+ **Python Version:** Requires 3.10+
160
+
161
+ ## Critical Patterns & Limitations
162
+
163
+ ### Plotting Order Requirement
164
+
165
+ **IMPORTANT:** Element order in matplotlib must match label/group array order.
166
+
167
+ The parser assigns tooltip data by index, not by element identity:
168
+
169
+ ```python
170
+ # PROBLEM: Mismatched order
171
+ for specie in df["species"].unique(): # Order: setosa, versicolor, virginica
172
+ ax.scatter(df[df["species"]==specie]["x"], df[df["species"]==specie]["y"])
173
+ PlotJS(...).add_tooltip(labels=df["species"]) # Order may differ
174
+
175
+ # SOLUTION: Plot all at once or ensure sorted order
176
+ ax.scatter(df["x"], df["y"], c=df["species"]) # All at once preserves order
177
+ ```
178
+
179
+ ### Hover Modes
180
+
181
+ - **Direct hover** (default): Highlights exactly what cursor hovers over
182
+ - **Nearest hover** (`hover_nearest=True`): Highlights closest element to cursor (useful for small points)
183
+
184
+ ### Grouping Behavior
185
+
186
+ Elements with same `tooltip_groups` value highlight together and dim others on hover.
187
+
188
+ ## Usage Example
189
+
190
+ ```python
191
+ import matplotlib.pyplot as plt
192
+ from plotjs import PlotJS
193
+
194
+ fig, ax = plt.subplots()
195
+ ax.scatter(x, y)
196
+
197
+ PlotJS(fig) \
198
+ .add_tooltip(
199
+ labels=["Point 1", "Point 2", ...],
200
+ groups=["Group A", "Group A", "Group B", ...],
201
+ hover_nearest=True
202
+ ) \
203
+ .add_css(css.from_file("custom.css")) \
204
+ .add_javascript(javascript.from_file("custom.js")) \
205
+ .save("output.html")
206
+ ```
207
+
208
+ ## Testing
209
+
210
+ - **Python:** pytest with coverage
211
+ - **JavaScript:** vitest with jsdom (browser simulation)
212
+
213
+ ## Documentation
214
+
215
+ See `/docs` for comprehensive guides:
216
+
217
+ - Quickstart and examples
218
+ - CSS/JavaScript customization
219
+ - SVG parsing deep dive
220
+ - Troubleshooting common issues
221
+ - API reference for all classes
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: plotjs
3
- Version: 0.0.5
3
+ Version: 0.0.7
4
4
  Summary: Turn static matplotlib charts into interactive web visualizations
5
5
  Author-email: Joseph Barbier <joseph.barbierdarnal@mail.com>
6
6
  License-Expression: MIT
@@ -11,7 +11,7 @@ Project-URL: Repository, https://github.com/y-sunflower/plotjs
11
11
  Keywords: matplotlib,interactive,javascript,web,css,d3,mpld3,plotnine
12
12
  Classifier: Programming Language :: Python :: 3
13
13
  Classifier: Operating System :: OS Independent
14
- Classifier: Development Status :: 4 - Beta
14
+ Classifier: Development Status :: 3 - Alpha
15
15
  Requires-Python: >=3.10
16
16
  Description-Content-Type: text/markdown
17
17
  License-File: LICENSE