inklet 3.0.0__tar.gz → 4.0.0.dev1__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 (924) hide show
  1. inklet-4.0.0.dev1/.gitattributes +4 -0
  2. inklet-4.0.0.dev1/.github/workflows/checks.yml +233 -0
  3. inklet-4.0.0.dev1/.github/workflows/publish.yml +113 -0
  4. inklet-4.0.0.dev1/CHANGELOG.md +348 -0
  5. inklet-4.0.0.dev1/CONTRIBUTING.md +111 -0
  6. inklet-4.0.0.dev1/PKG-INFO +257 -0
  7. inklet-4.0.0.dev1/README.md +207 -0
  8. inklet-4.0.0.dev1/THIRD_PARTY_NOTICES.md +145 -0
  9. inklet-4.0.0.dev1/docs/api.md +1267 -0
  10. inklet-4.0.0.dev1/docs/assets/guides/axes-and-scales-1.png +0 -0
  11. inklet-4.0.0.dev1/docs/assets/guides/calibrated-volumes-3.png +0 -0
  12. inklet-4.0.0.dev1/docs/assets/guides/channels-and-contours-1.png +0 -0
  13. inklet-4.0.0.dev1/docs/assets/guides/cookbook-anchor.png +0 -0
  14. inklet-4.0.0.dev1/docs/assets/guides/cookbook-annotation.png +0 -0
  15. inklet-4.0.0.dev1/docs/assets/guides/cookbook-bars-histogram.png +0 -0
  16. inklet-4.0.0.dev1/docs/assets/guides/cookbook-branch.png +0 -0
  17. inklet-4.0.0.dev1/docs/assets/guides/cookbook-broken-axis.png +0 -0
  18. inklet-4.0.0.dev1/docs/assets/guides/cookbook-callout.png +0 -0
  19. inklet-4.0.0.dev1/docs/assets/guides/cookbook-clipping.png +0 -0
  20. inklet-4.0.0.dev1/docs/assets/guides/cookbook-creases.png +0 -0
  21. inklet-4.0.0.dev1/docs/assets/guides/cookbook-custom-key.png +0 -0
  22. inklet-4.0.0.dev1/docs/assets/guides/cookbook-cutout.png +0 -0
  23. inklet-4.0.0.dev1/docs/assets/guides/cookbook-dates.png +0 -0
  24. inklet-4.0.0.dev1/docs/assets/guides/cookbook-dense.png +0 -0
  25. inklet-4.0.0.dev1/docs/assets/guides/cookbook-elbows.png +0 -0
  26. inklet-4.0.0.dev1/docs/assets/guides/cookbook-equal-boxes.png +0 -0
  27. inklet-4.0.0.dev1/docs/assets/guides/cookbook-facets.png +0 -0
  28. inklet-4.0.0.dev1/docs/assets/guides/cookbook-fit-graph.png +0 -0
  29. inklet-4.0.0.dev1/docs/assets/guides/cookbook-flow-width.png +0 -0
  30. inklet-4.0.0.dev1/docs/assets/guides/cookbook-formula.png +0 -0
  31. inklet-4.0.0.dev1/docs/assets/guides/cookbook-graph.png +0 -0
  32. inklet-4.0.0.dev1/docs/assets/guides/cookbook-halo.png +0 -0
  33. inklet-4.0.0.dev1/docs/assets/guides/cookbook-heatmap.png +0 -0
  34. inklet-4.0.0.dev1/docs/assets/guides/cookbook-hole.png +0 -0
  35. inklet-4.0.0.dev1/docs/assets/guides/cookbook-inline-type.png +0 -0
  36. inklet-4.0.0.dev1/docs/assets/guides/cookbook-inset.png +0 -0
  37. inklet-4.0.0.dev1/docs/assets/guides/cookbook-labels.png +0 -0
  38. inklet-4.0.0.dev1/docs/assets/guides/cookbook-layers.png +0 -0
  39. inklet-4.0.0.dev1/docs/assets/guides/cookbook-letters.png +0 -0
  40. inklet-4.0.0.dev1/docs/assets/guides/cookbook-list.png +0 -0
  41. inklet-4.0.0.dev1/docs/assets/guides/cookbook-matrix.png +0 -0
  42. inklet-4.0.0.dev1/docs/assets/guides/cookbook-page-grid.png +0 -0
  43. inklet-4.0.0.dev1/docs/assets/guides/cookbook-polar.png +0 -0
  44. inklet-4.0.0.dev1/docs/assets/guides/cookbook-protein.png +0 -0
  45. inklet-4.0.0.dev1/docs/assets/guides/cookbook-routes.png +0 -0
  46. inklet-4.0.0.dev1/docs/assets/guides/cookbook-scene-overlay.png +0 -0
  47. inklet-4.0.0.dev1/docs/assets/guides/cookbook-scene.png +0 -0
  48. inklet-4.0.0.dev1/docs/assets/guides/cookbook-series-key.png +0 -0
  49. inklet-4.0.0.dev1/docs/assets/guides/cookbook-span.png +0 -0
  50. inklet-4.0.0.dev1/docs/assets/guides/cookbook-sparse-grid.png +0 -0
  51. inklet-4.0.0.dev1/docs/assets/guides/cookbook-swarm.png +0 -0
  52. inklet-4.0.0.dev1/docs/assets/guides/cookbook-text-path.png +0 -0
  53. inklet-4.0.0.dev1/docs/assets/guides/cookbook-toon.png +0 -0
  54. inklet-4.0.0.dev1/docs/assets/guides/cookbook-twin-axis.png +0 -0
  55. inklet-4.0.0.dev1/docs/assets/guides/cookbook-unequal-panels.png +0 -0
  56. inklet-4.0.0.dev1/docs/assets/guides/cookbook-violin.png +0 -0
  57. inklet-4.0.0.dev1/docs/assets/guides/cookbook-wrapped-card.png +0 -0
  58. inklet-4.0.0.dev1/docs/assets/guides/data-1.png +0 -0
  59. inklet-4.0.0.dev1/docs/assets/guides/data-3.png +0 -0
  60. inklet-4.0.0.dev1/docs/assets/guides/dense-data-1.png +0 -0
  61. inklet-4.0.0.dev1/docs/assets/guides/diagram-components-1.png +0 -0
  62. inklet-4.0.0.dev1/docs/assets/guides/diagrams-1.png +0 -0
  63. inklet-4.0.0.dev1/docs/assets/guides/layout-3.png +0 -0
  64. inklet-4.0.0.dev1/docs/assets/guides/oblique-sections-2.png +0 -0
  65. inklet-4.0.0.dev1/docs/assets/guides/plot-quality-after.png +0 -0
  66. inklet-4.0.0.dev1/docs/assets/guides/plot-quality-before.png +0 -0
  67. inklet-4.0.0.dev1/docs/assets/guides/plot-types-1.png +0 -0
  68. inklet-4.0.0.dev1/docs/assets/guides/plotting-1.png +0 -0
  69. inklet-4.0.0.dev1/docs/assets/guides/plotting-2.png +0 -0
  70. inklet-4.0.0.dev1/docs/assets/guides/publication-plots-1.png +0 -0
  71. inklet-4.0.0.dev1/docs/assets/guides/publication-plots-2.png +0 -0
  72. inklet-4.0.0.dev1/docs/assets/guides/publication-plots-3.png +0 -0
  73. inklet-4.0.0.dev1/docs/assets/guides/publication-plots-4.png +0 -0
  74. inklet-4.0.0.dev1/docs/assets/guides/slabs-and-regions-1.png +0 -0
  75. inklet-4.0.0.dev1/docs/assets/guides/three-images-1.png +0 -0
  76. inklet-4.0.0.dev1/docs/assets/guides/three-images-2.png +0 -0
  77. inklet-4.0.0.dev1/docs/assets/research-preview/biology.json +420 -0
  78. inklet-4.0.0.dev1/docs/assets/research-preview/comparison.json +3833 -0
  79. inklet-4.0.0.dev1/docs/assets/research-preview/diagram-after.json +54 -0
  80. inklet-4.0.0.dev1/docs/assets/research-preview/diagram-before.json +60 -0
  81. inklet-4.0.0.dev1/docs/assets/research-preview/diagram-review-caption.tex +1 -0
  82. inklet-4.0.0.dev1/docs/assets/research-preview/engine-after.json +207 -0
  83. inklet-4.0.0.dev1/docs/assets/research-preview/engine-before.json +207 -0
  84. inklet-4.0.0.dev1/docs/assets/research-preview/engine-review-caption.tex +1 -0
  85. inklet-4.0.0.dev1/docs/assets/research-preview/fluorescence-biology.json +4879 -0
  86. inklet-4.0.0.dev1/docs/assets/research-preview/general-plots-caption.tex +1 -0
  87. inklet-4.0.0.dev1/docs/assets/research-preview/general-plots.json +716 -0
  88. inklet-4.0.0.dev1/docs/assets/research-preview/label-intensities-caption.tex +24 -0
  89. inklet-4.0.0.dev1/docs/assets/research-preview/label-intensities-native.csv +35 -0
  90. inklet-4.0.0.dev1/docs/assets/research-preview/label-intensities.json +5434 -0
  91. inklet-4.0.0.dev1/docs/assets/research-preview/lines-after.json +110 -0
  92. inklet-4.0.0.dev1/docs/assets/research-preview/lines-before.json +59 -0
  93. inklet-4.0.0.dev1/docs/assets/research-preview/oblique-biology.json +2189 -0
  94. inklet-4.0.0.dev1/docs/assets/research-preview/plot-engine-review-caption.tex +1 -0
  95. inklet-4.0.0.dev1/docs/assets/research-preview/real-biology.json +535 -0
  96. inklet-4.0.0.dev1/docs/assets/research-preview/revision.json +1514 -0
  97. inklet-4.0.0.dev1/docs/assets/research-preview/slab-biology.json +2123 -0
  98. inklet-4.0.0.dev1/docs/assets/research-preview/study.json +19645 -0
  99. inklet-4.0.0.dev1/docs/assets/v4/after.json +749 -0
  100. inklet-4.0.0.dev1/docs/assets/v4/before.json +531 -0
  101. inklet-4.0.0.dev1/docs/assets/v4/browser-quality.json +21 -0
  102. inklet-4.0.0.dev1/docs/assets/v4/browser-scatter.html +404 -0
  103. inklet-4.0.0.dev1/docs/assets/v4/browser-scatter.png +0 -0
  104. inklet-4.0.0.dev1/docs/assets/v4/browser-study.json +200 -0
  105. inklet-4.0.0.dev1/docs/assets/v4/contours-streamlines-170mm.png +0 -0
  106. inklet-4.0.0.dev1/docs/assets/v4/contours-streamlines-masked.png +0 -0
  107. inklet-4.0.0.dev1/docs/assets/v4/contours-streamlines.html +404 -0
  108. inklet-4.0.0.dev1/docs/assets/v4/contours-streamlines.png +0 -0
  109. inklet-4.0.0.dev1/docs/assets/v4/engineering-report-170mm.png +0 -0
  110. inklet-4.0.0.dev1/docs/assets/v4/engineering-report.html +404 -0
  111. inklet-4.0.0.dev1/docs/assets/v4/engineering-report.png +0 -0
  112. inklet-4.0.0.dev1/docs/assets/v4/faceted-operations.html +404 -0
  113. inklet-4.0.0.dev1/docs/assets/v4/faceted-operations.png +0 -0
  114. inklet-4.0.0.dev1/docs/assets/v4/linked-dashboard.html +404 -0
  115. inklet-4.0.0.dev1/docs/assets/v4/linked-dashboard.png +0 -0
  116. inklet-4.0.0.dev1/docs/assets/v4/linked-selection.html +89 -0
  117. inklet-4.0.0.dev1/docs/assets/v4/linked-selection.png +0 -0
  118. inklet-4.0.0.dev1/docs/assets/v4/mesh-fields-170mm.png +0 -0
  119. inklet-4.0.0.dev1/docs/assets/v4/mesh-fields.html +404 -0
  120. inklet-4.0.0.dev1/docs/assets/v4/mesh-fields.png +0 -0
  121. inklet-4.0.0.dev1/docs/assets/v4/region-shapes.html +404 -0
  122. inklet-4.0.0.dev1/docs/assets/v4/region-shapes.png +0 -0
  123. inklet-4.0.0.dev1/docs/assets/v4/regional-analysis.html +404 -0
  124. inklet-4.0.0.dev1/docs/assets/v4/regional-analysis.png +0 -0
  125. inklet-4.0.0.dev1/docs/assets/v4/regional-report-160mm.png +0 -0
  126. inklet-4.0.0.dev1/docs/assets/v4/regional-report.html +404 -0
  127. inklet-4.0.0.dev1/docs/assets/v4/regional-report.png +0 -0
  128. inklet-4.0.0.dev1/docs/assets/v4/scientific-report-170mm.png +0 -0
  129. inklet-4.0.0.dev1/docs/assets/v4/scientific-report.html +404 -0
  130. inklet-4.0.0.dev1/docs/assets/v4/scientific-report.png +0 -0
  131. inklet-4.0.0.dev1/docs/assets/v4/statistical-views.html +404 -0
  132. inklet-4.0.0.dev1/docs/assets/v4/statistical-views.png +0 -0
  133. inklet-4.0.0.dev1/docs/assets/v4/table-inputs.html +404 -0
  134. inklet-4.0.0.dev1/docs/assets/v4/table-inputs.png +0 -0
  135. inklet-4.0.0.dev1/docs/assets/v4/time-series.html +404 -0
  136. inklet-4.0.0.dev1/docs/assets/v4/time-series.png +0 -0
  137. inklet-4.0.0.dev1/docs/assets/v4/world-population-2019.html +404 -0
  138. inklet-4.0.0.dev1/docs/assets/v4/world-population-2019.json +33 -0
  139. inklet-4.0.0.dev1/docs/assets/v4/world-population-2019.png +0 -0
  140. inklet-4.0.0.dev1/docs/assets/v4/world-population-revisions.html +404 -0
  141. inklet-4.0.0.dev1/docs/assets/v4/world-population-revisions.png +0 -0
  142. inklet-4.0.0.dev1/docs/assets/v4/world-population.html +404 -0
  143. inklet-4.0.0.dev1/docs/assets/v4/world-population.png +0 -0
  144. inklet-4.0.0.dev1/docs/axes-and-scales.md +77 -0
  145. inklet-4.0.0.dev1/docs/biology-panels.md +72 -0
  146. inklet-4.0.0.dev1/docs/browser-rendering.md +116 -0
  147. inklet-4.0.0.dev1/docs/calibrated-volumes.md +110 -0
  148. inklet-4.0.0.dev1/docs/channels-and-contours.md +134 -0
  149. inklet-4.0.0.dev1/docs/compatibility.md +95 -0
  150. inklet-4.0.0.dev1/docs/complex-scene.md +59 -0
  151. inklet-4.0.0.dev1/docs/concepts.md +96 -0
  152. inklet-4.0.0.dev1/docs/contours-streamlines.md +171 -0
  153. inklet-4.0.0.dev1/docs/cookbook.md +2903 -0
  154. inklet-4.0.0.dev1/docs/data-revisions.md +221 -0
  155. inklet-4.0.0.dev1/docs/data.md +162 -0
  156. inklet-4.0.0.dev1/docs/dense-data.md +61 -0
  157. inklet-4.0.0.dev1/docs/design/browser-backends.md +133 -0
  158. inklet-4.0.0.dev1/docs/design/v4.md +207 -0
  159. inklet-4.0.0.dev1/docs/development-preview.md +96 -0
  160. inklet-4.0.0.dev1/docs/diagram-components.md +29 -0
  161. inklet-4.0.0.dev1/docs/diagram-engine.md +135 -0
  162. inklet-4.0.0.dev1/docs/diagrams.md +100 -0
  163. inklet-4.0.0.dev1/docs/engineering-report.md +170 -0
  164. inklet-4.0.0.dev1/docs/export-review.md +142 -0
  165. inklet-4.0.0.dev1/docs/fluorescence-biology.md +115 -0
  166. inklet-4.0.0.dev1/docs/general-plots.md +91 -0
  167. inklet-4.0.0.dev1/docs/index.md +67 -0
  168. inklet-4.0.0.dev1/docs/installation.md +148 -0
  169. inklet-4.0.0.dev1/docs/javascripts/inklet.js +140 -0
  170. inklet-4.0.0.dev1/docs/label-intensities.md +107 -0
  171. inklet-4.0.0.dev1/docs/label-measurements.md +104 -0
  172. inklet-4.0.0.dev1/docs/layout.md +121 -0
  173. inklet-4.0.0.dev1/docs/linked-facets.md +133 -0
  174. inklet-4.0.0.dev1/docs/linked-maps.md +170 -0
  175. inklet-4.0.0.dev1/docs/linked-plots.md +121 -0
  176. inklet-4.0.0.dev1/docs/mesh-fields.md +140 -0
  177. inklet-4.0.0.dev1/docs/microscopy-tiff.md +76 -0
  178. inklet-4.0.0.dev1/docs/migration.md +198 -0
  179. inklet-4.0.0.dev1/docs/oblique-biology.md +77 -0
  180. inklet-4.0.0.dev1/docs/oblique-sections.md +119 -0
  181. inklet-4.0.0.dev1/docs/plot-quality.md +49 -0
  182. inklet-4.0.0.dev1/docs/plot-types.md +55 -0
  183. inklet-4.0.0.dev1/docs/plotting-engine.md +107 -0
  184. inklet-4.0.0.dev1/docs/plotting.md +127 -0
  185. inklet-4.0.0.dev1/docs/presets.md +188 -0
  186. inklet-4.0.0.dev1/docs/publication-plots.md +95 -0
  187. inklet-4.0.0.dev1/docs/real-biology.md +104 -0
  188. inklet-4.0.0.dev1/docs/recipes/architecture-sketch.md +28 -0
  189. inklet-4.0.0.dev1/docs/recipes/architecture.md +28 -0
  190. inklet-4.0.0.dev1/docs/recipes/attractor.md +28 -0
  191. inklet-4.0.0.dev1/docs/recipes/helix.md +26 -0
  192. inklet-4.0.0.dev1/docs/recipes/interference.md +28 -0
  193. inklet-4.0.0.dev1/docs/recipes/lattice.md +26 -0
  194. inklet-4.0.0.dev1/docs/recipes/photonics.md +26 -0
  195. inklet-4.0.0.dev1/docs/recipes/wave-packets.md +28 -0
  196. inklet-4.0.0.dev1/docs/regional-report.md +143 -0
  197. inklet-4.0.0.dev1/docs/release-checks.md +148 -0
  198. inklet-4.0.0.dev1/docs/rendering-engine.md +114 -0
  199. inklet-4.0.0.dev1/docs/research-preview.md +236 -0
  200. inklet-4.0.0.dev1/docs/research-revision.md +100 -0
  201. inklet-4.0.0.dev1/docs/research-study.md +175 -0
  202. inklet-4.0.0.dev1/docs/roadmap.md +266 -0
  203. inklet-4.0.0.dev1/docs/scene-paths.md +125 -0
  204. inklet-4.0.0.dev1/docs/scene-templates.md +123 -0
  205. inklet-4.0.0.dev1/docs/scientific-report.md +180 -0
  206. inklet-4.0.0.dev1/docs/slab-biology.md +77 -0
  207. inklet-4.0.0.dev1/docs/slabs-and-regions.md +113 -0
  208. inklet-4.0.0.dev1/docs/statistical-views.md +131 -0
  209. inklet-4.0.0.dev1/docs/stylesheets/inklet.css +1561 -0
  210. inklet-4.0.0.dev1/docs/table-inputs.md +143 -0
  211. inklet-4.0.0.dev1/docs/three-images.md +96 -0
  212. inklet-4.0.0.dev1/docs/time-series.md +162 -0
  213. inklet-4.0.0.dev1/docs/v4-foundations.md +143 -0
  214. inklet-4.0.0.dev1/docs/world-map.md +95 -0
  215. inklet-4.0.0.dev1/examples/biology/README.md +21 -0
  216. inklet-4.0.0.dev1/examples/biology/cells3d.lock.json +41 -0
  217. inklet-4.0.0.dev1/examples/biology/data.py +50 -0
  218. inklet-4.0.0.dev1/examples/biology/fluorescence.py +21 -0
  219. inklet-4.0.0.dev1/examples/biology/organelle.lock.json +1002 -0
  220. inklet-4.0.0.dev1/examples/biology/requirements.txt +5 -0
  221. inklet-4.0.0.dev1/examples/biology_panels.py +144 -0
  222. inklet-4.0.0.dev1/examples/blender/organelle_scene.py +74 -0
  223. inklet-4.0.0.dev1/examples/blender/research_lab_views.py +38 -0
  224. inklet-4.0.0.dev1/examples/data/general-plots/benchmark.csv +4 -0
  225. inklet-4.0.0.dev1/examples/data/general-plots/learning.csv +32 -0
  226. inklet-4.0.0.dev1/examples/data/general-plots/revenue.csv +5 -0
  227. inklet-4.0.0.dev1/examples/data/general-plots/sensor.csv +122 -0
  228. inklet-4.0.0.dev1/examples/diagram_review.py +80 -0
  229. inklet-4.0.0.dev1/examples/engine_review.py +76 -0
  230. inklet-4.0.0.dev1/examples/fluorescence_biology.py +178 -0
  231. inklet-4.0.0.dev1/examples/general_plots.py +102 -0
  232. inklet-4.0.0.dev1/examples/label_intensities.py +146 -0
  233. inklet-4.0.0.dev1/examples/oblique_biology.py +140 -0
  234. inklet-4.0.0.dev1/examples/plot_engine_review.py +81 -0
  235. inklet-4.0.0.dev1/examples/plot_quality_review.py +54 -0
  236. inklet-4.0.0.dev1/examples/preset_formats.py +68 -0
  237. inklet-4.0.0.dev1/examples/real_biology.py +178 -0
  238. inklet-4.0.0.dev1/examples/research_figure_planner.py +156 -0
  239. inklet-4.0.0.dev1/examples/research_planner_study.py +147 -0
  240. inklet-4.0.0.dev1/examples/research_revision.py +59 -0
  241. inklet-4.0.0.dev1/examples/slab_biology.py +122 -0
  242. inklet-4.0.0.dev1/examples/v4/README.md +299 -0
  243. inklet-4.0.0.dev1/examples/v4/browser_scatter.py +42 -0
  244. inklet-4.0.0.dev1/examples/v4/contours_streamlines.py +102 -0
  245. inklet-4.0.0.dev1/examples/v4/data/world-countries.geojson +1 -0
  246. inklet-4.0.0.dev1/examples/v4/data/world-map-source.json +30 -0
  247. inklet-4.0.0.dev1/examples/v4/data/world-population.csv +177 -0
  248. inklet-4.0.0.dev1/examples/v4/engineering_report.py +167 -0
  249. inklet-4.0.0.dev1/examples/v4/faceted_operations.py +86 -0
  250. inklet-4.0.0.dev1/examples/v4/fixtures/assembly.json +10 -0
  251. inklet-4.0.0.dev1/examples/v4/fixtures/manifest.json +21 -0
  252. inklet-4.0.0.dev1/examples/v4/fixtures/measurement.json +8 -0
  253. inklet-4.0.0.dev1/examples/v4/fixtures/region-shapes.geojson +1 -0
  254. inklet-4.0.0.dev1/examples/v4/fixtures/regions.csv +5 -0
  255. inklet-4.0.0.dev1/examples/v4/fixtures/regions.geojson +1 -0
  256. inklet-4.0.0.dev1/examples/v4/linked_dashboard.py +46 -0
  257. inklet-4.0.0.dev1/examples/v4/linked_selection.html +89 -0
  258. inklet-4.0.0.dev1/examples/v4/linked_selection.py +102 -0
  259. inklet-4.0.0.dev1/examples/v4/mesh_fields.py +115 -0
  260. inklet-4.0.0.dev1/examples/v4/region_shapes.py +28 -0
  261. inklet-4.0.0.dev1/examples/v4/regional_analysis.py +50 -0
  262. inklet-4.0.0.dev1/examples/v4/regional_report.py +162 -0
  263. inklet-4.0.0.dev1/examples/v4/scientific_report.py +110 -0
  264. inklet-4.0.0.dev1/examples/v4/statistical_views.py +61 -0
  265. inklet-4.0.0.dev1/examples/v4/table_inputs.py +82 -0
  266. inklet-4.0.0.dev1/examples/v4/time_series.py +78 -0
  267. inklet-4.0.0.dev1/examples/v4/world_population.py +154 -0
  268. inklet-4.0.0.dev1/gallery/biology-panels.png +0 -0
  269. inklet-4.0.0.dev1/gallery/diagram-labels-after.png +0 -0
  270. inklet-4.0.0.dev1/gallery/diagram-labels-before.png +0 -0
  271. inklet-4.0.0.dev1/gallery/diagram-review.png +0 -0
  272. inklet-4.0.0.dev1/gallery/engine-review.png +0 -0
  273. inklet-4.0.0.dev1/gallery/engine-transparency-after.png +0 -0
  274. inklet-4.0.0.dev1/gallery/engine-transparency-before.png +0 -0
  275. inklet-4.0.0.dev1/gallery/fluorescence-biology.png +0 -0
  276. inklet-4.0.0.dev1/gallery/general-plots-before.png +0 -0
  277. inklet-4.0.0.dev1/gallery/general-plots.png +0 -0
  278. inklet-4.0.0.dev1/gallery/label-intensities.png +0 -0
  279. inklet-4.0.0.dev1/gallery/oblique-biology.png +0 -0
  280. inklet-4.0.0.dev1/gallery/plot-axis-after.png +0 -0
  281. inklet-4.0.0.dev1/gallery/plot-axis-before.png +0 -0
  282. inklet-4.0.0.dev1/gallery/plot-engine-review.png +0 -0
  283. inklet-4.0.0.dev1/gallery/real-biology.png +0 -0
  284. inklet-4.0.0.dev1/gallery/research-crossing-revision.png +0 -0
  285. inklet-4.0.0.dev1/gallery/research-figure-planner.png +0 -0
  286. inklet-4.0.0.dev1/gallery/research-planner-study.png +0 -0
  287. inklet-4.0.0.dev1/gallery/research-revision.png +0 -0
  288. inklet-4.0.0.dev1/gallery/slab-biology.png +0 -0
  289. inklet-4.0.0.dev1/mkdocs.yml +144 -0
  290. inklet-4.0.0.dev1/pyproject.toml +77 -0
  291. inklet-4.0.0.dev1/requirements-ci.txt +52 -0
  292. inklet-4.0.0.dev1/requirements-tables.txt +28 -0
  293. inklet-4.0.0.dev1/src/inklet/__init__.py +472 -0
  294. inklet-4.0.0.dev1/src/inklet/core/diagram.py +583 -0
  295. inklet-4.0.0.dev1/src/inklet/core/envelope.py +269 -0
  296. inklet-4.0.0.dev1/src/inklet/core/style.py +182 -0
  297. inklet-4.0.0.dev1/src/inklet/document/__init__.py +21 -0
  298. inklet-4.0.0.dev1/src/inklet/document/compiler.py +630 -0
  299. inklet-4.0.0.dev1/src/inklet/document/data.py +306 -0
  300. inklet-4.0.0.dev1/src/inklet/document/data_io.py +51 -0
  301. inklet-4.0.0.dev1/src/inklet/document/module.py +97 -0
  302. inklet-4.0.0.dev1/src/inklet/document/spec.py +302 -0
  303. inklet-4.0.0.dev1/src/inklet/draw/shapes.py +226 -0
  304. inklet-4.0.0.dev1/src/inklet/experimental/__init__.py +1 -0
  305. inklet-4.0.0.dev1/src/inklet/experimental/_table_adapters.py +137 -0
  306. inklet-4.0.0.dev1/src/inklet/experimental/browser/__init__.py +747 -0
  307. inklet-4.0.0.dev1/src/inklet/experimental/browser/drawings.py +91 -0
  308. inklet-4.0.0.dev1/src/inklet/experimental/browser/fields.py +108 -0
  309. inklet-4.0.0.dev1/src/inklet/experimental/browser/grid.py +108 -0
  310. inklet-4.0.0.dev1/src/inklet/experimental/browser/images.py +122 -0
  311. inklet-4.0.0.dev1/src/inklet/experimental/browser/page.html +22 -0
  312. inklet-4.0.0.dev1/src/inklet/experimental/browser/regions.py +92 -0
  313. inklet-4.0.0.dev1/src/inklet/experimental/browser/runtime.js +382 -0
  314. inklet-4.0.0.dev1/src/inklet/experimental/browser/series.py +107 -0
  315. inklet-4.0.0.dev1/src/inklet/experimental/browser/timeaxis.py +109 -0
  316. inklet-4.0.0.dev1/src/inklet/experimental/channels.py +152 -0
  317. inklet-4.0.0.dev1/src/inklet/experimental/contours.py +97 -0
  318. inklet-4.0.0.dev1/src/inklet/experimental/engineering.py +99 -0
  319. inklet-4.0.0.dev1/src/inklet/experimental/fields.py +135 -0
  320. inklet-4.0.0.dev1/src/inklet/experimental/figure_planner.py +513 -0
  321. inklet-4.0.0.dev1/src/inklet/experimental/grid.py +294 -0
  322. inklet-4.0.0.dev1/src/inklet/experimental/measurement.py +112 -0
  323. inklet-4.0.0.dev1/src/inklet/experimental/measurements.py +142 -0
  324. inklet-4.0.0.dev1/src/inklet/experimental/planner_geometry.py +127 -0
  325. inklet-4.0.0.dev1/src/inklet/experimental/regions.py +119 -0
  326. inklet-4.0.0.dev1/src/inklet/experimental/sections.py +213 -0
  327. inklet-4.0.0.dev1/src/inklet/experimental/selection.py +200 -0
  328. inklet-4.0.0.dev1/src/inklet/experimental/slabs.py +134 -0
  329. inklet-4.0.0.dev1/src/inklet/experimental/temporal.py +59 -0
  330. inklet-4.0.0.dev1/src/inklet/experimental/tiff.py +93 -0
  331. inklet-4.0.0.dev1/src/inklet/experimental/volume.py +222 -0
  332. inklet-4.0.0.dev1/src/inklet/figure.py +428 -0
  333. inklet-4.0.0.dev1/src/inklet/links/link.py +2484 -0
  334. inklet-4.0.0.dev1/src/inklet/plot/axis.py +559 -0
  335. inklet-4.0.0.dev1/src/inklet/plot/inset.py +311 -0
  336. inklet-4.0.0.dev1/src/inklet/plot/key.py +235 -0
  337. inklet-4.0.0.dev1/src/inklet/plot/marks.py +1151 -0
  338. inklet-4.0.0.dev1/src/inklet/plot/panel.py +1817 -0
  339. inklet-4.0.0.dev1/src/inklet/plot/scale.py +1224 -0
  340. inklet-4.0.0.dev1/src/inklet/plot/scatter_raster.py +201 -0
  341. inklet-4.0.0.dev1/src/inklet/plot/simplify.py +67 -0
  342. inklet-4.0.0.dev1/src/inklet/render/bounds.py +44 -0
  343. inklet-4.0.0.dev1/src/inklet/render/fontembed.py +395 -0
  344. inklet-4.0.0.dev1/src/inklet/render/paint.py +60 -0
  345. inklet-4.0.0.dev1/src/inklet/render/pdf.py +927 -0
  346. inklet-4.0.0.dev1/src/inklet/render/preview.py +106 -0
  347. inklet-4.0.0.dev1/src/inklet/render/resources.py +51 -0
  348. inklet-4.0.0.dev1/src/inklet/render/svg.py +1036 -0
  349. inklet-4.0.0.dev1/src/inklet/themes/theme.py +422 -0
  350. inklet-4.0.0.dev1/src/inklet/three/blender/lineart.py +451 -0
  351. inklet-4.0.0.dev1/src/inklet/three/blender/script.py +545 -0
  352. inklet-4.0.0.dev1/tests/test_biology_source.py +76 -0
  353. inklet-4.0.0.dev1/tests/test_browser_facets.py +262 -0
  354. inklet-4.0.0.dev1/tests/test_browser_figure.py +167 -0
  355. inklet-4.0.0.dev1/tests/test_browser_regions.py +165 -0
  356. inklet-4.0.0.dev1/tests/test_browser_revision.py +196 -0
  357. inklet-4.0.0.dev1/tests/test_browser_scatter.py +115 -0
  358. inklet-4.0.0.dev1/tests/test_browser_series.py +134 -0
  359. inklet-4.0.0.dev1/tests/test_browser_statistics.py +467 -0
  360. inklet-4.0.0.dev1/tests/test_browser_switching.py +330 -0
  361. inklet-4.0.0.dev1/tests/test_browser_time.py +295 -0
  362. inklet-4.0.0.dev1/tests/test_categories.py +52 -0
  363. inklet-4.0.0.dev1/tests/test_channels_contours.py +170 -0
  364. inklet-4.0.0.dev1/tests/test_csv_input.py +51 -0
  365. inklet-4.0.0.dev1/tests/test_diagram_engine.py +116 -0
  366. inklet-4.0.0.dev1/tests/test_docs_site.py +141 -0
  367. inklet-4.0.0.dev1/tests/test_engine_layout.py +80 -0
  368. inklet-4.0.0.dev1/tests/test_engine_rendering.py +84 -0
  369. inklet-4.0.0.dev1/tests/test_engine_scatter.py +57 -0
  370. inklet-4.0.0.dev1/tests/test_engineering_report.py +190 -0
  371. inklet-4.0.0.dev1/tests/test_figure_planner.py +390 -0
  372. inklet-4.0.0.dev1/tests/test_grid_fields.py +222 -0
  373. inklet-4.0.0.dev1/tests/test_guides.py +105 -0
  374. inklet-4.0.0.dev1/tests/test_label_measurements.py +99 -0
  375. inklet-4.0.0.dev1/tests/test_mesh_fields.py +218 -0
  376. inklet-4.0.0.dev1/tests/test_microscopy_tiff.py +72 -0
  377. inklet-4.0.0.dev1/tests/test_plot_engine.py +138 -0
  378. inklet-4.0.0.dev1/tests/test_plot_key.py +260 -0
  379. inklet-4.0.0.dev1/tests/test_plot_legend.py +200 -0
  380. inklet-4.0.0.dev1/tests/test_plot_quality_review.py +108 -0
  381. inklet-4.0.0.dev1/tests/test_regional_report.py +172 -0
  382. inklet-4.0.0.dev1/tests/test_release_adversarial.py +136 -0
  383. inklet-4.0.0.dev1/tests/test_render_jobs.py +122 -0
  384. inklet-4.0.0.dev1/tests/test_scientific_report.py +204 -0
  385. inklet-4.0.0.dev1/tests/test_sections.py +141 -0
  386. inklet-4.0.0.dev1/tests/test_shared_plot_margins.py +219 -0
  387. inklet-4.0.0.dev1/tests/test_slabs_regions.py +167 -0
  388. inklet-4.0.0.dev1/tests/test_table_adapters.py +260 -0
  389. inklet-4.0.0.dev1/tests/test_temporal_adapters.py +141 -0
  390. inklet-4.0.0.dev1/tests/test_three_blender.py +771 -0
  391. inklet-4.0.0.dev1/tests/test_v4_selection.py +226 -0
  392. inklet-4.0.0.dev1/tests/test_volume.py +132 -0
  393. inklet-4.0.0.dev1/tests/test_world_map_example.py +77 -0
  394. inklet-4.0.0.dev1/tests/visual/README.md +37 -0
  395. inklet-4.0.0.dev1/tests/visual/baseline/categories-pdf.png +0 -0
  396. inklet-4.0.0.dev1/tests/visual/baseline/categories-svg.png +0 -0
  397. inklet-4.0.0.dev1/tests/visual/baseline/components-svg.png +0 -0
  398. inklet-4.0.0.dev1/tests/visual/baseline/dense-pdf.png +0 -0
  399. inklet-4.0.0.dev1/tests/visual/baseline/dense-svg.png +0 -0
  400. inklet-4.0.0.dev1/tests/visual/baseline/inset-pdf.png +0 -0
  401. inklet-4.0.0.dev1/tests/visual/baseline/inset-svg.png +0 -0
  402. inklet-4.0.0.dev1/tests/visual/baseline/markers-pdf.png +0 -0
  403. inklet-4.0.0.dev1/tests/visual/baseline/markers-svg.png +0 -0
  404. inklet-4.0.0.dev1/tests/visual/baseline/renderers.json +4 -0
  405. inklet-4.0.0.dev1/tests/visual/baseline/v2-category-subset-pdf.png +0 -0
  406. inklet-4.0.0.dev1/tests/visual/baseline/v2-category-subset-svg.png +0 -0
  407. inklet-4.0.0.dev1/tests/visual/baseline/v2-dense-pdf.png +0 -0
  408. inklet-4.0.0.dev1/tests/visual/baseline/v2-dense-svg.png +0 -0
  409. inklet-4.0.0.dev1/tests/visual/baseline/v2-late-inset-pdf.png +0 -0
  410. inklet-4.0.0.dev1/tests/visual/baseline/v2-late-inset-svg.png +0 -0
  411. inklet-4.0.0.dev1/tests/visual/baseline/v2-shared-scales-pdf.png +0 -0
  412. inklet-4.0.0.dev1/tests/visual/baseline/v2-shared-scales-svg.png +0 -0
  413. inklet-4.0.0.dev1/tests/visual/baseline/v2-twins-matrix-pdf.png +0 -0
  414. inklet-4.0.0.dev1/tests/visual/baseline/v2-twins-matrix-svg.png +0 -0
  415. inklet-4.0.0.dev1/tests/visual/baseline/v2-workflow-pdf.png +0 -0
  416. inklet-4.0.0.dev1/tests/visual/baseline/v2-workflow-svg.png +0 -0
  417. inklet-4.0.0.dev1/tests/visual/baseline/v25-document-pdf.png +0 -0
  418. inklet-4.0.0.dev1/tests/visual/baseline/v25-document-svg.png +0 -0
  419. inklet-4.0.0.dev1/tools/benchmark_diagrams.py +75 -0
  420. inklet-4.0.0.dev1/tools/benchmark_engine.py +117 -0
  421. inklet-4.0.0.dev1/tools/benchmark_lines.py +63 -0
  422. inklet-4.0.0.dev1/tools/benchmark_v4.py +119 -0
  423. inklet-4.0.0.dev1/tools/browser_study.js +35 -0
  424. inklet-4.0.0.dev1/tools/check_wheel.py +201 -0
  425. inklet-4.0.0.dev1/tools/docs_gallery.json +365 -0
  426. inklet-4.0.0.dev1/tools/docs_previews.json +457 -0
  427. inklet-4.0.0.dev1/tools/docs_previews.py +69 -0
  428. inklet-4.0.0.dev1/tools/docs_site.py +171 -0
  429. inklet-4.0.0.dev1/tools/docs_theme/home.html +17 -0
  430. inklet-4.0.0.dev1/tools/docs_theme/main.html +54 -0
  431. inklet-4.0.0.dev1/tools/prepare_world_map.py +69 -0
  432. inklet-4.0.0.dev1/tools/v4-budgets.json +9 -0
  433. inklet-4.0.0.dev1/tools/visual_check.py +100 -0
  434. inklet-3.0.0/.gitattributes +0 -2
  435. inklet-3.0.0/.github/workflows/checks.yml +0 -146
  436. inklet-3.0.0/.github/workflows/publish.yml +0 -87
  437. inklet-3.0.0/CHANGELOG.md +0 -144
  438. inklet-3.0.0/CONTRIBUTING.md +0 -98
  439. inklet-3.0.0/PKG-INFO +0 -218
  440. inklet-3.0.0/README.md +0 -178
  441. inklet-3.0.0/THIRD_PARTY_NOTICES.md +0 -81
  442. inklet-3.0.0/docs/api.md +0 -1263
  443. inklet-3.0.0/docs/compatibility.md +0 -83
  444. inklet-3.0.0/docs/complex-scene.md +0 -59
  445. inklet-3.0.0/docs/concepts.md +0 -92
  446. inklet-3.0.0/docs/cookbook.md +0 -2723
  447. inklet-3.0.0/docs/data.md +0 -101
  448. inklet-3.0.0/docs/diagram-components.md +0 -25
  449. inklet-3.0.0/docs/diagrams.md +0 -93
  450. inklet-3.0.0/docs/export-review.md +0 -138
  451. inklet-3.0.0/docs/index.md +0 -58
  452. inklet-3.0.0/docs/installation.md +0 -130
  453. inklet-3.0.0/docs/javascripts/inklet.js +0 -135
  454. inklet-3.0.0/docs/layout.md +0 -87
  455. inklet-3.0.0/docs/migration.md +0 -142
  456. inklet-3.0.0/docs/plotting.md +0 -105
  457. inklet-3.0.0/docs/presets.md +0 -183
  458. inklet-3.0.0/docs/publication-plots.md +0 -70
  459. inklet-3.0.0/docs/recipes/architecture-sketch.md +0 -28
  460. inklet-3.0.0/docs/recipes/architecture.md +0 -28
  461. inklet-3.0.0/docs/recipes/attractor.md +0 -28
  462. inklet-3.0.0/docs/recipes/helix.md +0 -26
  463. inklet-3.0.0/docs/recipes/interference.md +0 -28
  464. inklet-3.0.0/docs/recipes/lattice.md +0 -26
  465. inklet-3.0.0/docs/recipes/photonics.md +0 -26
  466. inklet-3.0.0/docs/recipes/wave-packets.md +0 -28
  467. inklet-3.0.0/docs/release-checks.md +0 -133
  468. inklet-3.0.0/docs/scene-paths.md +0 -125
  469. inklet-3.0.0/docs/scene-templates.md +0 -123
  470. inklet-3.0.0/docs/stylesheets/inklet.css +0 -1534
  471. inklet-3.0.0/docs/three-images.md +0 -88
  472. inklet-3.0.0/examples/preset_formats.py +0 -65
  473. inklet-3.0.0/mkdocs.yml +0 -95
  474. inklet-3.0.0/pyproject.toml +0 -71
  475. inklet-3.0.0/requirements-ci.txt +0 -26
  476. inklet-3.0.0/src/inklet/__init__.py +0 -472
  477. inklet-3.0.0/src/inklet/core/diagram.py +0 -580
  478. inklet-3.0.0/src/inklet/core/envelope.py +0 -269
  479. inklet-3.0.0/src/inklet/core/style.py +0 -179
  480. inklet-3.0.0/src/inklet/document/__init__.py +0 -18
  481. inklet-3.0.0/src/inklet/document/compiler.py +0 -543
  482. inklet-3.0.0/src/inklet/document/data.py +0 -301
  483. inklet-3.0.0/src/inklet/document/module.py +0 -75
  484. inklet-3.0.0/src/inklet/document/spec.py +0 -277
  485. inklet-3.0.0/src/inklet/draw/shapes.py +0 -226
  486. inklet-3.0.0/src/inklet/figure.py +0 -428
  487. inklet-3.0.0/src/inklet/links/link.py +0 -2464
  488. inklet-3.0.0/src/inklet/plot/axis.py +0 -523
  489. inklet-3.0.0/src/inklet/plot/inset.py +0 -310
  490. inklet-3.0.0/src/inklet/plot/key.py +0 -202
  491. inklet-3.0.0/src/inklet/plot/marks.py +0 -1150
  492. inklet-3.0.0/src/inklet/plot/panel.py +0 -1775
  493. inklet-3.0.0/src/inklet/plot/scale.py +0 -1202
  494. inklet-3.0.0/src/inklet/plot/scatter_raster.py +0 -161
  495. inklet-3.0.0/src/inklet/render/fontembed.py +0 -391
  496. inklet-3.0.0/src/inklet/render/paint.py +0 -60
  497. inklet-3.0.0/src/inklet/render/pdf.py +0 -926
  498. inklet-3.0.0/src/inklet/render/preview.py +0 -70
  499. inklet-3.0.0/src/inklet/render/resources.py +0 -45
  500. inklet-3.0.0/src/inklet/render/svg.py +0 -1025
  501. inklet-3.0.0/src/inklet/themes/theme.py +0 -422
  502. inklet-3.0.0/src/inklet/three/blender/lineart.py +0 -458
  503. inklet-3.0.0/src/inklet/three/blender/script.py +0 -541
  504. inklet-3.0.0/tests/test_categories.py +0 -44
  505. inklet-3.0.0/tests/test_docs_site.py +0 -100
  506. inklet-3.0.0/tests/test_guides.py +0 -83
  507. inklet-3.0.0/tests/test_plot_key.py +0 -233
  508. inklet-3.0.0/tests/test_plot_legend.py +0 -187
  509. inklet-3.0.0/tests/test_render_jobs.py +0 -120
  510. inklet-3.0.0/tests/test_three_blender.py +0 -761
  511. inklet-3.0.0/tests/visual/README.md +0 -26
  512. inklet-3.0.0/tests/visual/baseline/categories-pdf.png +0 -0
  513. inklet-3.0.0/tests/visual/baseline/categories-svg.png +0 -0
  514. inklet-3.0.0/tests/visual/baseline/components-svg.png +0 -0
  515. inklet-3.0.0/tests/visual/baseline/dense-pdf.png +0 -0
  516. inklet-3.0.0/tests/visual/baseline/dense-svg.png +0 -0
  517. inklet-3.0.0/tests/visual/baseline/inset-pdf.png +0 -0
  518. inklet-3.0.0/tests/visual/baseline/inset-svg.png +0 -0
  519. inklet-3.0.0/tests/visual/baseline/markers-pdf.png +0 -0
  520. inklet-3.0.0/tests/visual/baseline/markers-svg.png +0 -0
  521. inklet-3.0.0/tests/visual/baseline/v2-category-subset-pdf.png +0 -0
  522. inklet-3.0.0/tests/visual/baseline/v2-category-subset-svg.png +0 -0
  523. inklet-3.0.0/tests/visual/baseline/v2-dense-pdf.png +0 -0
  524. inklet-3.0.0/tests/visual/baseline/v2-dense-svg.png +0 -0
  525. inklet-3.0.0/tests/visual/baseline/v2-late-inset-pdf.png +0 -0
  526. inklet-3.0.0/tests/visual/baseline/v2-late-inset-svg.png +0 -0
  527. inklet-3.0.0/tests/visual/baseline/v2-shared-scales-pdf.png +0 -0
  528. inklet-3.0.0/tests/visual/baseline/v2-shared-scales-svg.png +0 -0
  529. inklet-3.0.0/tests/visual/baseline/v2-twins-matrix-pdf.png +0 -0
  530. inklet-3.0.0/tests/visual/baseline/v2-twins-matrix-svg.png +0 -0
  531. inklet-3.0.0/tests/visual/baseline/v2-workflow-pdf.png +0 -0
  532. inklet-3.0.0/tests/visual/baseline/v2-workflow-svg.png +0 -0
  533. inklet-3.0.0/tests/visual/baseline/v25-document-pdf.png +0 -0
  534. inklet-3.0.0/tests/visual/baseline/v25-document-svg.png +0 -0
  535. inklet-3.0.0/tools/check_wheel.py +0 -102
  536. inklet-3.0.0/tools/docs_gallery.json +0 -222
  537. inklet-3.0.0/tools/docs_site.py +0 -104
  538. inklet-3.0.0/tools/docs_theme/home.html +0 -17
  539. inklet-3.0.0/tools/docs_theme/main.html +0 -53
  540. inklet-3.0.0/tools/visual_check.py +0 -80
  541. {inklet-3.0.0 → inklet-4.0.0.dev1}/.gitignore +0 -0
  542. {inklet-3.0.0 → inklet-4.0.0.dev1}/.readthedocs.yaml +0 -0
  543. {inklet-3.0.0 → inklet-4.0.0.dev1}/CONTRACT.md +0 -0
  544. {inklet-3.0.0 → inklet-4.0.0.dev1}/LICENSE +0 -0
  545. {inklet-3.0.0 → inklet-4.0.0.dev1}/docs/assets/brand/inklet-icon.svg +0 -0
  546. {inklet-3.0.0 → inklet-4.0.0.dev1}/docs/assets/brand/inklet-logo-dark.svg +0 -0
  547. {inklet-3.0.0 → inklet-4.0.0.dev1}/docs/assets/brand/inklet-logo-mono.svg +0 -0
  548. {inklet-3.0.0 → inklet-4.0.0.dev1}/docs/assets/brand/inklet-logo.svg +0 -0
  549. {inklet-3.0.0 → inklet-4.0.0.dev1}/docs/assets/brand/inklet-wordmark.svg +0 -0
  550. {inklet-3.0.0 → inklet-4.0.0.dev1}/docs/assets/examples/quickstart.pdf +0 -0
  551. {inklet-3.0.0 → inklet-4.0.0.dev1}/docs/assets/examples/quickstart.png +0 -0
  552. {inklet-3.0.0 → inklet-4.0.0.dev1}/docs/assets/examples/quickstart.svg +0 -0
  553. {inklet-3.0.0 → inklet-4.0.0.dev1}/docs/blender-scenes.md +0 -0
  554. {inklet-3.0.0 → inklet-4.0.0.dev1}/docs/brand.md +0 -0
  555. {inklet-3.0.0 → inklet-4.0.0.dev1}/docs/cli.md +0 -0
  556. {inklet-3.0.0 → inklet-4.0.0.dev1}/docs/design/page_grid.md +0 -0
  557. {inklet-3.0.0 → inklet-4.0.0.dev1}/docs/design/v2.md +0 -0
  558. {inklet-3.0.0 → inklet-4.0.0.dev1}/docs/example-library.md +0 -0
  559. {inklet-3.0.0 → inklet-4.0.0.dev1}/docs/examples.md +0 -0
  560. {inklet-3.0.0 → inklet-4.0.0.dev1}/docs/quickstart.md +0 -0
  561. {inklet-3.0.0 → inklet-4.0.0.dev1}/docs/render-jobs.md +0 -0
  562. {inklet-3.0.0 → inklet-4.0.0.dev1}/docs/scene-annotations.md +0 -0
  563. {inklet-3.0.0 → inklet-4.0.0.dev1}/docs/showcase.md +0 -0
  564. {inklet-3.0.0 → inklet-4.0.0.dev1}/docs/stress20.md +0 -0
  565. {inklet-3.0.0 → inklet-4.0.0.dev1}/docs/stylesheets/code.css +0 -0
  566. {inklet-3.0.0 → inklet-4.0.0.dev1}/docs/troubleshooting.md +0 -0
  567. {inklet-3.0.0 → inklet-4.0.0.dev1}/docs/v2.5.md +0 -0
  568. {inklet-3.0.0 → inklet-4.0.0.dev1}/docs/v2.md +0 -0
  569. {inklet-3.0.0 → inklet-4.0.0.dev1}/docs/v3.md +0 -0
  570. {inklet-3.0.0 → inklet-4.0.0.dev1}/examples/blender/complex_lab_scene.py +0 -0
  571. {inklet-3.0.0 → inklet-4.0.0.dev1}/examples/blender/lab_scene.py +0 -0
  572. {inklet-3.0.0 → inklet-4.0.0.dev1}/examples/blender/occlusion_scene.py +0 -0
  573. {inklet-3.0.0 → inklet-4.0.0.dev1}/examples/broken_axis.py +0 -0
  574. {inklet-3.0.0 → inklet-4.0.0.dev1}/examples/feature_flow.py +0 -0
  575. {inklet-3.0.0 → inklet-4.0.0.dev1}/examples/gallery.py +0 -0
  576. {inklet-3.0.0 → inklet-4.0.0.dev1}/examples/graph.py +0 -0
  577. {inklet-3.0.0 → inklet-4.0.0.dev1}/examples/hello_figure.py +0 -0
  578. {inklet-3.0.0 → inklet-4.0.0.dev1}/examples/panels.py +0 -0
  579. {inklet-3.0.0 → inklet-4.0.0.dev1}/examples/polar.py +0 -0
  580. {inklet-3.0.0 → inklet-4.0.0.dev1}/examples/presets.py +0 -0
  581. {inklet-3.0.0 → inklet-4.0.0.dev1}/examples/render_smoke.py +0 -0
  582. {inklet-3.0.0 → inklet-4.0.0.dev1}/examples/showcase/README.md +0 -0
  583. {inklet-3.0.0 → inklet-4.0.0.dev1}/examples/showcase/assets.lock.json +0 -0
  584. {inklet-3.0.0 → inklet-4.0.0.dev1}/examples/showcase/blender_scenes.py +0 -0
  585. {inklet-3.0.0 → inklet-4.0.0.dev1}/examples/showcase/figures.py +0 -0
  586. {inklet-3.0.0 → inklet-4.0.0.dev1}/examples/state_machine.py +0 -0
  587. {inklet-3.0.0 → inklet-4.0.0.dev1}/examples/stress20.py +0 -0
  588. {inklet-3.0.0 → inklet-4.0.0.dev1}/examples/v25_document.py +0 -0
  589. {inklet-3.0.0 → inklet-4.0.0.dev1}/examples/v2_cases.py +0 -0
  590. {inklet-3.0.0 → inklet-4.0.0.dev1}/examples/v2_document.py +0 -0
  591. {inklet-3.0.0 → inklet-4.0.0.dev1}/examples/v3_complex_scene.py +0 -0
  592. {inklet-3.0.0 → inklet-4.0.0.dev1}/examples/v3_render_jobs.py +0 -0
  593. {inklet-3.0.0 → inklet-4.0.0.dev1}/examples/v3_rendering.py +0 -0
  594. {inklet-3.0.0 → inklet-4.0.0.dev1}/examples/v3_scene_annotations.py +0 -0
  595. {inklet-3.0.0 → inklet-4.0.0.dev1}/examples/v3_scene_passes.py +0 -0
  596. {inklet-3.0.0 → inklet-4.0.0.dev1}/examples/v3_scene_paths.py +0 -0
  597. {inklet-3.0.0 → inklet-4.0.0.dev1}/examples/v3_scene_templates.py +0 -0
  598. {inklet-3.0.0 → inklet-4.0.0.dev1}/figures/annot.py +0 -0
  599. {inklet-3.0.0 → inklet-4.0.0.dev1}/figures/bio3d.py +0 -0
  600. {inklet-3.0.0 → inklet-4.0.0.dev1}/figures/cartoon.py +0 -0
  601. {inklet-3.0.0 → inklet-4.0.0.dev1}/figures/chem_data.py +0 -0
  602. {inklet-3.0.0 → inklet-4.0.0.dev1}/figures/chem_fingerprints.py +0 -0
  603. {inklet-3.0.0 → inklet-4.0.0.dev1}/figures/data/1m17-kinase.pdb +0 -0
  604. {inklet-3.0.0 → inklet-4.0.0.dev1}/figures/data/README.md +0 -0
  605. {inklet-3.0.0 → inklet-4.0.0.dev1}/figures/drug_discovery.py +0 -0
  606. {inklet-3.0.0 → inklet-4.0.0.dev1}/figures/mouse_brain_data.py +0 -0
  607. {inklet-3.0.0 → inklet-4.0.0.dev1}/figures/neural_activity.py +0 -0
  608. {inklet-3.0.0 → inklet-4.0.0.dev1}/figures/pdbfile.py +0 -0
  609. {inklet-3.0.0 → inklet-4.0.0.dev1}/figures/showcase_part.py +0 -0
  610. {inklet-3.0.0 → inklet-4.0.0.dev1}/figures/showcase_process.py +0 -0
  611. {inklet-3.0.0 → inklet-4.0.0.dev1}/figures/showcase_season.py +0 -0
  612. {inklet-3.0.0 → inklet-4.0.0.dev1}/figures/structure.py +0 -0
  613. {inklet-3.0.0 → inklet-4.0.0.dev1}/figures/structure_data.py +0 -0
  614. {inklet-3.0.0 → inklet-4.0.0.dev1}/figures/target.py +0 -0
  615. {inklet-3.0.0 → inklet-4.0.0.dev1}/figures/trial.py +0 -0
  616. {inklet-3.0.0 → inklet-4.0.0.dev1}/gallery/README.md +0 -0
  617. {inklet-3.0.0 → inklet-4.0.0.dev1}/gallery/chem_fingerprints.png +0 -0
  618. {inklet-3.0.0 → inklet-4.0.0.dev1}/gallery/flow.png +0 -0
  619. {inklet-3.0.0 → inklet-4.0.0.dev1}/gallery/part.png +0 -0
  620. {inklet-3.0.0 → inklet-4.0.0.dev1}/gallery/plots.png +0 -0
  621. {inklet-3.0.0 → inklet-4.0.0.dev1}/gallery/polar.png +0 -0
  622. {inklet-3.0.0 → inklet-4.0.0.dev1}/gallery/preset-formats.png +0 -0
  623. {inklet-3.0.0 → inklet-4.0.0.dev1}/gallery/presets.png +0 -0
  624. {inklet-3.0.0 → inklet-4.0.0.dev1}/gallery/process.png +0 -0
  625. {inklet-3.0.0 → inklet-4.0.0.dev1}/gallery/season.png +0 -0
  626. {inklet-3.0.0 → inklet-4.0.0.dev1}/gallery/showcase-architecture-sketch.png +0 -0
  627. {inklet-3.0.0 → inklet-4.0.0.dev1}/gallery/showcase-architecture.png +0 -0
  628. {inklet-3.0.0 → inklet-4.0.0.dev1}/gallery/showcase-attractor.png +0 -0
  629. {inklet-3.0.0 → inklet-4.0.0.dev1}/gallery/showcase-helix.png +0 -0
  630. {inklet-3.0.0 → inklet-4.0.0.dev1}/gallery/showcase-interference.png +0 -0
  631. {inklet-3.0.0 → inklet-4.0.0.dev1}/gallery/showcase-lattice.png +0 -0
  632. {inklet-3.0.0 → inklet-4.0.0.dev1}/gallery/showcase-photonics.png +0 -0
  633. {inklet-3.0.0 → inklet-4.0.0.dev1}/gallery/showcase-wave-packets.png +0 -0
  634. {inklet-3.0.0 → inklet-4.0.0.dev1}/gallery/stress20.png +0 -0
  635. {inklet-3.0.0 → inklet-4.0.0.dev1}/gallery/structure.png +0 -0
  636. {inklet-3.0.0 → inklet-4.0.0.dev1}/gallery/v3-complex-scene.png +0 -0
  637. {inklet-3.0.0 → inklet-4.0.0.dev1}/gallery/v3-render-jobs.png +0 -0
  638. {inklet-3.0.0 → inklet-4.0.0.dev1}/gallery/v3-rendering.png +0 -0
  639. {inklet-3.0.0 → inklet-4.0.0.dev1}/gallery/v3-scene-annotations.png +0 -0
  640. {inklet-3.0.0 → inklet-4.0.0.dev1}/gallery/v3-scene-passes.png +0 -0
  641. {inklet-3.0.0 → inklet-4.0.0.dev1}/gallery/v3-scene-paths.png +0 -0
  642. {inklet-3.0.0 → inklet-4.0.0.dev1}/gallery/v3-scene-templates.png +0 -0
  643. {inklet-3.0.0 → inklet-4.0.0.dev1}/requirements-docs.txt +0 -0
  644. {inklet-3.0.0 → inklet-4.0.0.dev1}/scripts/bench_svg.py +0 -0
  645. {inklet-3.0.0 → inklet-4.0.0.dev1}/scripts/rasterise.sh +0 -0
  646. {inklet-3.0.0 → inklet-4.0.0.dev1}/scripts/sanity_typeset.py +0 -0
  647. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/__main__.py +0 -0
  648. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/assets/__init__.py +0 -0
  649. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/assets/asset.py +0 -0
  650. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/assets/cache.py +0 -0
  651. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/assets/cutout.py +0 -0
  652. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/assets/deps.py +0 -0
  653. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/assets/harmonise.py +0 -0
  654. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/assets/lineart.py +0 -0
  655. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/assets/mask.py +0 -0
  656. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/assets/provenance.py +0 -0
  657. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/assets/raster.py +0 -0
  658. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/assets/sidecar.py +0 -0
  659. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/assets/silhouette.py +0 -0
  660. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/cli.py +0 -0
  661. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/components.py +0 -0
  662. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/core/__init__.py +0 -0
  663. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/core/geom.py +0 -0
  664. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/core/prims.py +0 -0
  665. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/core/trace.py +0 -0
  666. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/core/units.py +0 -0
  667. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/diagnostics/__init__.py +0 -0
  668. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/diagnostics/abut.py +0 -0
  669. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/diagnostics/break_rules.py +0 -0
  670. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/diagnostics/color.py +0 -0
  671. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/diagnostics/cross.py +0 -0
  672. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/diagnostics/image.py +0 -0
  673. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/diagnostics/key_rules.py +0 -0
  674. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/diagnostics/link_rules.py +0 -0
  675. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/diagnostics/path_rules.py +0 -0
  676. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/diagnostics/plot_rules.py +0 -0
  677. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/diagnostics/report.py +0 -0
  678. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/diagnostics/rules.py +0 -0
  679. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/diagnostics/three_rules.py +0 -0
  680. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/document/composition.py +0 -0
  681. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/document/presets.py +0 -0
  682. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/document/publication.py +0 -0
  683. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/draw/__init__.py +0 -0
  684. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/draw/annotate.py +0 -0
  685. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/draw/clip.py +0 -0
  686. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/draw/coords.py +0 -0
  687. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/draw/path.py +0 -0
  688. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/draw/place.py +0 -0
  689. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/layout/__init__.py +0 -0
  690. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/layout/fit.py +0 -0
  691. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/layout/flow.py +0 -0
  692. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/layout/graph.py +0 -0
  693. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/layout/graph_force.py +0 -0
  694. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/layout/graph_layered.py +0 -0
  695. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/layout/graph_tree.py +0 -0
  696. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/layout/labels.py +0 -0
  697. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/layout/sankey.py +0 -0
  698. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/links/__init__.py +0 -0
  699. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/links/curves.py +0 -0
  700. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/plot/__init__.py +0 -0
  701. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/plot/breaks.py +0 -0
  702. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/plot/categories.py +0 -0
  703. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/plot/facets.py +0 -0
  704. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/plot/notes.py +0 -0
  705. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/plot/png.py +0 -0
  706. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/plot/polar.py +0 -0
  707. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/plot/ramp.py +0 -0
  708. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/plot/raster.py +0 -0
  709. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/plot/ribbon.py +0 -0
  710. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/plot/series.py +0 -0
  711. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/plot/timescale.py +0 -0
  712. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/render/__init__.py +0 -0
  713. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/render/brushes.py +0 -0
  714. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/render/bundle.py +0 -0
  715. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/render/composite.py +0 -0
  716. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/render/glyphs.py +0 -0
  717. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/render/outline.py +0 -0
  718. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/render/pathdata.py +0 -0
  719. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/render/pdftext.py +0 -0
  720. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/render/raster.py +0 -0
  721. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/render/review.py +0 -0
  722. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/render/revision.py +0 -0
  723. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/themes/__init__.py +0 -0
  724. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/themes/color.py +0 -0
  725. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/themes/palettes.py +0 -0
  726. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/three/__init__.py +0 -0
  727. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/three/api.py +0 -0
  728. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/three/backend.py +0 -0
  729. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/three/blender/__init__.py +0 -0
  730. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/three/blender/device_worker.py +0 -0
  731. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/three/blender/discover.py +0 -0
  732. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/three/blender/options.py +0 -0
  733. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/three/blender/scene_worker.py +0 -0
  734. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/three/blender/svgread.py +0 -0
  735. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/three/blender/template_worker.py +0 -0
  736. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/three/blender/tracing.py +0 -0
  737. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/three/blender_backend.py +0 -0
  738. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/three/camera.py +0 -0
  739. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/three/deps.py +0 -0
  740. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/three/depth.py +0 -0
  741. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/three/devices.py +0 -0
  742. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/three/drill.py +0 -0
  743. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/three/edges.py +0 -0
  744. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/three/hlr.py +0 -0
  745. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/three/linalg.py +0 -0
  746. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/three/mesh.py +0 -0
  747. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/three/occlude.py +0 -0
  748. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/three/order.py +0 -0
  749. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/three/parse.py +0 -0
  750. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/three/place.py +0 -0
  751. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/three/protein.py +0 -0
  752. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/three/quality.py +0 -0
  753. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/three/render_jobs.py +0 -0
  754. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/three/scene_annotations.py +0 -0
  755. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/three/scene_pass.py +0 -0
  756. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/three/scene_projection.py +0 -0
  757. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/three/scenes.py +0 -0
  758. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/three/shade.py +0 -0
  759. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/three/solids.py +0 -0
  760. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/three/templates.json +0 -0
  761. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/three/templates.py +0 -0
  762. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/typeset/__init__.py +0 -0
  763. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/typeset/fonts.py +0 -0
  764. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/typeset/markup.py +0 -0
  765. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/typeset/onpath.py +0 -0
  766. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/typeset/outline.py +0 -0
  767. {inklet-3.0.0 → inklet-4.0.0.dev1}/src/inklet/typeset/shaping.py +0 -0
  768. {inklet-3.0.0 → inklet-4.0.0.dev1}/stress/assets/mouse.inklet.json +0 -0
  769. {inklet-3.0.0 → inklet-4.0.0.dev1}/stress/assets/mouse.png +0 -0
  770. {inklet-3.0.0 → inklet-4.0.0.dev1}/stress/dense_graph.py +0 -0
  771. {inklet-3.0.0 → inklet-4.0.0.dev1}/stress/draw_probe.py +0 -0
  772. {inklet-3.0.0 → inklet-4.0.0.dev1}/stress/electro/assets/sem.png +0 -0
  773. {inklet-3.0.0 → inklet-4.0.0.dev1}/stress/electro/assets/tem.png +0 -0
  774. {inklet-3.0.0 → inklet-4.0.0.dev1}/stress/electro/cell.py +0 -0
  775. {inklet-3.0.0 → inklet-4.0.0.dev1}/stress/electro/common.py +0 -0
  776. {inklet-3.0.0 → inklet-4.0.0.dev1}/stress/electro/data.py +0 -0
  777. {inklet-3.0.0 → inklet-4.0.0.dev1}/stress/electro/imaging.py +0 -0
  778. {inklet-3.0.0 → inklet-4.0.0.dev1}/stress/electro/kinetics.py +0 -0
  779. {inklet-3.0.0 → inklet-4.0.0.dev1}/stress/electro/micrograph.py +0 -0
  780. {inklet-3.0.0 → inklet-4.0.0.dev1}/stress/electro/system.py +0 -0
  781. {inklet-3.0.0 → inklet-4.0.0.dev1}/stress/electro_figure.py +0 -0
  782. {inklet-3.0.0 → inklet-4.0.0.dev1}/stress/fidelity.py +0 -0
  783. {inklet-3.0.0 → inklet-4.0.0.dev1}/stress/flow.py +0 -0
  784. {inklet-3.0.0 → inklet-4.0.0.dev1}/stress/hard_figure.py +0 -0
  785. {inklet-3.0.0 → inklet-4.0.0.dev1}/stress/label_storm.py +0 -0
  786. {inklet-3.0.0 → inklet-4.0.0.dev1}/stress/mega_figure.py +0 -0
  787. {inklet-3.0.0 → inklet-4.0.0.dev1}/stress/meshes/README.md +0 -0
  788. {inklet-3.0.0 → inklet-4.0.0.dev1}/stress/meshes/brain-lh.obj +0 -0
  789. {inklet-3.0.0 → inklet-4.0.0.dev1}/stress/meshes/spot.obj +0 -0
  790. {inklet-3.0.0 → inklet-4.0.0.dev1}/stress/panels/apparatus.py +0 -0
  791. {inklet-3.0.0 → inklet-4.0.0.dev1}/stress/panels/graphs.py +0 -0
  792. {inklet-3.0.0 → inklet-4.0.0.dev1}/stress/panels/relations.py +0 -0
  793. {inklet-3.0.0 → inklet-4.0.0.dev1}/stress/panels/responses.py +0 -0
  794. {inklet-3.0.0 → inklet-4.0.0.dev1}/stress/panels/sections.py +0 -0
  795. {inklet-3.0.0 → inklet-4.0.0.dev1}/stress/probes.py +0 -0
  796. {inklet-3.0.0 → inklet-4.0.0.dev1}/stress/three_figure.py +0 -0
  797. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_alignment_contract.py +0 -0
  798. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_annotate.py +0 -0
  799. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_annotate_letters.py +0 -0
  800. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_assets.py +0 -0
  801. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_assets_provenance.py +0 -0
  802. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_blend_scene.py +0 -0
  803. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_chem_figure.py +0 -0
  804. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_cli.py +0 -0
  805. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_components.py +0 -0
  806. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_contrast_and_labels.py +0 -0
  807. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_cookbook.py +0 -0
  808. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_core.py +0 -0
  809. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_core_amendments.py +0 -0
  810. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_diagnostics.py +0 -0
  811. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_diagnostics_api.py +0 -0
  812. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_diagnostics_artwork.py +0 -0
  813. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_diagnostics_break_distorts.py +0 -0
  814. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_diagnostics_crossing.py +0 -0
  815. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_diagnostics_image_contrast.py +0 -0
  816. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_diagnostics_ink.py +0 -0
  817. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_diagnostics_keys.py +0 -0
  818. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_diagnostics_links.py +0 -0
  819. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_diagnostics_paths.py +0 -0
  820. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_diagnostics_plot_box.py +0 -0
  821. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_docs.py +0 -0
  822. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_document.py +0 -0
  823. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_document_data.py +0 -0
  824. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_document_v25.py +0 -0
  825. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_draw_clip.py +0 -0
  826. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_draw_path.py +0 -0
  827. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_draw_place.py +0 -0
  828. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_draw_shapes.py +0 -0
  829. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_export_bundle.py +0 -0
  830. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_figure.py +0 -0
  831. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_fit.py +0 -0
  832. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_layout.py +0 -0
  833. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_layout_graph.py +0 -0
  834. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_layout_graph_fit.py +0 -0
  835. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_layout_origin.py +0 -0
  836. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_layout_sankey.py +0 -0
  837. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_links.py +0 -0
  838. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_links_avoid.py +0 -0
  839. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_links_shapes.py +0 -0
  840. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_neural_activity.py +0 -0
  841. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_output_contract.py +0 -0
  842. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_paint_program.py +0 -0
  843. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_place_labels.py +0 -0
  844. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_plot_axis.py +0 -0
  845. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_plot_broken_axis.py +0 -0
  846. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_plot_clip.py +0 -0
  847. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_plot_facets.py +0 -0
  848. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_plot_inset.py +0 -0
  849. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_plot_labels.py +0 -0
  850. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_plot_marks.py +0 -0
  851. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_plot_notes.py +0 -0
  852. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_plot_polar.py +0 -0
  853. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_plot_publication.py +0 -0
  854. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_plot_raster.py +0 -0
  855. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_plot_ribbon.py +0 -0
  856. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_plot_scale.py +0 -0
  857. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_plot_swarm.py +0 -0
  858. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_plot_time.py +0 -0
  859. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_presets.py +0 -0
  860. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_publication_limits.py +0 -0
  861. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_render_devices.py +0 -0
  862. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_render_embed.py +0 -0
  863. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_render_glyphs.py +0 -0
  864. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_render_outline.py +0 -0
  865. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_render_pdf.py +0 -0
  866. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_render_pdf_text.py +0 -0
  867. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_render_quality.py +0 -0
  868. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_render_style_fields.py +0 -0
  869. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_render_svg_perf.py +0 -0
  870. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_render_v3.py +0 -0
  871. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_review_v25.py +0 -0
  872. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_round4_plot.py +0 -0
  873. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_routing_avoid.py +0 -0
  874. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_scatter_rendering.py +0 -0
  875. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_scene_annotations.py +0 -0
  876. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_scene_pass.py +0 -0
  877. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_scene_projection.py +0 -0
  878. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_scene_templates.py +0 -0
  879. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_showcase_library.py +0 -0
  880. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_showcase_round3.py +0 -0
  881. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_structure_figure.py +0 -0
  882. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_svg.py +0 -0
  883. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_target_pose.py +0 -0
  884. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_text_markup.py +0 -0
  885. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_text_on_path.py +0 -0
  886. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_theme_font_style.py +0 -0
  887. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_themes.py +0 -0
  888. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_three_anchor_pin.py +0 -0
  889. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_three_api.py +0 -0
  890. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_three_backend_blender.py +0 -0
  891. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_three_depth_order.py +0 -0
  892. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_three_drill.py +0 -0
  893. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_three_hlr.py +0 -0
  894. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_three_mesh.py +0 -0
  895. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_three_order_vector.py +0 -0
  896. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_three_overlay.py +0 -0
  897. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_three_parse.py +0 -0
  898. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_three_patches.py +0 -0
  899. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_three_place.py +0 -0
  900. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_three_protein.py +0 -0
  901. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_three_ridges.py +0 -0
  902. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_three_sort.py +0 -0
  903. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_three_sort_budget.py +0 -0
  904. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_three_view.py +0 -0
  905. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_typeset.py +0 -0
  906. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/test_watch_review.py +0 -0
  907. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/visual/baseline/components-pdf.png +0 -0
  908. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/visual/baseline/fonts.json +0 -0
  909. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/visual/baseline/type-opacity-pdf.png +0 -0
  910. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/visual/baseline/type-opacity-svg.png +0 -0
  911. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/visual/fixtures.py +0 -0
  912. {inklet-3.0.0 → inklet-4.0.0.dev1}/tests/visual/v2-budgets.json +0 -0
  913. {inklet-3.0.0 → inklet-4.0.0.dev1}/tools/benchmark_v2.py +0 -0
  914. {inklet-3.0.0 → inklet-4.0.0.dev1}/tools/check_render_wheel.py +0 -0
  915. {inklet-3.0.0 → inklet-4.0.0.dev1}/tools/dock_ligand.py +0 -0
  916. {inklet-3.0.0 → inklet-4.0.0.dev1}/tools/docs_theme/404.html +0 -0
  917. {inklet-3.0.0 → inklet-4.0.0.dev1}/tools/docs_theme/card.html +0 -0
  918. {inklet-3.0.0 → inklet-4.0.0.dev1}/tools/docs_theme/gallery.html +0 -0
  919. {inklet-3.0.0 → inklet-4.0.0.dev1}/tools/gen_api.py +0 -0
  920. {inklet-3.0.0 → inklet-4.0.0.dev1}/tools/preset_gallery.py +0 -0
  921. {inklet-3.0.0 → inklet-4.0.0.dev1}/tools/showcase_gallery.py +0 -0
  922. {inklet-3.0.0 → inklet-4.0.0.dev1}/tools/stress20.py +0 -0
  923. {inklet-3.0.0 → inklet-4.0.0.dev1}/tools/strip_pdb.py +0 -0
  924. {inklet-3.0.0 → inklet-4.0.0.dev1}/tools/v3_showcase.py +0 -0
@@ -0,0 +1,4 @@
1
+ # PDB records use fixed-width, space-padded columns.
2
+ *.pdb whitespace=-blank-at-eol
3
+ # Keep example source hashes stable across platforms.
4
+ examples/data/general-plots/*.csv text eol=lf
@@ -0,0 +1,233 @@
1
+ name: Release checks
2
+
3
+ on:
4
+ push:
5
+ branches: [master]
6
+ pull_request:
7
+ workflow_dispatch:
8
+
9
+ permissions:
10
+ contents: read
11
+
12
+ concurrency:
13
+ group: checks-${{ github.workflow }}-${{ github.ref }}
14
+ cancel-in-progress: true
15
+
16
+ jobs:
17
+ figures:
18
+ runs-on: ubuntu-24.04
19
+ timeout-minutes: 25
20
+ steps:
21
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
22
+ - uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
23
+ with:
24
+ python-version: '3.12'
25
+ - name: Install fonts and independent PDF renderer
26
+ run: |
27
+ sudo apt-get update
28
+ sudo apt-get install -y fonts-dejavu-core fonts-dejavu-extra fonts-noto-core fonts-liberation fonts-urw-base35 poppler-utils
29
+ pdftoppm -v
30
+ - name: Install the reviewed visual browser
31
+ env:
32
+ CHROME_VERSION: '145.0.7632.45'
33
+ CHROME_SHA256: 6aed53fe777ca9a58a680b848a80022300566fb902424291e054984a784c73a2
34
+ run: |
35
+ curl --fail --location --retry 3 "https://dl.google.com/linux/chrome/deb/pool/main/g/google-chrome-stable/google-chrome-stable_${CHROME_VERSION}-1_amd64.deb" --output "$RUNNER_TEMP/chrome.deb"
36
+ printf '%s %s\n' "$CHROME_SHA256" "$RUNNER_TEMP/chrome.deb" | sha256sum --check
37
+ dpkg-deb -x "$RUNNER_TEMP/chrome.deb" "$RUNNER_TEMP/visual-browser"
38
+ mkdir -p "$RUNNER_TEMP/visual-browser/bin"
39
+ ln -s ../opt/google/chrome/google-chrome "$RUNNER_TEMP/visual-browser/bin/google-chrome"
40
+ echo "$RUNNER_TEMP/visual-browser/bin" >> "$GITHUB_PATH"
41
+ "$RUNNER_TEMP/visual-browser/bin/google-chrome" --version
42
+ - name: Install locked test dependencies
43
+ run: |
44
+ uv venv
45
+ uv pip install -r requirements-ci.txt -e .
46
+ .venv/bin/inklet doctor
47
+ - name: Unit and integration tests
48
+ run: .venv/bin/python -m pytest -q --junitxml=out/tests.xml
49
+ - name: Generated API documentation
50
+ run: .venv/bin/python tools/gen_api.py --check
51
+ - name: Build documentation with strict link validation
52
+ run: |
53
+ uv pip install -r requirements-docs.txt
54
+ .venv/bin/python -m mkdocs build --strict
55
+ .venv/bin/python -m pytest -q tests/test_docs_site.py
56
+ - name: Build the v2.5 publication review
57
+ run: .venv/bin/inklet build examples/v25_document.py --output out/v25 --name document
58
+ - name: Build the preset comparison gallery
59
+ run: .venv/bin/python tools/preset_gallery.py --output out/presets
60
+ - name: Common CSV plotting example
61
+ run: |
62
+ .venv/bin/python examples/general_plots.py --output out/general-plots
63
+ .venv/bin/python examples/plot_quality_review.py --output out/plot-quality
64
+ - name: Experimental selection and revision baseline
65
+ run: |
66
+ .venv/bin/python examples/v4/linked_selection.py --output out/v4-linked
67
+ .venv/bin/python examples/v4/browser_scatter.py --count 3000 --output out/v4-browser
68
+ .venv/bin/python examples/v4/linked_dashboard.py --output out/v4-dashboard
69
+ .venv/bin/python examples/v4/faceted_operations.py --output out/v4-facets
70
+ .venv/bin/python examples/v4/time_series.py --output out/v4-time
71
+ .venv/bin/python examples/v4/statistical_views.py --output out/v4-statistics
72
+ .venv/bin/python examples/v4/regional_report.py --render --output out/v4-regional-report
73
+ .venv/bin/python examples/v4/engineering_report.py --render --output out/v4-engineering
74
+ .venv/bin/python examples/v4/scientific_report.py --render --output out/v4-scientific
75
+ .venv/bin/python examples/v4/mesh_fields.py --render --output out/v4-mesh-fields
76
+ .venv/bin/python examples/v4/contours_streamlines.py --render --output out/v4-contours-streamlines
77
+ .venv/bin/python examples/v4/regional_analysis.py --output out/v4-regions
78
+ .venv/bin/python examples/v4/region_shapes.py --output out/v4-region-shapes
79
+ .venv/bin/python examples/v4/world_population.py --output out/v4-world
80
+ .venv/bin/python examples/v4/world_population.py --year 2019 --output out/v4-revision
81
+ .venv/bin/python examples/v4/world_population.py --switchable --output out/v4-switchable
82
+ .venv/bin/python tools/benchmark_v4.py --repeat 1 --label ci --output out/v4-baseline.json
83
+ - name: Build the mathematical showcase library
84
+ run: .venv/bin/python tools/showcase_gallery.py --plots-only --quality preview
85
+ - name: Coordinated biology figure and data export
86
+ run: .venv/bin/python examples/biology_panels.py --output out/biology
87
+ - name: Complete figure visual regressions
88
+ run: .venv/bin/python tools/visual_check.py --output out/visual
89
+ - name: Complete figure performance checks
90
+ run: .venv/bin/python tools/benchmark_v2.py --output out/benchmarks
91
+ - name: Rendering engine workloads and quality review
92
+ run: |
93
+ .venv/bin/python tools/benchmark_engine.py --repeat 1 --output out/engine-benchmark.json
94
+ .venv/bin/python examples/engine_review.py --output out/engine-review
95
+ - name: Diagram routing and label review
96
+ run: |
97
+ .venv/bin/python tools/benchmark_diagrams.py --repeat 1 --output out/diagram-benchmark.json
98
+ .venv/bin/python examples/diagram_review.py --output out/diagram-review
99
+ - name: Dense vector lines and measured axes
100
+ run: |
101
+ .venv/bin/python tools/benchmark_lines.py --repeat 1 --output out/line-benchmark.json
102
+ .venv/bin/python examples/plot_engine_review.py --output out/plot-engine-review
103
+ - name: Twenty-panel mixed-media stress test
104
+ run: .venv/bin/python tools/stress20.py --output out/stress20
105
+ - name: Preserve review artifacts
106
+ if: always()
107
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
108
+ with:
109
+ name: figure-checks
110
+ path: out/
111
+ retention-days: 7
112
+ if-no-files-found: ignore
113
+
114
+ tables:
115
+ name: Table adapters (${{ matrix.dependencies }})
116
+ runs-on: ubuntu-24.04
117
+ timeout-minutes: 10
118
+ strategy:
119
+ fail-fast: false
120
+ matrix:
121
+ dependencies: [minimum, current]
122
+ steps:
123
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
124
+ - uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
125
+ with:
126
+ python-version: '3.12'
127
+ - name: Install current locked adapters
128
+ if: matrix.dependencies == 'current'
129
+ run: |
130
+ uv venv
131
+ uv pip install -r requirements-tables.txt -e .
132
+ - name: Install minimum supported adapters
133
+ if: matrix.dependencies == 'minimum'
134
+ run: |
135
+ uv venv
136
+ uv pip install -e '.[dev]' 'pandas==2.2.0' 'polars==1.0.0' 'numpy==1.26.4'
137
+ - name: Table contracts and cross-library figure reconstruction
138
+ run: |
139
+ .venv/bin/python -m pytest -q tests/test_table_adapters.py tests/test_temporal_adapters.py tests/test_v4_selection.py
140
+ .venv/bin/python examples/v4/table_inputs.py --backend pandas --output out/pandas
141
+ .venv/bin/python examples/v4/table_inputs.py --backend polars --state out/pandas/view.json --output out/polars
142
+ cmp out/pandas/figure.svg out/polars/figure.svg
143
+ .venv/bin/python examples/v4/table_inputs.py --backend pandas --revised --output out/pandas-revised
144
+ .venv/bin/python examples/v4/table_inputs.py --backend polars --revised --state out/pandas-revised/view.json --output out/polars-revised
145
+ cmp out/pandas-revised/figure.svg out/polars-revised/figure.svg
146
+ .venv/bin/python examples/v4/time_series.py --backend pandas --output out/time-pandas
147
+ .venv/bin/python examples/v4/time_series.py --backend polars --state out/time-pandas/view.json --output out/time-polars
148
+ cmp out/time-pandas/figure.svg out/time-polars/figure.svg
149
+
150
+ wheel:
151
+ runs-on: ${{ matrix.os }}
152
+ timeout-minutes: 10
153
+ defaults:
154
+ run:
155
+ shell: bash
156
+ strategy:
157
+ fail-fast: false
158
+ matrix:
159
+ os: [ubuntu-24.04]
160
+ python: ['3.11', '3.12', '3.13']
161
+ include:
162
+ - os: windows-2022
163
+ python: '3.12'
164
+ - os: macos-14
165
+ python: '3.12'
166
+ steps:
167
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
168
+ - uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
169
+ with:
170
+ python-version: ${{ matrix.python }}
171
+ - name: Build and install with core dependencies only
172
+ run: |
173
+ uv build --wheel --out-dir out/dist
174
+ uv run --no-project python tools/check_wheel.py out/dist/inklet-*.whl
175
+ - name: Install and check optional render extra
176
+ run: uv run --no-project python tools/check_render_wheel.py out/dist/inklet-*.whl
177
+
178
+ blender:
179
+ name: Blender ${{ matrix.version }} CPU
180
+ runs-on: ubuntu-24.04
181
+ timeout-minutes: 15
182
+ strategy:
183
+ fail-fast: false
184
+ matrix:
185
+ include:
186
+ - version: '4.2.23'
187
+ series: '4.2'
188
+ sha256: bea0eb3146be13eae6225409a117b215184f41b7f79e799f97cb3abb8f6dc404
189
+ - version: '4.5.13'
190
+ series: '4.5'
191
+ sha256: da4e69b06b75b9e642d106496c50e7e240218b411d2f6e18271c1d1d819cef91
192
+ steps:
193
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
194
+ - uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
195
+ with:
196
+ python-version: '3.12'
197
+ - name: Install Blender and test dependencies
198
+ env:
199
+ BLENDER_VERSION: ${{ matrix.version }}
200
+ BLENDER_SERIES: ${{ matrix.series }}
201
+ BLENDER_SHA256: ${{ matrix.sha256 }}
202
+ run: |
203
+ sudo apt-get update
204
+ sudo apt-get install -y libegl1 libxkbcommon0 fonts-dejavu-core fonts-dejavu-extra
205
+ archive="blender-${BLENDER_VERSION}-linux-x64.tar.xz"
206
+ curl --fail --location --retry 3 "https://download.blender.org/release/Blender${BLENDER_SERIES}/${archive}" --output "$RUNNER_TEMP/$archive"
207
+ printf '%s %s\n' "$BLENDER_SHA256" "$RUNNER_TEMP/$archive" | sha256sum --check
208
+ tar -xf "$RUNNER_TEMP/$archive" -C "$RUNNER_TEMP"
209
+ echo "INKLET_BLENDER=$RUNNER_TEMP/blender-${BLENDER_VERSION}-linux-x64/blender" >> "$GITHUB_ENV"
210
+ uv venv
211
+ uv pip install -r requirements-ci.txt -e .
212
+ - name: Require the requested Blender build
213
+ env:
214
+ BLENDER_VERSION: ${{ matrix.version }}
215
+ run: |
216
+ .venv/bin/python -c 'import os; from inklet.three.blender import find_blender; assert find_blender().release == os.environ["BLENDER_VERSION"]'
217
+ - name: Complete scenes, passes, projections, annotations and templates
218
+ run: |
219
+ .venv/bin/python -m pytest -q tests/test_blend_scene.py tests/test_scene_pass.py tests/test_scene_projection.py tests/test_scene_annotations.py tests/test_scene_templates.py tests/test_render_devices.py tests/test_render_jobs.py --junitxml=out/blender-tests.xml
220
+ - name: Installed wheel creates and renders all templates
221
+ run: |
222
+ uv build --wheel --out-dir out/dist
223
+ .venv/bin/python tools/check_render_wheel.py out/dist/inklet-*.whl --templates
224
+ - name: Legacy vector line-art export integrity
225
+ if: matrix.version == '4.2.23'
226
+ run: .venv/bin/python -m pytest -q tests/test_three_blender.py
227
+ - name: Preserve Blender test report
228
+ if: always()
229
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
230
+ with:
231
+ name: blender-${{ matrix.version }}-checks
232
+ path: out/blender-tests.xml
233
+ retention-days: 7
@@ -0,0 +1,113 @@
1
+ name: Publish to PyPI
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ inputs:
6
+ tag:
7
+ description: Published GitHub release tag
8
+ required: true
9
+ default: v4.0.0.dev1
10
+ type: string
11
+ dry_run:
12
+ description: Validate release files without uploading to PyPI
13
+ required: true
14
+ default: true
15
+ type: boolean
16
+
17
+ permissions:
18
+ contents: read
19
+
20
+ concurrency:
21
+ group: pypi-publish
22
+ cancel-in-progress: false
23
+
24
+ jobs:
25
+ publish:
26
+ if: github.repository == 'Mapika/inklet' && github.ref == 'refs/heads/master'
27
+ runs-on: ubuntu-24.04
28
+ timeout-minutes: 10
29
+ environment:
30
+ name: pypi
31
+ url: https://pypi.org/project/inklet/
32
+ permissions:
33
+ contents: read
34
+ id-token: write
35
+ steps:
36
+ - uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
37
+ with:
38
+ python-version: '3.12'
39
+ - name: Download published release distributions
40
+ env:
41
+ GH_TOKEN: ${{ github.token }}
42
+ GH_REPO: ${{ github.repository }}
43
+ RELEASE_TAG: ${{ inputs.tag }}
44
+ run: |
45
+ [[ "$RELEASE_TAG" =~ ^v[0-9]+\.[0-9]+\.[0-9]+(\.dev[0-9]+)?$ ]] || {
46
+ echo 'Expected a stable or development tag such as v3.1.0 or v4.0.0.dev1' >&2
47
+ exit 1
48
+ }
49
+ gh release view "$RELEASE_TAG" --json isDraft,isPrerelease > "$RUNNER_TEMP/release.json"
50
+ python - <<'PYCODE'
51
+ import json, os
52
+ from pathlib import Path
53
+ release = json.loads((Path(os.environ['RUNNER_TEMP']) / 'release.json').read_text())
54
+ if release['isDraft']:
55
+ raise SystemExit('Publish the GitHub release before uploading its assets')
56
+ if release['isPrerelease'] != ('.dev' in os.environ['RELEASE_TAG']):
57
+ raise SystemExit('Development tags must be GitHub prereleases; stable tags must not')
58
+ PYCODE
59
+ version="${RELEASE_TAG#v}"
60
+ gh release download "$RELEASE_TAG" --dir dist \
61
+ --pattern "inklet-${version}-py3-none-any.whl" \
62
+ --pattern "inklet-${version}.tar.gz" \
63
+ --pattern SHA256SUMS
64
+ - name: Verify release checksums and package metadata
65
+ env:
66
+ RELEASE_TAG: ${{ inputs.tag }}
67
+ run: |
68
+ python - <<'PY'
69
+ import hashlib
70
+ import os
71
+ import tarfile
72
+ import zipfile
73
+ from email.parser import BytesParser
74
+ from pathlib import Path
75
+
76
+ dist = Path('dist')
77
+ version = os.environ['RELEASE_TAG'][1:]
78
+ expected = {f'inklet-{version}-py3-none-any.whl', f'inklet-{version}.tar.gz'}
79
+ lines = (dist / 'SHA256SUMS').read_text().splitlines()
80
+ entries = [line.split() for line in lines]
81
+ if len(entries) != 2 or any(len(entry) != 2 for entry in entries):
82
+ raise SystemExit('Expected exactly two release checksums')
83
+ if {name for _, name in entries} != expected:
84
+ raise SystemExit('Checksum filenames do not match the requested release')
85
+ for digest, name in entries:
86
+ if hashlib.sha256((dist / name).read_bytes()).hexdigest() != digest:
87
+ raise SystemExit(f'Checksum mismatch: {name}')
88
+ print(f'Verified {name}')
89
+ wheel = dist / f'inklet-{version}-py3-none-any.whl'
90
+ with zipfile.ZipFile(wheel) as archive:
91
+ metadata_files = [n for n in archive.namelist() if n.endswith('.dist-info/METADATA')]
92
+ if len(metadata_files) != 1:
93
+ raise SystemExit('Expected exactly one wheel metadata file')
94
+ wheel_metadata = BytesParser().parsebytes(archive.read(metadata_files[0]))
95
+ with tarfile.open(dist / f'inklet-{version}.tar.gz') as archive:
96
+ metadata = archive.extractfile(f'inklet-{version}/PKG-INFO')
97
+ if metadata is None:
98
+ raise SystemExit('Missing source archive metadata')
99
+ source_metadata = BytesParser().parsebytes(metadata.read())
100
+ for metadata in (wheel_metadata, source_metadata):
101
+ if metadata['Name'] != 'inklet' or metadata['Version'] != version:
102
+ raise SystemExit('Distribution metadata does not match the requested release')
103
+ (dist / 'SHA256SUMS').unlink()
104
+ PY
105
+ uvx --from twine==7.0.0 twine check --strict dist/*
106
+ - name: Publish using PyPI Trusted Publishing
107
+ if: ${{ !inputs.dry_run }}
108
+ uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
109
+ with:
110
+ packages-dir: dist/
111
+ - name: Record dry run
112
+ if: inputs.dry_run
113
+ run: echo 'Release files verified. Nothing was uploaded to PyPI.' >> "$GITHUB_STEP_SUMMARY"