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.
- {fullbleed-2.2.0 → fullbleed-2.2.3}/Cargo.lock +9 -2
- {fullbleed-2.2.0 → fullbleed-2.2.3}/Cargo.toml +3 -2
- {fullbleed-2.2.0 → fullbleed-2.2.3}/PKG-INFO +23 -3
- {fullbleed-2.2.0 → fullbleed-2.2.3}/README.md +22 -2
- {fullbleed-2.2.0 → fullbleed-2.2.3}/crates/fullbleed_audit_contract/Cargo.lock +1 -1
- {fullbleed-2.2.0 → fullbleed-2.2.3}/crates/fullbleed_audit_contract/Cargo.toml +1 -1
- {fullbleed-2.2.0 → fullbleed-2.2.3}/crates/fullbleed_audit_contract/src/lib.rs +52 -15
- {fullbleed-2.2.0 → fullbleed-2.2.3}/pyproject.toml +1 -1
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed/ui/core.py +5 -1
- fullbleed-2.2.3/src/canvas.rs +1852 -0
- fullbleed-2.2.3/src/doc_context.rs +89 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/src/doc_template.rs +395 -81
- {fullbleed-2.2.0 → fullbleed-2.2.3}/src/flowable.rs +26742 -11451
- {fullbleed-2.2.0 → fullbleed-2.2.3}/src/font.rs +315 -60
- {fullbleed-2.2.0 → fullbleed-2.2.3}/src/frame.rs +89 -14
- {fullbleed-2.2.0 → fullbleed-2.2.3}/src/html.rs +4076 -318
- {fullbleed-2.2.0 → fullbleed-2.2.3}/src/image_native.rs +344 -127
- {fullbleed-2.2.0 → fullbleed-2.2.3}/src/jit.rs +56 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/src/lib.rs +3860 -143
- {fullbleed-2.2.0 → fullbleed-2.2.3}/src/native_shape.rs +52 -7
- {fullbleed-2.2.0 → fullbleed-2.2.3}/src/page_template.rs +58 -1
- {fullbleed-2.2.0 → fullbleed-2.2.3}/src/pdf.rs +2219 -185
- {fullbleed-2.2.0 → fullbleed-2.2.3}/src/pdf_raster.rs +1 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/src/python/abi_exports.rs +8 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/src/python.rs +2 -1
- {fullbleed-2.2.0 → fullbleed-2.2.3}/src/raster.rs +1961 -136
- {fullbleed-2.2.0 → fullbleed-2.2.3}/src/raster_native.rs +148 -12
- {fullbleed-2.2.0 → fullbleed-2.2.3}/src/sfnt.rs +35 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/src/spill.rs +695 -18
- {fullbleed-2.2.0 → fullbleed-2.2.3}/src/style.rs +5012 -309
- {fullbleed-2.2.0 → fullbleed-2.2.3}/src/svg.rs +21 -25
- {fullbleed-2.2.0 → fullbleed-2.2.3}/src/text_shape.rs +121 -11
- {fullbleed-2.2.0 → fullbleed-2.2.3}/src/types.rs +100 -0
- fullbleed-2.2.0/src/canvas.rs +0 -918
- fullbleed-2.2.0/src/doc_context.rs +0 -14
- {fullbleed-2.2.0 → fullbleed-2.2.3}/COPYRIGHT +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/FONT_LICENSE_AUDIT.json +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/FONT_LICENSE_AUDIT.md +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/LICENSE +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/LICENSING.md +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/THIRD_PARTY_LICENSES.md +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/build.rs +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/build_backend/fullbleed_build_backend.py +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/crates/fullbleed_audit_contract/LICENSE +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/crates/fullbleed_audit_contract/README.md +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/crates/fullbleed_audit_contract/specs/fullbleed.audit_registry.v1.yaml +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/crates/fullbleed_audit_contract/specs/section508_html_registry.v1.yaml +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/crates/fullbleed_audit_contract/specs/wcag20aa_registry.v1.yaml +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/crates/fullbleed_audit_contract/src/json.rs +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/crates/fullbleed_audit_contract/src/sha256.rs +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/docs/specs/fullbleed.a11y.verify.v1.schema.json +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/docs/specs/fullbleed.audit_registry.v1.yaml +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/docs/specs/fullbleed.pmr.v1.schema.json +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/docs/specs/section508_html_registry.v1.yaml +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/docs/specs/wcag20aa_registry.v1.yaml +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed/__init__.py +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed/__main__.py +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed/_abi.py +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed/accessibility/__init__.py +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed/accessibility/engine.py +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed/accessibility/runtime.py +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed/accessibility/types.py +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed/audit_prototype.py +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed/audit_section508.py +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed/audit_wcag.py +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed/ui/__init__.py +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed/ui/accessibility.py +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed/ui/cav/__init__.py +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed/ui/cav/_core.py +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed/ui/cav/agency_letter.py +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed/ui/cav/court_motion_form.py +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed/ui/cav/declaration_form.py +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed/ui/cav/instruction_sheet.py +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed/ui/cav/investment_portfolio_report.py +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed/ui/cav/marriage_record.py +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed/ui/cav/profiles.py +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed/ui/cav/recorded_plat.py +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed/ui/cav/redaction_request_form.py +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed/ui/cav/warranty_deed.py +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed/ui/primitives.py +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed/ui/style.py +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_assets/__init__.py +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_assets/bootstrap.min.css +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_assets/fonts/Inter-Variable.ttf +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_assets/fonts/NotoSans-Regular.ttf +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_assets/fonts/NotoSansMath-Regular.ttf +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_assets/fonts/NotoSansSymbols-Regular.ttf +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_assets/fonts/NotoSansSymbols2-Regular.ttf +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_assets/icons/bootstrap-icons.svg +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/__init__.py +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/__main__.py +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/assets.py +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/cache.py +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/cli.py +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/finalize.py +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold.py +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/__init__.py +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/init/.gitignore +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/init/COMPLIANCE.md +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/init/SCAFFOLDING.md +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/init/components/__init__.py +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/init/components/body.py +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/init/components/fb_ui.py +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/init/components/footer.py +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/init/components/header.py +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/init/components/primitives.py +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/init/components/styles/body.css +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/init/components/styles/footer.css +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/init/components/styles/header.css +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/init/components/styles/primitives.css +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/init/report.py +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/init/styles/report.css +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/init/styles/tokens.css +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/accessible/README.md +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/accessible/output/.gitignore +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/accessible/output/.gitkeep +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/accessible/report.py +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/accessible/styles/report.css +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/accessible/vendor/fonts/Inter-Variable.ttf +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/invoice/output/.gitignore +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/invoice/output/.gitkeep +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/invoice/report.py +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/invoice/templates/invoice.css +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/invoice/templates/invoice.html +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/reference/COMPLIANCE.md +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/reference/README.md +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/reference/SCAFFOLDING.md +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/reference/assets/brand-mark.svg +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/reference/assets/reference-pattern.svg +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/reference/components/__init__.py +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/reference/components/appendix.py +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/reference/components/architecture.py +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/reference/components/cover.py +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/reference/components/data_pages.py +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/reference/components/fb_ui.py +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/reference/components/primitives.py +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/reference/components/styles/appendix.css +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/reference/components/styles/architecture.css +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/reference/components/styles/cover.css +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/reference/components/styles/data.css +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/reference/components/styles/primitives.css +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/reference/components/styles/visuals.css +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/reference/components/visuals.py +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/reference/data/reference.json +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/reference/output/.gitignore +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/reference/report.py +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/reference/styles/report.css +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/reference/styles/tokens.css +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/statement/output/.gitignore +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/statement/output/.gitkeep +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/statement/report.py +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/statement/templates/statement.css +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/python/fullbleed_cli/scaffold_templates/new/statement/templates/statement.html +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/src/assets.rs +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/src/base64.rs +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/src/css_native.rs +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/src/css_queries.rs +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/src/debug.rs +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/src/error.rs +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/src/finalize.rs +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/src/flate_native.rs +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/src/font_subset.rs +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/src/glyph_report.rs +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/src/html_dom.rs +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/src/html_entities.rs +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/src/html_entities_0.rs +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/src/html_entities_1.rs +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/src/html_entities_2.rs +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/src/html_entities_3.rs +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/src/html_entities_4.rs +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/src/html_entities_5.rs +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/src/jpeg_native.rs +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/src/math.rs +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/src/metrics.rs +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/src/page_data.rs +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/src/parallel.rs +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/src/pdf_encodings.rs +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/src/pdf_native.rs +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/src/pdfinspect.rs +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/src/perf.rs +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/src/plan.rs +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/src/python_abi.rs +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/src/sfnt_cff.rs +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/src/sfnt_outline.rs +0 -0
- {fullbleed-2.2.0 → fullbleed-2.2.3}/src/unicode_data.rs +0 -0
- {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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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,
|
|
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.
|
|
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,
|
|
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:
|
|
@@ -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(
|
|
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(
|
|
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(
|
|
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
|
-
|
|
378
|
+
audit_registry_text()
|
|
354
379
|
}
|
|
355
380
|
|
|
356
381
|
pub fn wcag20aa_registry_v1_json() -> &'static str {
|
|
357
|
-
|
|
382
|
+
wcag20aa_registry_text()
|
|
358
383
|
}
|
|
359
384
|
|
|
360
385
|
pub fn audit_registry_v1_hash_sha256() -> String {
|
|
361
|
-
hash_memoized(&AUDIT_REGISTRY_HASH,
|
|
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,
|
|
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
|
-
|
|
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(
|
|
408
|
-
WCAG20AA_REGISTRY_ID => Some(
|
|
409
|
-
SECTION508_HTML_REGISTRY_ID => Some(
|
|
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
|
-
|
|
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(
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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!(
|
|
@@ -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
|
-
|
|
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:
|