hyperweave 0.2.2__tar.gz → 0.2.3__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 (330) hide show
  1. {hyperweave-0.2.2 → hyperweave-0.2.3}/CHANGELOG.md +14 -0
  2. {hyperweave-0.2.2 → hyperweave-0.2.3}/PKG-INFO +1 -1
  3. {hyperweave-0.2.2 → hyperweave-0.2.3}/pyproject.toml +1 -0
  4. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/_version.py +2 -2
  5. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/compose/resolver.py +11 -4
  6. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/core/schema.py +13 -0
  7. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/data/genomes/chrome-horizon.json +4 -0
  8. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/badge/chrome-defs.j2 +8 -3
  9. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/stats/chrome-content.j2 +9 -15
  10. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/strip/chrome-defs.j2 +1 -0
  11. {hyperweave-0.2.2 → hyperweave-0.2.3}/tests/test_github_scrape.py +8 -8
  12. {hyperweave-0.2.2 → hyperweave-0.2.3}/.dockerignore +0 -0
  13. {hyperweave-0.2.2 → hyperweave-0.2.3}/.github/workflows/ci.yml +0 -0
  14. {hyperweave-0.2.2 → hyperweave-0.2.3}/.github/workflows/deploy.yml +0 -0
  15. {hyperweave-0.2.2 → hyperweave-0.2.3}/.github/workflows/publish.yml +0 -0
  16. {hyperweave-0.2.2 → hyperweave-0.2.3}/.gitignore +0 -0
  17. {hyperweave-0.2.2 → hyperweave-0.2.3}/Dockerfile +0 -0
  18. {hyperweave-0.2.2 → hyperweave-0.2.3}/LICENSE +0 -0
  19. {hyperweave-0.2.2 → hyperweave-0.2.3}/README.md +0 -0
  20. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/buttons/button-liquid.svg +0 -0
  21. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/cards/card-butterfly.svg +0 -0
  22. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/cards/card-python.svg +0 -0
  23. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/cards/card-sunflower.svg +0 -0
  24. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/cards/card-waves.svg +0 -0
  25. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/examples/brutalist-emerald/badge_critical.svg +0 -0
  26. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/examples/brutalist-emerald/badge_passing.svg +0 -0
  27. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/examples/brutalist-emerald/badge_warning.svg +0 -0
  28. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/examples/brutalist-emerald/banner.svg +0 -0
  29. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/examples/brutalist-emerald/icons/discord.svg +0 -0
  30. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/examples/brutalist-emerald/icons/notion.svg +0 -0
  31. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/examples/brutalist-emerald/icons/reddit.svg +0 -0
  32. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/examples/brutalist-emerald/icons/spotify.svg +0 -0
  33. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/examples/brutalist-emerald/icons/youtube.svg +0 -0
  34. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/examples/brutalist-emerald/marquee_counter.svg +0 -0
  35. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/examples/brutalist-emerald/marquee_horizontal.svg +0 -0
  36. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/examples/brutalist-emerald/marquee_vertical.svg +0 -0
  37. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/examples/brutalist-emerald/profile-cards/chart_stars_full.svg +0 -0
  38. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/examples/brutalist-emerald/profile-cards/stats.svg +0 -0
  39. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/examples/brutalist-emerald/strip.svg +0 -0
  40. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/examples/chrome-horizon/badge_critical.svg +0 -0
  41. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/examples/chrome-horizon/badge_passing.svg +0 -0
  42. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/examples/chrome-horizon/badge_warning.svg +0 -0
  43. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/examples/chrome-horizon/banner.svg +0 -0
  44. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/examples/chrome-horizon/icons/bluesky.svg +0 -0
  45. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/examples/chrome-horizon/icons/github.svg +0 -0
  46. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/examples/chrome-horizon/icons/instagram.svg +0 -0
  47. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/examples/chrome-horizon/icons/mastodon.svg +0 -0
  48. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/examples/chrome-horizon/icons/x.svg +0 -0
  49. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/examples/chrome-horizon/marquee_counter.svg +0 -0
  50. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/examples/chrome-horizon/marquee_horizontal.svg +0 -0
  51. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/examples/chrome-horizon/marquee_vertical.svg +0 -0
  52. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/examples/chrome-horizon/profile-cards/chart_stars_full.svg +0 -0
  53. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/examples/chrome-horizon/profile-cards/stats.svg +0 -0
  54. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/examples/chrome-horizon/strip.svg +0 -0
  55. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/examples/telemetry/master_card.svg +0 -0
  56. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/examples/telemetry/receipt.svg +0 -0
  57. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/examples/telemetry/rhythm_strip.svg +0 -0
  58. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/footers/inneraura-footer-liquid.svg +0 -0
  59. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/footers/inneraura-footer-purple.svg +0 -0
  60. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/footers/inneraura-footer.svg +0 -0
  61. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/hyperweave-banner.svg +0 -0
  62. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/icons/cobalt-sapphire-discord.svg +0 -0
  63. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/icons/cobalt-sapphire-docs.svg +0 -0
  64. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/icons/cobalt-sapphire-github.svg +0 -0
  65. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/icons/cobalt-sapphire-instagram.svg +0 -0
  66. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/icons/cobalt-sapphire-linkedin.svg +0 -0
  67. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/icons/cobalt-sapphire-tiktok.svg +0 -0
  68. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/icons/cobalt-sapphire-x.svg +0 -0
  69. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/icons/cobalt-sapphire-youtube.svg +0 -0
  70. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/marquees/badge-showcase-triple.svg +0 -0
  71. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/marquees/genome-marquee-triple.svg +0 -0
  72. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/marquees/sample-badges.svg +0 -0
  73. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/mintlify-assets/404.svg +0 -0
  74. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/mintlify-assets/callout-icons.svg +0 -0
  75. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/mintlify-assets/divider.svg +0 -0
  76. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/mintlify-assets/favicon.svg +0 -0
  77. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/mintlify-assets/hero-banner.svg +0 -0
  78. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/mintlify-assets/hyperweave-banner-v2.svg +0 -0
  79. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/mintlify-assets/hyperweave-navbar-logo.svg +0 -0
  80. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/mintlify-assets/loader.svg +0 -0
  81. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/mintlify-assets/og-image.svg +0 -0
  82. {hyperweave-0.2.2 → hyperweave-0.2.3}/assets/timelines/hyperweave-roadmap.svg +0 -0
  83. {hyperweave-0.2.2 → hyperweave-0.2.3}/docs/assets/favicon.svg +0 -0
  84. {hyperweave-0.2.2 → hyperweave-0.2.3}/docs/assets/hyperweave-banner.svg +0 -0
  85. {hyperweave-0.2.2 → hyperweave-0.2.3}/docs/assets/hyperweave-navbar-logo.svg +0 -0
  86. {hyperweave-0.2.2 → hyperweave-0.2.3}/docs/assets/og-image.svg +0 -0
  87. {hyperweave-0.2.2 → hyperweave-0.2.3}/docs/explanation/architecture.mdx +0 -0
  88. {hyperweave-0.2.2 → hyperweave-0.2.3}/docs/explanation/camo-compatibility.mdx +0 -0
  89. {hyperweave-0.2.2 → hyperweave-0.2.3}/docs/explanation/cim-compliance.mdx +0 -0
  90. {hyperweave-0.2.2 → hyperweave-0.2.3}/docs/explanation/genome-profile-system.mdx +0 -0
  91. {hyperweave-0.2.2 → hyperweave-0.2.3}/docs/explanation/metadata-tiers.mdx +0 -0
  92. {hyperweave-0.2.2 → hyperweave-0.2.3}/docs/how-to/add-motion-to-badges.mdx +0 -0
  93. {hyperweave-0.2.2 → hyperweave-0.2.3}/docs/how-to/create-session-receipts.mdx +0 -0
  94. {hyperweave-0.2.2 → hyperweave-0.2.3}/docs/how-to/set-up-claude-code-hooks.mdx +0 -0
  95. {hyperweave-0.2.2 → hyperweave-0.2.3}/docs/how-to/use-live-data-badges.mdx +0 -0
  96. {hyperweave-0.2.2 → hyperweave-0.2.3}/docs/introduction.mdx +0 -0
  97. {hyperweave-0.2.2 → hyperweave-0.2.3}/docs/mint.json +0 -0
  98. {hyperweave-0.2.2 → hyperweave-0.2.3}/docs/quickstart.mdx +0 -0
  99. {hyperweave-0.2.2 → hyperweave-0.2.3}/docs/reference/cli.mdx +0 -0
  100. {hyperweave-0.2.2 → hyperweave-0.2.3}/docs/reference/compose-spec.mdx +0 -0
  101. {hyperweave-0.2.2 → hyperweave-0.2.3}/docs/reference/genomes.mdx +0 -0
  102. {hyperweave-0.2.2 → hyperweave-0.2.3}/docs/reference/http-api.mdx +0 -0
  103. {hyperweave-0.2.2 → hyperweave-0.2.3}/docs/reference/mcp-tools.mdx +0 -0
  104. {hyperweave-0.2.2 → hyperweave-0.2.3}/docs/reference/motions.mdx +0 -0
  105. {hyperweave-0.2.2 → hyperweave-0.2.3}/docs/reference/telemetry-contract.mdx +0 -0
  106. {hyperweave-0.2.2 → hyperweave-0.2.3}/docs/spec/hyperweave-protocol.mdx +0 -0
  107. {hyperweave-0.2.2 → hyperweave-0.2.3}/docs/tutorials/build-an-artifact-kit.mdx +0 -0
  108. {hyperweave-0.2.2 → hyperweave-0.2.3}/docs/tutorials/compose-your-first-badge.mdx +0 -0
  109. {hyperweave-0.2.2 → hyperweave-0.2.3}/docs/tutorials/install-session-telemetry.mdx +0 -0
  110. {hyperweave-0.2.2 → hyperweave-0.2.3}/fly.toml +0 -0
  111. {hyperweave-0.2.2 → hyperweave-0.2.3}/hooks/install.py +0 -0
  112. {hyperweave-0.2.2 → hyperweave-0.2.3}/hooks/session_end.sh +0 -0
  113. {hyperweave-0.2.2 → hyperweave-0.2.3}/justfile +0 -0
  114. {hyperweave-0.2.2 → hyperweave-0.2.3}/scripts/extract_glyphs.py +0 -0
  115. {hyperweave-0.2.2 → hyperweave-0.2.3}/scripts/generate_hw_compliant.py +0 -0
  116. {hyperweave-0.2.2 → hyperweave-0.2.3}/scripts/generate_proofset.py +0 -0
  117. {hyperweave-0.2.2 → hyperweave-0.2.3}/scripts/stress_test.py +0 -0
  118. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/__init__.py +0 -0
  119. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/__main__.py +0 -0
  120. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/cli.py +0 -0
  121. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/compose/__init__.py +0 -0
  122. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/compose/assembler.py +0 -0
  123. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/compose/context.py +0 -0
  124. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/compose/engine.py +0 -0
  125. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/compose/lanes.py +0 -0
  126. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/compose/resolvers/__init__.py +0 -0
  127. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/compose/resolvers/chart.py +0 -0
  128. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/compose/resolvers/stats.py +0 -0
  129. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/compose/resolvers/timeline.py +0 -0
  130. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/config/__init__.py +0 -0
  131. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/config/genome_validator.py +0 -0
  132. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/config/loader.py +0 -0
  133. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/config/registry.py +0 -0
  134. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/config/settings.py +0 -0
  135. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/connectors/__init__.py +0 -0
  136. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/connectors/arxiv.py +0 -0
  137. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/connectors/base.py +0 -0
  138. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/connectors/cache.py +0 -0
  139. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/connectors/github.py +0 -0
  140. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/connectors/rest.py +0 -0
  141. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/core/__init__.py +0 -0
  142. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/core/color.py +0 -0
  143. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/core/contracts.py +0 -0
  144. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/core/enums.py +0 -0
  145. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/core/models.py +0 -0
  146. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/core/text.py +0 -0
  147. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/core/thresholds.py +0 -0
  148. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/data/css/accessibility.css +0 -0
  149. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/data/css/bridge.css +0 -0
  150. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/data/css/expression.css +0 -0
  151. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/data/css/phase-colors.css +0 -0
  152. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/data/css/status.css +0 -0
  153. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/data/css/telemetry.css +0 -0
  154. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/data/font-metrics/inter.json +0 -0
  155. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/data/fonts/jetbrains-mono.b64 +0 -0
  156. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/data/fonts/jetbrains-mono.meta.json +0 -0
  157. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/data/fonts/orbitron.b64 +0 -0
  158. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/data/fonts/orbitron.meta.json +0 -0
  159. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/data/genomes/brutalist-emerald.json +0 -0
  160. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/data/genomes/telemetry-void.json +0 -0
  161. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/data/glyphs.json +0 -0
  162. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/data/motions/border/chromatic-pulse.yaml +0 -0
  163. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/data/motions/border/corner-trace.yaml +0 -0
  164. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/data/motions/border/dual-orbit.yaml +0 -0
  165. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/data/motions/border/entanglement.yaml +0 -0
  166. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/data/motions/border/rimrun.yaml +0 -0
  167. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/data/motions/kinetic/bars.yaml +0 -0
  168. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/data/motions/kinetic/breach.yaml +0 -0
  169. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/data/motions/kinetic/broadcast.yaml +0 -0
  170. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/data/motions/kinetic/cascade.yaml +0 -0
  171. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/data/motions/kinetic/collapse.yaml +0 -0
  172. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/data/motions/kinetic/converge.yaml +0 -0
  173. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/data/motions/kinetic/crash.yaml +0 -0
  174. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/data/motions/kinetic/drop.yaml +0 -0
  175. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/data/motions/kinetic/pulse.yaml +0 -0
  176. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/data/motions/static.yaml +0 -0
  177. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/data/policies/normal.json +0 -0
  178. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/data/policies/permissive.json +0 -0
  179. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/data/policies/ungoverned.json +0 -0
  180. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/data/profiles/brutalist.contract.json +0 -0
  181. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/data/profiles/brutalist.yaml +0 -0
  182. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/data/profiles/chrome.contract.json +0 -0
  183. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/data/profiles/chrome.yaml +0 -0
  184. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/data/specimens.yaml +0 -0
  185. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/data/telemetry/model-pricing.yaml +0 -0
  186. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/data/telemetry/stage-config.yaml +0 -0
  187. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/data/telemetry/stage-labels.yaml +0 -0
  188. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/data/telemetry/tool-classes.yaml +0 -0
  189. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/data/telemetry/tool-colors.yaml +0 -0
  190. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/data/terminals/arrow.json +0 -0
  191. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/data/terminals/aurora.json +0 -0
  192. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/data/terminals/beacon.json +0 -0
  193. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/data/terminals/bracket3d.json +0 -0
  194. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/data/terminals/chevron.json +0 -0
  195. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/data/terminals/crosshair.json +0 -0
  196. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/data/terminals/diamond.json +0 -0
  197. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/data/terminals/rocket.json +0 -0
  198. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/data/terminals/rules/bar.json +0 -0
  199. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/data/terminals/rules/dashed.json +0 -0
  200. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/data/terminals/rules/five-wave.json +0 -0
  201. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/data/terminals/rules/spectral.json +0 -0
  202. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/data/terminals/rules/straight.json +0 -0
  203. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/data/terminals/rules/wave.json +0 -0
  204. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/data/terminals/stijl.json +0 -0
  205. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/kit.py +0 -0
  206. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/mcp/__init__.py +0 -0
  207. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/mcp/__main__.py +0 -0
  208. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/mcp/server.py +0 -0
  209. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/py.typed +0 -0
  210. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/render/__init__.py +0 -0
  211. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/render/chart_engine.py +0 -0
  212. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/render/fonts.py +0 -0
  213. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/render/glyphs.py +0 -0
  214. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/render/motion.py +0 -0
  215. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/render/templates.py +0 -0
  216. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/serve/__init__.py +0 -0
  217. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/serve/app.py +0 -0
  218. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/telemetry/__init__.py +0 -0
  219. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/telemetry/capture.py +0 -0
  220. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/telemetry/contract.py +0 -0
  221. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/telemetry/corrections.py +0 -0
  222. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/telemetry/cost.py +0 -0
  223. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/telemetry/models.py +0 -0
  224. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/telemetry/parser.py +0 -0
  225. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/telemetry/stages.py +0 -0
  226. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/components/filter.svg.j2 +0 -0
  227. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/components/glyph-inline.svg.j2 +0 -0
  228. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/components/glyph.svg.j2 +0 -0
  229. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/components/gradient.svg.j2 +0 -0
  230. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/components/metadata.svg.j2 +0 -0
  231. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/components/metric.svg.j2 +0 -0
  232. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/components/phase-segment.svg.j2 +0 -0
  233. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/components/rule.svg.j2 +0 -0
  234. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/components/status.svg.j2 +0 -0
  235. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/components/terminal.svg.j2 +0 -0
  236. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/components/treemap.svg.j2 +0 -0
  237. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/document.svg.j2 +0 -0
  238. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/error-badge.svg.j2 +0 -0
  239. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/badge/brutalist-content.j2 +0 -0
  240. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/badge/brutalist-defs.j2 +0 -0
  241. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/badge/chrome-content.j2 +0 -0
  242. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/badge/default-content.j2 +0 -0
  243. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/badge/default-defs.j2 +0 -0
  244. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/badge.svg.j2 +0 -0
  245. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/banner/brutalist-defs.j2 +0 -0
  246. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/banner/chrome-defs.j2 +0 -0
  247. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/banner/default-defs.j2 +0 -0
  248. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/banner.svg.j2 +0 -0
  249. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/catalog.svg.j2 +0 -0
  250. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/chart/brutalist-content.j2 +0 -0
  251. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/chart/brutalist-defs.j2 +0 -0
  252. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/chart/chrome-content.j2 +0 -0
  253. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/chart/chrome-defs.j2 +0 -0
  254. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/chart.svg.j2 +0 -0
  255. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/divider.svg.j2 +0 -0
  256. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/icon/brutalist-content.j2 +0 -0
  257. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/icon/brutalist-defs.j2 +0 -0
  258. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/icon/chrome-content.j2 +0 -0
  259. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/icon/chrome-defs.j2 +0 -0
  260. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/icon/default-content.j2 +0 -0
  261. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/icon/default-defs.j2 +0 -0
  262. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/icon.svg.j2 +0 -0
  263. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/marquee-counter/brutalist-content.j2 +0 -0
  264. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/marquee-counter/brutalist-defs.j2 +0 -0
  265. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/marquee-counter/chrome-content.j2 +0 -0
  266. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/marquee-counter/chrome-defs.j2 +0 -0
  267. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/marquee-counter.svg.j2 +0 -0
  268. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/marquee-horizontal/brutalist-content.j2 +0 -0
  269. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/marquee-horizontal/brutalist-defs.j2 +0 -0
  270. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/marquee-horizontal/chrome-content.j2 +0 -0
  271. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/marquee-horizontal/chrome-defs.j2 +0 -0
  272. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/marquee-horizontal.svg.j2 +0 -0
  273. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/marquee-vertical/brutalist-content.j2 +0 -0
  274. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/marquee-vertical/brutalist-defs.j2 +0 -0
  275. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/marquee-vertical/chrome-content.j2 +0 -0
  276. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/marquee-vertical/chrome-defs.j2 +0 -0
  277. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/marquee-vertical.svg.j2 +0 -0
  278. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/master-card.svg.j2 +0 -0
  279. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/receipt.svg.j2 +0 -0
  280. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/rhythm-strip.svg.j2 +0 -0
  281. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/stats/brutalist-content.j2 +0 -0
  282. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/stats/brutalist-defs.j2 +0 -0
  283. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/stats/chrome-defs.j2 +0 -0
  284. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/stats.svg.j2 +0 -0
  285. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/strip/brutalist-content.j2 +0 -0
  286. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/strip/brutalist-defs.j2 +0 -0
  287. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/strip/brutalist-status.j2 +0 -0
  288. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/strip/chrome-content.j2 +0 -0
  289. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/strip/chrome-status.j2 +0 -0
  290. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/strip/default-content.j2 +0 -0
  291. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/strip/default-defs.j2 +0 -0
  292. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/strip/default-status.j2 +0 -0
  293. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/strip.svg.j2 +0 -0
  294. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/timeline/default-content.j2 +0 -0
  295. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/frames/timeline.svg.j2 +0 -0
  296. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/motions/border/chromatic-pulse.svg.j2 +0 -0
  297. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/motions/border/corner-trace.svg.j2 +0 -0
  298. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/motions/border/dual-orbit.svg.j2 +0 -0
  299. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/motions/border/entanglement.svg.j2 +0 -0
  300. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/motions/border/rimrun.svg.j2 +0 -0
  301. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/motions/kinetic/bars.svg.j2 +0 -0
  302. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/motions/kinetic/breach.svg.j2 +0 -0
  303. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/motions/kinetic/broadcast.svg.j2 +0 -0
  304. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/motions/kinetic/cascade.svg.j2 +0 -0
  305. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/motions/kinetic/collapse.svg.j2 +0 -0
  306. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/motions/kinetic/converge.svg.j2 +0 -0
  307. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/motions/kinetic/crash.svg.j2 +0 -0
  308. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/motions/kinetic/drop.svg.j2 +0 -0
  309. {hyperweave-0.2.2 → hyperweave-0.2.3}/src/hyperweave/templates/motions/kinetic/pulse.svg.j2 +0 -0
  310. {hyperweave-0.2.2 → hyperweave-0.2.3}/tests/__init__.py +0 -0
  311. {hyperweave-0.2.2 → hyperweave-0.2.3}/tests/conftest.py +0 -0
  312. {hyperweave-0.2.2 → hyperweave-0.2.3}/tests/fixtures/github_contributions/synthetic.html +0 -0
  313. {hyperweave-0.2.2 → hyperweave-0.2.3}/tests/fixtures/session.json +0 -0
  314. {hyperweave-0.2.2 → hyperweave-0.2.3}/tests/fixtures/session.jsonl +0 -0
  315. {hyperweave-0.2.2 → hyperweave-0.2.3}/tests/test_assembler.py +0 -0
  316. {hyperweave-0.2.2 → hyperweave-0.2.3}/tests/test_chart_engine.py +0 -0
  317. {hyperweave-0.2.2 → hyperweave-0.2.3}/tests/test_chart_frame.py +0 -0
  318. {hyperweave-0.2.2 → hyperweave-0.2.3}/tests/test_connectors.py +0 -0
  319. {hyperweave-0.2.2 → hyperweave-0.2.3}/tests/test_core.py +0 -0
  320. {hyperweave-0.2.2 → hyperweave-0.2.3}/tests/test_kit.py +0 -0
  321. {hyperweave-0.2.2 → hyperweave-0.2.3}/tests/test_mcp.py +0 -0
  322. {hyperweave-0.2.2 → hyperweave-0.2.3}/tests/test_paradigm_dispatch.py +0 -0
  323. {hyperweave-0.2.2 → hyperweave-0.2.3}/tests/test_proofset.py +0 -0
  324. {hyperweave-0.2.2 → hyperweave-0.2.3}/tests/test_render.py +0 -0
  325. {hyperweave-0.2.2 → hyperweave-0.2.3}/tests/test_serve.py +0 -0
  326. {hyperweave-0.2.2 → hyperweave-0.2.3}/tests/test_stats_card.py +0 -0
  327. {hyperweave-0.2.2 → hyperweave-0.2.3}/tests/test_telemetry.py +0 -0
  328. {hyperweave-0.2.2 → hyperweave-0.2.3}/tests/test_telemetry_integration.py +0 -0
  329. {hyperweave-0.2.2 → hyperweave-0.2.3}/tests/test_timeline.py +0 -0
  330. {hyperweave-0.2.2 → hyperweave-0.2.3}/uv.lock +0 -0
@@ -5,6 +5,20 @@ All notable changes to HyperWeave are documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.2.3] - 2026-04-13
9
+
10
+ ### Added
11
+
12
+ - **Genome-level `text_metrics` field.** Genomes can now declare per-zone text width multipliers (`badge_label_width_factor`, `badge_value_width_factor`) so the resolver sizes frames correctly for non-default display fonts. Defaults preserve pre-v0.2.3 behavior; new fonts (e.g. Orbitron on chrome-horizon) opt in without touching the resolver. Extensible to future zones without a schema change.
13
+ - chrome-horizon ships `badge_value_width_factor = 1.35` to match Orbitron 900 glyph advances at the compositor badge scale.
14
+
15
+ ### Fixed
16
+
17
+ - **Orbitron was not actually loading on badges and strips.** The v0.2.0 font bundler emits `@font-face` via a `{{ font_faces | safe }}` Jinja variable, but that variable was only rendered in `stats/chrome-defs.j2` and `chart/chrome-defs.j2` — badge and strip chrome-defs templates omitted it. As a result, v0.2.1's switch to `var(--dna-font-display)` fell through to the system-ui fallback instead of rendering Orbitron. `{{ font_faces | safe }}` is now emitted in `badge/chrome-defs.j2` and `strip/chrome-defs.j2` so the bundled WOFF2 actually loads.
18
+ - **chrome-horizon badge typography overflow.** Compounded by the font-loading bug above, v0.2.1's badge font sizes (11/17 label/value) matched the magazine's 200x52 showcase badge but the compositor badge is 125x22 (~40% of magazine scale). Scaled to 8/11 and combined with the new `text_metrics` width factor so the value text and status diamond no longer collide.
19
+ - **Activity bar vector halos produced visible "fat bar" artifacts on mobile.** The v0.2.1 fix replaced `feGaussianBlur` with 2-layer sibling-rect halos, but those expanded the visual width of each 7px bar by 4px total, which read as blurry on small viewports. The magazine specimen's light-cyan top highlight is carried by the `ch-bar` gradient's first stop (#C8DAE6) alone, not by any halo — so the halos are removed entirely. Bars render as crisp gradient rects at every scale.
20
+ - `tier2/` added to ruff `extend-exclude` so `just fmt` no longer trips on internal research files.
21
+
8
22
  ## [0.2.2] - 2026-04-13
9
23
 
10
24
  ### Fixed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hyperweave
3
- Version: 0.2.2
3
+ Version: 0.2.3
4
4
  Summary: Headless visual output layer for AI agents. One API call → self-contained SVG.
5
5
  Project-URL: Repository, https://github.com/InnerAura/hyperweave
6
6
  Project-URL: Issues, https://github.com/InnerAura/hyperweave/issues
@@ -94,6 +94,7 @@ markers = [
94
94
  line-length = 120
95
95
  target-version = "py312"
96
96
  src = ["src"]
97
+ extend-exclude = ["tier2"]
97
98
 
98
99
  [tool.ruff.lint]
99
100
  select = ["E", "F", "I", "UP", "B", "SIM", "TCH", "RUF"]
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '0.2.2'
22
- __version_tuple__ = version_tuple = (0, 2, 2)
21
+ __version__ = version = '0.2.3'
22
+ __version_tuple__ = version_tuple = (0, 2, 3)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -148,10 +148,17 @@ def resolve_badge(
148
148
  if use_mono and label_display:
149
149
  lw += len(label_display) * font_size * 0.06
150
150
 
151
- # System fonts (non-mono) are wider than the Inter LUT
152
- if not use_mono:
153
- lw *= 1.15
154
- vw *= 1.10
151
+ # Empirical width factors the Inter/mono LUTs approximate actual rendered
152
+ # width, but genomes can override per-zone to match their declared fonts.
153
+ # chrome-horizon, for example, renders badge values in Orbitron (~1.35x
154
+ # Inter). New genomes should measure their display font and declare their
155
+ # own `text_metrics` to avoid value-zone overflow. Defaults preserve the
156
+ # pre-v0.2.3 behavior so existing genomes are unaffected.
157
+ tm = genome.get("text_metrics", {})
158
+ default_label_factor = 1.15 if not use_mono else 1.0
159
+ default_value_factor = 1.10 if not use_mono else 1.0
160
+ lw *= tm.get("badge_label_width_factor", default_label_factor)
161
+ vw *= tm.get("badge_value_width_factor", default_value_factor)
155
162
 
156
163
  has_glyph = bool(spec.glyph or spec.custom_glyph_svg)
157
164
 
@@ -211,6 +211,19 @@ class GenomeSpec(BaseModel):
211
211
  description="Material hints: surface (matte/gloss), depth, filter_chain",
212
212
  )
213
213
 
214
+ # -- Text metrics (optional, per-zone width factors for empirical calibration) --
215
+ # The text-measurement LUT is Inter-calibrated; genomes that render with wider
216
+ # fonts (e.g. Orbitron 900 for chrome-horizon badge values) declare a
217
+ # post-measurement multiplier per zone. Defaults preserve pre-v0.2.3 behavior
218
+ # (1.0 for mono, 1.10-1.15 for non-mono via the resolver fallback).
219
+ # Known zone keys: badge_label_width_factor, badge_value_width_factor.
220
+ # Future zones (strip_value_width_factor, banner_hero_width_factor, etc.) can
221
+ # be added without schema change.
222
+ text_metrics: dict[str, float] = Field(
223
+ default_factory=dict,
224
+ description="Per-zone text width multipliers (e.g. badge_value_width_factor=1.35 for Orbitron)",
225
+ )
226
+
214
227
  # -- Kinetic cascade (optional, motion timing + compatible vocab) --
215
228
  motion_config: dict[str, Any] = Field(
216
229
  default_factory=dict,
@@ -119,6 +119,10 @@
119
119
  "hero_weight": 900,
120
120
  "weight_hierarchy": "900/700/500/400"
121
121
  },
122
+ "text_metrics": {
123
+ "badge_value_width_factor": 1.35,
124
+ "badge_label_width_factor": 1.0
125
+ },
122
126
  "material": {
123
127
  "surface": "metallic",
124
128
  "depth": "deep",
@@ -45,15 +45,20 @@
45
45
  <stop offset="{{ stop.offset }}" stop-color="{{ stop.color }}"/>
46
46
  {% endfor %}
47
47
  </linearGradient>
48
- {# ── Typography (class-based, matches stats/chart pattern) ── #}
48
+ {# ── Typography (class-based, scaled for 22px compositor badge).
49
+ Magazine specimen uses 11/17 label/value at 200×52; compositor badge is
50
+ 125×22 (~40% of magazine scale), so sizes proportionally compress.
51
+ Design intent preserved: Orbitron replaces Impact for values, skew removed.
52
+ @font-face for bundled WOFF2 emitted so Orbitron actually loads. #}
49
53
  <style>
54
+ {{ font_faces | safe }}
50
55
  .{{ uid }}-label {
51
56
  font-family: var(--dna-font-mono, 'JetBrains Mono', 'SF Mono', monospace);
52
- font-size: 11px; font-weight: 600; letter-spacing: 0.10em;
57
+ font-size: 8px; font-weight: 600; letter-spacing: 0.10em;
53
58
  }
54
59
  .{{ uid }}-value {
55
60
  font-family: var(--dna-font-display, 'Orbitron', 'Space Grotesk', sans-serif);
56
- font-size: 17px; font-weight: 900; letter-spacing: 0.02em;
61
+ font-size: 11px; font-weight: 900; letter-spacing: 0.02em;
57
62
  }
58
63
  </style>
59
64
  <clipPath id="{{ uid }}-clip"><rect width="{{ width }}" height="{{ height }}" rx="{{ chrome_corner | default('4') }}"/></clipPath>
@@ -78,10 +78,12 @@
78
78
  <line x1="{{ (ch_start_x + q * ch_stride) | round(1) }}" y1="{{ ch_baseline + 1.5 }}" x2="{{ (ch_start_x + q * ch_stride) | round(1) }}" y2="{{ ch_baseline + 4 }}" stroke="#A8C0D0" stroke-width="0.4" opacity="0.5"/>
79
79
  {% endfor %}
80
80
 
81
- {# Activity bars — 2-layer vector halo replaces feGaussianBlur so the bars
82
- stay crisp when the SVG is scaled down on mobile (iOS Safari downsamples
83
- filter-rasterized buffers, which fuzzed the 7px-wide bars). #}
84
- <g data-hw-zone="activity-bars">
81
+ {# Activity bars — pure gradient rects, no halo. The magazine's light-cyan
82
+ top edge comes from the `ch-bar` gradient's first stop (#C8DAE6), not a
83
+ feGaussianBlur halo. On mobile, removing the filter eliminates the soft
84
+ blur from rasterized-buffer downsampling; on desktop, the gradient's top
85
+ stop alone carries the icy-highlight aesthetic. #}
86
+ <g data-hw-zone="activity-bars" fill="url(#{{ uid }}-bar)">
85
87
  {% for bar in activity_bars %}
86
88
  {# Zero-count weeks render as 2px stubs; non-zero weeks use sqrt scaling. #}
87
89
  {% if bar.count == 0 %}
@@ -89,17 +91,9 @@
89
91
  {% else %}
90
92
  {% set h = [4, ((bar.count / ch_peak) ** 0.5 * ch_max_h) | int] | max %}
91
93
  {% endif %}
92
- {% set bx = (ch_start_x + loop.index0 * ch_stride) | round(1) %}
93
- {% set by = ch_baseline - h %}
94
- {# Outer halo — soft wide glow #}
95
- <rect x="{{ bx - 2 }}" y="{{ by - 2 }}" width="{{ ch_bar_w + 4 }}" height="{{ h + 4 }}" rx="2"
96
- fill="#A8D4F0" opacity="0.10"/>
97
- {# Inner halo — tighter brighter glow #}
98
- <rect x="{{ bx - 1 }}" y="{{ by - 1 }}" width="{{ ch_bar_w + 2 }}" height="{{ h + 2 }}" rx="1.5"
99
- fill="#A8D4F0" opacity="0.22"/>
100
- {# Bar body — gradient fill #}
101
- <rect x="{{ bx }}" y="{{ by }}" width="{{ ch_bar_w }}" height="{{ h }}" rx="1"
102
- fill="url(#{{ uid }}-bar)" shape-rendering="geometricPrecision"/>
94
+ <rect x="{{ (ch_start_x + loop.index0 * ch_stride) | round(1) }}" y="{{ ch_baseline - h }}"
95
+ width="{{ ch_bar_w }}" height="{{ h }}" rx="1"
96
+ shape-rendering="geometricPrecision"/>
103
97
  {% endfor %}
104
98
  </g>
105
99
 
@@ -67,6 +67,7 @@
67
67
  keeps shields.io-style Impact+skew but with silver hero gradient fill tying it
68
68
  visually to stats/chart hero numbers. #}
69
69
  <style>
70
+ {{ font_faces | safe }}
70
71
  .{{ uid }}-identity {
71
72
  font-family: var(--dna-font-mono, 'JetBrains Mono', monospace);
72
73
  font-size: 11px; font-weight: 900; letter-spacing: 0.18em;
@@ -72,11 +72,11 @@ def test_parse_streak_grace_day_for_empty_today() -> None:
72
72
  '<td class="ContributionCalendar-day" data-date="2025-04-10" data-level="3">&nbsp;</td>'
73
73
  '<td class="ContributionCalendar-day" data-date="2025-04-11" data-level="4">&nbsp;</td>'
74
74
  '<td class="ContributionCalendar-day" data-date="2025-04-12" data-level="0">&nbsp;</td>'
75
- '<tool-tip>No contributions on April 8</tool-tip>'
76
- '<tool-tip>5 contributions on April 9</tool-tip>'
77
- '<tool-tip>12 contributions on April 10</tool-tip>'
78
- '<tool-tip>30 contributions on April 11</tool-tip>'
79
- '<tool-tip>No contributions on April 12</tool-tip>'
75
+ "<tool-tip>No contributions on April 8</tool-tip>"
76
+ "<tool-tip>5 contributions on April 9</tool-tip>"
77
+ "<tool-tip>12 contributions on April 10</tool-tip>"
78
+ "<tool-tip>30 contributions on April 11</tool-tip>"
79
+ "<tool-tip>No contributions on April 12</tool-tip>"
80
80
  )
81
81
  parsed = parse_contribution_html(html)
82
82
  # Today (Apr 12) is empty → grace. Apr 11 (30), Apr 10 (12), Apr 9 (5) are
@@ -90,9 +90,9 @@ def test_parse_streak_two_consecutive_zeros_break() -> None:
90
90
  '<td class="ContributionCalendar-day" data-date="2025-04-10" data-level="3">&nbsp;</td>'
91
91
  '<td class="ContributionCalendar-day" data-date="2025-04-11" data-level="0">&nbsp;</td>'
92
92
  '<td class="ContributionCalendar-day" data-date="2025-04-12" data-level="0">&nbsp;</td>'
93
- '<tool-tip>12 contributions on April 10</tool-tip>'
94
- '<tool-tip>No contributions on April 11</tool-tip>'
95
- '<tool-tip>No contributions on April 12</tool-tip>'
93
+ "<tool-tip>12 contributions on April 10</tool-tip>"
94
+ "<tool-tip>No contributions on April 11</tool-tip>"
95
+ "<tool-tip>No contributions on April 12</tool-tip>"
96
96
  )
97
97
  parsed = parse_contribution_html(html)
98
98
  # Today (Apr 12) is grace-zero, Apr 11 is also zero → streak breaks.
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes