inklet 4.0.0.dev8__tar.gz → 4.0.0.dev9__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 (987) hide show
  1. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/.github/workflows/publish.yml +2 -2
  2. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/CHANGELOG.md +15 -0
  3. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/PKG-INFO +6 -6
  4. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/README.md +5 -5
  5. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/api.md +1 -1
  6. inklet-4.0.0.dev9/docs/assets/guides/layout-editor-gestures.png +0 -0
  7. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/compatibility.md +1 -1
  8. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/composition-recipes.md +3 -1
  9. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/development-preview.md +27 -8
  10. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/installation.md +3 -3
  11. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/layout-editor.md +40 -7
  12. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/layout-overrides.md +6 -4
  13. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/roadmap.md +4 -2
  14. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/pyproject.toml +1 -1
  15. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/__init__.py +1 -1
  16. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/document/composition.py +23 -6
  17. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/document/layout_overrides.py +12 -5
  18. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/experimental/layout_editor/__init__.py +75 -5
  19. inklet-4.0.0.dev9/src/inklet/experimental/layout_editor/gestures.js +63 -0
  20. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/experimental/layout_editor/page.html +9 -7
  21. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_layout_editor.py +1 -1
  22. inklet-4.0.0.dev9/tests/test_layout_gestures.py +146 -0
  23. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tools/check_wheel.py +2 -0
  24. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tools/docs_gallery.json +3 -3
  25. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/.gitattributes +0 -0
  26. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/.github/workflows/checks.yml +0 -0
  27. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/.gitignore +0 -0
  28. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/.readthedocs.yaml +0 -0
  29. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/CONTRACT.md +0 -0
  30. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/CONTRIBUTING.md +0 -0
  31. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/LICENSE +0 -0
  32. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/THIRD_PARTY_NOTICES.md +0 -0
  33. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/brand/inklet-icon.svg +0 -0
  34. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/brand/inklet-logo-dark.svg +0 -0
  35. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/brand/inklet-logo-mono.svg +0 -0
  36. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/brand/inklet-logo.svg +0 -0
  37. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/brand/inklet-wordmark.svg +0 -0
  38. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/examples/quickstart.pdf +0 -0
  39. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/examples/quickstart.png +0 -0
  40. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/examples/quickstart.svg +0 -0
  41. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/axes-and-scales-1.png +0 -0
  42. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/calibrated-volumes-3.png +0 -0
  43. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/channels-and-contours-1.png +0 -0
  44. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/composition-recipes-narrow.png +0 -0
  45. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/composition-recipes.html +0 -0
  46. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/composition-recipes.png +0 -0
  47. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/cookbook-anchor.png +0 -0
  48. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/cookbook-annotation.png +0 -0
  49. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/cookbook-bars-histogram.png +0 -0
  50. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/cookbook-branch.png +0 -0
  51. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/cookbook-broken-axis.png +0 -0
  52. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/cookbook-callout.png +0 -0
  53. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/cookbook-clipping.png +0 -0
  54. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/cookbook-creases.png +0 -0
  55. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/cookbook-custom-key.png +0 -0
  56. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/cookbook-cutout.png +0 -0
  57. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/cookbook-dates.png +0 -0
  58. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/cookbook-dense.png +0 -0
  59. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/cookbook-elbows.png +0 -0
  60. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/cookbook-equal-boxes.png +0 -0
  61. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/cookbook-facets.png +0 -0
  62. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/cookbook-fit-graph.png +0 -0
  63. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/cookbook-flow-width.png +0 -0
  64. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/cookbook-formula.png +0 -0
  65. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/cookbook-graph.png +0 -0
  66. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/cookbook-halo.png +0 -0
  67. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/cookbook-heatmap.png +0 -0
  68. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/cookbook-hole.png +0 -0
  69. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/cookbook-inline-type.png +0 -0
  70. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/cookbook-inset.png +0 -0
  71. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/cookbook-labels.png +0 -0
  72. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/cookbook-layers.png +0 -0
  73. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/cookbook-letters.png +0 -0
  74. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/cookbook-list.png +0 -0
  75. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/cookbook-matrix.png +0 -0
  76. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/cookbook-page-grid.png +0 -0
  77. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/cookbook-polar.png +0 -0
  78. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/cookbook-protein.png +0 -0
  79. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/cookbook-routes.png +0 -0
  80. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/cookbook-scene-overlay.png +0 -0
  81. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/cookbook-scene.png +0 -0
  82. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/cookbook-series-key.png +0 -0
  83. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/cookbook-span.png +0 -0
  84. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/cookbook-sparse-grid.png +0 -0
  85. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/cookbook-swarm.png +0 -0
  86. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/cookbook-text-path.png +0 -0
  87. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/cookbook-toon.png +0 -0
  88. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/cookbook-twin-axis.png +0 -0
  89. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/cookbook-unequal-panels.png +0 -0
  90. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/cookbook-violin.png +0 -0
  91. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/cookbook-wrapped-card.png +0 -0
  92. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/data-1.png +0 -0
  93. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/data-3.png +0 -0
  94. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/dense-data-1.png +0 -0
  95. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/diagram-components-1.png +0 -0
  96. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/diagrams-1.png +0 -0
  97. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/layout-3.png +0 -0
  98. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/layout-editor.png +0 -0
  99. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/layout-restored.html +0 -0
  100. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/layout-restored.png +0 -0
  101. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/layout-revised.png +0 -0
  102. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/oblique-sections-2.png +0 -0
  103. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/plot-composition-narrow.png +0 -0
  104. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/plot-composition.html +0 -0
  105. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/plot-composition.png +0 -0
  106. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/plot-quality-after.png +0 -0
  107. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/plot-quality-before.png +0 -0
  108. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/plots-band.png +0 -0
  109. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/plots-bars.png +0 -0
  110. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/plots-boxplot.png +0 -0
  111. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/plots-errorbars.png +0 -0
  112. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/plots-fill-between.png +0 -0
  113. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/plots-fill.png +0 -0
  114. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/plots-grouped-bars.png +0 -0
  115. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/plots-hist.png +0 -0
  116. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/plots-horizontal-bars.png +0 -0
  117. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/plots-line-errors.png +0 -0
  118. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/plots-line.png +0 -0
  119. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/plots-markers.png +0 -0
  120. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/plots-matrix.png +0 -0
  121. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/plots-polar-curve.png +0 -0
  122. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/plots-rose.png +0 -0
  123. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/plots-scatter.png +0 -0
  124. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/plots-series.png +0 -0
  125. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/plots-stackarea.png +0 -0
  126. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/plots-stacked-bars.png +0 -0
  127. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/plots-step.png +0 -0
  128. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/plots-swarm.png +0 -0
  129. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/plots-violin.png +0 -0
  130. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/plotting-1.png +0 -0
  131. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/plotting-2.png +0 -0
  132. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/publication-plots-1.png +0 -0
  133. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/publication-plots-2.png +0 -0
  134. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/publication-plots-3.png +0 -0
  135. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/publication-plots-4.png +0 -0
  136. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/slabs-and-regions-1.png +0 -0
  137. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/three-images-1.png +0 -0
  138. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/guides/three-images-2.png +0 -0
  139. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/biology.json +0 -0
  140. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/clipping-after.json +0 -0
  141. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/clipping-before.json +0 -0
  142. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/clipping-caption.tex +0 -0
  143. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/clipping-lines-after.json +0 -0
  144. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/clipping-lines-before.json +0 -0
  145. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/comparison.json +0 -0
  146. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/compiled-marker-shapes-caption.tex +0 -0
  147. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/compiled-marker-shapes.html +0 -0
  148. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/compiled-markers-display.json +0 -0
  149. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/compiled-markers-hardware.json +0 -0
  150. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/compiled-scene-viewer.html +0 -0
  151. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/compiled-viewer-display.json +0 -0
  152. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/compiled-viewer-export.json +0 -0
  153. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/compiled-viewer-study.json +0 -0
  154. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/compositing-after.json +0 -0
  155. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/compositing-before.json +0 -0
  156. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/compositing-caption.tex +0 -0
  157. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/dense-scatter-caption.tex +0 -0
  158. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/diagram-after.json +0 -0
  159. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/diagram-before.json +0 -0
  160. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/diagram-review-caption.tex +0 -0
  161. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/engine-after.json +0 -0
  162. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/engine-before.json +0 -0
  163. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/engine-review-caption.tex +0 -0
  164. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/fluorescence-biology.json +0 -0
  165. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/general-plots-caption.tex +0 -0
  166. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/general-plots.json +0 -0
  167. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/hatch-after.json +0 -0
  168. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/hatch-before.json +0 -0
  169. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/hatch-caption.tex +0 -0
  170. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/label-intensities-caption.tex +0 -0
  171. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/label-intensities-native.csv +0 -0
  172. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/label-intensities.json +0 -0
  173. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/lines-after.json +0 -0
  174. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/lines-before.json +0 -0
  175. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/marker-batches.json +0 -0
  176. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/marker-index-after.json +0 -0
  177. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/marker-index-before.json +0 -0
  178. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/marker-index-browser-after.json +0 -0
  179. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/marker-index-browser-before.json +0 -0
  180. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/oblique-biology.json +0 -0
  181. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/plot-engine-review-caption.tex +0 -0
  182. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/real-biology.json +0 -0
  183. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/render-scene-caption.tex +0 -0
  184. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/revision.json +0 -0
  185. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/scenes-after.json +0 -0
  186. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/scenes-before.json +0 -0
  187. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/slab-biology.json +0 -0
  188. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/study.json +0 -0
  189. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/viewer-culling-after.json +0 -0
  190. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/viewer-culling-before.json +0 -0
  191. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/viewer-culling-gpu-after.json +0 -0
  192. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/viewer-culling-gpu-before.json +0 -0
  193. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/viewer-redraw-after.json +0 -0
  194. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/viewer-redraw-before.json +0 -0
  195. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/viewer-redraw-display.json +0 -0
  196. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/viewer-redraw-profile.json +0 -0
  197. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/viewer-window-after.json +0 -0
  198. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/viewer-window-before.json +0 -0
  199. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/research-preview/viewer-window-display.json +0 -0
  200. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/v4/after.json +0 -0
  201. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/v4/before.json +0 -0
  202. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/v4/browser-quality.json +0 -0
  203. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/v4/browser-scatter.html +0 -0
  204. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/v4/browser-scatter.png +0 -0
  205. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/v4/browser-study.json +0 -0
  206. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/v4/contours-streamlines-170mm.png +0 -0
  207. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/v4/contours-streamlines-masked.png +0 -0
  208. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/v4/contours-streamlines.html +0 -0
  209. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/v4/contours-streamlines.png +0 -0
  210. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/v4/engineering-report-170mm.png +0 -0
  211. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/v4/engineering-report.html +0 -0
  212. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/v4/engineering-report.png +0 -0
  213. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/v4/faceted-operations.html +0 -0
  214. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/v4/faceted-operations.png +0 -0
  215. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/v4/linked-dashboard.html +0 -0
  216. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/v4/linked-dashboard.png +0 -0
  217. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/v4/linked-selection.html +0 -0
  218. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/v4/linked-selection.png +0 -0
  219. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/v4/mesh-fields-170mm.png +0 -0
  220. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/v4/mesh-fields.html +0 -0
  221. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/v4/mesh-fields.png +0 -0
  222. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/v4/region-shapes.html +0 -0
  223. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/v4/region-shapes.png +0 -0
  224. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/v4/regional-analysis.html +0 -0
  225. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/v4/regional-analysis.png +0 -0
  226. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/v4/regional-report-160mm.png +0 -0
  227. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/v4/regional-report.html +0 -0
  228. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/v4/regional-report.png +0 -0
  229. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/v4/scientific-report-170mm.png +0 -0
  230. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/v4/scientific-report.html +0 -0
  231. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/v4/scientific-report.png +0 -0
  232. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/v4/statistical-views.html +0 -0
  233. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/v4/statistical-views.png +0 -0
  234. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/v4/table-inputs.html +0 -0
  235. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/v4/table-inputs.png +0 -0
  236. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/v4/time-series.html +0 -0
  237. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/v4/time-series.png +0 -0
  238. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/v4/transport-map.html +0 -0
  239. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/v4/transport-map.png +0 -0
  240. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/v4/visual-overrides.png +0 -0
  241. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/v4/world-population-2019.html +0 -0
  242. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/v4/world-population-2019.json +0 -0
  243. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/v4/world-population-2019.png +0 -0
  244. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/v4/world-population-revisions.html +0 -0
  245. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/v4/world-population-revisions.png +0 -0
  246. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/v4/world-population.html +0 -0
  247. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/assets/v4/world-population.png +0 -0
  248. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/axes-and-scales.md +0 -0
  249. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/bars-and-areas.md +0 -0
  250. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/biology-panels.md +0 -0
  251. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/blender-scenes.md +0 -0
  252. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/brand.md +0 -0
  253. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/browser-rendering.md +0 -0
  254. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/calibrated-volumes.md +0 -0
  255. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/channels-and-contours.md +0 -0
  256. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/cli.md +0 -0
  257. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/clipping.md +0 -0
  258. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/compiled-scenes.md +0 -0
  259. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/compiled-viewer.md +0 -0
  260. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/complex-scene.md +0 -0
  261. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/compositing.md +0 -0
  262. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/concepts.md +0 -0
  263. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/contours-streamlines.md +0 -0
  264. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/cookbook.md +0 -0
  265. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/data-revisions.md +0 -0
  266. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/data.md +0 -0
  267. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/dense-data.md +0 -0
  268. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/design/browser-backends.md +0 -0
  269. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/design/page_grid.md +0 -0
  270. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/design/v2.md +0 -0
  271. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/design/v4.md +0 -0
  272. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/diagram-components.md +0 -0
  273. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/diagram-engine.md +0 -0
  274. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/diagrams.md +0 -0
  275. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/distributions.md +0 -0
  276. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/engineering-report.md +0 -0
  277. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/example-library.md +0 -0
  278. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/examples.md +0 -0
  279. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/export-review.md +0 -0
  280. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/fluorescence-biology.md +0 -0
  281. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/general-plots.md +0 -0
  282. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/geographic-features.md +0 -0
  283. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/hatching.md +0 -0
  284. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/index.md +0 -0
  285. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/interactive-documents.md +0 -0
  286. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/javascripts/inklet.js +0 -0
  287. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/label-intensities.md +0 -0
  288. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/label-measurements.md +0 -0
  289. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/layout.md +0 -0
  290. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/lines-and-points.md +0 -0
  291. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/linked-facets.md +0 -0
  292. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/linked-maps.md +0 -0
  293. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/linked-plots.md +0 -0
  294. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/marker-batches.md +0 -0
  295. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/marker-culling.md +0 -0
  296. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/matrices.md +0 -0
  297. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/mesh-fields.md +0 -0
  298. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/microscopy-tiff.md +0 -0
  299. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/migration.md +0 -0
  300. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/oblique-biology.md +0 -0
  301. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/oblique-sections.md +0 -0
  302. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/plot-quality.md +0 -0
  303. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/plot-recipes.md +0 -0
  304. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/plot-types.md +0 -0
  305. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/plotting-engine.md +0 -0
  306. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/plotting.md +0 -0
  307. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/polar-plots.md +0 -0
  308. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/presets.md +0 -0
  309. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/publication-plots.md +0 -0
  310. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/quickstart.md +0 -0
  311. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/real-biology.md +0 -0
  312. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/recipes/architecture-sketch.md +0 -0
  313. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/recipes/architecture.md +0 -0
  314. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/recipes/attractor.md +0 -0
  315. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/recipes/helix.md +0 -0
  316. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/recipes/interference.md +0 -0
  317. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/recipes/lattice.md +0 -0
  318. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/recipes/photonics.md +0 -0
  319. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/recipes/wave-packets.md +0 -0
  320. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/regional-report.md +0 -0
  321. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/release-checks.md +0 -0
  322. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/render-jobs.md +0 -0
  323. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/rendering-engine.md +0 -0
  324. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/research-preview.md +0 -0
  325. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/research-revision.md +0 -0
  326. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/research-study.md +0 -0
  327. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/scene-annotations.md +0 -0
  328. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/scene-paths.md +0 -0
  329. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/scene-templates.md +0 -0
  330. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/scientific-report.md +0 -0
  331. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/showcase.md +0 -0
  332. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/slab-biology.md +0 -0
  333. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/slabs-and-regions.md +0 -0
  334. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/statistical-views.md +0 -0
  335. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/stress20.md +0 -0
  336. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/stylesheets/code.css +0 -0
  337. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/stylesheets/inklet.css +0 -0
  338. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/table-inputs.md +0 -0
  339. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/three-images.md +0 -0
  340. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/time-series.md +0 -0
  341. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/troubleshooting.md +0 -0
  342. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/uncertainty.md +0 -0
  343. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/v2.5.md +0 -0
  344. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/v2.md +0 -0
  345. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/v3.md +0 -0
  346. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/v4-foundations.md +0 -0
  347. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/visual-editing.md +0 -0
  348. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/docs/world-map.md +0 -0
  349. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/biology/README.md +0 -0
  350. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/biology/cells3d.lock.json +0 -0
  351. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/biology/data.py +0 -0
  352. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/biology/fluorescence.py +0 -0
  353. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/biology/organelle.lock.json +0 -0
  354. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/biology/requirements.txt +0 -0
  355. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/biology_panels.py +0 -0
  356. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/blender/complex_lab_scene.py +0 -0
  357. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/blender/lab_scene.py +0 -0
  358. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/blender/occlusion_scene.py +0 -0
  359. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/blender/organelle_scene.py +0 -0
  360. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/blender/research_lab_views.py +0 -0
  361. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/broken_axis.py +0 -0
  362. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/clipping_review.py +0 -0
  363. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/compiled_marker_shapes.py +0 -0
  364. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/compiled_scene_viewer.py +0 -0
  365. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/compositing_review.py +0 -0
  366. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/composition_recipes.py +0 -0
  367. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/data/general-plots/benchmark.csv +0 -0
  368. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/data/general-plots/learning.csv +0 -0
  369. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/data/general-plots/revenue.csv +0 -0
  370. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/data/general-plots/sensor.csv +0 -0
  371. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/dense_scatter_review.py +0 -0
  372. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/diagram_review.py +0 -0
  373. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/engine_review.py +0 -0
  374. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/feature_flow.py +0 -0
  375. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/fluorescence_biology.py +0 -0
  376. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/gallery.py +0 -0
  377. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/general_plots.py +0 -0
  378. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/graph.py +0 -0
  379. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/hatch_review.py +0 -0
  380. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/hello_figure.py +0 -0
  381. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/label_intensities.py +0 -0
  382. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/layout_editor.py +0 -0
  383. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/oblique_biology.py +0 -0
  384. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/panels.py +0 -0
  385. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/plot_composition.py +0 -0
  386. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/plot_engine_review.py +0 -0
  387. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/plot_quality_review.py +0 -0
  388. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/polar.py +0 -0
  389. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/preset_formats.py +0 -0
  390. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/presets.py +0 -0
  391. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/real_biology.py +0 -0
  392. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/render_scene_review.py +0 -0
  393. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/render_smoke.py +0 -0
  394. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/research_figure_planner.py +0 -0
  395. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/research_planner_study.py +0 -0
  396. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/research_revision.py +0 -0
  397. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/showcase/README.md +0 -0
  398. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/showcase/assets.lock.json +0 -0
  399. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/showcase/blender_scenes.py +0 -0
  400. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/showcase/figures.py +0 -0
  401. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/slab_biology.py +0 -0
  402. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/state_machine.py +0 -0
  403. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/stress20.py +0 -0
  404. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/v25_document.py +0 -0
  405. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/v2_cases.py +0 -0
  406. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/v2_document.py +0 -0
  407. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/v3_complex_scene.py +0 -0
  408. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/v3_render_jobs.py +0 -0
  409. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/v3_rendering.py +0 -0
  410. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/v3_scene_annotations.py +0 -0
  411. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/v3_scene_passes.py +0 -0
  412. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/v3_scene_paths.py +0 -0
  413. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/v3_scene_templates.py +0 -0
  414. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/v4/README.md +0 -0
  415. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/v4/browser_scatter.py +0 -0
  416. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/v4/contours_streamlines.py +0 -0
  417. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/v4/data/world-countries.geojson +0 -0
  418. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/v4/data/world-map-source.json +0 -0
  419. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/v4/data/world-population.csv +0 -0
  420. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/v4/engineering_report.py +0 -0
  421. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/v4/faceted_operations.py +0 -0
  422. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/v4/fixtures/assembly.json +0 -0
  423. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/v4/fixtures/manifest.json +0 -0
  424. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/v4/fixtures/measurement.json +0 -0
  425. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/v4/fixtures/region-shapes.geojson +0 -0
  426. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/v4/fixtures/regions.csv +0 -0
  427. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/v4/fixtures/regions.geojson +0 -0
  428. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/v4/fixtures/transport.geojson +0 -0
  429. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/v4/linked_dashboard.py +0 -0
  430. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/v4/linked_selection.html +0 -0
  431. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/v4/linked_selection.py +0 -0
  432. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/v4/mesh_fields.py +0 -0
  433. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/v4/region_shapes.py +0 -0
  434. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/v4/regional_analysis.py +0 -0
  435. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/v4/regional_report.py +0 -0
  436. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/v4/scientific_report.py +0 -0
  437. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/v4/statistical_views.py +0 -0
  438. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/v4/table_inputs.py +0 -0
  439. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/v4/time_series.py +0 -0
  440. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/v4/transport_map.py +0 -0
  441. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/examples/v4/world_population.py +0 -0
  442. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/figures/annot.py +0 -0
  443. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/figures/bio3d.py +0 -0
  444. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/figures/cartoon.py +0 -0
  445. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/figures/chem_data.py +0 -0
  446. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/figures/chem_fingerprints.py +0 -0
  447. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/figures/data/1m17-kinase.pdb +0 -0
  448. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/figures/data/README.md +0 -0
  449. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/figures/drug_discovery.py +0 -0
  450. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/figures/mouse_brain_data.py +0 -0
  451. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/figures/neural_activity.py +0 -0
  452. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/figures/pdbfile.py +0 -0
  453. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/figures/showcase_part.py +0 -0
  454. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/figures/showcase_process.py +0 -0
  455. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/figures/showcase_season.py +0 -0
  456. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/figures/structure.py +0 -0
  457. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/figures/structure_data.py +0 -0
  458. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/figures/target.py +0 -0
  459. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/figures/trial.py +0 -0
  460. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/README.md +0 -0
  461. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/biology-panels.png +0 -0
  462. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/chem_fingerprints.png +0 -0
  463. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/clipping-review.png +0 -0
  464. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/compiled-marker-shapes.png +0 -0
  465. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/compiled-scene-viewer.png +0 -0
  466. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/compiled-viewer-culling.png +0 -0
  467. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/compiled-viewer-deep-zoom.png +0 -0
  468. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/compositing-pdf-after.png +0 -0
  469. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/compositing-pdf-before.png +0 -0
  470. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/compositing-review.png +0 -0
  471. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/dense-scatter-review.png +0 -0
  472. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/diagram-labels-after.png +0 -0
  473. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/diagram-labels-before.png +0 -0
  474. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/diagram-review.png +0 -0
  475. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/engine-review.png +0 -0
  476. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/engine-transparency-after.png +0 -0
  477. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/engine-transparency-before.png +0 -0
  478. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/flow.png +0 -0
  479. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/fluorescence-biology.png +0 -0
  480. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/general-plots-before.png +0 -0
  481. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/general-plots.png +0 -0
  482. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/hatch-pdf-after.png +0 -0
  483. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/hatch-pdf-before.png +0 -0
  484. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/hatch-review.png +0 -0
  485. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/hatch-svg-before.png +0 -0
  486. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/label-intensities.png +0 -0
  487. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/oblique-biology.png +0 -0
  488. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/part.png +0 -0
  489. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/plot-axis-after.png +0 -0
  490. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/plot-axis-before.png +0 -0
  491. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/plot-engine-review.png +0 -0
  492. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/plots.png +0 -0
  493. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/polar.png +0 -0
  494. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/preset-formats.png +0 -0
  495. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/presets.png +0 -0
  496. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/process.png +0 -0
  497. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/real-biology.png +0 -0
  498. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/render-scene-data.png +0 -0
  499. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/render-scene-initial.png +0 -0
  500. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/render-scene-review.png +0 -0
  501. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/research-crossing-revision.png +0 -0
  502. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/research-figure-planner.png +0 -0
  503. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/research-planner-study.png +0 -0
  504. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/research-revision.png +0 -0
  505. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/season.png +0 -0
  506. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/showcase-architecture-sketch.png +0 -0
  507. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/showcase-architecture.png +0 -0
  508. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/showcase-attractor.png +0 -0
  509. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/showcase-helix.png +0 -0
  510. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/showcase-interference.png +0 -0
  511. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/showcase-lattice.png +0 -0
  512. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/showcase-photonics.png +0 -0
  513. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/showcase-wave-packets.png +0 -0
  514. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/slab-biology.png +0 -0
  515. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/stress20.png +0 -0
  516. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/structure.png +0 -0
  517. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/v3-complex-scene.png +0 -0
  518. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/v3-render-jobs.png +0 -0
  519. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/v3-rendering.png +0 -0
  520. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/v3-scene-annotations.png +0 -0
  521. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/v3-scene-passes.png +0 -0
  522. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/v3-scene-paths.png +0 -0
  523. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/gallery/v3-scene-templates.png +0 -0
  524. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/mkdocs.yml +0 -0
  525. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/requirements-ci.txt +0 -0
  526. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/requirements-docs.txt +0 -0
  527. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/requirements-tables.txt +0 -0
  528. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/scripts/bench_svg.py +0 -0
  529. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/scripts/rasterise.sh +0 -0
  530. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/scripts/sanity_typeset.py +0 -0
  531. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/__main__.py +0 -0
  532. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/assets/__init__.py +0 -0
  533. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/assets/asset.py +0 -0
  534. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/assets/cache.py +0 -0
  535. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/assets/cutout.py +0 -0
  536. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/assets/deps.py +0 -0
  537. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/assets/harmonise.py +0 -0
  538. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/assets/lineart.py +0 -0
  539. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/assets/mask.py +0 -0
  540. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/assets/provenance.py +0 -0
  541. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/assets/raster.py +0 -0
  542. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/assets/sidecar.py +0 -0
  543. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/assets/silhouette.py +0 -0
  544. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/cli.py +0 -0
  545. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/components.py +0 -0
  546. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/core/__init__.py +0 -0
  547. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/core/batch.py +0 -0
  548. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/core/diagram.py +0 -0
  549. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/core/envelope.py +0 -0
  550. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/core/geom.py +0 -0
  551. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/core/prims.py +0 -0
  552. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/core/style.py +0 -0
  553. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/core/trace.py +0 -0
  554. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/core/units.py +0 -0
  555. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/diagnostics/__init__.py +0 -0
  556. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/diagnostics/abut.py +0 -0
  557. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/diagnostics/break_rules.py +0 -0
  558. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/diagnostics/color.py +0 -0
  559. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/diagnostics/cross.py +0 -0
  560. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/diagnostics/image.py +0 -0
  561. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/diagnostics/key_rules.py +0 -0
  562. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/diagnostics/link_rules.py +0 -0
  563. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/diagnostics/path_rules.py +0 -0
  564. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/diagnostics/plot_rules.py +0 -0
  565. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/diagnostics/report.py +0 -0
  566. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/diagnostics/rules.py +0 -0
  567. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/diagnostics/three_rules.py +0 -0
  568. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/document/__init__.py +0 -0
  569. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/document/compiler.py +0 -0
  570. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/document/data.py +0 -0
  571. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/document/data_io.py +0 -0
  572. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/document/module.py +0 -0
  573. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/document/presets.py +0 -0
  574. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/document/publication.py +0 -0
  575. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/document/spec.py +0 -0
  576. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/draw/__init__.py +0 -0
  577. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/draw/annotate.py +0 -0
  578. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/draw/bezier_clip.py +0 -0
  579. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/draw/clip.py +0 -0
  580. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/draw/coords.py +0 -0
  581. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/draw/path.py +0 -0
  582. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/draw/place.py +0 -0
  583. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/draw/shapes.py +0 -0
  584. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/experimental/__init__.py +0 -0
  585. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/experimental/_table_adapters.py +0 -0
  586. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/experimental/browser/__init__.py +0 -0
  587. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/experimental/browser/compiled.js +0 -0
  588. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/experimental/browser/compiled.py +0 -0
  589. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/experimental/browser/drawings.py +0 -0
  590. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/experimental/browser/editor.html +0 -0
  591. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/experimental/browser/editor.js +0 -0
  592. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/experimental/browser/fields.py +0 -0
  593. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/experimental/browser/geography.py +0 -0
  594. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/experimental/browser/grid.py +0 -0
  595. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/experimental/browser/images.py +0 -0
  596. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/experimental/browser/overrides.py +0 -0
  597. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/experimental/browser/page.html +0 -0
  598. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/experimental/browser/regions.py +0 -0
  599. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/experimental/browser/runtime.js +0 -0
  600. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/experimental/browser/series.py +0 -0
  601. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/experimental/browser/timeaxis.py +0 -0
  602. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/experimental/channels.py +0 -0
  603. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/experimental/contours.py +0 -0
  604. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/experimental/engineering.py +0 -0
  605. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/experimental/fields.py +0 -0
  606. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/experimental/figure_planner.py +0 -0
  607. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/experimental/grid.py +0 -0
  608. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/experimental/measurement.py +0 -0
  609. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/experimental/measurements.py +0 -0
  610. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/experimental/planner_geometry.py +0 -0
  611. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/experimental/regions.py +0 -0
  612. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/experimental/scene_viewer/__init__.py +0 -0
  613. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/experimental/scene_viewer/controls.js +0 -0
  614. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/experimental/scene_viewer/page.html +0 -0
  615. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/experimental/scene_viewer/runtime.js +0 -0
  616. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/experimental/scene_viewer/spatial.js +0 -0
  617. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/experimental/sections.py +0 -0
  618. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/experimental/selection.py +0 -0
  619. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/experimental/slabs.py +0 -0
  620. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/experimental/temporal.py +0 -0
  621. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/experimental/tiff.py +0 -0
  622. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/experimental/volume.py +0 -0
  623. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/figure.py +0 -0
  624. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/layout/__init__.py +0 -0
  625. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/layout/fit.py +0 -0
  626. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/layout/flow.py +0 -0
  627. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/layout/graph.py +0 -0
  628. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/layout/graph_force.py +0 -0
  629. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/layout/graph_layered.py +0 -0
  630. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/layout/graph_tree.py +0 -0
  631. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/layout/labels.py +0 -0
  632. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/layout/sankey.py +0 -0
  633. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/links/__init__.py +0 -0
  634. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/links/curves.py +0 -0
  635. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/links/link.py +0 -0
  636. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/plot/__init__.py +0 -0
  637. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/plot/axis.py +0 -0
  638. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/plot/breaks.py +0 -0
  639. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/plot/categories.py +0 -0
  640. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/plot/facets.py +0 -0
  641. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/plot/inset.py +0 -0
  642. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/plot/key.py +0 -0
  643. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/plot/marks.py +0 -0
  644. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/plot/notes.py +0 -0
  645. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/plot/panel.py +0 -0
  646. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/plot/png.py +0 -0
  647. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/plot/polar.py +0 -0
  648. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/plot/ramp.py +0 -0
  649. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/plot/raster.py +0 -0
  650. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/plot/ribbon.py +0 -0
  651. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/plot/scale.py +0 -0
  652. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/plot/scatter_batch.py +0 -0
  653. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/plot/scatter_raster.py +0 -0
  654. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/plot/series.py +0 -0
  655. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/plot/simplify.py +0 -0
  656. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/plot/timescale.py +0 -0
  657. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/render/__init__.py +0 -0
  658. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/render/analysis.py +0 -0
  659. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/render/bounds.py +0 -0
  660. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/render/brushes.py +0 -0
  661. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/render/bundle.py +0 -0
  662. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/render/composite.py +0 -0
  663. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/render/fontembed.py +0 -0
  664. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/render/glyphs.py +0 -0
  665. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/render/hatching.py +0 -0
  666. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/render/outline.py +0 -0
  667. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/render/paint.py +0 -0
  668. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/render/pathdata.py +0 -0
  669. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/render/pdf.py +0 -0
  670. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/render/pdftext.py +0 -0
  671. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/render/preview.py +0 -0
  672. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/render/raster.py +0 -0
  673. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/render/resources.py +0 -0
  674. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/render/review.py +0 -0
  675. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/render/revision.py +0 -0
  676. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/render/scene.py +0 -0
  677. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/render/svg.py +0 -0
  678. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/themes/__init__.py +0 -0
  679. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/themes/color.py +0 -0
  680. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/themes/palettes.py +0 -0
  681. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/themes/theme.py +0 -0
  682. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/three/__init__.py +0 -0
  683. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/three/api.py +0 -0
  684. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/three/backend.py +0 -0
  685. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/three/blender/__init__.py +0 -0
  686. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/three/blender/device_worker.py +0 -0
  687. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/three/blender/discover.py +0 -0
  688. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/three/blender/lineart.py +0 -0
  689. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/three/blender/options.py +0 -0
  690. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/three/blender/scene_worker.py +0 -0
  691. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/three/blender/script.py +0 -0
  692. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/three/blender/svgread.py +0 -0
  693. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/three/blender/template_worker.py +0 -0
  694. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/three/blender/tracing.py +0 -0
  695. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/three/blender_backend.py +0 -0
  696. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/three/camera.py +0 -0
  697. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/three/deps.py +0 -0
  698. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/three/depth.py +0 -0
  699. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/three/devices.py +0 -0
  700. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/three/drill.py +0 -0
  701. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/three/edges.py +0 -0
  702. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/three/hlr.py +0 -0
  703. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/three/linalg.py +0 -0
  704. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/three/mesh.py +0 -0
  705. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/three/occlude.py +0 -0
  706. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/three/order.py +0 -0
  707. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/three/parse.py +0 -0
  708. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/three/place.py +0 -0
  709. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/three/protein.py +0 -0
  710. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/three/quality.py +0 -0
  711. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/three/render_jobs.py +0 -0
  712. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/three/scene_annotations.py +0 -0
  713. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/three/scene_pass.py +0 -0
  714. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/three/scene_projection.py +0 -0
  715. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/three/scenes.py +0 -0
  716. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/three/shade.py +0 -0
  717. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/three/solids.py +0 -0
  718. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/three/templates.json +0 -0
  719. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/three/templates.py +0 -0
  720. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/typeset/__init__.py +0 -0
  721. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/typeset/fonts.py +0 -0
  722. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/typeset/markup.py +0 -0
  723. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/typeset/onpath.py +0 -0
  724. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/typeset/outline.py +0 -0
  725. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/src/inklet/typeset/shaping.py +0 -0
  726. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/stress/assets/mouse.inklet.json +0 -0
  727. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/stress/assets/mouse.png +0 -0
  728. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/stress/dense_graph.py +0 -0
  729. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/stress/draw_probe.py +0 -0
  730. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/stress/electro/assets/sem.png +0 -0
  731. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/stress/electro/assets/tem.png +0 -0
  732. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/stress/electro/cell.py +0 -0
  733. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/stress/electro/common.py +0 -0
  734. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/stress/electro/data.py +0 -0
  735. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/stress/electro/imaging.py +0 -0
  736. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/stress/electro/kinetics.py +0 -0
  737. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/stress/electro/micrograph.py +0 -0
  738. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/stress/electro/system.py +0 -0
  739. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/stress/electro_figure.py +0 -0
  740. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/stress/fidelity.py +0 -0
  741. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/stress/flow.py +0 -0
  742. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/stress/hard_figure.py +0 -0
  743. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/stress/label_storm.py +0 -0
  744. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/stress/mega_figure.py +0 -0
  745. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/stress/meshes/README.md +0 -0
  746. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/stress/meshes/brain-lh.obj +0 -0
  747. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/stress/meshes/spot.obj +0 -0
  748. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/stress/panels/apparatus.py +0 -0
  749. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/stress/panels/graphs.py +0 -0
  750. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/stress/panels/relations.py +0 -0
  751. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/stress/panels/responses.py +0 -0
  752. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/stress/panels/sections.py +0 -0
  753. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/stress/probes.py +0 -0
  754. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/stress/three_figure.py +0 -0
  755. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_alignment_contract.py +0 -0
  756. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_annotate.py +0 -0
  757. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_annotate_letters.py +0 -0
  758. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_assets.py +0 -0
  759. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_assets_provenance.py +0 -0
  760. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_biology_source.py +0 -0
  761. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_blend_scene.py +0 -0
  762. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_browser_compiled.py +0 -0
  763. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_browser_facets.py +0 -0
  764. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_browser_figure.py +0 -0
  765. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_browser_geography.py +0 -0
  766. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_browser_overrides.py +0 -0
  767. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_browser_regions.py +0 -0
  768. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_browser_revision.py +0 -0
  769. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_browser_scatter.py +0 -0
  770. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_browser_series.py +0 -0
  771. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_browser_statistics.py +0 -0
  772. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_browser_switching.py +0 -0
  773. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_browser_time.py +0 -0
  774. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_categories.py +0 -0
  775. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_channels_contours.py +0 -0
  776. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_chem_figure.py +0 -0
  777. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_cli.py +0 -0
  778. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_clip_engine.py +0 -0
  779. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_components.py +0 -0
  780. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_compositing_engine.py +0 -0
  781. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_composition_recipes.py +0 -0
  782. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_contrast_and_labels.py +0 -0
  783. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_cookbook.py +0 -0
  784. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_core.py +0 -0
  785. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_core_amendments.py +0 -0
  786. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_csv_input.py +0 -0
  787. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_diagnostics.py +0 -0
  788. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_diagnostics_api.py +0 -0
  789. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_diagnostics_artwork.py +0 -0
  790. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_diagnostics_break_distorts.py +0 -0
  791. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_diagnostics_crossing.py +0 -0
  792. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_diagnostics_image_contrast.py +0 -0
  793. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_diagnostics_ink.py +0 -0
  794. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_diagnostics_keys.py +0 -0
  795. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_diagnostics_links.py +0 -0
  796. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_diagnostics_paths.py +0 -0
  797. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_diagnostics_plot_box.py +0 -0
  798. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_diagram_engine.py +0 -0
  799. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_docs.py +0 -0
  800. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_docs_site.py +0 -0
  801. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_document.py +0 -0
  802. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_document_data.py +0 -0
  803. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_document_v25.py +0 -0
  804. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_draw_clip.py +0 -0
  805. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_draw_path.py +0 -0
  806. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_draw_place.py +0 -0
  807. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_draw_shapes.py +0 -0
  808. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_engine_layout.py +0 -0
  809. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_engine_rendering.py +0 -0
  810. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_engine_scatter.py +0 -0
  811. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_engineering_report.py +0 -0
  812. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_export_bundle.py +0 -0
  813. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_figure.py +0 -0
  814. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_figure_planner.py +0 -0
  815. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_fit.py +0 -0
  816. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_grid_fields.py +0 -0
  817. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_guides.py +0 -0
  818. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_hatch_engine.py +0 -0
  819. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_label_measurements.py +0 -0
  820. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_layout.py +0 -0
  821. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_layout_graph.py +0 -0
  822. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_layout_graph_fit.py +0 -0
  823. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_layout_origin.py +0 -0
  824. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_layout_overrides.py +0 -0
  825. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_layout_sankey.py +0 -0
  826. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_links.py +0 -0
  827. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_links_avoid.py +0 -0
  828. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_links_shapes.py +0 -0
  829. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_marker_batches.py +0 -0
  830. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_mesh_fields.py +0 -0
  831. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_microscopy_tiff.py +0 -0
  832. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_neural_activity.py +0 -0
  833. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_output_contract.py +0 -0
  834. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_paint_program.py +0 -0
  835. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_place_labels.py +0 -0
  836. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_plot_axis.py +0 -0
  837. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_plot_broken_axis.py +0 -0
  838. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_plot_clip.py +0 -0
  839. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_plot_engine.py +0 -0
  840. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_plot_facets.py +0 -0
  841. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_plot_inset.py +0 -0
  842. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_plot_key.py +0 -0
  843. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_plot_labels.py +0 -0
  844. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_plot_legend.py +0 -0
  845. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_plot_marks.py +0 -0
  846. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_plot_notes.py +0 -0
  847. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_plot_polar.py +0 -0
  848. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_plot_publication.py +0 -0
  849. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_plot_quality_review.py +0 -0
  850. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_plot_raster.py +0 -0
  851. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_plot_recipes.py +0 -0
  852. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_plot_ribbon.py +0 -0
  853. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_plot_scale.py +0 -0
  854. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_plot_swarm.py +0 -0
  855. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_plot_time.py +0 -0
  856. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_presets.py +0 -0
  857. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_publication_limits.py +0 -0
  858. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_regional_report.py +0 -0
  859. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_release_adversarial.py +0 -0
  860. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_render_devices.py +0 -0
  861. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_render_embed.py +0 -0
  862. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_render_glyphs.py +0 -0
  863. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_render_jobs.py +0 -0
  864. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_render_outline.py +0 -0
  865. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_render_pdf.py +0 -0
  866. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_render_pdf_text.py +0 -0
  867. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_render_quality.py +0 -0
  868. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_render_scene.py +0 -0
  869. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_render_style_fields.py +0 -0
  870. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_render_svg_perf.py +0 -0
  871. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_render_v3.py +0 -0
  872. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_review_v25.py +0 -0
  873. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_round4_plot.py +0 -0
  874. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_routing_avoid.py +0 -0
  875. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_scatter_rendering.py +0 -0
  876. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_scene_annotations.py +0 -0
  877. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_scene_culling.py +0 -0
  878. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_scene_pass.py +0 -0
  879. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_scene_projection.py +0 -0
  880. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_scene_templates.py +0 -0
  881. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_scene_viewer.py +0 -0
  882. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_scientific_report.py +0 -0
  883. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_sections.py +0 -0
  884. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_shared_plot_margins.py +0 -0
  885. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_showcase_library.py +0 -0
  886. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_showcase_round3.py +0 -0
  887. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_slabs_regions.py +0 -0
  888. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_structure_figure.py +0 -0
  889. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_svg.py +0 -0
  890. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_table_adapters.py +0 -0
  891. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_target_pose.py +0 -0
  892. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_temporal_adapters.py +0 -0
  893. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_text_markup.py +0 -0
  894. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_text_on_path.py +0 -0
  895. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_theme_font_style.py +0 -0
  896. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_themes.py +0 -0
  897. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_three_anchor_pin.py +0 -0
  898. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_three_api.py +0 -0
  899. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_three_backend_blender.py +0 -0
  900. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_three_blender.py +0 -0
  901. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_three_depth_order.py +0 -0
  902. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_three_drill.py +0 -0
  903. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_three_hlr.py +0 -0
  904. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_three_mesh.py +0 -0
  905. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_three_order_vector.py +0 -0
  906. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_three_overlay.py +0 -0
  907. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_three_parse.py +0 -0
  908. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_three_patches.py +0 -0
  909. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_three_place.py +0 -0
  910. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_three_protein.py +0 -0
  911. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_three_ridges.py +0 -0
  912. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_three_sort.py +0 -0
  913. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_three_sort_budget.py +0 -0
  914. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_three_view.py +0 -0
  915. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_typeset.py +0 -0
  916. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_v4_selection.py +0 -0
  917. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_volume.py +0 -0
  918. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_watch_review.py +0 -0
  919. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/test_world_map_example.py +0 -0
  920. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/visual/README.md +0 -0
  921. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/visual/baseline/categories-pdf.png +0 -0
  922. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/visual/baseline/categories-svg.png +0 -0
  923. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/visual/baseline/components-pdf.png +0 -0
  924. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/visual/baseline/components-svg.png +0 -0
  925. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/visual/baseline/dense-pdf.png +0 -0
  926. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/visual/baseline/dense-svg.png +0 -0
  927. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/visual/baseline/fonts.json +0 -0
  928. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/visual/baseline/inset-pdf.png +0 -0
  929. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/visual/baseline/inset-svg.png +0 -0
  930. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/visual/baseline/markers-pdf.png +0 -0
  931. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/visual/baseline/markers-svg.png +0 -0
  932. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/visual/baseline/renderers.json +0 -0
  933. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/visual/baseline/type-opacity-pdf.png +0 -0
  934. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/visual/baseline/type-opacity-svg.png +0 -0
  935. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/visual/baseline/v2-category-subset-pdf.png +0 -0
  936. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/visual/baseline/v2-category-subset-svg.png +0 -0
  937. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/visual/baseline/v2-dense-pdf.png +0 -0
  938. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/visual/baseline/v2-dense-svg.png +0 -0
  939. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/visual/baseline/v2-late-inset-pdf.png +0 -0
  940. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/visual/baseline/v2-late-inset-svg.png +0 -0
  941. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/visual/baseline/v2-shared-scales-pdf.png +0 -0
  942. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/visual/baseline/v2-shared-scales-svg.png +0 -0
  943. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/visual/baseline/v2-twins-matrix-pdf.png +0 -0
  944. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/visual/baseline/v2-twins-matrix-svg.png +0 -0
  945. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/visual/baseline/v2-workflow-pdf.png +0 -0
  946. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/visual/baseline/v2-workflow-svg.png +0 -0
  947. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/visual/baseline/v25-document-pdf.png +0 -0
  948. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/visual/baseline/v25-document-svg.png +0 -0
  949. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/visual/fixtures.py +0 -0
  950. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tests/visual/v2-budgets.json +0 -0
  951. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tools/benchmark_batches.py +0 -0
  952. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tools/benchmark_clipping.py +0 -0
  953. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tools/benchmark_diagrams.py +0 -0
  954. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tools/benchmark_engine.py +0 -0
  955. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tools/benchmark_lines.py +0 -0
  956. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tools/benchmark_marker_index.mjs +0 -0
  957. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tools/benchmark_scene_culling.js +0 -0
  958. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tools/benchmark_scene_gpu.js +0 -0
  959. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tools/benchmark_scene_redraw.js +0 -0
  960. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tools/benchmark_scene_viewer.js +0 -0
  961. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tools/benchmark_scene_zoom.js +0 -0
  962. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tools/benchmark_v2.py +0 -0
  963. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tools/benchmark_v4.py +0 -0
  964. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tools/browser_study.js +0 -0
  965. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tools/check_render_wheel.py +0 -0
  966. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tools/dock_ligand.py +0 -0
  967. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tools/docs_previews.json +0 -0
  968. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tools/docs_previews.py +0 -0
  969. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tools/docs_site.py +0 -0
  970. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tools/docs_theme/404.html +0 -0
  971. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tools/docs_theme/card.html +0 -0
  972. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tools/docs_theme/gallery.html +0 -0
  973. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tools/docs_theme/home.html +0 -0
  974. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tools/docs_theme/main.html +0 -0
  975. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tools/docs_theme/plot-gallery.html +0 -0
  976. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tools/gen_api.py +0 -0
  977. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tools/make_culling_review.py +0 -0
  978. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tools/plot_catalog.json +0 -0
  979. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tools/prepare_world_map.py +0 -0
  980. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tools/preset_gallery.py +0 -0
  981. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tools/profile_scene_redraw.js +0 -0
  982. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tools/showcase_gallery.py +0 -0
  983. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tools/stress20.py +0 -0
  984. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tools/strip_pdb.py +0 -0
  985. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tools/v3_showcase.py +0 -0
  986. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tools/v4-budgets.json +0 -0
  987. {inklet-4.0.0.dev8 → inklet-4.0.0.dev9}/tools/visual_check.py +0 -0
@@ -6,7 +6,7 @@ on:
6
6
  tag:
7
7
  description: Published GitHub release tag
8
8
  required: true
9
- default: v4.0.0.dev8
9
+ default: v4.0.0.dev9
10
10
  type: string
11
11
  dry_run:
12
12
  description: Validate release files without uploading to PyPI
@@ -43,7 +43,7 @@ jobs:
43
43
  RELEASE_TAG: ${{ inputs.tag }}
44
44
  run: |
45
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.dev8' >&2
46
+ echo 'Expected a stable or development tag such as v3.1.0 or v4.0.0.dev9' >&2
47
47
  exit 1
48
48
  }
49
49
  gh release view "$RELEASE_TAG" --json isDraft,isPrerelease > "$RUNNER_TEMP/release.json"
@@ -2,6 +2,21 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 4.0.0.dev9 — 2026-09-12
6
+
7
+ Ninth development preview: mouse movement and proportional artwork scaling.
8
+ 3.1.0 remains the stable release.
9
+
10
+ - Add click/drag selection and movement, corner scale handles, containing-group
11
+ selection, keyboard nudges and cancellable pointer gestures to LayoutEditor.
12
+ - Map gestures through nested physical coordinate units and scales. Preserve
13
+ measured positions with folded offsets and keep the opposite scale corner fixed.
14
+ - Add explicit Composition child scale, preserving registered ports and scaling
15
+ complete artwork. Width/height fitting retains its separate layout semantics.
16
+ - Save scale in composition-layout schema 0.2; continue loading schema 0.1 files.
17
+ - Cover geometry, ports, all four corners, undo/reopen, nested transforms,
18
+ invalid gestures and browser/Python export agreement; update the editor guide.
19
+
5
20
  ## 4.0.0.dev8 — 2026-09-12
6
21
 
7
22
  Eighth development preview: local browser layout editing with Python compilation.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: inklet
3
- Version: 4.0.0.dev8
3
+ Version: 4.0.0.dev9
4
4
  Summary: Scientific figures with live data, measured layout, and consistent vector exports.
5
5
  Project-URL: Repository, https://github.com/Mapika/inklet
6
6
  Project-URL: Documentation, https://inklet.readthedocs.io/en/latest/
@@ -81,16 +81,16 @@ their signatures and report schemas may change.
81
81
 
82
82
  ## 4.0 development preview
83
83
 
84
- **4.0.0.dev8** adds a local browser layout inspector backed by the Python
85
- compiler. Edit named placements and dimensions, undo/redo changes, save layout
86
- choices, and export the same compiled preview to SVG or PDF.
84
+ **4.0.0.dev9** adds mouse movement and proportional artwork scaling to the
85
+ local layout editor. Drag named objects and groups, use corner handles, undo
86
+ gestures, and save choices that reproduce through the Python compiler.
87
87
  ```sh
88
- python -m pip install "inklet==4.0.0.dev8"
88
+ python -m pip install "inklet==4.0.0.dev9"
89
89
  ```
90
90
 
91
91
  [Preview guide and examples](https://inklet.readthedocs.io/en/latest/development-preview/) ·
92
92
  [4.0 roadmap](https://inklet.readthedocs.io/en/latest/roadmap/) ·
93
- [Release notes](https://github.com/Mapika/inklet/releases/tag/v4.0.0.dev8)
93
+ [Release notes](https://github.com/Mapika/inklet/releases/tag/v4.0.0.dev9)
94
94
 
95
95
  This is an opt-in development release. Experimental APIs and saved-state schemas
96
96
  may change; 3.1.0 remains the stable release. General browser editing,
@@ -31,16 +31,16 @@ their signatures and report schemas may change.
31
31
 
32
32
  ## 4.0 development preview
33
33
 
34
- **4.0.0.dev8** adds a local browser layout inspector backed by the Python
35
- compiler. Edit named placements and dimensions, undo/redo changes, save layout
36
- choices, and export the same compiled preview to SVG or PDF.
34
+ **4.0.0.dev9** adds mouse movement and proportional artwork scaling to the
35
+ local layout editor. Drag named objects and groups, use corner handles, undo
36
+ gestures, and save choices that reproduce through the Python compiler.
37
37
  ```sh
38
- python -m pip install "inklet==4.0.0.dev8"
38
+ python -m pip install "inklet==4.0.0.dev9"
39
39
  ```
40
40
 
41
41
  [Preview guide and examples](https://inklet.readthedocs.io/en/latest/development-preview/) ·
42
42
  [4.0 roadmap](https://inklet.readthedocs.io/en/latest/roadmap/) ·
43
- [Release notes](https://github.com/Mapika/inklet/releases/tag/v4.0.0.dev8)
43
+ [Release notes](https://github.com/Mapika/inklet/releases/tag/v4.0.0.dev9)
44
44
 
45
45
  This is an opt-in development release. Experimental APIs and saved-state schemas
46
46
  may change; 3.1.0 remains the stable release. General browser editing,
@@ -218,7 +218,7 @@ A figure assembled from named children and measured expressions.
218
218
 
219
219
  * `measure(name, dimension='width')` -- Reference a child's measured width or height, in composition units.
220
220
  * `point(name, anchor='center')` -- Reference a placed child's compass point or registered port.
221
- * `add(name, item, *, x=0, y=0, anchor=None, width=None, height=None)`
221
+ * `add(name, item, *, x=0, y=0, anchor=None, width=None, height=None, scale=1)`
222
222
  * `replace(name, item)` -- Replace a child while preserving its placement and dependent references.
223
223
  * `slot(name, **placement)` -- Declare a required content input with the same placement options as add().
224
224
  * `copy()` -- Copy nested compositions, plots, modules and component instructions.
@@ -48,7 +48,7 @@ Blender. Scene creation and rendering run Blender in a separate process.
48
48
  ### Development-preview table adapters
49
49
 
50
50
  The [pandas and Polars adapters](table-inputs.md) are included in the experimental
51
- [4.0.0.dev8 preview](development-preview.md), not in stable 3.1.0. Their `pandas` and `polars` extras are separate
51
+ [4.0.0.dev9 preview](development-preview.md), not in stable 3.1.0. Their `pandas` and `polars` extras are separate
52
52
  from core dependencies. The adapter CI jobs use Linux/Python 3.12 with pandas
53
53
  2.2.0 / Polars 1.0.0 and the versions pinned in `requirements-tables.txt`.
54
54
  Both paths check scalar/identity contracts and saved-state SVG reconstruction.
@@ -86,7 +86,9 @@ assert before.to_svg() == old_svg
86
86
  assert doc.compile() is after
87
87
  ```
88
88
 
89
- `place()` changes only placement fields: `x`, `y`, `anchor`, `width`, `height`.
89
+ `place()` changes placement fields: `x`, `y`, `anchor`, `width`, `height` and
90
+ `scale`. Explicit `scale` (dev9) uniformly scales complete artwork, including
91
+ text and strokes; it is separate from fitting a plot to a new width/height.
90
92
  Set `anchor`, `width` or `height` to `None` to restore their unspecified behavior.
91
93
  `replace()` replaces content and keeps its placement and named relationships.
92
94
  Dimension updates through `configure()` validate before mutation; expressions,
@@ -1,6 +1,6 @@
1
- # Inklet 4.0.0.dev8
1
+ # Inklet 4.0.0.dev9
2
2
 
3
- The eighth 4.0 development release includes the linked plotting, mapping,
3
+ The ninth 4.0 development release includes the linked plotting, mapping,
4
4
  engineering and scientific workflows developed since 3.1.0. It is an installable
5
5
  snapshot for trying real examples and reporting problems. **3.1.0 remains the
6
6
  stable release.** The [4.0 roadmap](roadmap.md) still has open work.
@@ -8,7 +8,7 @@ stable release.** The [4.0 roadmap](roadmap.md) still has open work.
8
8
  ```sh
9
9
  python -m venv .venv
10
10
  source .venv/bin/activate
11
- python -m pip install "inklet==4.0.0.dev8"
11
+ python -m pip install "inklet==4.0.0.dev9"
12
12
  ```
13
13
 
14
14
  On Windows PowerShell, activate with `.venv\Scripts\Activate.ps1` instead.
@@ -19,9 +19,9 @@ stable releases; see its [installation documentation](https://pip.pypa.io/en/sta
19
19
  Optional extras can be installed with the same pin:
20
20
 
21
21
  ```sh
22
- python -m pip install "inklet[render,pandas,polars]==4.0.0.dev8"
22
+ python -m pip install "inklet[render,pandas,polars]==4.0.0.dev9"
23
23
  # Add calibrated volumes and TIFF workflows when needed:
24
- python -m pip install "inklet[volume,render]==4.0.0.dev8"
24
+ python -m pip install "inklet[volume,render]==4.0.0.dev9"
25
25
  ```
26
26
 
27
27
  The core preview needs no browser server, NumPy, pandas, Polars or Blender.
@@ -29,7 +29,26 @@ Opening the generated HTML requires a browser. PNG/PDF exports from browser
29
29
  figures use separate Chrome/Chromium and Pillow; native Diagram exports retain
30
30
  their existing requirements. See [installation](installation.md).
31
31
 
32
- ## Local layout inspector in dev8
32
+ ## Mouse movement and scaling in dev9
33
+
34
+ The [layout editor](layout-editor.md) now supports direct mouse movement and
35
+ proportional corner scaling of named objects and groups. Alt-click selects a
36
+ containing group, arrow keys nudge, and Escape cancels. A drag shows an outline;
37
+ release compiles the actual figure and updates dependent links.
38
+
39
+ Moves preserve measured positions by adding offsets. Scaling keeps the opposite
40
+ corner fixed, including inside scaled groups with different coordinate units.
41
+ Each completed edit participates in undo/redo and saved-layout reconstruction.
42
+ Uniform artwork scaling includes text and strokes; plot width/height controls
43
+ retain their separate typography-preserving layout behavior.
44
+
45
+ ![Mouse selection and proportional scaling in the local editor](assets/guides/layout-editor-gestures.png)
46
+
47
+ New layout files use schema 0.2 for explicit artwork scale. Dev7/dev8 schema 0.1
48
+ files still load. Named composition objects are editable; individual plot marks,
49
+ axis labels, connector segments and camera parameters remain outside this scope.
50
+
51
+ ## Local layout inspector retained from dev8
33
52
 
34
53
  The [local layout editor](layout-editor.md) turns saved composition choices into
35
54
  a browser workflow. Edit named placements and dimensions, preview the actual
@@ -45,7 +64,7 @@ remain consistent across repeated edits and resets.
45
64
  ![The local browser layout inspector](assets/guides/layout-editor.png)
46
65
 
47
66
  This inspector requires its local Python session. It covers composition layout;
48
- drag handles, label content, plot styling and cameras remain separate work.
67
+ label content, individual plot marks and cameras remain separate work.
49
68
  The existing standalone viewers and linked-plot appearance editor retain their
50
69
  current scope.
51
70
 
@@ -162,7 +181,7 @@ The wheel contains the library. To obtain recipes and fixtures, use the matching
162
181
  release checkout or source archive:
163
182
 
164
183
  ```sh
165
- git clone --branch v4.0.0.dev8 https://github.com/Mapika/inklet.git
184
+ git clone --branch v4.0.0.dev9 https://github.com/Mapika/inklet.git
166
185
  cd inklet
167
186
  python -m pip install -e '.[render]'
168
187
  python examples/v4/regional_report.py --renderer compiled --editor --output out/regional
@@ -3,7 +3,7 @@
3
3
  Inklet requires Python 3.11 or later and an installed TrueType/OpenType font.
4
4
  The core Python dependencies are HarfBuzz bindings and fontTools.
5
5
 
6
- This page covers stable **Inklet 3.1** and the opt-in **4.0.0.dev8 preview**. See the
6
+ This page covers stable **Inklet 3.1** and the opt-in **4.0.0.dev9 preview**. See the
7
7
  [compatibility matrix](compatibility.md) for tested platforms and Blender versions.
8
8
 
9
9
  ## From PyPI
@@ -24,9 +24,9 @@ Activate the environment or prefix commands with `.venv/bin/` on Linux/macOS.
24
24
  ## 4.0 development preview
25
25
 
26
26
  ```sh
27
- python -m pip install "inklet==4.0.0.dev8"
27
+ python -m pip install "inklet==4.0.0.dev9"
28
28
  # Optional rendering and DataFrame adapters:
29
- python -m pip install "inklet[render,pandas,polars]==4.0.0.dev8"
29
+ python -m pip install "inklet[render,pandas,polars]==4.0.0.dev9"
30
30
  ```
31
31
 
32
32
  Use a separate virtual environment when trying the preview. Experimental APIs
@@ -1,11 +1,11 @@
1
1
  # Local layout editor
2
2
 
3
- Available in **4.0.0.dev8**, under `inklet.experimental.layout_editor`. Adjust
3
+ Available since **4.0.0.dev8**, with mouse gestures in **4.0.0.dev9**, under `inklet.experimental.layout_editor`. Adjust
4
4
  named placements and dimensions in a browser while Python recompiles the
5
5
  actual composition. The preview and downloaded SVG/PDF come from the same
6
6
  compiled figure, including plots, nested diagrams and native 3D content.
7
7
 
8
- ![The local layout inspector editing a mixed-content report](assets/guides/layout-editor.png)
8
+ ![Mouse selection and proportional scaling handles on a native 3D object](assets/guides/layout-editor-gestures.png)
9
9
 
10
10
  The [complete example](../examples/layout_editor.py) opens the reusable report
11
11
  from [composition recipes](composition-recipes.md). From the checkout, run:
@@ -45,12 +45,42 @@ width and height, including its coordinate unit. Optional `width=` and
45
45
  `height=` arguments fix the containing document's dimensions in millimetres;
46
46
  those dimensions remain authoritative when the authored page size changes.
47
47
 
48
+ ## Move and scale with the mouse
49
+
50
+ Click a named object in the preview and drag it to move. Corner handles scale
51
+ its complete artwork proportionally, keeping the opposite corner fixed. This
52
+ works for plots, modules, text, images, native 3D components and nested
53
+ compositions. A dashed outline follows the pointer; release to compile the
54
+ result and update dependent links. Escape or a cancelled pointer gesture leaves
55
+ the figure unchanged. A simple click selects without making an edit.
56
+
57
+ Use Alt-click to select a containing group, or choose its path in **Content**.
58
+ Drag a selected group's outline to move the group. With the canvas focused,
59
+ arrow keys move the selected object by 1 mm in figure space; Shift changes that
60
+ to 10 mm. Mouse and pointer gestures use the same coordinates even inside
61
+ scaled groups or compositions with different coordinate units.
62
+
63
+ Each completed edit is one undo step. Movements add offsets to measured
64
+ positions instead of discarding their relationships. Repeated offsets are
65
+ combined, so a long editing session does not grow ever-deeper expressions.
66
+ Saved layout files retain movement and scaling for Python reconstruction.
67
+
68
+ **Scaling artwork also scales its text and strokes.** To resize a plot's data
69
+ region while retaining physical typography, use the width/height controls
70
+ below. The **Uniform scale** field gives an exact artwork scale factor; Reset
71
+ target restores the original factor and placement.
72
+
73
+ The selectable units are named composition children and groups. Individual
74
+ marks, ticks, axis labels and connector segments remain part of their owning
75
+ plot or diagram. Scaling and movement do not remove authored constraints or
76
+ top-fitting behavior; dependent content can reflow when the compiler rebuilds.
77
+
48
78
  ## Edit and review
49
79
 
50
80
  Choose a named path in **Content**, enter the fields you want to change, then
51
81
  select **Apply layout**. Other fields retain their definitions.
52
82
 
53
- - Child placement fields are X, Y, anchor, width and height. Numbers use the
83
+ - Child placement fields are X, Y, anchor, width, height and uniform scale. Numbers use the
54
84
  containing composition's coordinate unit. For plots, width and height describe
55
85
  the data region; changing them does not scale text or strokes.
56
86
  - A field marked **Measured** still follows its layout expression. Entering a
@@ -91,6 +121,7 @@ import json
91
121
  from pathlib import Path
92
122
 
93
123
  editor.command('edit', {'path': '/chart', 'placement': {'height': 35}})
124
+ editor.command('gesture', {'path': '/chart', 'dx': 2, 'dy': 1})
94
125
  Path('layout-overrides.json').write_text(json.dumps(editor.overrides(), indent=2))
95
126
  editor.figure.save('edited.svg', 'edited.pdf')
96
127
  restored, report = recipe.with_layout_overrides(editor.overrides())
@@ -100,8 +131,10 @@ assert report['orphaned_targets'] == []
100
131
  `editor.figure` is the last successful compiled snapshot and supports the normal
101
132
  [export APIs](export-review.md), including PNG when render dependencies are
102
133
  installed. `overrides()` and `snapshot()` return independently owned data.
103
- Programmatic `command()` accepts `edit`, `reset`, `load`, `undo`, `redo` and
104
- `refresh`; an optional `revision=` rejects stale callers.
134
+ Programmatic `command()` accepts `gesture`, `edit`, `reset`, `load`, `undo`,
135
+ `redo` and `refresh`; an optional `revision=` rejects stale callers. A gesture
136
+ uses figure-space `dx`/`dy` in millimetres. Optional `factor` and `corner`
137
+ (`nw`, `ne`, `sw`, `se`) scale from the opposite corner.
105
138
 
106
139
  ## Refresh changed source content
107
140
 
@@ -130,8 +163,8 @@ remain accessible in Python. The `with LayoutEditor(recipe) as editor:` form
130
163
  starts and closes the server automatically; keep that context alive during
131
164
  browser use.
132
165
 
133
- This first inspector edits composition layout. Drag handles, label content,
134
- plot styling, camera controls, and file watching are not part of this interface.
166
+ The inspector edits named composition layout and artwork scale. Label content,
167
+ individual plot marks, camera controls, and file watching are not part of this interface.
135
168
  The separate [linked-plot appearance editor](visual-editing.md) retains its
136
169
  existing scope. Broader authoring and identity work remains on the
137
170
  [4.0 roadmap](roadmap.md).
@@ -1,6 +1,6 @@
1
1
  # Save and restore layout choices
2
2
 
3
- Available in **4.0.0.dev7**. Save placement and dimension edits separately from
3
+ Available since **4.0.0.dev7**; uniform artwork scale is added in **dev9**. Save placement and dimension edits separately from
4
4
  a [composition recipe](composition-recipes.md), then restore those choices
5
5
  when its data, labels or content change. The saved JSON records only differences
6
6
  from a reference recipe. Unedited source decisions remain in control.
@@ -41,7 +41,7 @@ Path('layout.json').write_text(json.dumps(state, indent=2, allow_nan=False))
41
41
  ```
42
42
 
43
43
  `layout_overrides(reference)` captures changed `x`, `y`, `anchor`, `width` and
44
- `height` fields on children, plus `width`, `height`, `unit` and `fit_top` on
44
+ `height` and uniform `scale` fields on children, plus `width`, `height`, `unit` and `fit_top` on
45
45
  compositions. It visits nested compositions through their named children.
46
46
  Measured expressions remain expressions, so page resizing and dependent
47
47
  content measurements still work after reopening.
@@ -123,8 +123,10 @@ of 32 operations. Malformed files, nonfinite numbers, invalid properties and
123
123
  contradictory edits to a shared nested definition are rejected, including when
124
124
  `missing='drop'` is used.
125
125
 
126
- The schema identifier is `inklet.composition-layout/0.1`. Unknown schemas are
127
- rejected. The file is a JSON object with `schema` and `targets`; each target has
126
+ New files use `inklet.composition-layout/0.2`, which adds a positive uniform
127
+ artwork scale. The loader also accepts `inklet.composition-layout/0.1` files
128
+ from dev7/dev8; those cannot contain scale fields. Unknown schemas are rejected.
129
+ Upgrade older readers before opening a new 0.2 file. The file is a JSON object with `schema` and `targets`; each target has
128
130
  changed `placement` and/or `page` fields. It is a development-preview format,
129
131
  not a general Python object serializer or an asset manifest.
130
132
 
@@ -58,8 +58,10 @@ Dev7 adds [saved layout overrides](layout-overrides.md) keyed by named paths,
58
58
  with measured expressions, independent restoration and explicit orphan reports.
59
59
  Dev8 adds a [local layout inspector](layout-editor.md) backed by Python
60
60
  compilation, with saved choices, undo/redo and explicit source refresh.
61
- Serialized project templates, asset manifests, shared selection relationships,
62
- label/camera editing and direct manipulation remain open. Subsequent work
61
+ Dev9 adds mouse movement, proportional artwork scaling and keyboard nudges
62
+ for named composition children, with preserved measured positions and saved
63
+ choices. Serialized project templates, asset manifests, shared selection
64
+ relationships, label/camera editing and finer-grained manipulation remain open. Subsequent work
63
65
  should extend authoring and cross-content identity beyond this bounded inspector.
64
66
 
65
67
  ## Who this should serve
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "inklet"
3
- version = "4.0.0.dev8"
3
+ version = "4.0.0.dev9"
4
4
  description = "Scientific figures with live data, measured layout, and consistent vector exports."
5
5
  readme = "README.md"
6
6
  authors = [{name = "Mark Marosi"}]
@@ -470,4 +470,4 @@ __all__ = [
470
470
  "mm", "pt", "COLUMN_SINGLE", "COLUMN_DOUBLE",
471
471
  ]
472
472
 
473
- __version__ = "4.0.0.dev8"
473
+ __version__ = "4.0.0.dev9"
@@ -12,6 +12,12 @@ from .spec import BuildSpec, ComponentSpec, fingerprint, freeze, length
12
12
  from .compiler import LayoutError
13
13
 
14
14
 
15
+ def _scale(value):
16
+ if type(value) not in (int,float) or not math.isfinite(value) or value<=0:
17
+ raise ValueError('component scale must be a finite positive number')
18
+ return float(value)
19
+
20
+
15
21
  @dataclass(frozen=True)
16
22
  class _Slot(BuildSpec):
17
23
  name: str
@@ -66,6 +72,7 @@ class _Part:
66
72
  anchor: str | None = None
67
73
  width: object = None
68
74
  height: object = None
75
+ scale: float = 1
69
76
 
70
77
 
71
78
  @dataclass(eq=False)
@@ -76,7 +83,8 @@ class Composition(BuildSpec):
76
83
  and height describe data regions. Other children retain their authored size
77
84
  unless explicit dimensions are provided. `anchor=None` preserves the local
78
85
  coordinate frame; `nw`, `center`, registered ports and `area-nw` align a
79
- measured point to (x, y). Layout never scales text or strokes.
86
+ measured point to (x, y). Dimension fitting never scales text or strokes. Explicit scale uniformly
87
+ scales the complete child artwork, including typography and strokes.
80
88
  """
81
89
  width: float
82
90
  height: float
@@ -109,11 +117,11 @@ class Composition(BuildSpec):
109
117
  """Reference a placed child's compass point or registered port."""
110
118
  return tuple(LayoutValue('point', (name, anchor, axis)) for axis in ('x', 'y'))
111
119
 
112
- def add(self, name, item, *, x=0, y=0, anchor=None, width=None, height=None):
120
+ def add(self, name, item, *, x=0, y=0, anchor=None, width=None, height=None, scale=1):
113
121
  if not isinstance(name, str) or not re.fullmatch(r'[A-Za-z][A-Za-z0-9_-]*', name):
114
122
  raise ValueError('component names start with a letter and contain letters, digits, underscores or hyphens')
115
123
  if any(part.name == name for part in self._parts): raise LayoutError(f'duplicate component {name!r}')
116
- self._parts.append(_Part(name, item, x, y, anchor, width, height))
124
+ self._parts.append(_Part(name, item, x, y, anchor, width, height, _scale(scale)))
117
125
  return item
118
126
 
119
127
  def __getitem__(self, name):
@@ -171,12 +179,13 @@ class Composition(BuildSpec):
171
179
  def place(self, name, **placement):
172
180
  """Edit a child's placement without replacing its content or named links.
173
181
 
174
- Accepts x, y, anchor, width and height as in add(). Expressions and
182
+ Accepts x, y, anchor, width, height and uniform scale as in add(). Expressions and
175
183
  resulting geometry are validated during compilation.
176
184
  """
177
185
  from dataclasses import replace
178
- unknown = placement.keys() - {'x','y','anchor','width','height'}
186
+ unknown = placement.keys() - {'x','y','anchor','width','height','scale'}
179
187
  if unknown: raise TypeError(f'unknown placement options: {", ".join(sorted(unknown))}')
188
+ if 'scale' in placement: placement['scale'] = _scale(placement['scale'])
180
189
  for index,part in enumerate(self._parts):
181
190
  if part.name == name:
182
191
  self._parts[index] = replace(part, **freeze(placement))
@@ -282,7 +291,15 @@ class Composition(BuildSpec):
282
291
  item = ComponentSpec(item.factory, evaluate(item.args), evaluate(item.kwargs), item.responsive)
283
292
  w = None if part.width is None else length(evaluate(part.width), 'child width')*self.unit
284
293
  h = None if part.height is None else length(evaluate(part.height), 'child height')*self.unit
285
- return context.build(item, w, h).copy()
294
+ node = context.build(item, w, h).copy()
295
+ factor = _scale(part.scale)
296
+ if factor != 1:
297
+ scaled = node.scaled(factor)
298
+ # Keep registered ports directly available to measured
299
+ # placement; their coordinates precede the new scale.
300
+ for key in node.anchors: scaled.anchors[key] = placed_anchor(node,key)
301
+ node = scaled
302
+ return node
286
303
  built[name] = guarded('measure', name, perform)
287
304
  return built[name]
288
305
 
@@ -7,8 +7,9 @@ import re
7
7
  from .compiler import LayoutError
8
8
  from .spec import length
9
9
 
10
- SCHEMA = 'inklet.composition-layout/0.1'
11
- _PLACEMENT = {'x', 'y', 'anchor', 'width', 'height'}
10
+ SCHEMA = 'inklet.composition-layout/0.2'
11
+ LEGACY_SCHEMA = 'inklet.composition-layout/0.1'
12
+ _PLACEMENT = {'x', 'y', 'anchor', 'width', 'height', 'scale'}
12
13
  _PAGE = {'width', 'height', 'unit', 'fit_top'}
13
14
  _NAME = r'[A-Za-z][A-Za-z0-9_-]*'
14
15
 
@@ -58,7 +59,10 @@ def _placement(values, *, encode=False):
58
59
  if not isinstance(values,dict) or not values or not set(values)<=_PLACEMENT:
59
60
  raise ValueError('invalid placement override properties')
60
61
  for key,value in values.items():
61
- if key=='anchor':
62
+ if key=='scale':
63
+ from .composition import _scale
64
+ result[key] = _scale(value)
65
+ elif key=='anchor':
62
66
  if value is not None and (not isinstance(value,str) or not value):
63
67
  raise ValueError('placement anchors must be nonempty strings or null')
64
68
  result[key] = value
@@ -125,7 +129,7 @@ def apply(recipe, value, *, missing='error'):
125
129
  """Validate all edits, reconcile stable names, then edit an independent copy."""
126
130
  from .composition import Composition
127
131
  if missing not in ('error','drop'): raise ValueError('missing policy must be error or drop')
128
- if (not isinstance(value,dict) or set(value)!={'schema','targets'} or value['schema']!=SCHEMA
132
+ if (not isinstance(value,dict) or set(value)!={'schema','targets'} or value['schema'] not in (SCHEMA,LEGACY_SCHEMA)
129
133
  or not isinstance(value['targets'],dict)):
130
134
  raise ValueError('invalid composition layout overrides')
131
135
  targets = _targets(recipe)
@@ -136,7 +140,10 @@ def apply(recipe, value, *, missing='error'):
136
140
  if not isinstance(entry,dict) or not entry or not set(entry)<={'placement','page'}:
137
141
  raise ValueError(f'invalid layout target properties: {path}')
138
142
  options = {}
139
- if 'placement' in entry: options['placement'] = _placement(entry['placement'])
143
+ if 'placement' in entry:
144
+ options['placement'] = _placement(entry['placement'])
145
+ if value['schema']==LEGACY_SCHEMA and 'scale' in options['placement']:
146
+ raise ValueError('scale requires composition layout schema 0.2')
140
147
  if 'page' in entry: options['page'] = _page(entry['page'])
141
148
  target = targets.get(path)
142
149
  invalid = target is None
@@ -3,6 +3,8 @@ from __future__ import annotations
3
3
 
4
4
  import copy
5
5
  import json
6
+ import math
7
+ import xml.etree.ElementTree as ET
6
8
  from pathlib import Path
7
9
  import secrets
8
10
  import threading
@@ -10,7 +12,7 @@ from urllib.parse import urlsplit, parse_qs
10
12
  from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
11
13
 
12
14
  from ...document import Composition, document
13
- from ...document.layout_overrides import SCHEMA, _targets, _placement
15
+ from ...document.layout_overrides import SCHEMA, _targets, _placement, _expression
14
16
 
15
17
 
16
18
  class LayoutEditor:
@@ -57,6 +59,68 @@ class LayoutEditor:
57
59
  """Return independently owned JSON-compatible saved layout choices."""
58
60
  with self._lock:return copy.deepcopy(self._value)
59
61
 
62
+ def _geometry(self):
63
+ from ...core import Vec2
64
+ from ...draw.coords import placed_anchor, plot_area
65
+ root,resolved=self._figure.build()
66
+ targets=_targets(self._recipe)
67
+ geometry={}
68
+ def visit(node,path=''):
69
+ if node.kind=='composition-part' and node.name:
70
+ path=path+'/'+node.name
71
+ if path in targets:
72
+ parent,part,_=targets[path]
73
+ placement=resolved[node.id];box=placement.bbox
74
+ child=node.children[0]
75
+ if part.anchor=='area-nw':
76
+ area=plot_area(child);point=Vec2(area.x0,area.y0)
77
+ elif part.anchor is None:point=Vec2(0,0)
78
+ else:point=placed_anchor(child,part.anchor)
79
+ anchor=placement.world.apply(point)
80
+ inverse=placement.world.inverse()
81
+ if box is not None:
82
+ geometry[path]=dict(box=[box.x0,box.y0,box.width,box.height],
83
+ anchor=[anchor.x,anchor.y],
84
+ inverse=[inverse.a/parent.unit,inverse.b/parent.unit,
85
+ inverse.c/parent.unit,inverse.d/parent.unit])
86
+ for child in node.children:visit(child,path)
87
+ visit(root)
88
+ return geometry
89
+
90
+ def _gesture(self,value):
91
+ from ...document.composition import LayoutValue, _scale
92
+ if (not isinstance(value,dict) or not {'path','dx','dy'}<=set(value) or
93
+ not set(value)<={'path','dx','dy','factor','corner'}):
94
+ raise ValueError('gesture needs path and finite figure-space dx/dy')
95
+ for key in ('dx','dy'):
96
+ if type(value[key]) not in (int,float) or not math.isfinite(value[key]):
97
+ raise ValueError('gesture displacement must be finite')
98
+ path=value['path'];geometry=self._geometry()
99
+ if not isinstance(path,str) or path not in geometry:raise ValueError('unknown gesture target')
100
+ _,part,_=_targets(self._recipe)[path]
101
+ box=geometry[path]['box'];anchor=geometry[path]['anchor']
102
+ dx,dy=value['dx'],value['dy'];fields={}
103
+ if 'factor' in value:
104
+ factor=_scale(value['factor'])
105
+ corner=value.get('corner','se')
106
+ if corner not in ('nw','ne','sw','se'):raise ValueError('invalid scale corner')
107
+ # The opposite corner remains fixed even for custom placement ports.
108
+ px=box[0]+(box[2] if 'w' in corner else 0)
109
+ py=box[1]+(box[3] if 'n' in corner else 0)
110
+ dx+=(1-factor)*(px-anchor[0]);dy+=(1-factor)*(py-anchor[1])
111
+ fields['scale']=part.scale*factor
112
+ elif 'corner' in value:raise ValueError('scale corner requires a factor')
113
+ a,b,c,d=geometry[path]['inverse'];ux,uy=a*dx+c*dy,b*dx+d*dy
114
+ def offset(current,delta):
115
+ if type(current) in (int,float):return current+delta
116
+ # Fold repeated mouse offsets instead of growing expression depth.
117
+ if isinstance(current,LayoutValue) and current.operation=='+' and type(current.args[1]) in (int,float):
118
+ return LayoutValue('+',(current.args[0],current.args[1]+delta))
119
+ return LayoutValue('+',(current,delta))
120
+ for key,delta in (('x',ux),('y',uy)):
121
+ if abs(delta)>1e-10:fields[key]=_expression(offset(getattr(part,key),delta),encode=True)
122
+ return dict(path=path,placement=fields) if fields else None
123
+
60
124
  def snapshot(self):
61
125
  """Return current controls, revision and preview without rebuilding."""
62
126
  with self._lock:
@@ -64,13 +128,14 @@ class LayoutEditor:
64
128
  for path,(_,part,item) in _targets(self._recipe).items():
65
129
  entry={}
66
130
  if part is not None:
67
- entry['placement']=_placement({k:getattr(part,k) for k in ('x','y','anchor','width','height')},encode=True)
131
+ entry['placement']=_placement({k:getattr(part,k) for k in ('x','y','anchor','width','height','scale')},encode=True)
68
132
  if isinstance(item,Composition):
69
133
  entry['page']={k:getattr(item,k) for k in ('width','height','unit','fit_top')}
70
134
  targets[path]=entry
71
135
  return dict(revision=self._revision,targets=targets,overrides=self.overrides(),
72
136
  undo=bool(self._undo),redo=bool(self._redo),report=copy.deepcopy(self._report),
73
- svg=self._figure.to_svg())
137
+ svg=self._figure.to_svg(),geometry=self._geometry(),
138
+ viewbox=[float(x) for x in ET.fromstring(self._figure.to_svg()).attrib['viewBox'].split()])
74
139
 
75
140
  def _aliases(self, path, group):
76
141
  targets=_targets(self._recipe)
@@ -83,13 +148,17 @@ class LayoutEditor:
83
148
  def command(self, action, value=None, *, revision=None, missing='error'):
84
149
  """Compile a command atomically; a stale revision or failed build changes nothing.
85
150
 
86
- Actions: edit (path with placement/page fields), reset (one path), load
151
+ Actions: gesture (figure-space move/uniform scale), edit (placement/page), reset, load
87
152
  (override JSON), undo, redo and refresh (current source; clears history).
88
153
  Refresh may explicitly drop removed targets with missing='drop'.
89
154
  """
90
155
  with self._lock:
91
156
  if revision is not None and (type(revision) is not int or revision!=self._revision):
92
157
  raise ValueError('stale editor revision; reload the current editor state')
158
+ if action=='gesture':
159
+ value=self._gesture(value)
160
+ if value is None:return self.snapshot()
161
+ action='edit'
93
162
  candidate=copy.deepcopy(self._value)
94
163
  if action=='edit':
95
164
  if (not isinstance(value,dict) or 'path' not in value or
@@ -132,7 +201,8 @@ class LayoutEditor:
132
201
  return self.snapshot()
133
202
 
134
203
  def _html(self):
135
- return Path(__file__).with_name('page.html').read_text().replace('__TOKEN__',self._token)
204
+ return (Path(__file__).with_name('page.html').read_text().replace('__TOKEN__',self._token)
205
+ .replace('<!--GESTURES-->',Path(__file__).with_name('gestures.js').read_text()))
136
206
 
137
207
  def start(self, *, port=0):
138
208
  """Start a loopback-only editor server; port=0 chooses a free local port."""