fullbleed 2.2.0__tar.gz → 2.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 (186) hide show
  1. {fullbleed-2.2.0 → fullbleed-2.2.3}/Cargo.lock +9 -2
  2. {fullbleed-2.2.0 → fullbleed-2.2.3}/Cargo.toml +3 -2
  3. {fullbleed-2.2.0 → fullbleed-2.2.3}/PKG-INFO +23 -3
  4. {fullbleed-2.2.0 → fullbleed-2.2.3}/README.md +22 -2
  5. {fullbleed-2.2.0 → fullbleed-2.2.3}/crates/fullbleed_audit_contract/Cargo.lock +1 -1
  6. {fullbleed-2.2.0 → fullbleed-2.2.3}/crates/fullbleed_audit_contract/Cargo.toml +1 -1
  7. {fullbleed-2.2.0 → fullbleed-2.2.3}/crates/fullbleed_audit_contract/src/lib.rs +52 -15
  8. {fullbleed-2.2.0 → fullbleed-2.2.3}/pyproject.toml +1 -1
  9. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed/ui/core.py +5 -1
  10. fullbleed-2.2.3/src/canvas.rs +1852 -0
  11. fullbleed-2.2.3/src/doc_context.rs +89 -0
  12. {fullbleed-2.2.0 → fullbleed-2.2.3}/src/doc_template.rs +395 -81
  13. {fullbleed-2.2.0 → fullbleed-2.2.3}/src/flowable.rs +26742 -11451
  14. {fullbleed-2.2.0 → fullbleed-2.2.3}/src/font.rs +315 -60
  15. {fullbleed-2.2.0 → fullbleed-2.2.3}/src/frame.rs +89 -14
  16. {fullbleed-2.2.0 → fullbleed-2.2.3}/src/html.rs +4076 -318
  17. {fullbleed-2.2.0 → fullbleed-2.2.3}/src/image_native.rs +344 -127
  18. {fullbleed-2.2.0 → fullbleed-2.2.3}/src/jit.rs +56 -0
  19. {fullbleed-2.2.0 → fullbleed-2.2.3}/src/lib.rs +3860 -143
  20. {fullbleed-2.2.0 → fullbleed-2.2.3}/src/native_shape.rs +52 -7
  21. {fullbleed-2.2.0 → fullbleed-2.2.3}/src/page_template.rs +58 -1
  22. {fullbleed-2.2.0 → fullbleed-2.2.3}/src/pdf.rs +2219 -185
  23. {fullbleed-2.2.0 → fullbleed-2.2.3}/src/pdf_raster.rs +1 -0
  24. {fullbleed-2.2.0 → fullbleed-2.2.3}/src/python/abi_exports.rs +8 -0
  25. {fullbleed-2.2.0 → fullbleed-2.2.3}/src/python.rs +2 -1
  26. {fullbleed-2.2.0 → fullbleed-2.2.3}/src/raster.rs +1961 -136
  27. {fullbleed-2.2.0 → fullbleed-2.2.3}/src/raster_native.rs +148 -12
  28. {fullbleed-2.2.0 → fullbleed-2.2.3}/src/sfnt.rs +35 -0
  29. {fullbleed-2.2.0 → fullbleed-2.2.3}/src/spill.rs +695 -18
  30. {fullbleed-2.2.0 → fullbleed-2.2.3}/src/style.rs +5012 -309
  31. {fullbleed-2.2.0 → fullbleed-2.2.3}/src/svg.rs +21 -25
  32. {fullbleed-2.2.0 → fullbleed-2.2.3}/src/text_shape.rs +121 -11
  33. {fullbleed-2.2.0 → fullbleed-2.2.3}/src/types.rs +100 -0
  34. fullbleed-2.2.0/src/canvas.rs +0 -918
  35. fullbleed-2.2.0/src/doc_context.rs +0 -14
  36. {fullbleed-2.2.0 → fullbleed-2.2.3}/COPYRIGHT +0 -0
  37. {fullbleed-2.2.0 → fullbleed-2.2.3}/FONT_LICENSE_AUDIT.json +0 -0
  38. {fullbleed-2.2.0 → fullbleed-2.2.3}/FONT_LICENSE_AUDIT.md +0 -0
  39. {fullbleed-2.2.0 → fullbleed-2.2.3}/LICENSE +0 -0
  40. {fullbleed-2.2.0 → fullbleed-2.2.3}/LICENSING.md +0 -0
  41. {fullbleed-2.2.0 → fullbleed-2.2.3}/THIRD_PARTY_LICENSES.md +0 -0
  42. {fullbleed-2.2.0 → fullbleed-2.2.3}/build.rs +0 -0
  43. {fullbleed-2.2.0 → fullbleed-2.2.3}/build_backend/fullbleed_build_backend.py +0 -0
  44. {fullbleed-2.2.0 → fullbleed-2.2.3}/crates/fullbleed_audit_contract/LICENSE +0 -0
  45. {fullbleed-2.2.0 → fullbleed-2.2.3}/crates/fullbleed_audit_contract/README.md +0 -0
  46. {fullbleed-2.2.0 → fullbleed-2.2.3}/crates/fullbleed_audit_contract/specs/fullbleed.audit_registry.v1.yaml +0 -0
  47. {fullbleed-2.2.0 → fullbleed-2.2.3}/crates/fullbleed_audit_contract/specs/section508_html_registry.v1.yaml +0 -0
  48. {fullbleed-2.2.0 → fullbleed-2.2.3}/crates/fullbleed_audit_contract/specs/wcag20aa_registry.v1.yaml +0 -0
  49. {fullbleed-2.2.0 → fullbleed-2.2.3}/crates/fullbleed_audit_contract/src/json.rs +0 -0
  50. {fullbleed-2.2.0 → fullbleed-2.2.3}/crates/fullbleed_audit_contract/src/sha256.rs +0 -0
  51. {fullbleed-2.2.0 → fullbleed-2.2.3}/docs/specs/fullbleed.a11y.verify.v1.schema.json +0 -0
  52. {fullbleed-2.2.0 → fullbleed-2.2.3}/docs/specs/fullbleed.audit_registry.v1.yaml +0 -0
  53. {fullbleed-2.2.0 → fullbleed-2.2.3}/docs/specs/fullbleed.pmr.v1.schema.json +0 -0
  54. {fullbleed-2.2.0 → fullbleed-2.2.3}/docs/specs/section508_html_registry.v1.yaml +0 -0
  55. {fullbleed-2.2.0 → fullbleed-2.2.3}/docs/specs/wcag20aa_registry.v1.yaml +0 -0
  56. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed/__init__.py +0 -0
  57. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed/__main__.py +0 -0
  58. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed/_abi.py +0 -0
  59. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed/accessibility/__init__.py +0 -0
  60. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed/accessibility/engine.py +0 -0
  61. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed/accessibility/runtime.py +0 -0
  62. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed/accessibility/types.py +0 -0
  63. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed/audit_prototype.py +0 -0
  64. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed/audit_section508.py +0 -0
  65. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed/audit_wcag.py +0 -0
  66. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed/ui/__init__.py +0 -0
  67. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed/ui/accessibility.py +0 -0
  68. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed/ui/cav/__init__.py +0 -0
  69. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed/ui/cav/_core.py +0 -0
  70. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed/ui/cav/agency_letter.py +0 -0
  71. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed/ui/cav/court_motion_form.py +0 -0
  72. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed/ui/cav/declaration_form.py +0 -0
  73. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed/ui/cav/instruction_sheet.py +0 -0
  74. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed/ui/cav/investment_portfolio_report.py +0 -0
  75. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed/ui/cav/marriage_record.py +0 -0
  76. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed/ui/cav/profiles.py +0 -0
  77. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed/ui/cav/recorded_plat.py +0 -0
  78. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed/ui/cav/redaction_request_form.py +0 -0
  79. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed/ui/cav/warranty_deed.py +0 -0
  80. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed/ui/primitives.py +0 -0
  81. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed/ui/style.py +0 -0
  82. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_assets/__init__.py +0 -0
  83. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_assets/bootstrap.min.css +0 -0
  84. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_assets/fonts/Inter-Variable.ttf +0 -0
  85. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_assets/fonts/NotoSans-Regular.ttf +0 -0
  86. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_assets/fonts/NotoSansMath-Regular.ttf +0 -0
  87. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_assets/fonts/NotoSansSymbols-Regular.ttf +0 -0
  88. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_assets/fonts/NotoSansSymbols2-Regular.ttf +0 -0
  89. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_assets/icons/bootstrap-icons.svg +0 -0
  90. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/__init__.py +0 -0
  91. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/__main__.py +0 -0
  92. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/assets.py +0 -0
  93. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/cache.py +0 -0
  94. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/cli.py +0 -0
  95. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/finalize.py +0 -0
  96. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold.py +0 -0
  97. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/__init__.py +0 -0
  98. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/init/.gitignore +0 -0
  99. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/init/COMPLIANCE.md +0 -0
  100. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/init/SCAFFOLDING.md +0 -0
  101. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/init/components/__init__.py +0 -0
  102. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/init/components/body.py +0 -0
  103. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/init/components/fb_ui.py +0 -0
  104. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/init/components/footer.py +0 -0
  105. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/init/components/header.py +0 -0
  106. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/init/components/primitives.py +0 -0
  107. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/init/components/styles/body.css +0 -0
  108. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/init/components/styles/footer.css +0 -0
  109. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/init/components/styles/header.css +0 -0
  110. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/init/components/styles/primitives.css +0 -0
  111. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/init/report.py +0 -0
  112. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/init/styles/report.css +0 -0
  113. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/init/styles/tokens.css +0 -0
  114. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/accessible/README.md +0 -0
  115. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/accessible/output/.gitignore +0 -0
  116. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/accessible/output/.gitkeep +0 -0
  117. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/accessible/report.py +0 -0
  118. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/accessible/styles/report.css +0 -0
  119. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/accessible/vendor/fonts/Inter-Variable.ttf +0 -0
  120. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/invoice/output/.gitignore +0 -0
  121. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/invoice/output/.gitkeep +0 -0
  122. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/invoice/report.py +0 -0
  123. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/invoice/templates/invoice.css +0 -0
  124. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/invoice/templates/invoice.html +0 -0
  125. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/reference/COMPLIANCE.md +0 -0
  126. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/reference/README.md +0 -0
  127. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/reference/SCAFFOLDING.md +0 -0
  128. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/reference/assets/brand-mark.svg +0 -0
  129. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/reference/assets/reference-pattern.svg +0 -0
  130. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/reference/components/__init__.py +0 -0
  131. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/reference/components/appendix.py +0 -0
  132. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/reference/components/architecture.py +0 -0
  133. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/reference/components/cover.py +0 -0
  134. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/reference/components/data_pages.py +0 -0
  135. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/reference/components/fb_ui.py +0 -0
  136. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/reference/components/primitives.py +0 -0
  137. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/reference/components/styles/appendix.css +0 -0
  138. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/reference/components/styles/architecture.css +0 -0
  139. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/reference/components/styles/cover.css +0 -0
  140. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/reference/components/styles/data.css +0 -0
  141. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/reference/components/styles/primitives.css +0 -0
  142. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/reference/components/styles/visuals.css +0 -0
  143. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/reference/components/visuals.py +0 -0
  144. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/reference/data/reference.json +0 -0
  145. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/reference/output/.gitignore +0 -0
  146. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/reference/report.py +0 -0
  147. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/reference/styles/report.css +0 -0
  148. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/reference/styles/tokens.css +0 -0
  149. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/statement/output/.gitignore +0 -0
  150. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/statement/output/.gitkeep +0 -0
  151. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/statement/report.py +0 -0
  152. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/statement/templates/statement.css +0 -0
  153. {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/statement/templates/statement.html +0 -0
  154. {fullbleed-2.2.0 → fullbleed-2.2.3}/src/assets.rs +0 -0
  155. {fullbleed-2.2.0 → fullbleed-2.2.3}/src/base64.rs +0 -0
  156. {fullbleed-2.2.0 → fullbleed-2.2.3}/src/css_native.rs +0 -0
  157. {fullbleed-2.2.0 → fullbleed-2.2.3}/src/css_queries.rs +0 -0
  158. {fullbleed-2.2.0 → fullbleed-2.2.3}/src/debug.rs +0 -0
  159. {fullbleed-2.2.0 → fullbleed-2.2.3}/src/error.rs +0 -0
  160. {fullbleed-2.2.0 → fullbleed-2.2.3}/src/finalize.rs +0 -0
  161. {fullbleed-2.2.0 → fullbleed-2.2.3}/src/flate_native.rs +0 -0
  162. {fullbleed-2.2.0 → fullbleed-2.2.3}/src/font_subset.rs +0 -0
  163. {fullbleed-2.2.0 → fullbleed-2.2.3}/src/glyph_report.rs +0 -0
  164. {fullbleed-2.2.0 → fullbleed-2.2.3}/src/html_dom.rs +0 -0
  165. {fullbleed-2.2.0 → fullbleed-2.2.3}/src/html_entities.rs +0 -0
  166. {fullbleed-2.2.0 → fullbleed-2.2.3}/src/html_entities_0.rs +0 -0
  167. {fullbleed-2.2.0 → fullbleed-2.2.3}/src/html_entities_1.rs +0 -0
  168. {fullbleed-2.2.0 → fullbleed-2.2.3}/src/html_entities_2.rs +0 -0
  169. {fullbleed-2.2.0 → fullbleed-2.2.3}/src/html_entities_3.rs +0 -0
  170. {fullbleed-2.2.0 → fullbleed-2.2.3}/src/html_entities_4.rs +0 -0
  171. {fullbleed-2.2.0 → fullbleed-2.2.3}/src/html_entities_5.rs +0 -0
  172. {fullbleed-2.2.0 → fullbleed-2.2.3}/src/jpeg_native.rs +0 -0
  173. {fullbleed-2.2.0 → fullbleed-2.2.3}/src/math.rs +0 -0
  174. {fullbleed-2.2.0 → fullbleed-2.2.3}/src/metrics.rs +0 -0
  175. {fullbleed-2.2.0 → fullbleed-2.2.3}/src/page_data.rs +0 -0
  176. {fullbleed-2.2.0 → fullbleed-2.2.3}/src/parallel.rs +0 -0
  177. {fullbleed-2.2.0 → fullbleed-2.2.3}/src/pdf_encodings.rs +0 -0
  178. {fullbleed-2.2.0 → fullbleed-2.2.3}/src/pdf_native.rs +0 -0
  179. {fullbleed-2.2.0 → fullbleed-2.2.3}/src/pdfinspect.rs +0 -0
  180. {fullbleed-2.2.0 → fullbleed-2.2.3}/src/perf.rs +0 -0
  181. {fullbleed-2.2.0 → fullbleed-2.2.3}/src/plan.rs +0 -0
  182. {fullbleed-2.2.0 → fullbleed-2.2.3}/src/python_abi.rs +0 -0
  183. {fullbleed-2.2.0 → fullbleed-2.2.3}/src/sfnt_cff.rs +0 -0
  184. {fullbleed-2.2.0 → fullbleed-2.2.3}/src/sfnt_outline.rs +0 -0
  185. {fullbleed-2.2.0 → fullbleed-2.2.3}/src/unicode_data.rs +0 -0
  186. {fullbleed-2.2.0 → fullbleed-2.2.3}/src/xml.rs +0 -0
@@ -4,15 +4,16 @@ version = 4
4
4
 
5
5
  [[package]]
6
6
  name = "fullbleed"
7
- version = "2.2.0"
7
+ version = "2.2.3"
8
8
  dependencies = [
9
9
  "fullbleed_audit_contract",
10
10
  "subsetter",
11
+ "unicode-bidi",
11
12
  ]
12
13
 
13
14
  [[package]]
14
15
  name = "fullbleed_audit_contract"
15
- version = "0.1.2"
16
+ version = "0.1.3"
16
17
 
17
18
  [[package]]
18
19
  name = "rustc-hash"
@@ -28,3 +29,9 @@ checksum = "38803281d1c23166c5ebcb455439a5d2afe711cc909cf88af72448c297756ad6"
28
29
  dependencies = [
29
30
  "rustc-hash",
30
31
  ]
32
+
33
+ [[package]]
34
+ name = "unicode-bidi"
35
+ version = "0.3.18"
36
+ source = "registry+https://github.com/rust-lang/crates.io-index"
37
+ checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5"
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "fullbleed"
3
- version = "2.2.0"
3
+ version = "2.2.3"
4
4
  edition = "2024"
5
5
  rust-version = "1.85"
6
6
  license = "MIT"
@@ -37,5 +37,6 @@ inherits = "release"
37
37
  debug = true
38
38
 
39
39
  [dependencies]
40
- fullbleed_audit_contract = { version = "0.1.2", path = "crates/fullbleed_audit_contract" }
40
+ fullbleed_audit_contract = { version = "0.1.3", path = "crates/fullbleed_audit_contract" }
41
41
  subsetter = { version = "0.2.6", default-features = false }
42
+ unicode-bidi = "0.3.18"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fullbleed
3
- Version: 2.2.0
3
+ Version: 2.2.3
4
4
  Classifier: Development Status :: 5 - Production/Stable
5
5
  Classifier: License :: OSI Approved :: MIT License
6
6
  Classifier: Operating System :: MacOS
@@ -125,6 +125,10 @@ markers, deterministic bytes, and equal buffer/file SHA-256. Reproduce it with:
125
125
  python tools/benchmark_fullbleed_vdp.py --records 100000 --repeats 5
126
126
  ```
127
127
 
128
+ Fixed-geometry slots may remain inside immutable page-space transforms and clips. The compiler
129
+ captures that active coordinate-state program once and replays it in each compact record overlay;
130
+ it does not rerun layout or clone the complete page display list.
131
+
128
132
  The fixed-copy result remains scoped to identical content; the variable-data result is scoped to
129
133
  paint-only text whose geometry does not reflow. Neither is a claim that arbitrary new HTML or
130
134
  size-changing records render 200x faster. See
@@ -143,7 +147,7 @@ python -m pip install fullbleed
143
147
  From a local wheel:
144
148
 
145
149
  ```bash
146
- python -m pip install C:\path\to\fullbleed-2.2.0-cp310-abi3-win_amd64.whl
150
+ python -m pip install C:\path\to\fullbleed-2.2.3-cp310-abi3-win_amd64.whl
147
151
  ```
148
152
 
149
153
  From a source checkout with Rust installed, no Python build package is needed:
@@ -194,7 +198,9 @@ vendors `inter` into `vendor/fonts/Inter-Variable.ttf`, writes license notices
194
198
  and seeds `assets.lock.json` with pinned hashes.
195
199
  The scaffolded `report.py` also runs a component mount smoke validation before
196
200
  main render and writes `output/component_mount_validation.json` (fails fast on
197
- missing glyphs, placement overflow, or CSS miss signals parsed from debug logs).
201
+ missing glyphs, actual pagination overflow, or CSS miss signals). On current engines,
202
+ render-time pagination is authoritative for overflow; conservative JIT placement bounds
203
+ remain the compatibility fallback for older engines.
198
204
  Scaffolded components now include `components/primitives.py` with reusable
199
205
  layout/content helpers (`Stack`, `Row`, `Text`, table/list helpers, key/value rows, etc.).
200
206
  Each scaffolded project also includes `SCAFFOLDING.md`, which should be your
@@ -789,6 +795,20 @@ Summary as of May 19, 2026:
789
795
  - Canonical validation artifact: `_css_working/tmp/fixture_full_latest.json`
790
796
  - Canonical validation artifact: `_css_working/css_broad_coverage_sprint_s14.md`
791
797
 
798
+ The complete pinned independent Wheel265 gate closed on August 9, 2026 with `1,642 PASS`,
799
+ `0 FAIL`, and `20 REFERENCE-DISPUTED` across 1,662 fixtures. That is strict `100%` parity for
800
+ every adjudicable fixture in this named corpus; disputed references remain visible and are not
801
+ relabeled as implementation passes. Broader web-platform coverage remains bounded by the module
802
+ and known-gap contract in `docs/css-coverage.md`.
803
+
804
+ Flow/reflow hardening validated on August 5, 2026 adds fixed-height block,
805
+ one-column grid, and column-flex continuation slicing; avoids content
806
+ duplication; retains empty styled captions inside avoided figures; preserves
807
+ `display: contents` grid paint phase; and keeps positioned containing blocks
808
+ atomic. The independent review's targeted 18-case regression cluster passes
809
+ `18/18` (13 pixel-exact, maximum above-floor difference `0.97030199%`). This
810
+ targeted diagnostic does not replace the full external-corpus report.
811
+
792
812
  Current validated behavior includes first-class parser -> evaluator -> calculator -> layout/paint coverage across broad static-document CSS domains (values math, layout primitives, pagination/fragmentation baselines, transforms phase-1, gradient/effects subsets including color-first and interleaved-color `filter: drop-shadow(...)` with computed lengths, modern `rgb()` shadow colors with `mm` lengths, duplicate `drop-shadow(...)` color rejection, empty optional filter-function defaults, explicit/currentColor `backdrop-filter: drop-shadow(...)` raster paint, strict `box-shadow` length/color grammar with modern `rgb()` plus `mm` paint coverage, softened blurred inset edge paint, and directional inset offset edge paint, overflow-gated `text-overflow: ellipsis`, physical min/max box constraints, horizontal-tb RTL `direction` inline inset/margin/padding/border mapping, vertical writing-mode `direction: rtl` inline inset remapping, vertical-rl logical sizing/insets/margin/padding/border/min-max constraints, vertical-lr logical sizing/min-max/insets/margin/padding/border remapping, basic vertical text columns with `vertical-rl` leftward and `vertical-lr` rightward line progression, and deterministic diagnostics).
793
813
 
794
814
  Known gap categories are explicitly tracked for the final parity push:
@@ -88,6 +88,10 @@ markers, deterministic bytes, and equal buffer/file SHA-256. Reproduce it with:
88
88
  python tools/benchmark_fullbleed_vdp.py --records 100000 --repeats 5
89
89
  ```
90
90
 
91
+ Fixed-geometry slots may remain inside immutable page-space transforms and clips. The compiler
92
+ captures that active coordinate-state program once and replays it in each compact record overlay;
93
+ it does not rerun layout or clone the complete page display list.
94
+
91
95
  The fixed-copy result remains scoped to identical content; the variable-data result is scoped to
92
96
  paint-only text whose geometry does not reflow. Neither is a claim that arbitrary new HTML or
93
97
  size-changing records render 200x faster. See
@@ -106,7 +110,7 @@ python -m pip install fullbleed
106
110
  From a local wheel:
107
111
 
108
112
  ```bash
109
- python -m pip install C:\path\to\fullbleed-2.2.0-cp310-abi3-win_amd64.whl
113
+ python -m pip install C:\path\to\fullbleed-2.2.3-cp310-abi3-win_amd64.whl
110
114
  ```
111
115
 
112
116
  From a source checkout with Rust installed, no Python build package is needed:
@@ -157,7 +161,9 @@ vendors `inter` into `vendor/fonts/Inter-Variable.ttf`, writes license notices
157
161
  and seeds `assets.lock.json` with pinned hashes.
158
162
  The scaffolded `report.py` also runs a component mount smoke validation before
159
163
  main render and writes `output/component_mount_validation.json` (fails fast on
160
- missing glyphs, placement overflow, or CSS miss signals parsed from debug logs).
164
+ missing glyphs, actual pagination overflow, or CSS miss signals). On current engines,
165
+ render-time pagination is authoritative for overflow; conservative JIT placement bounds
166
+ remain the compatibility fallback for older engines.
161
167
  Scaffolded components now include `components/primitives.py` with reusable
162
168
  layout/content helpers (`Stack`, `Row`, `Text`, table/list helpers, key/value rows, etc.).
163
169
  Each scaffolded project also includes `SCAFFOLDING.md`, which should be your
@@ -752,6 +758,20 @@ Summary as of May 19, 2026:
752
758
  - Canonical validation artifact: `_css_working/tmp/fixture_full_latest.json`
753
759
  - Canonical validation artifact: `_css_working/css_broad_coverage_sprint_s14.md`
754
760
 
761
+ The complete pinned independent Wheel265 gate closed on August 9, 2026 with `1,642 PASS`,
762
+ `0 FAIL`, and `20 REFERENCE-DISPUTED` across 1,662 fixtures. That is strict `100%` parity for
763
+ every adjudicable fixture in this named corpus; disputed references remain visible and are not
764
+ relabeled as implementation passes. Broader web-platform coverage remains bounded by the module
765
+ and known-gap contract in `docs/css-coverage.md`.
766
+
767
+ Flow/reflow hardening validated on August 5, 2026 adds fixed-height block,
768
+ one-column grid, and column-flex continuation slicing; avoids content
769
+ duplication; retains empty styled captions inside avoided figures; preserves
770
+ `display: contents` grid paint phase; and keeps positioned containing blocks
771
+ atomic. The independent review's targeted 18-case regression cluster passes
772
+ `18/18` (13 pixel-exact, maximum above-floor difference `0.97030199%`). This
773
+ targeted diagnostic does not replace the full external-corpus report.
774
+
755
775
  Current validated behavior includes first-class parser -> evaluator -> calculator -> layout/paint coverage across broad static-document CSS domains (values math, layout primitives, pagination/fragmentation baselines, transforms phase-1, gradient/effects subsets including color-first and interleaved-color `filter: drop-shadow(...)` with computed lengths, modern `rgb()` shadow colors with `mm` lengths, duplicate `drop-shadow(...)` color rejection, empty optional filter-function defaults, explicit/currentColor `backdrop-filter: drop-shadow(...)` raster paint, strict `box-shadow` length/color grammar with modern `rgb()` plus `mm` paint coverage, softened blurred inset edge paint, and directional inset offset edge paint, overflow-gated `text-overflow: ellipsis`, physical min/max box constraints, horizontal-tb RTL `direction` inline inset/margin/padding/border mapping, vertical writing-mode `direction: rtl` inline inset remapping, vertical-rl logical sizing/insets/margin/padding/border/min-max constraints, vertical-lr logical sizing/min-max/insets/margin/padding/border remapping, basic vertical text columns with `vertical-rl` leftward and `vertical-lr` rightward line progression, and deterministic diagnostics).
756
776
 
757
777
  Known gap categories are explicitly tracked for the final parity push:
@@ -4,4 +4,4 @@ version = 4
4
4
 
5
5
  [[package]]
6
6
  name = "fullbleed_audit_contract"
7
- version = "0.1.2"
7
+ version = "0.1.3"
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "fullbleed_audit_contract"
3
- version = "0.1.2"
3
+ version = "0.1.3"
4
4
  edition = "2024"
5
5
  rust-version = "1.85"
6
6
  license = "MIT"
@@ -298,6 +298,9 @@ fn hash_memoized(cell: &OnceLock<String>, text: &str) -> String {
298
298
  static AUDIT_REGISTRY_HASH: OnceLock<String> = OnceLock::new();
299
299
  static WCAG20AA_REGISTRY_HASH: OnceLock<String> = OnceLock::new();
300
300
  static SECTION508_HTML_REGISTRY_HASH: OnceLock<String> = OnceLock::new();
301
+ static AUDIT_REGISTRY_TEXT: OnceLock<String> = OnceLock::new();
302
+ static WCAG20AA_REGISTRY_TEXT: OnceLock<String> = OnceLock::new();
303
+ static SECTION508_HTML_REGISTRY_TEXT: OnceLock<String> = OnceLock::new();
301
304
  static CONTRACT_FINGERPRINT: OnceLock<String> = OnceLock::new();
302
305
  static AUDIT_REGISTRY_JSON_VALUE: OnceLock<Value> = OnceLock::new();
303
306
  static WCAG20AA_REGISTRY_JSON_VALUE: OnceLock<Value> = OnceLock::new();
@@ -306,23 +309,45 @@ static A11Y_DEFAULT_GATE_LEVELS: OnceLock<BTreeMap<String, String>> = OnceLock::
306
309
  static A11Y_PROFILE_GATE_OVERRIDES: OnceLock<BTreeMap<String, BTreeMap<String, String>>> =
307
310
  OnceLock::new();
308
311
 
312
+ fn canonical_lf(text: &str) -> String {
313
+ text.replace("\r\n", "\n").replace('\r', "\n")
314
+ }
315
+
316
+ fn audit_registry_text() -> &'static str {
317
+ AUDIT_REGISTRY_TEXT
318
+ .get_or_init(|| canonical_lf(AUDIT_REGISTRY_V1_JSON))
319
+ .as_str()
320
+ }
321
+
322
+ fn wcag20aa_registry_text() -> &'static str {
323
+ WCAG20AA_REGISTRY_TEXT
324
+ .get_or_init(|| canonical_lf(WCAG20AA_REGISTRY_V1_JSON))
325
+ .as_str()
326
+ }
327
+
328
+ fn section508_html_registry_text() -> &'static str {
329
+ SECTION508_HTML_REGISTRY_TEXT
330
+ .get_or_init(|| canonical_lf(SECTION508_HTML_REGISTRY_V1_JSON))
331
+ .as_str()
332
+ }
333
+
309
334
  fn audit_registry_value() -> &'static Value {
310
335
  AUDIT_REGISTRY_JSON_VALUE.get_or_init(|| {
311
- json::parse(AUDIT_REGISTRY_V1_JSON)
336
+ json::parse(audit_registry_text())
312
337
  .expect("embedded audit registry must be valid JSON-formatted YAML")
313
338
  })
314
339
  }
315
340
 
316
341
  fn wcag20aa_registry_value() -> &'static Value {
317
342
  WCAG20AA_REGISTRY_JSON_VALUE.get_or_init(|| {
318
- json::parse(WCAG20AA_REGISTRY_V1_JSON)
343
+ json::parse(wcag20aa_registry_text())
319
344
  .expect("embedded wcag20aa registry must be valid JSON-formatted YAML")
320
345
  })
321
346
  }
322
347
 
323
348
  fn section508_html_registry_value() -> &'static Value {
324
349
  SECTION508_HTML_REGISTRY_JSON_VALUE.get_or_init(|| {
325
- json::parse(SECTION508_HTML_REGISTRY_V1_JSON)
350
+ json::parse(section508_html_registry_text())
326
351
  .expect("embedded section508 html registry must be valid JSON-formatted YAML")
327
352
  })
328
353
  }
@@ -350,25 +375,25 @@ fn worst_verdict<'a>(verdicts: impl IntoIterator<Item = &'a str>) -> Option<&'a
350
375
  }
351
376
 
352
377
  pub fn audit_registry_v1_json() -> &'static str {
353
- AUDIT_REGISTRY_V1_JSON
378
+ audit_registry_text()
354
379
  }
355
380
 
356
381
  pub fn wcag20aa_registry_v1_json() -> &'static str {
357
- WCAG20AA_REGISTRY_V1_JSON
382
+ wcag20aa_registry_text()
358
383
  }
359
384
 
360
385
  pub fn audit_registry_v1_hash_sha256() -> String {
361
- hash_memoized(&AUDIT_REGISTRY_HASH, AUDIT_REGISTRY_V1_JSON)
386
+ hash_memoized(&AUDIT_REGISTRY_HASH, audit_registry_text())
362
387
  }
363
388
 
364
389
  pub fn wcag20aa_registry_v1_hash_sha256() -> String {
365
- hash_memoized(&WCAG20AA_REGISTRY_HASH, WCAG20AA_REGISTRY_V1_JSON)
390
+ hash_memoized(&WCAG20AA_REGISTRY_HASH, wcag20aa_registry_text())
366
391
  }
367
392
 
368
393
  pub fn section508_html_registry_v1_hash_sha256() -> String {
369
394
  hash_memoized(
370
395
  &SECTION508_HTML_REGISTRY_HASH,
371
- SECTION508_HTML_REGISTRY_V1_JSON,
396
+ section508_html_registry_text(),
372
397
  )
373
398
  }
374
399
 
@@ -404,15 +429,15 @@ pub fn contract_fingerprint_sha256() -> String {
404
429
 
405
430
  pub fn registry_json(name: &str) -> Option<&'static str> {
406
431
  match name {
407
- AUDIT_REGISTRY_ID => Some(AUDIT_REGISTRY_V1_JSON),
408
- WCAG20AA_REGISTRY_ID => Some(WCAG20AA_REGISTRY_V1_JSON),
409
- SECTION508_HTML_REGISTRY_ID => Some(SECTION508_HTML_REGISTRY_V1_JSON),
432
+ AUDIT_REGISTRY_ID => Some(audit_registry_text()),
433
+ WCAG20AA_REGISTRY_ID => Some(wcag20aa_registry_text()),
434
+ SECTION508_HTML_REGISTRY_ID => Some(section508_html_registry_text()),
410
435
  _ => None,
411
436
  }
412
437
  }
413
438
 
414
439
  pub fn section508_html_registry_v1_json() -> &'static str {
415
- SECTION508_HTML_REGISTRY_V1_JSON
440
+ section508_html_registry_text()
416
441
  }
417
442
 
418
443
  pub fn wcag20aa_coverage_from_rule_verdicts<'a, I>(rule_verdicts: I) -> Wcag20AaCoverageSummary
@@ -860,7 +885,7 @@ pub fn metadata() -> AuditContractMetadata {
860
885
  mod tests {
861
886
  use super::*;
862
887
  fn parse_embedded_audit_registry() -> Value {
863
- json::parse(AUDIT_REGISTRY_V1_JSON).expect("embedded audit registry JSON should parse")
888
+ json::parse(audit_registry_text()).expect("embedded audit registry JSON should parse")
864
889
  }
865
890
 
866
891
  #[test]
@@ -871,7 +896,7 @@ mod tests {
871
896
  );
872
897
  assert_eq!(
873
898
  wcag20aa_registry_v1_hash_sha256(),
874
- "3ff936a514baac7b528b2745ec88c9e8d2b4c52c56bd63b39478a897ac52f30c"
899
+ "108d4e5062ede7c5c3893fff78153a58f35749d2dd9df58173fc2dd0dbcd36b6"
875
900
  );
876
901
  assert_eq!(
877
902
  section508_html_registry_v1_hash_sha256(),
@@ -882,10 +907,22 @@ mod tests {
882
907
  assert_eq!(a, b);
883
908
  assert_eq!(
884
909
  a,
885
- "db3f5de6ea0c6cd5b3c1828c58f2023d093cc4a46c9302c2ac3bed47c5277de5"
910
+ "83123c2d5ff2a8b459326a360e3eeac1134fb1eef4c704c433dadfd3e32606d5"
886
911
  );
887
912
  }
888
913
 
914
+ #[test]
915
+ fn registry_payloads_are_canonical_lf() {
916
+ for id in [
917
+ AUDIT_REGISTRY_ID,
918
+ WCAG20AA_REGISTRY_ID,
919
+ SECTION508_HTML_REGISTRY_ID,
920
+ ] {
921
+ let payload = registry_json(id).expect("known registry should have a payload");
922
+ assert!(!payload.contains('\r'), "{id} contains a carriage return");
923
+ }
924
+ }
925
+
889
926
  #[test]
890
927
  fn registry_lookup_returns_known_payloads() {
891
928
  assert!(
@@ -5,7 +5,7 @@ backend-path = ["build_backend"]
5
5
 
6
6
  [project]
7
7
  name = "fullbleed"
8
- version = "2.2.0"
8
+ version = "2.2.3"
9
9
  description = "Deterministic static HTML/CSS-to-PDF renderer built in Rust"
10
10
  readme = "README.md"
11
11
  requires-python = ">=3.10"
@@ -885,7 +885,11 @@ def validate_component_mount(
885
885
  asset_unresolved_count = int(asset_summary.get("unresolved_count") or 0)
886
886
  asset_unsupported_count = int(asset_summary.get("unsupported_count") or 0)
887
887
  asset_reference_count = int(asset_summary.get("image_reference_count") or 0)
888
- if pagination_overflow_count > overflow_count:
888
+ # The native pagination trace describes layout overflow directly. Legacy
889
+ # JIT placement bounds are a fallback for older engines and can be wider
890
+ # than the painted glyph outlines because glyph runs use conservative
891
+ # diagnostic padding.
892
+ if pagination_trace_available:
889
893
  overflow_count = pagination_overflow_count
890
894
  overflow_samples = pagination_overflow_samples
891
895
  if pagination_trace_available: