diff --git a/.gitattributes b/.gitattributes
index 49fbf25..de3dc4e 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -135,3 +135,20 @@ examples/accessible-showcase-alpha5/fonts/*.ttf binary
docs/assets/accessible-showcase-alpha5/** -text whitespace=cr-at-eol
docs/assets/accessible-showcase-alpha5/*.pdf binary
docs/assets/accessible-showcase-alpha5/fonts/*.ttf binary
+
+# Alpha 6 download hashes cover exact source and evidence bytes on every OS.
+examples/component-notebook-alpha6/** text eol=lf
+docs/assets/component-notebook-alpha6/** -text
+docs/assets/component-notebook-alpha6/*.pdf binary
+examples/bootstrap-alpha6/** -text whitespace=cr-at-eol
+docs/assets/bootstrap-alpha6/** -text
+docs/assets/bootstrap-alpha6/*.pdf binary
+examples/showcase-authoring-alpha6/** -text whitespace=cr-at-eol
+examples/showcase-authoring-alpha6/**/fonts/*-OFL.txt -whitespace
+docs/assets/showcase-authoring-alpha6/** -text whitespace=cr-at-eol
+docs/assets/showcase-authoring-alpha6/*.pdf binary
+examples/accessible-showcase-alpha6/** -text
+examples/accessible-showcase-alpha6/fonts/*.ttf binary
+docs/assets/accessible-showcase-alpha6/** -text whitespace=cr-at-eol
+docs/assets/accessible-showcase-alpha6/*.pdf binary
+docs/assets/accessible-showcase-alpha6/fonts/*.ttf binary
diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml
index 9b8d406..74f3577 100644
--- a/.github/workflows/docs.yml
+++ b/.github/workflows/docs.yml
@@ -21,18 +21,18 @@ jobs:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest]
- channel: [alpha4, alpha5]
+ channel: [alpha4, alpha5, alpha6]
steps:
- uses: actions/checkout@v7
- uses: actions/setup-python@v6
with:
python-version: '3.12'
- run: |
- python -m pip install --only-binary=:all: -r examples/accessible-showcase${{ matrix.channel == 'alpha5' && '-alpha5' || '' }}/requirements-check.txt
+ python -m pip install --only-binary=:all: -r examples/accessible-showcase${{ matrix.channel != 'alpha4' && format('-{0}', matrix.channel) || '' }}/requirements-check.txt
- name: Rebuild the source kit and reproduce the externally validated PDF
run: |
python tools/build_accessible_showcase.py --channel ${{ matrix.channel }}
- git diff --exit-code -- docs/assets/accessible-showcase${{ matrix.channel == 'alpha5' && '-alpha5' || '' }}/project.zip docs/assets/accessible-showcase${{ matrix.channel == 'alpha5' && '-alpha5' || '' }}/source.json
+ git diff --exit-code -- docs/assets/accessible-showcase${{ matrix.channel != 'alpha4' && format('-{0}', matrix.channel) || '' }}/project.zip docs/assets/accessible-showcase${{ matrix.channel != 'alpha4' && format('-{0}', matrix.channel) || '' }}/source.json
python tools/verify_accessible_showcase.py --channel ${{ matrix.channel }} --out target/accessible-showcase
- uses: actions/upload-artifact@v4
if: always()
@@ -48,19 +48,19 @@ jobs:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest]
- channel: [alpha4, alpha5]
+ channel: [alpha4, alpha5, alpha6]
steps:
- uses: actions/checkout@v7
- uses: actions/setup-python@v6
with:
python-version: '3.12'
- run: |
- python -m pip install --only-binary=:all: -r examples/showcase-authoring${{ matrix.channel == 'alpha5' && '-alpha5' || '' }}/requirements.txt pypdf==6.19.0 pypdfium2==5.14.0 Pillow==12.3.0
+ python -m pip install --only-binary=:all: -r examples/showcase-authoring${{ matrix.channel != 'alpha4' && format('-{0}', matrix.channel) || '' }}/requirements.txt pypdf==6.19.0 pypdfium2==5.14.0 Pillow==12.3.0
- name: Rebuild the download and compare both authoring paths
shell: bash
run: |
python tools/build_showcase_authoring.py --channel ${{ matrix.channel }}
- git diff --exit-code -- docs/assets/showcase-authoring${{ matrix.channel == 'alpha5' && '-alpha5' || '' }}/project.zip docs/assets/showcase-authoring${{ matrix.channel == 'alpha5' && '-alpha5' || '' }}/source.json
+ git diff --exit-code -- docs/assets/showcase-authoring${{ matrix.channel != 'alpha4' && format('-{0}', matrix.channel) || '' }}/project.zip docs/assets/showcase-authoring${{ matrix.channel != 'alpha4' && format('-{0}', matrix.channel) || '' }}/source.json
python tools/verify_showcase_authoring.py --channel ${{ matrix.channel }} --out target/showcase-authoring
python target/showcase-authoring/project/tools/check_showcase_preview.py --project target/showcase-authoring/project/examples/design_showcase --out target/showcase-authoring/live-preview
- uses: actions/upload-artifact@v4
@@ -77,7 +77,7 @@ jobs:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest]
- channel: [alpha3, alpha5]
+ channel: [alpha3, alpha5, alpha6]
steps:
- uses: actions/checkout@v7
- uses: actions/setup-python@v6
@@ -151,7 +151,7 @@ jobs:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest]
- channel: [preview, alpha, alpha2, alpha3, alpha4, alpha5]
+ channel: [preview, alpha, alpha2, alpha3, alpha4, alpha5, alpha6]
steps:
- uses: actions/checkout@v7
- uses: actions/setup-python@v6
@@ -934,8 +934,8 @@ jobs:
- name: Verify live component previews and browser downloads
run: |
python -m venv output/showcase-live-env
- output/showcase-live-env/bin/python -m pip install --only-binary=:all: -r examples/showcase-authoring/requirements.txt
- python examples/showcase-authoring/tools/check_showcase_preview_browser.py --project examples/showcase-authoring/examples/design_showcase --python output/showcase-live-env/bin/python --out output/showcase-live-ui --channel chrome
+ output/showcase-live-env/bin/python -m pip install --only-binary=:all: -r examples/showcase-authoring-alpha6/requirements.txt
+ python examples/showcase-authoring-alpha6/tools/check_showcase_preview_browser.py --project examples/showcase-authoring-alpha6/examples/design_showcase --python output/showcase-live-env/bin/python --out output/showcase-live-ui --channel chrome
- uses: actions/upload-artifact@v4
if: always()
with:
diff --git a/docs/assets/accessible-showcase-alpha6/a11y-source.json b/docs/assets/accessible-showcase-alpha6/a11y-source.json
new file mode 100644
index 0000000..bd4b251
--- /dev/null
+++ b/docs/assets/accessible-showcase-alpha6/a11y-source.json
@@ -0,0 +1,9 @@
+{
+ "diagnostics": [],
+ "error_count": 0,
+ "errors": [],
+ "mode": "raise",
+ "ok": true,
+ "warning_count": 0,
+ "warnings": []
+}
diff --git a/docs/assets/accessible-showcase-alpha6/browser-verification.json b/docs/assets/accessible-showcase-alpha6/browser-verification.json
new file mode 100644
index 0000000..c011485
--- /dev/null
+++ b/docs/assets/accessible-showcase-alpha6/browser-verification.json
@@ -0,0 +1,270 @@
+{
+ "ok": true,
+ "browser": "155.0.8059.40",
+ "styled": [
+ {
+ "width": 1440,
+ "ok": true,
+ "metrics": {
+ "viewport": 1440,
+ "scroll": 1440,
+ "images": [
+ {
+ "complete": true,
+ "width": 880,
+ "alt": "Illustration of a shared garden: three raised planting beds beside a broad, level path, with a bench and a greenhouse."
+ }
+ ],
+ "headings": [
+ {
+ "tag": "H1",
+ "text": "A place to grow.A place to belong."
+ },
+ {
+ "tag": "H2",
+ "text": "Find your starting point"
+ },
+ {
+ "tag": "H3",
+ "text": "Grow something"
+ },
+ {
+ "tag": "H3",
+ "text": "Share a table"
+ },
+ {
+ "tag": "H3",
+ "text": "Make it last"
+ },
+ {
+ "tag": "H2",
+ "text": "Every visit starts with hello"
+ },
+ {
+ "tag": "H2",
+ "text": "Make room for a good day."
+ },
+ {
+ "tag": "H2",
+ "text": "Plan a comfortable visit"
+ },
+ {
+ "tag": "H3",
+ "text": "An easy arrival"
+ },
+ {
+ "tag": "H3",
+ "text": "Choose your pace"
+ },
+ {
+ "tag": "H2",
+ "text": "A small first step is enough"
+ },
+ {
+ "tag": "H2",
+ "text": "About this guide"
+ }
+ ],
+ "link": "https://docs.fullbleed.dev/",
+ "grids": [
+ "209.281px 209.297px 209.297px",
+ "316.594px 316.594px"
+ ],
+ "sheets": [
+ {
+ "bottom": 1142.140625,
+ "contentBottom": 866.578125
+ },
+ {
+ "bottom": 2284.28125,
+ "contentBottom": 2185.640625
+ }
+ ]
+ }
+ },
+ {
+ "width": 390,
+ "ok": true,
+ "metrics": {
+ "viewport": 390,
+ "scroll": 390,
+ "images": [
+ {
+ "complete": true,
+ "width": 880,
+ "alt": "Illustration of a shared garden: three raised planting beds beside a broad, level path, with a bench and a greenhouse."
+ }
+ ],
+ "headings": [
+ {
+ "tag": "H1",
+ "text": "A place to grow.A place to belong."
+ },
+ {
+ "tag": "H2",
+ "text": "Find your starting point"
+ },
+ {
+ "tag": "H3",
+ "text": "Grow something"
+ },
+ {
+ "tag": "H3",
+ "text": "Share a table"
+ },
+ {
+ "tag": "H3",
+ "text": "Make it last"
+ },
+ {
+ "tag": "H2",
+ "text": "Every visit starts with hello"
+ },
+ {
+ "tag": "H2",
+ "text": "Make room for a good day."
+ },
+ {
+ "tag": "H2",
+ "text": "Plan a comfortable visit"
+ },
+ {
+ "tag": "H3",
+ "text": "An easy arrival"
+ },
+ {
+ "tag": "H3",
+ "text": "Choose your pace"
+ },
+ {
+ "tag": "H2",
+ "text": "A small first step is enough"
+ },
+ {
+ "tag": "H2",
+ "text": "About this guide"
+ }
+ ],
+ "link": "https://docs.fullbleed.dev/",
+ "grids": [
+ "342px",
+ "342px"
+ ],
+ "sheets": [
+ {
+ "bottom": 1019.640625,
+ "contentBottom": 995.640625
+ },
+ {
+ "bottom": 2374.828125,
+ "contentBottom": 2340.171875
+ }
+ ]
+ }
+ },
+ {
+ "width": 320,
+ "ok": true,
+ "metrics": {
+ "viewport": 320,
+ "scroll": 320,
+ "images": [
+ {
+ "complete": true,
+ "width": 880,
+ "alt": "Illustration of a shared garden: three raised planting beds beside a broad, level path, with a bench and a greenhouse."
+ }
+ ],
+ "headings": [
+ {
+ "tag": "H1",
+ "text": "A place to grow.A place to belong."
+ },
+ {
+ "tag": "H2",
+ "text": "Find your starting point"
+ },
+ {
+ "tag": "H3",
+ "text": "Grow something"
+ },
+ {
+ "tag": "H3",
+ "text": "Share a table"
+ },
+ {
+ "tag": "H3",
+ "text": "Make it last"
+ },
+ {
+ "tag": "H2",
+ "text": "Every visit starts with hello"
+ },
+ {
+ "tag": "H2",
+ "text": "Make room for a good day."
+ },
+ {
+ "tag": "H2",
+ "text": "Plan a comfortable visit"
+ },
+ {
+ "tag": "H3",
+ "text": "An easy arrival"
+ },
+ {
+ "tag": "H3",
+ "text": "Choose your pace"
+ },
+ {
+ "tag": "H2",
+ "text": "A small first step is enough"
+ },
+ {
+ "tag": "H2",
+ "text": "About this guide"
+ }
+ ],
+ "link": "https://docs.fullbleed.dev/",
+ "grids": [
+ "272px",
+ "272px"
+ ],
+ "sheets": [
+ {
+ "bottom": 1166.515625,
+ "contentBottom": 1142.515625
+ },
+ {
+ "bottom": 2719.8125,
+ "contentBottom": 2685.15625
+ }
+ ]
+ }
+ }
+ ],
+ "unstyled_semantics_and_no_css": true,
+ "keyboard_link_focus": true,
+ "authored_text_color_contrast": [
+ {
+ "foreground": "#17382e",
+ "background": "#f8f5ec",
+ "ratio": 11.73
+ },
+ {
+ "foreground": "#17382e",
+ "background": "#e3eadc",
+ "ratio": 10.4
+ },
+ {
+ "foreground": "#17382e",
+ "background": "#e9eddf",
+ "ratio": 10.75
+ },
+ {
+ "foreground": "#3c5548",
+ "background": "#f8f5ec",
+ "ratio": 7.45
+ }
+ ]
+}
diff --git a/docs/assets/accessible-showcase-alpha6/common-ground-guide.pdf b/docs/assets/accessible-showcase-alpha6/common-ground-guide.pdf
new file mode 100644
index 0000000..b0c5123
Binary files /dev/null and b/docs/assets/accessible-showcase-alpha6/common-ground-guide.pdf differ
diff --git a/docs/assets/accessible-showcase-alpha6/fonts/DMSerifDisplay-OFL.txt b/docs/assets/accessible-showcase-alpha6/fonts/DMSerifDisplay-OFL.txt
new file mode 100644
index 0000000..aea163a
--- /dev/null
+++ b/docs/assets/accessible-showcase-alpha6/fonts/DMSerifDisplay-OFL.txt
@@ -0,0 +1,93 @@
+Copyright 2014-2018 Adobe (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe in the United States and/or other countries. Copyright 2019 Google LLC.
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+
+This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/docs/assets/accessible-showcase-alpha6/fonts/DMSerifDisplay-Regular.ttf b/docs/assets/accessible-showcase-alpha6/fonts/DMSerifDisplay-Regular.ttf
new file mode 100644
index 0000000..bc5ed0c
Binary files /dev/null and b/docs/assets/accessible-showcase-alpha6/fonts/DMSerifDisplay-Regular.ttf differ
diff --git a/docs/assets/accessible-showcase-alpha6/fonts/Inter-OFL.txt b/docs/assets/accessible-showcase-alpha6/fonts/Inter-OFL.txt
new file mode 100644
index 0000000..909a6bf
--- /dev/null
+++ b/docs/assets/accessible-showcase-alpha6/fonts/Inter-OFL.txt
@@ -0,0 +1,93 @@
+Copyright 2020 The Inter Project Authors (https://github.com/rsms/inter)
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+https://scripts.sil.org/OFL
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/docs/assets/accessible-showcase-alpha6/fonts/Inter-Variable.ttf b/docs/assets/accessible-showcase-alpha6/fonts/Inter-Variable.ttf
new file mode 100644
index 0000000..047c92f
Binary files /dev/null and b/docs/assets/accessible-showcase-alpha6/fonts/Inter-Variable.ttf differ
diff --git a/docs/assets/accessible-showcase-alpha6/garden.svg b/docs/assets/accessible-showcase-alpha6/garden.svg
new file mode 100644
index 0000000..31a0f3f
--- /dev/null
+++ b/docs/assets/accessible-showcase-alpha6/garden.svg
@@ -0,0 +1,34 @@
+
diff --git a/docs/assets/accessible-showcase-alpha6/guide-unstyled.html b/docs/assets/accessible-showcase-alpha6/guide-unstyled.html
new file mode 100644
index 0000000..67b3458
--- /dev/null
+++ b/docs/assets/accessible-showcase-alpha6/guide-unstyled.html
@@ -0,0 +1 @@
+
Common Ground: A place to grow, a place to belong
Common Ground
Community field guide / Autumn 2026
A place to grow. A place to belong.
Good things happen when we make a little room for one another. Come for a quiet hour, a shared meal or something new to learn.
Find your starting point
Grow something
A few seeds. A pair of hands. A garden we tend together.
Share a table
Pull up a chair for conversation and a warm bowl of soup.
Make it last
Swap a skill, mend a favorite thing or try a small project.
Every visit starts with hello
All sessions are free. No membership, equipment or experience is needed. Come on your own or bring someone with you.
Your next Saturday
Make room for a good day.
Stay for one session or linger a little longer. You decide how to take part.
Autumn 2026 · Weekly sessions at the Common Ground garden
Program
When
What to expect
Garden together
Saturdays, 10–11:30 am
Plant, water or harvest. Seated tasks are available.
The shared table
Saturdays, noon–1 pm
Bring your lunch or share the seasonal soup. Ingredients are listed.
Make & mend
First Saturday, 2–3:30 pm
Bring a small repair or try a simple craft. Materials are provided.
Plan a comfortable visit
An easy arrival
Enter through the wide gate beside the greenhouse.
The main path is firm and level. Seating is available along the way.
A welcome volunteer can show you the garden and the accessible restroom.
Choose your pace
Take part seated or standing, or simply watch.
Use the quiet corner whenever you would like a break.
Ask for written instructions or a demonstration. Both are welcome.
A small first step is enough
You do not have to know anyone, know what to say or stay all day. There is a place for you here.
About this guide
Common Ground and its programs are fictional. This sample shows how a thoughtfully designed document can carry its structure into PDF and HTML.
\ No newline at end of file
diff --git a/docs/assets/accessible-showcase-alpha6/guide.html b/docs/assets/accessible-showcase-alpha6/guide.html
new file mode 100644
index 0000000..e813ca3
--- /dev/null
+++ b/docs/assets/accessible-showcase-alpha6/guide.html
@@ -0,0 +1,64 @@
+Common Ground: A place to grow, a place to belong
Common Ground
Community field guide / Autumn 2026
A place to grow. A place to belong.
Good things happen when we make a little room for one another. Come for a quiet hour, a shared meal or something new to learn.
Find your starting point
Grow something
A few seeds. A pair of hands. A garden we tend together.
Share a table
Pull up a chair for conversation and a warm bowl of soup.
Make it last
Swap a skill, mend a favorite thing or try a small project.
Every visit starts with hello
All sessions are free. No membership, equipment or experience is needed. Come on your own or bring someone with you.
Your next Saturday
Make room for a good day.
Stay for one session or linger a little longer. You decide how to take part.
Autumn 2026 · Weekly sessions at the Common Ground garden
Program
When
What to expect
Garden together
Saturdays, 10–11:30 am
Plant, water or harvest. Seated tasks are available.
The shared table
Saturdays, noon–1 pm
Bring your lunch or share the seasonal soup. Ingredients are listed.
Make & mend
First Saturday, 2–3:30 pm
Bring a small repair or try a simple craft. Materials are provided.
Plan a comfortable visit
An easy arrival
Enter through the wide gate beside the greenhouse.
The main path is firm and level. Seating is available along the way.
A welcome volunteer can show you the garden and the accessible restroom.
Choose your pace
Take part seated or standing, or simply watch.
Use the quiet corner whenever you would like a break.
Ask for written instructions or a demonstration. Both are welcome.
A small first step is enough
You do not have to know anyone, know what to say or stay all day. There is a place for you here.
About this guide
Common Ground and its programs are fictional. This sample shows how a thoughtfully designed document can carry its structure into PDF and HTML.
\ No newline at end of file
diff --git a/docs/assets/bootstrap-alpha6/catalog.unstyled.html b/docs/assets/bootstrap-alpha6/catalog.unstyled.html
new file mode 100644
index 0000000..134f1f7
--- /dev/null
+++ b/docs/assets/bootstrap-alpha6/catalog.unstyled.html
@@ -0,0 +1 @@
+Static Bootstrap 5.0.0 catalog
\ No newline at end of file
diff --git a/docs/assets/bootstrap-alpha6/forms-page-1.png b/docs/assets/bootstrap-alpha6/forms-page-1.png
new file mode 100644
index 0000000..07d1131
Binary files /dev/null and b/docs/assets/bootstrap-alpha6/forms-page-1.png differ
diff --git a/docs/assets/bootstrap-alpha6/forms.pdf b/docs/assets/bootstrap-alpha6/forms.pdf
new file mode 100644
index 0000000..9f0f44f
Binary files /dev/null and b/docs/assets/bootstrap-alpha6/forms.pdf differ
diff --git a/docs/assets/bootstrap-alpha6/project.zip b/docs/assets/bootstrap-alpha6/project.zip
new file mode 100644
index 0000000..cc6f7ed
Binary files /dev/null and b/docs/assets/bootstrap-alpha6/project.zip differ
diff --git a/docs/assets/bootstrap-alpha6/report-page-1.png b/docs/assets/bootstrap-alpha6/report-page-1.png
new file mode 100644
index 0000000..e2656fd
Binary files /dev/null and b/docs/assets/bootstrap-alpha6/report-page-1.png differ
diff --git a/docs/assets/bootstrap-alpha6/report.pdf b/docs/assets/bootstrap-alpha6/report.pdf
new file mode 100644
index 0000000..25ad1d7
Binary files /dev/null and b/docs/assets/bootstrap-alpha6/report.pdf differ
diff --git a/docs/assets/bootstrap-alpha6/report.styled.html b/docs/assets/bootstrap-alpha6/report.styled.html
new file mode 100644
index 0000000..a0229cc
--- /dev/null
+++ b/docs/assets/bootstrap-alpha6/report.styled.html
@@ -0,0 +1,40 @@
+Northstar / April production report
NORTHSTAR / STUDIOAPRIL 2026
Made with care.
+Delivered with purpose.
A production report for people who care about the details.
408
Items delivered
$8,640
Collection revenue
98%
On-time dispatch
The April collection
Completed orders / April 1-30, 2026
Collection
Units
Revenue
Studio notebooks
240
$3,600.00
Cotton stationery sets
120
$2,160.00
Archival print collection
48
$2,880.00
A lighter footprint
Every shipment used recycled packaging. The next collection enters production on May 6.
On the horizon
We are three quarters of the way to our spring production target.
75%
All figures are final. Prepared for the Northstar operations team.
\ No newline at end of file
diff --git a/docs/assets/bootstrap-alpha6/report.unstyled.html b/docs/assets/bootstrap-alpha6/report.unstyled.html
new file mode 100644
index 0000000..be4c49a
--- /dev/null
+++ b/docs/assets/bootstrap-alpha6/report.unstyled.html
@@ -0,0 +1,2 @@
+Northstar / April production report
NORTHSTAR / STUDIOAPRIL 2026
Made with care.
+Delivered with purpose.
A production report for people who care about the details.
408
Items delivered
$8,640
Collection revenue
98%
On-time dispatch
The April collection
Completed orders / April 1-30, 2026
Collection
Units
Revenue
Studio notebooks
240
$3,600.00
Cotton stationery sets
120
$2,160.00
Archival print collection
48
$2,880.00
A lighter footprint
Every shipment used recycled packaging. The next collection enters production on May 6.
On the horizon
We are three quarters of the way to our spring production target.
75%
All figures are final. Prepared for the Northstar operations team.
\ No newline at end of file
diff --git a/docs/assets/bootstrap-alpha6/source.json b/docs/assets/bootstrap-alpha6/source.json
new file mode 100644
index 0000000..f96eaa5
--- /dev/null
+++ b/docs/assets/bootstrap-alpha6/source.json
@@ -0,0 +1,200 @@
+{
+ "schema": "fullbleed.bootstrap-alpha6-source.v1",
+ "experimental": true,
+ "source_commit": "9da6a672e81fabebb5733aadcdd932355188bac5",
+ "contains_engine_binaries": false,
+ "engine_installation": "pypi",
+ "native_build_required": false,
+ "native_build_scope": "Compatible wheels need no Rust build; other platforms may build the PyPI sdist with Rust and native build tools.",
+ "source_engine_requirement": "fullbleed==2.6.0a6",
+ "engine_wheels": {
+ "package_version": "2.6.0a6",
+ "release_url": "https://github.com/fullbleed-engine/fullbleed-official/releases/tag/v2.6.0a6",
+ "index_url": "https://pypi.org/project/fullbleed/2.6.0a6/",
+ "files": [
+ {
+ "file": "fullbleed-2.6.0a6-cp310-abi3-macosx_10_12_x86_64.whl",
+ "url": "https://files.pythonhosted.org/packages/d2/c6/3286f3baa5777ca5515b7ca6acaa840cca82775c0c09a406dd089512232c/fullbleed-2.6.0a6-cp310-abi3-macosx_10_12_x86_64.whl",
+ "bytes": 7648571,
+ "sha256": "28dc8ee1f634561dc8b170a4e83213dfa1668f0e2b715b1a31f9223bd9f9fd51",
+ "kind": "wheel"
+ },
+ {
+ "file": "fullbleed-2.6.0a6-cp310-abi3-macosx_11_0_arm64.whl",
+ "url": "https://files.pythonhosted.org/packages/5f/f8/c27385503abce24d01eaee71a3c2888cd49eef91d679d3845431d126b83d/fullbleed-2.6.0a6-cp310-abi3-macosx_11_0_arm64.whl",
+ "bytes": 7247075,
+ "sha256": "47537d51432de97e51cf20ea99f908f4117966b21f8c2562b3a222451b874a49",
+ "kind": "wheel"
+ },
+ {
+ "file": "fullbleed-2.6.0a6-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
+ "url": "https://files.pythonhosted.org/packages/38/96/73f26c37a5ee80a1867d56656f26f8d5ea79f90f9ad49377a20c6723cff6/fullbleed-2.6.0a6-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
+ "bytes": 7391630,
+ "sha256": "c9a7b6725d610847774937e3df6b27cb6933a299066a74ee8d2b5e065e959375",
+ "kind": "wheel"
+ },
+ {
+ "file": "fullbleed-2.6.0a6-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
+ "url": "https://files.pythonhosted.org/packages/0b/b5/65e81e3b982f4b7622cd23a93135a411673858cadcc91bfe25602a3d5b94/fullbleed-2.6.0a6-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
+ "bytes": 9203264,
+ "sha256": "4c2f6344834caf5fb823ded48e13361d27f1b69d89526a66d8069fe8905f96a4",
+ "kind": "wheel"
+ },
+ {
+ "file": "fullbleed-2.6.0a6-cp310-abi3-manylinux_2_17_i686.manylinux2014_i686.whl",
+ "url": "https://files.pythonhosted.org/packages/77/5e/f18111ff6846608dd6317ffb43ee576597dfb03d635c9f097ba09cf50265/fullbleed-2.6.0a6-cp310-abi3-manylinux_2_17_i686.manylinux2014_i686.whl",
+ "bytes": 9932252,
+ "sha256": "2f2796a905a17860c408c3d75370a867820ba2d6e801f76126b2aecb78530dd3",
+ "kind": "wheel"
+ },
+ {
+ "file": "fullbleed-2.6.0a6-cp310-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
+ "url": "https://files.pythonhosted.org/packages/dd/55/20f7adec6d0298ee238660c7ab15ac22ea23faaf28f889cc572f84d7b2c3/fullbleed-2.6.0a6-cp310-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
+ "bytes": 8152134,
+ "sha256": "3ae86cd57d5899387d69540e3b74602d7a410f4d8af3e22a4ed8c18aaa170b8b",
+ "kind": "wheel"
+ },
+ {
+ "file": "fullbleed-2.6.0a6-cp310-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl",
+ "url": "https://files.pythonhosted.org/packages/02/15/151d678523a33790b0b309f914d03b474a2c772c77bd86a8ccf61696771e/fullbleed-2.6.0a6-cp310-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl",
+ "bytes": 8218561,
+ "sha256": "335eaa63f6b9f688f2ab0d2ef0c96e746616cd279227b92c25ce5d2809a03694",
+ "kind": "wheel"
+ },
+ {
+ "file": "fullbleed-2.6.0a6-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
+ "url": "https://files.pythonhosted.org/packages/2f/34/cf185658535470f7f0361326de2add1dc30b1afd6fcb3b5fae5541f889b4/fullbleed-2.6.0a6-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
+ "bytes": 7807566,
+ "sha256": "c081ea0f98f1fa1637d49c20de70a4876ccddffa7d376c4c58b6f0819a7c2817",
+ "kind": "wheel"
+ },
+ {
+ "file": "fullbleed-2.6.0a6-cp310-abi3-musllinux_1_2_aarch64.whl",
+ "url": "https://files.pythonhosted.org/packages/3c/0a/2802eacf894b188307cedc6b94eda7f6f3bf24524ae40c4d7f9a3a58f73b/fullbleed-2.6.0a6-cp310-abi3-musllinux_1_2_aarch64.whl",
+ "bytes": 7368110,
+ "sha256": "7c87201e0bfa95ce193893cb5d05852916883aeb7f304704a35bb7a3e37cb987",
+ "kind": "wheel"
+ },
+ {
+ "file": "fullbleed-2.6.0a6-cp310-abi3-musllinux_1_2_armv7l.whl",
+ "url": "https://files.pythonhosted.org/packages/64/b3/2044f1829b17349a49945695073a939b32a9eff0ce875876445507e73d23/fullbleed-2.6.0a6-cp310-abi3-musllinux_1_2_armv7l.whl",
+ "bytes": 9250127,
+ "sha256": "4bab4c563e8ac3aca6f6277dafecc70610f8a668a08f3b1d76a808f55e78a3b1",
+ "kind": "wheel"
+ },
+ {
+ "file": "fullbleed-2.6.0a6-cp310-abi3-musllinux_1_2_i686.whl",
+ "url": "https://files.pythonhosted.org/packages/63/c9/2fe1e0ba2b7268c74cbdd7ec084ab240ef83fd7f9d33c3863cc661cd8aa7/fullbleed-2.6.0a6-cp310-abi3-musllinux_1_2_i686.whl",
+ "bytes": 9901728,
+ "sha256": "da351fcac9916ed342033313d8dc229f0a3f33955d64dab9ce9ebdb948c3a23a",
+ "kind": "wheel"
+ },
+ {
+ "file": "fullbleed-2.6.0a6-cp310-abi3-musllinux_1_2_x86_64.whl",
+ "url": "https://files.pythonhosted.org/packages/fc/cb/43072820d6633a948ba85be48532015e50dc2d2b6c641deeb190fc486c44/fullbleed-2.6.0a6-cp310-abi3-musllinux_1_2_x86_64.whl",
+ "bytes": 7802074,
+ "sha256": "d31f8c82a7717daacb17d2e79fd33ab9a27a59e713b0be58a82ad6f21f43ef8c",
+ "kind": "wheel"
+ },
+ {
+ "file": "fullbleed-2.6.0a6-cp310-abi3-win32.whl",
+ "url": "https://files.pythonhosted.org/packages/d4/6e/d56eb7b6cb3ce5422cc68bc6be572543e7a438233578e800a98e736aa53e/fullbleed-2.6.0a6-cp310-abi3-win32.whl",
+ "bytes": 9137566,
+ "sha256": "d675e696c1f2a848e4178e9d26b6c47212fd4a37107ec75fed659f20365f719a",
+ "kind": "wheel"
+ },
+ {
+ "file": "fullbleed-2.6.0a6-cp310-abi3-win_amd64.whl",
+ "url": "https://files.pythonhosted.org/packages/1b/01/8451c57827252dd082c4c12fc9fcb28f44dd0419a8afda182784880abdcf/fullbleed-2.6.0a6-cp310-abi3-win_amd64.whl",
+ "bytes": 7971040,
+ "sha256": "d163fc15bdb1c3a950a94b7b72f1d7044263d29cc9804f2fce87f2a482164293",
+ "kind": "wheel"
+ },
+ {
+ "file": "fullbleed-2.6.0a6-cp310-abi3-win_arm64.whl",
+ "url": "https://files.pythonhosted.org/packages/83/5d/33c5bbd45675c14e9075a14183329ca62f1440f5dc4b7c70eac137389a19/fullbleed-2.6.0a6-cp310-abi3-win_arm64.whl",
+ "bytes": 7490997,
+ "sha256": "541ca7f4f8148a72bd132f6c96ff79894e60aab409c96d44c96d03950e64dde4",
+ "kind": "wheel"
+ }
+ ]
+ },
+ "engine_python_files": {
+ "fullbleed/ui/experimental/__init__.py": "d375915c58573c6769543dc33e2ec87084879412e63ea1bbcf8421458e0085fa",
+ "fullbleed/ui/experimental/_bridge.py": "d9d63910ad4e19bf63a3bd7c51507ebcc8aab14f86424259052be2f61ef6bf42",
+ "fullbleed/ui/experimental/_bridge.pyi": "372ce75241bfdadf41a7b38c4f301a35f7968c454f4d8c48fb565845f27754f9",
+ "fullbleed/ui/experimental/_document.py": "8201b0be994280baefe726100bf11c822ba2c57277050602059c9ca723889cea",
+ "fullbleed/ui/experimental/_document.pyi": "1112209e898c9bdbb16edb922a4df6c253fcbe3ded88e328b57bd4f26079d022",
+ "fullbleed/ui/experimental/_resources.py": "89561bebca0065b319f51133d6e9f5a747df32d7183c282aa036e11b751a395d",
+ "fullbleed/ui/experimental/_schema.py": "bf6463e42f5e8111e20975e949c7997a9da72b0a9996455df5d69d38d4543ca7",
+ "fullbleed/ui/experimental/_semantics.py": "dad8b9e7293eac421deb9ba9faf2bee24ccfdd69b5043413d053cb00b85883ab",
+ "fullbleed/ui/experimental/_style.py": "eadd516613985245691b0798361b7df6122c6906443ccefae77e154e3681e226",
+ "fullbleed/ui/experimental/_style.pyi": "5db65d4a5ff3ebba0cead751cb0bb1b5143d02dfa1981b3a82be3d8f4a4a03c6",
+ "fullbleed/ui/experimental/_table.py": "2dc2ab734d4f6a0bad6b9d90be29d2eacde50e9bd3ca5847f18392d18474eed4",
+ "fullbleed/ui/experimental/_table.pyi": "4304062d301270c8e80c454dec76704d84c7a9d5340be656ce035bf86d3d2898",
+ "fullbleed/ui/experimental/_tree.py": "035158f8115ae8f4da2d864a0a666128cf809b12f65fb4432f6cfd020df451e4",
+ "fullbleed/ui/experimental/_tree.pyi": "b4474fb9d51ee735c8a749765496d524a50e9dae405a1e5a2b239dfaa532e2d9",
+ "fullbleed/ui/experimental/bootstrap/__init__.py": "3d38275bdce34ed31cbb959dd8a7f8ce309b77dc3c482fff454718dd404f94d4",
+ "fullbleed/ui/experimental/bootstrap/__init__.pyi": "a2f96b9d41df8073231c914cef31f497c24974757ab625ae2cdb9a5cd43f7ee9",
+ "fullbleed/ui/experimental/bootstrap/_components.py": "5f402fe3b810bc5443cea9dd67cde5668923b3c98c20eb241141fdd33efefc7a",
+ "fullbleed/ui/experimental/bootstrap/_core.py": "d82ec29deec6d8a248b9f9a419bbcb915862393ba1de08d9f28d814249716c99",
+ "fullbleed/ui/experimental/bootstrap/_forms.py": "bd368525794d02f6ee4ececb1e42b0e16fe104da0579d4966ace0b6f9462963b",
+ "fullbleed/ui/experimental/bootstrap/_layout.py": "41ce430739224135c028c984a0e578fbbd0726c7dab059c685b0db844af2fe86",
+ "fullbleed/ui/experimental/bootstrap/_schema.py": "45ca43bcadc62e6b13338868e520f0ac91ce617aae090db9fb8fd2c5329d263e",
+ "fullbleed/ui/experimental/bootstrap/_utilities.py": "b7b5606b6113acf5de27d72a7ebf46e762a61132a19e954207708a300b47815a",
+ "fullbleed/ui/experimental/py.typed": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ "adapted_example_files": {
+ "examples/component_bootstrap/catalog.py": {
+ "upstream_sha256": "2cfca9d51a892ac596b87f29bb44c8f84cf364d5933fb8b2b0e67f03bd781b36",
+ "sha256": "287faf4e607e0e3daba21b952e26dc0acc7033cfe0d07dd0639b0b43a4db7fd3",
+ "change": "Demo links target other existing catalog sections. The downloadable HTML has no unresolved placeholder anchors."
+ },
+ "examples/component_bootstrap/main.py": {
+ "upstream_sha256": "1fbbb445e23a2096785b74aa663a5fe29a3da469c789911579d5d01e5dabd1aa",
+ "sha256": "bcd0eec912b0cd2ecff65d99c04afc907b2fd2ea95f11cabbd43ba0c4d051649",
+ "change": "Write textual artifacts with explicit LF line endings so downloadable HTML has identical bytes on Windows and Linux."
+ }
+ },
+ "bootstrap_css_sha256": "04083fcecdd9e19b2acd1e0073437aa07c98d230f0198d7f1fd470ab220fef64",
+ "first_document_sha256": "33f8bcb22893ec7df5fe6562f0131790dd7006e71afa45abe98d120c20bf2024",
+ "files": [
+ {
+ "path": "README.md",
+ "bytes": 6096,
+ "sha256": "5a291b3be52db88a4769576b037185dcfd12c6c7faa2f8ba8cc6d11e1c6cef07"
+ },
+ {
+ "path": "LICENSE",
+ "bytes": 1079,
+ "sha256": "36a2115938f6e68cf0d87eccff7a6a3e57c17017e909cbd640d51aff1fa0c5a9"
+ },
+ {
+ "path": "requirements.txt",
+ "bytes": 19,
+ "sha256": "058f91f852902be181df6d21cf5e5484cecbc11b14f920337d28d86950cc3d17"
+ },
+ {
+ "path": "first_document.py",
+ "bytes": 1387,
+ "sha256": "33f8bcb22893ec7df5fe6562f0131790dd7006e71afa45abe98d120c20bf2024"
+ },
+ {
+ "path": "upstream.json",
+ "bytes": 10963,
+ "sha256": "83072771517fe311b8e4e0e036e7e018268bd9a337536096aebdc9fde6a70b00"
+ },
+ {
+ "path": "examples/component_bootstrap/main.py",
+ "bytes": 5875,
+ "sha256": "bcd0eec912b0cd2ecff65d99c04afc907b2fd2ea95f11cabbd43ba0c4d051649"
+ },
+ {
+ "path": "examples/component_bootstrap/catalog.py",
+ "bytes": 5311,
+ "sha256": "287faf4e607e0e3daba21b952e26dc0acc7033cfe0d07dd0639b0b43a4db7fd3"
+ }
+ ],
+ "zip_sha256": "eeedc7bcfa711526c1e5d38fe340d27be27c5707711eeef5227fba3891bf3716",
+ "zip_bytes": 13074
+}
diff --git a/docs/assets/bootstrap-alpha6/verification.json b/docs/assets/bootstrap-alpha6/verification.json
new file mode 100644
index 0000000..a2875c0
--- /dev/null
+++ b/docs/assets/bootstrap-alpha6/verification.json
@@ -0,0 +1,78 @@
+{
+ "schema": "fullbleed.bootstrap-alpha6-output.v1",
+ "experimental": true,
+ "source_commit": "9da6a672e81fabebb5733aadcdd932355188bac5",
+ "package_version": "2.6.0a6",
+ "publication_verified": true,
+ "core_ci": "https://github.com/fullbleed-engine/fullbleed-official/actions/runs/39133047267",
+ "core_ci_conclusion": "success",
+ "bootstrap": "5.0.0",
+ "bootstrap_css_sha256": "04083fcecdd9e19b2acd1e0073437aa07c98d230f0198d7f1fd470ab220fef64",
+ "preview_rendering": "PDFium 5.14.0 from each saved PDF at 108 DPI",
+ "files": [
+ {
+ "file": "report.pdf",
+ "bytes": 78105,
+ "sha256": "8412ca9864f948695b2614cde22a722533a0dae6ce1e125d64ed84c915e75d15",
+ "pages": 1
+ },
+ {
+ "file": "forms.pdf",
+ "bytes": 11119,
+ "sha256": "3a624260f79afa97dc83e7071e4f7a31e7365ad626d095393969e37920107d65",
+ "pages": 1
+ },
+ {
+ "file": "report.styled.html",
+ "bytes": 162706,
+ "sha256": "62625bbcd9621690c75b6374554b18b664fb462d8a04fa61c4711f6e819bd1bb"
+ },
+ {
+ "file": "report.unstyled.html",
+ "bytes": 3146,
+ "sha256": "633e2b318c1ed9263001b5b75e9f7d3d87dd90954714e4d4cabe9d48b5c66c68"
+ },
+ {
+ "file": "catalog.html",
+ "bytes": 171383,
+ "sha256": "24cfb11194bf7bca1a71945e0565803017df3cc9bed6ab45062ff99a5c55e2e5"
+ },
+ {
+ "file": "catalog.unstyled.html",
+ "bytes": 13601,
+ "sha256": "0aa42bbedb52e8c54b1a76af2b23866d4a1b70778e11166dab5508716beb13b7"
+ },
+ {
+ "file": "report-page-1.png",
+ "bytes": 114451,
+ "sha256": "c1cb3b7b5251e5990d53768bd69b6dff5f01ff330fda4a0054d093fc7ed0bdd9"
+ },
+ {
+ "file": "forms-page-1.png",
+ "bytes": 30230,
+ "sha256": "2e0c791a0cc88b5e09a616fc5012ed5dd94cb1578f836fc1e068b749b4bf6dd7"
+ }
+ ],
+ "preserved_previous_downloads": true,
+ "scope": "Verified public PyPI alpha 6 and the exact downloadable source ZIP: 29 one-page PDFs, printed and hidden states, three executable guide blocks, installed authoring-file hashes, and matching downloadable PDF/styled/unstyled HTML bytes. Native and independent previews were visually reviewed. These checks cover the provided examples, not exhaustive Bootstrap/CSS combinations, general accessibility or independent usability.",
+ "source_zip_sha256": "eeedc7bcfa711526c1e5d38fe340d27be27c5707711eeef5227fba3891bf3716",
+ "engine_wheel": {
+ "file": "fullbleed-2.6.0a6-cp310-abi3-win_amd64.whl",
+ "url": "https://files.pythonhosted.org/packages/1b/01/8451c57827252dd082c4c12fc9fcb28f44dd0419a8afda182784880abdcf/fullbleed-2.6.0a6-cp310-abi3-win_amd64.whl",
+ "bytes": 7971040,
+ "sha256": "d163fc15bdb1c3a950a94b7b72f1d7044263d29cc9804f2fce87f2a482164293",
+ "kind": "wheel"
+ },
+ "release_conclusion": "success",
+ "build_run": "https://github.com/fullbleed-engine/fullbleed-official/actions/runs/39136534983",
+ "stable_default_version_after_publication": "2.5.32",
+ "starter_check": {
+ "ok": true,
+ "pdfs": 29,
+ "guide_blocks": 3,
+ "version": "2.6.0a6",
+ "source_zip_sha256": "eeedc7bcfa711526c1e5d38fe340d27be27c5707711eeef5227fba3891bf3716",
+ "installed_wheel_sha256": "d163fc15bdb1c3a950a94b7b72f1d7044263d29cc9804f2fce87f2a482164293"
+ },
+ "changed_output_review": "The complete report and forms PDFs and independently rendered page pixels are identical to alpha 5. Both complete documents were visually reviewed; bootstrap-output-review.json retains that comparison."
+}
diff --git a/docs/assets/component-notebook-alpha6/bootstrap_components.ipynb b/docs/assets/component-notebook-alpha6/bootstrap_components.ipynb
new file mode 100644
index 0000000..f899cd5
--- /dev/null
+++ b/docs/assets/component-notebook-alpha6/bootstrap_components.ipynb
@@ -0,0 +1,330 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "welcome",
+ "metadata": {},
+ "source": [
+ "# Make a PDF from Python components\n",
+ "\n",
+ "Edit an order, customize its cards and table, and export a PDF plus styled\n",
+ "and unstyled HTML. You write Python values and components; no HTML strings\n",
+ "are needed. All sample data is fictional.\n",
+ "\n",
+ "**In Colab:** choose **Runtime → Run all**, sign in if prompted, and use a\n",
+ "standard CPU runtime. No GPU or paid plan is needed for this example;\n",
+ "[Colab availability and limits](https://research.google.com/colaboratory/faq.html)\n",
+ "still apply. Runtime files are temporary, so download your results before\n",
+ "leaving. Local Jupyter also works.\n",
+ "\n",
+ "**Experimental:** this notebook pins Fullbleed **2.6.0a6**. The component API\n",
+ "may change and has documented CSS limits. Bootstrap components are static\n",
+ "in both PDF and HTML; no Bootstrap JavaScript is included."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "install-help",
+ "metadata": {},
+ "source": [
+ "## 1. Install the tested alpha\n",
+ "\n",
+ "Run this before importing Fullbleed. If you already imported a different\n",
+ "version in this notebook session, restart its kernel/runtime first.\n",
+ "The wheel supplies the engine and font; Jupyter supplies display tools."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "id": "install-fullbleed",
+ "metadata": {
+ "tags": [
+ "install-fullbleed"
+ ]
+ },
+ "source": [
+ "%pip install --quiet --only-binary=:all: \"fullbleed==2.6.0a6\""
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "id": "data-help",
+ "metadata": {},
+ "source": [
+ "## 2. Make the order yours\n",
+ "\n",
+ "Change a name, quantity or price, then rerun this cell and the cells below it.\n",
+ "Prices are decimal strings; this example omits tax, shipping and discounts.\n",
+ "Try `items=[]` to see the empty state, or add rows to explore pagination."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "id": "order-data",
+ "metadata": {},
+ "source": [
+ "order = {\n",
+ " \"number\": \"1048\",\n",
+ " \"customer\": \"Moss & Fern Studio\",\n",
+ " \"collection\": \"The autumn collection\",\n",
+ " \"status\": \"Ready to ship\",\n",
+ " \"items\": [\n",
+ " {\"item\": \"Studio notebooks\", \"quantity\": 24, \"unit_price\": \"15.00\"},\n",
+ " {\"item\": \"Cotton stationery sets\", \"quantity\": 12, \"unit_price\": \"18.00\"},\n",
+ " {\"item\": \"Archival prints\", \"quantity\": 8, \"unit_price\": \"60.00\"},\n",
+ " ],\n",
+ "}"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "id": "styles-help",
+ "metadata": {},
+ "source": [
+ "## 3. Choose the accent and type size\n",
+ "\n",
+ "These values feed ordinary Python styles. Later, `.with_parts(...)` styles\n",
+ "a card's own title and body. The custom `dispatch-note` class gets its rule\n",
+ "from `Document(styles=...)`; a class name alone does not create a style."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "id": "style-controls",
+ "metadata": {},
+ "source": [
+ "accent = \"#205b47\"\n",
+ "title_size = 30"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "id": "components-help",
+ "metadata": {},
+ "source": [
+ "## 4. Compose reusable components\n",
+ "\n",
+ "`Panel` supplies reusable card defaults. `Metric` is an ordinary Python\n",
+ "function. `DataTable` builds its structure from rows and column functions.\n",
+ "Bootstrap classes such as `mb-4` come with the components; your custom\n",
+ "classes need their own rules. Text values are escaped automatically.\n",
+ "\n",
+ "A column callback can return a component: `Strong(row[\"item\"])` emphasizes\n",
+ "each item inside its table cell. Return text or compose other components\n",
+ "without constructing an HTML string.\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "id": "components",
+ "metadata": {},
+ "source": [
+ "from decimal import Decimal\n",
+ "from fullbleed.ui.experimental import Document, Page, Strong, Theme, mm, pt, style, styled\n",
+ "from fullbleed.ui.experimental import bootstrap as bs\n",
+ "\n",
+ "def money(value):\n",
+ " return f\"USD {value:,.2f}\"\n",
+ "\n",
+ "Panel = styled(bs.Card, border_color=\"#d7e1de\", border_radius=\"8px\")\n",
+ "\n",
+ "def Metric(value, label):\n",
+ " return Panel(\n",
+ " bs.Heading(value, level=2, class_name=\"mb-1\", style=style(color=accent)),\n",
+ " bs.Text(label, class_name=\"text-secondary\"),\n",
+ " )\n",
+ "\n",
+ "def OrderSummary(data):\n",
+ " rows = [dict(row, amount=Decimal(row[\"unit_price\"]) * row[\"quantity\"])\n",
+ " for row in data[\"items\"]]\n",
+ " total = sum((row[\"amount\"] for row in rows), Decimal(\"0.00\"))\n",
+ " units = sum(row[\"quantity\"] for row in rows)\n",
+ " details = bs.DataTable(\n",
+ " rows,\n",
+ " columns=[\n",
+ " bs.Column(\"Item\", lambda row: Strong(row[\"item\"])),\n",
+ " bs.Column(\"Quantity\", lambda row: row[\"quantity\"], align=\"right\"),\n",
+ " bs.Column(\"Amount\", lambda row: money(row[\"amount\"]), align=\"right\"),\n",
+ " ],\n",
+ " striped=True,\n",
+ " caption=\"Order contents · USD\",\n",
+ " ) if rows else bs.Alert(\"No items in this order.\", variant=\"light\")\n",
+ " return Document(\n",
+ " bs.Box(bs.Text(\"NORTHSTAR / STUDIO\", class_name=\"fw-bold\"),\n",
+ " bs.Badge(data[\"status\"], variant=\"light\", class_name=\"ms-3\"),\n",
+ " class_name=\"mb-4\"),\n",
+ " bs.Heading(data[\"collection\"], level=1,\n",
+ " style=style(font_size=pt(title_size), color=accent, line_height=1.1)),\n",
+ " bs.Paragraph(f'Prepared for {data[\"customer\"]}', class_name=\"lead mb-4\"),\n",
+ " bs.Row(\n",
+ " bs.Col(Metric(str(units), \"Items in this order\"), span=5),\n",
+ " bs.Col(Metric(money(total), \"Order total\"), span=7),\n",
+ " gutter=3, class_name=\"mb-4 mx-0\",\n",
+ " ),\n",
+ " Panel(details, title=f'Order {data[\"number\"]}',\n",
+ " footer=\"Made with care. Packed with purpose.\").with_parts(\n",
+ " title=style(color=accent, font_size=pt(16)),\n",
+ " body=style(padding=\"1.25rem\"),\n",
+ " ),\n",
+ " bs.Alert(\"Please retain this copy with your shipment.\",\n",
+ " class_name=\"dispatch-note mt-4\"),\n",
+ " title=f'Order {data[\"number\"]}',\n",
+ " page=Page(size=\"A4\", margin=mm(16)),\n",
+ " theme=Theme(text=style(font_family=\"Inter, Arial, sans-serif\", font_size=pt(10),\n",
+ " color=\"#18382f\", line_height=1.4)),\n",
+ " styles={\".dispatch-note\": style(color=accent, border_color=accent,\n",
+ " background_color=\"#f0f5f2\")},\n",
+ " )\n",
+ "\n",
+ "document = OrderSummary(order)"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "id": "render-help",
+ "metadata": {},
+ "source": [
+ "## 5. Render and export\n",
+ "\n",
+ "The PDF renderer receives the bundled Inter font file explicitly. A CSS\n",
+ "family name does not load a font. Styled HTML keeps the family declaration;\n",
+ "its browser host supplies Inter separately, or uses the Arial/sans-serif fallback.\n",
+ "\n",
+ "`include_styles=False` removes generated and inline styling but keeps classes\n",
+ "for a host application's CSS. Both export modes also work on an individual\n",
+ "component, such as `Metric(\"44\", \"Items\").to_html(include_styles=False)`.\n",
+ "Styled Bootstrap fragments include global Bootstrap rules; use unstyled\n",
+ "fragments when the host page already provides its stylesheet."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "id": "render-export",
+ "metadata": {},
+ "source": [
+ "from importlib.resources import files\n",
+ "from pathlib import Path\n",
+ "from fullbleed.ui.experimental import Renderer\n",
+ "\n",
+ "output = Path(\"output\")\n",
+ "output.mkdir(exist_ok=True)\n",
+ "font = files(\"fullbleed_assets\").joinpath(\"fonts/Inter-Variable.ttf\")\n",
+ "renderer = Renderer(font_files=[str(font)],\n",
+ " document_timestamp=\"2026-10-01T00:00:00Z\")\n",
+ "prepared = document.prepare(renderer)\n",
+ "pdf_path = output / \"order.pdf\"\n",
+ "pdf_path.write_bytes(prepared.render_pdf())\n",
+ "(output / \"order.styled.html\").write_text(\n",
+ " document.to_html(include_styles=True), encoding=\"utf-8\", newline=\"\\n\")\n",
+ "(output / \"order.unstyled.html\").write_text(\n",
+ " document.to_html(include_styles=False), encoding=\"utf-8\", newline=\"\\n\")\n",
+ "print(f\"Saved {pdf_path} and both HTML exports.\")"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "id": "preview",
+ "metadata": {},
+ "source": [
+ "from IPython.display import Image, display\n",
+ "\n",
+ "preview_paths = []\n",
+ "for number, png in enumerate(prepared.render_image_pages(dpi=110), start=1):\n",
+ " path = output / f\"order-page-{number}.png\"\n",
+ " path.write_bytes(png)\n",
+ " preview_paths.append(path)\n",
+ " display(Image(data=png, width=650))\n",
+ "print(f\"{len(preview_paths)} page(s). Review every page before using the document.\")"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "id": "download-help",
+ "metadata": {},
+ "source": [
+ "## 6. Download your files\n",
+ "\n",
+ "This ZIP contains the current PDF, both HTML exports, and every current page\n",
+ "preview. In Colab the next cell starts the download. In local Jupyter it\n",
+ "displays a link. The runtime's `output/` folder also contains the individual\n",
+ "files. If you edit the order or styles, rerun from that edit through this cell."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "id": "download",
+ "metadata": {},
+ "source": [
+ "import sys\n",
+ "from zipfile import ZipFile, ZIP_DEFLATED\n",
+ "\n",
+ "bundle_path = output / \"component-order.zip\"\n",
+ "current_files = [pdf_path, output / \"order.styled.html\",\n",
+ " output / \"order.unstyled.html\", *preview_paths]\n",
+ "with ZipFile(bundle_path, \"w\", compression=ZIP_DEFLATED) as bundle:\n",
+ " for path in current_files:\n",
+ " bundle.write(path, arcname=path.name)\n",
+ "\n",
+ "if \"google.colab\" in sys.modules:\n",
+ " from google.colab import files\n",
+ " files.download(str(bundle_path))\n",
+ "else:\n",
+ " from IPython.display import FileLink\n",
+ " display(FileLink(str(bundle_path)))"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "id": "next-steps",
+ "metadata": {},
+ "source": [
+ "## Keep composing\n",
+ "\n",
+ "- [Component guide and catalog](https://docs.fullbleed.dev/guides/bootstrap-components-preview/)\n",
+ " explain class names, named parts, fonts, static states and current limits.\n",
+ "- [Northstar and Common Ground source kits](https://docs.fullbleed.dev/guides/showcase-authoring/)\n",
+ " show a complete invoice and illustrated report in components and HTML/CSS.\n",
+ "- [The authored accessible guide](https://docs.fullbleed.dev/guides/accessible-showcase/)\n",
+ " includes the exact PDF, semantic source and scoped validation receipts.\n",
+ "- [Share an authoring example](https://github.com/fullbleed-engine/fullbleed-official/discussions/86)\n",
+ " if a composition or styling task feels awkward. Include the small component,\n",
+ " expected result and Fullbleed version; use fictional data in public posts.\n",
+ "- [Stable Python guide](https://docs.fullbleed.dev/guides/python-components/)\n",
+ " documents the established API separately from this alpha.\n",
+ "\n",
+ "The notebook and Fullbleed are MIT licensed. This example does not establish\n",
+ "complete Bootstrap CSS, browser, accessibility or PDF conformance."
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "name": "python"
+ },
+ "colab": {
+ "name": "bootstrap_components.ipynb",
+ "provenance": []
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/docs/assets/component-notebook-alpha6/order-page-1.png b/docs/assets/component-notebook-alpha6/order-page-1.png
new file mode 100644
index 0000000..0303b90
Binary files /dev/null and b/docs/assets/component-notebook-alpha6/order-page-1.png differ
diff --git a/docs/assets/component-notebook-alpha6/order.pdf b/docs/assets/component-notebook-alpha6/order.pdf
new file mode 100644
index 0000000..2d2bb4b
Binary files /dev/null and b/docs/assets/component-notebook-alpha6/order.pdf differ
diff --git a/docs/assets/component-notebook-alpha6/order.styled.html b/docs/assets/component-notebook-alpha6/order.styled.html
new file mode 100644
index 0000000..42fbeb4
--- /dev/null
+++ b/docs/assets/component-notebook-alpha6/order.styled.html
@@ -0,0 +1,39 @@
+Order 1048
NORTHSTAR / STUDIOReady to ship
The autumn collection
Prepared for Moss & Fern Studio
44
Items in this order
USD 1,056.00
Order total
Order 1048
Order contents · USD
Item
Quantity
Amount
Studio notebooks
24
USD 360.00
Cotton stationery sets
12
USD 216.00
Archival prints
8
USD 480.00
Please retain this copy with your shipment.
\ No newline at end of file
diff --git a/docs/assets/component-notebook-alpha6/order.unstyled.html b/docs/assets/component-notebook-alpha6/order.unstyled.html
new file mode 100644
index 0000000..fe4de62
--- /dev/null
+++ b/docs/assets/component-notebook-alpha6/order.unstyled.html
@@ -0,0 +1 @@
+Order 1048
NORTHSTAR / STUDIOReady to ship
The autumn collection
Prepared for Moss & Fern Studio
44
Items in this order
USD 1,056.00
Order total
Order 1048
Order contents · USD
Item
Quantity
Amount
Studio notebooks
24
USD 360.00
Cotton stationery sets
12
USD 216.00
Archival prints
8
USD 480.00
Please retain this copy with your shipment.
\ No newline at end of file
diff --git a/docs/assets/component-notebook-alpha6/verification.json b/docs/assets/component-notebook-alpha6/verification.json
new file mode 100644
index 0000000..c6173ca
--- /dev/null
+++ b/docs/assets/component-notebook-alpha6/verification.json
@@ -0,0 +1,61 @@
+{
+ "runtime_version": "2.6.0a6",
+ "notebook_sha256": "46dc83fb67764992a17b2382217ac52ccb054c2f30cfff38d36527dce8de9fe3",
+ "cases": [
+ {
+ "name": "default",
+ "pages": 1,
+ "row_count": 3,
+ "total": "1056.00",
+ "pdf_sha256": "e273572ff4885ba8b139563cec45b590b385a2e7330d8728d2f71596e2fdbce6",
+ "accent": "#205b47",
+ "rich_cell_components_checked": true
+ },
+ {
+ "name": "edited",
+ "pages": 1,
+ "row_count": 3,
+ "total": "1176.00",
+ "pdf_sha256": "5823731e0146ab74806acce6bbd0676af5b77bf04566827c9c50523004cdb4c4",
+ "accent": "#763c96",
+ "rich_cell_components_checked": true
+ },
+ {
+ "name": "long",
+ "pages": 4,
+ "row_count": 72,
+ "total": "684.00",
+ "pdf_sha256": "c543c6cd5c6dadc7b4e77fd043a3fa5f2693dfbb0e20d9f844a5e6bb894a4735",
+ "accent": "#205b47",
+ "rich_cell_components_checked": true
+ },
+ {
+ "name": "empty-after-long",
+ "pages": 1,
+ "row_count": 0,
+ "total": "0.00",
+ "pdf_sha256": "5994d1a6f3a7176c8f4f614221cd60d27028a1fd8d80a372f4510eeeb056b573",
+ "accent": "#205b47",
+ "rich_cell_components_checked": true
+ }
+ ],
+ "downloads": {
+ "bootstrap_components.ipynb": "46dc83fb67764992a17b2382217ac52ccb054c2f30cfff38d36527dce8de9fe3",
+ "order.pdf": "e273572ff4885ba8b139563cec45b590b385a2e7330d8728d2f71596e2fdbce6",
+ "order-page-1.png": "d84d30060d7593e28dbc9ae16cb0f7c4ef1a013f83ed82cff9df8e9519eae1fa",
+ "order.styled.html": "c53d95a831b1d2fda92da28e6dcc5bf6063a7b1090cf1053930c39ff7b54103f",
+ "order.unstyled.html": "3e072e3dd684f9e7c483859a41051619effa814225a64a1a0e500e4d6be936e6"
+ },
+ "preview": "PDFium rendering of the default output PDF at 110 DPI",
+ "checks": [
+ "Notebook installation and execution",
+ "Independent PDF text and page bounds",
+ "Requested PDF accent colours",
+ "Repeat/direct PDF byte equality",
+ "Static styled and unstyled HTML",
+ "Rich item cell emphasis, order and escaped text in both HTML exports",
+ "Exact ZIP contents",
+ "Long-to-empty rerun excludes old pages"
+ ],
+ "scope": "Executed Jupyter cells and independent PDF/HTML/ZIP checks. Hosted Colab runtime and download UI, exhaustive CSS/browser parity and standards conformance are not evaluated."
+}
diff --git a/docs/assets/showcase-authoring-alpha6/comparison.json b/docs/assets/showcase-authoring-alpha6/comparison.json
new file mode 100644
index 0000000..ee26e15
--- /dev/null
+++ b/docs/assets/showcase-authoring-alpha6/comparison.json
@@ -0,0 +1,70 @@
+{
+ "ok": true,
+ "engine_version": "2.6.0a6",
+ "dpi": 120,
+ "documents": [
+ {
+ "name": "invoice",
+ "ok": true,
+ "failures": [],
+ "page_count": 1,
+ "html_pdf_sha256": "6c40e92c4800827efd0a407146bc196b38c266f4a181c3721446d90f221e14b1",
+ "component_pdf_sha256": "6c40e92c4800827efd0a407146bc196b38c266f4a181c3721446d90f221e14b1",
+ "pdf_bytes_identical": true,
+ "pages": [
+ {
+ "page": 1,
+ "identical": true,
+ "html_sha256": "5ceda957db105b08796af42c5d8efa82e37424e320741770adcbbbdbac0e47a0",
+ "component_sha256": "5ceda957db105b08796af42c5d8efa82e37424e320741770adcbbbdbac0e47a0"
+ }
+ ],
+ "render_verify_replay": true,
+ "direct_component_api_pdf_identical": true,
+ "styled_html_pdf_identical": true,
+ "styled_and_unstyled_exports": true,
+ "authored_classes_preserved": true
+ },
+ {
+ "name": "report",
+ "ok": true,
+ "failures": [],
+ "page_count": 3,
+ "html_pdf_sha256": "eb9d9e201b971c7d3a586df8f6aad0a58a6163c133463d767505deeea8f88ad0",
+ "component_pdf_sha256": "3821b11defee284b2df724bf4d4bfddb6d89aee288b61c08d1c9c51e615c43bd",
+ "pdf_bytes_identical": false,
+ "pages": [
+ {
+ "page": 1,
+ "identical": true,
+ "html_sha256": "faec5cb1a8e58c6bad2a81c5ba902a66f26dd7fc638c1b543345256ed001b936",
+ "component_sha256": "faec5cb1a8e58c6bad2a81c5ba902a66f26dd7fc638c1b543345256ed001b936"
+ },
+ {
+ "page": 2,
+ "identical": true,
+ "html_sha256": "7e7cff0f4b9911fea23a57d57f72b88b13c407c5fc736dd9cff05674261e76f3",
+ "component_sha256": "7e7cff0f4b9911fea23a57d57f72b88b13c407c5fc736dd9cff05674261e76f3"
+ },
+ {
+ "page": 3,
+ "identical": true,
+ "html_sha256": "1ab62db939e6ef91ef9a107f759fcce11d896a17be4882cf4ee95ad26e74f12a",
+ "component_sha256": "1ab62db939e6ef91ef9a107f759fcce11d896a17be4882cf4ee95ad26e74f12a"
+ }
+ ],
+ "render_verify_replay": true,
+ "direct_component_api_pdf_identical": true,
+ "styled_html_pdf_identical": true,
+ "styled_and_unstyled_exports": true,
+ "authored_classes_preserved": true
+ }
+ ],
+ "fonts": {
+ "Inter-Variable.ttf": "29160a80ff49ddcab2c97711247e08b1fab27a484a329ce8b813d820dc559031",
+ "BebasNeue-Regular.ttf": "08e4623805102d819f58601e46e345648846075e363b2ceb23313c2d1c83ec73",
+ "DMSerifDisplay-Regular.ttf": "8cc3643535edf039aa5d95440a8542735e9197e4f4b8d9303e980fefbf5ab616",
+ "DMSerifDisplay-Italic.ttf": "df74c0ac387baeaeb0fe4f2324e1668e6a3ed8c09cd9796fe162c71753e19e45"
+ },
+ "scope": "Same-runtime PDF page appearance for these fixed A4 compositions; not general HTML/CSS parity."
+}
diff --git a/docs/assets/showcase-authoring-alpha6/independent-reader.json b/docs/assets/showcase-authoring-alpha6/independent-reader.json
new file mode 100644
index 0000000..f89f11b
--- /dev/null
+++ b/docs/assets/showcase-authoring-alpha6/independent-reader.json
@@ -0,0 +1,166 @@
+{
+ "ok": true,
+ "engine_version": "2.6.0a6",
+ "source_commit": "9da6a672e81fabebb5733aadcdd932355188bac5",
+ "zip_sha256": "778b31539e274db5f36fd07bbd1bd6de0d09c167d9f977c3bc17b5fccd40e526",
+ "native_comparison": {
+ "ok": true,
+ "engine_version": "2.6.0a6",
+ "dpi": 120,
+ "documents": [
+ {
+ "name": "invoice",
+ "ok": true,
+ "failures": [],
+ "page_count": 1,
+ "html_pdf_sha256": "6c40e92c4800827efd0a407146bc196b38c266f4a181c3721446d90f221e14b1",
+ "component_pdf_sha256": "6c40e92c4800827efd0a407146bc196b38c266f4a181c3721446d90f221e14b1",
+ "pdf_bytes_identical": true,
+ "pages": [
+ {
+ "page": 1,
+ "identical": true,
+ "html_sha256": "5ceda957db105b08796af42c5d8efa82e37424e320741770adcbbbdbac0e47a0",
+ "component_sha256": "5ceda957db105b08796af42c5d8efa82e37424e320741770adcbbbdbac0e47a0"
+ }
+ ],
+ "render_verify_replay": true,
+ "direct_component_api_pdf_identical": true,
+ "styled_html_pdf_identical": true,
+ "styled_and_unstyled_exports": true,
+ "authored_classes_preserved": true
+ },
+ {
+ "name": "report",
+ "ok": true,
+ "failures": [],
+ "page_count": 3,
+ "html_pdf_sha256": "eb9d9e201b971c7d3a586df8f6aad0a58a6163c133463d767505deeea8f88ad0",
+ "component_pdf_sha256": "3821b11defee284b2df724bf4d4bfddb6d89aee288b61c08d1c9c51e615c43bd",
+ "pdf_bytes_identical": false,
+ "pages": [
+ {
+ "page": 1,
+ "identical": true,
+ "html_sha256": "faec5cb1a8e58c6bad2a81c5ba902a66f26dd7fc638c1b543345256ed001b936",
+ "component_sha256": "faec5cb1a8e58c6bad2a81c5ba902a66f26dd7fc638c1b543345256ed001b936"
+ },
+ {
+ "page": 2,
+ "identical": true,
+ "html_sha256": "7e7cff0f4b9911fea23a57d57f72b88b13c407c5fc736dd9cff05674261e76f3",
+ "component_sha256": "7e7cff0f4b9911fea23a57d57f72b88b13c407c5fc736dd9cff05674261e76f3"
+ },
+ {
+ "page": 3,
+ "identical": true,
+ "html_sha256": "1ab62db939e6ef91ef9a107f759fcce11d896a17be4882cf4ee95ad26e74f12a",
+ "component_sha256": "1ab62db939e6ef91ef9a107f759fcce11d896a17be4882cf4ee95ad26e74f12a"
+ }
+ ],
+ "render_verify_replay": true,
+ "direct_component_api_pdf_identical": true,
+ "styled_html_pdf_identical": true,
+ "styled_and_unstyled_exports": true,
+ "authored_classes_preserved": true
+ }
+ ],
+ "fonts": {
+ "Inter-Variable.ttf": "29160a80ff49ddcab2c97711247e08b1fab27a484a329ce8b813d820dc559031",
+ "BebasNeue-Regular.ttf": "08e4623805102d819f58601e46e345648846075e363b2ceb23313c2d1c83ec73",
+ "DMSerifDisplay-Regular.ttf": "8cc3643535edf039aa5d95440a8542735e9197e4f4b8d9303e980fefbf5ab616",
+ "DMSerifDisplay-Italic.ttf": "df74c0ac387baeaeb0fe4f2324e1668e6a3ed8c09cd9796fe162c71753e19e45"
+ },
+ "scope": "Same-runtime PDF page appearance for these fixed A4 compositions; not general HTML/CSS parity."
+ },
+ "independent_pages": [
+ {
+ "document": "invoice",
+ "page": 1,
+ "dpi": 144,
+ "pixels_sha256": "eed62fa682199704f450ffe208e17832ba43c4b95f48e82ce005ba45eb04341d",
+ "identical": true
+ },
+ {
+ "document": "report",
+ "page": 1,
+ "dpi": 144,
+ "pixels_sha256": "5e50b32dc9766120ccba5baad60bc1f868d3427a0d1a535ec2ad4c93d351e318",
+ "identical": true
+ },
+ {
+ "document": "report",
+ "page": 2,
+ "dpi": 144,
+ "pixels_sha256": "baa7fab1acdbee376757429a2d3f0a59358641fe6264d0a082038bf49470e0ba",
+ "identical": true
+ },
+ {
+ "document": "report",
+ "page": 3,
+ "dpi": 144,
+ "pixels_sha256": "a66d50b48d29c0bad766a801e569e2af1ed60162f618ce70ca59f771384662fa",
+ "identical": true
+ }
+ ],
+ "pdfium_version": "5.14.0",
+ "guide_blocks": 3,
+ "edited_data": [
+ {
+ "name": "invoice",
+ "ok": true,
+ "failures": [],
+ "page_count": 1,
+ "html_pdf_sha256": "d7495178e1d521540c596fa1030321f45c548796cca3da4888b61bd5b0aa61ed",
+ "component_pdf_sha256": "d7495178e1d521540c596fa1030321f45c548796cca3da4888b61bd5b0aa61ed",
+ "pdf_bytes_identical": true,
+ "pages": [
+ {
+ "page": 1,
+ "identical": true,
+ "html_sha256": "d9cdc37b264838e9b5277d7d11fa114ab0271a4ec4332886d3c3e0763ee779e2",
+ "component_sha256": "d9cdc37b264838e9b5277d7d11fa114ab0271a4ec4332886d3c3e0763ee779e2"
+ }
+ ],
+ "render_verify_replay": true,
+ "direct_component_api_pdf_identical": true,
+ "styled_html_pdf_identical": true,
+ "styled_and_unstyled_exports": true,
+ "authored_classes_preserved": true
+ },
+ {
+ "name": "report",
+ "ok": true,
+ "failures": [],
+ "page_count": 3,
+ "html_pdf_sha256": "69f520794b3b6ab26ff021d3ece358c16e9ecfbfc932c425aafc488dc7c36287",
+ "component_pdf_sha256": "05b94be8c731e69eae87076feab30e44f80a5db0f11a66550eb5346c88b7fac8",
+ "pdf_bytes_identical": false,
+ "pages": [
+ {
+ "page": 1,
+ "identical": true,
+ "html_sha256": "faec5cb1a8e58c6bad2a81c5ba902a66f26dd7fc638c1b543345256ed001b936",
+ "component_sha256": "faec5cb1a8e58c6bad2a81c5ba902a66f26dd7fc638c1b543345256ed001b936"
+ },
+ {
+ "page": 2,
+ "identical": true,
+ "html_sha256": "100bcdd7930a5752eafb67f092f392cf734e0e6fb452f9e840e2e90eb8fa1fe3",
+ "component_sha256": "100bcdd7930a5752eafb67f092f392cf734e0e6fb452f9e840e2e90eb8fa1fe3"
+ },
+ {
+ "page": 3,
+ "identical": true,
+ "html_sha256": "05c9ce6a8d6d9f7993122a6fdf4fedc992b6518de6e52df884c543141bd686f5",
+ "component_sha256": "05c9ce6a8d6d9f7993122a6fdf4fedc992b6518de6e52df884c543141bd686f5"
+ }
+ ],
+ "render_verify_replay": true,
+ "direct_component_api_pdf_identical": true,
+ "styled_html_pdf_identical": true,
+ "styled_and_unstyled_exports": true,
+ "authored_classes_preserved": true
+ }
+ ]
+}
diff --git a/docs/assets/showcase-authoring-alpha6/invoice-1.png b/docs/assets/showcase-authoring-alpha6/invoice-1.png
new file mode 100644
index 0000000..3528068
Binary files /dev/null and b/docs/assets/showcase-authoring-alpha6/invoice-1.png differ
diff --git a/docs/assets/showcase-authoring-alpha6/invoice-components.pdf b/docs/assets/showcase-authoring-alpha6/invoice-components.pdf
new file mode 100644
index 0000000..4ea3fa4
Binary files /dev/null and b/docs/assets/showcase-authoring-alpha6/invoice-components.pdf differ
diff --git a/docs/assets/showcase-authoring-alpha6/invoice-html.pdf b/docs/assets/showcase-authoring-alpha6/invoice-html.pdf
new file mode 100644
index 0000000..4ea3fa4
Binary files /dev/null and b/docs/assets/showcase-authoring-alpha6/invoice-html.pdf differ
diff --git a/docs/assets/showcase-authoring-alpha6/preview-desktop.png b/docs/assets/showcase-authoring-alpha6/preview-desktop.png
new file mode 100644
index 0000000..7a8dfc2
Binary files /dev/null and b/docs/assets/showcase-authoring-alpha6/preview-desktop.png differ
diff --git a/docs/assets/showcase-authoring-alpha6/preview-error-mobile.png b/docs/assets/showcase-authoring-alpha6/preview-error-mobile.png
new file mode 100644
index 0000000..7f5c688
Binary files /dev/null and b/docs/assets/showcase-authoring-alpha6/preview-error-mobile.png differ
diff --git a/docs/assets/showcase-authoring-alpha6/project.zip b/docs/assets/showcase-authoring-alpha6/project.zip
new file mode 100644
index 0000000..9080c3a
Binary files /dev/null and b/docs/assets/showcase-authoring-alpha6/project.zip differ
diff --git a/docs/assets/showcase-authoring-alpha6/report-1.png b/docs/assets/showcase-authoring-alpha6/report-1.png
new file mode 100644
index 0000000..a588841
Binary files /dev/null and b/docs/assets/showcase-authoring-alpha6/report-1.png differ
diff --git a/docs/assets/showcase-authoring-alpha6/report-2.png b/docs/assets/showcase-authoring-alpha6/report-2.png
new file mode 100644
index 0000000..d1a4d9e
Binary files /dev/null and b/docs/assets/showcase-authoring-alpha6/report-2.png differ
diff --git a/docs/assets/showcase-authoring-alpha6/report-3.png b/docs/assets/showcase-authoring-alpha6/report-3.png
new file mode 100644
index 0000000..6d92d7e
Binary files /dev/null and b/docs/assets/showcase-authoring-alpha6/report-3.png differ
diff --git a/docs/assets/showcase-authoring-alpha6/report-components.pdf b/docs/assets/showcase-authoring-alpha6/report-components.pdf
new file mode 100644
index 0000000..2e9e0de
Binary files /dev/null and b/docs/assets/showcase-authoring-alpha6/report-components.pdf differ
diff --git a/docs/assets/showcase-authoring-alpha6/report-html.pdf b/docs/assets/showcase-authoring-alpha6/report-html.pdf
new file mode 100644
index 0000000..589ab25
Binary files /dev/null and b/docs/assets/showcase-authoring-alpha6/report-html.pdf differ
diff --git a/docs/assets/showcase-authoring-alpha6/source.json b/docs/assets/showcase-authoring-alpha6/source.json
new file mode 100644
index 0000000..e716fcf
--- /dev/null
+++ b/docs/assets/showcase-authoring-alpha6/source.json
@@ -0,0 +1,78 @@
+{
+ "schema": "fullbleed.showcase-authoring.source.v1",
+ "source_commit": "9da6a672e81fabebb5733aadcdd932355188bac5",
+ "repository": "https://github.com/fullbleed-engine/fullbleed-official",
+ "engine_version": "2.6.0a6",
+ "source_files": {
+ "examples/design_showcase/.gitattributes": "3b2d2f910738670779137ecce4829c9d5e1a211d2b1174afb01ba87f06812564",
+ "examples/design_showcase/.gitignore": "7e2f65c80bddb76631f05a448b09378247e7f14af4ade18127925c07a6538dbf",
+ "examples/design_showcase/README.md": "a6463c5e9852adad8f69b23a8f986bbfe18eb3ef9676728b937c253cd3804f7a",
+ "examples/design_showcase/common.css": "59ed65ebed86dcebe554d6d2d48c53e0e75e67293e99f537fc767a45db1a84c7",
+ "examples/design_showcase/compare_authoring.py": "01bce371d15aac6821e3a6d00cf005d1c05927a51c5be5958100b1020c31c819",
+ "examples/design_showcase/component_primitives.py": "7cd0283d64abdb9d42076a5476eae83f2fdc6850fa9b5b88622542c365b16333",
+ "examples/design_showcase/data.json": "46cc3ad7cf6560349a41f8ba82bc9822c16176177f3c1236711fa28cb0baa13a",
+ "examples/design_showcase/fonts/BebasNeue-OFL.txt": "72082f6cb4d04be2ecf7cc7d9e1e7d73787f0af8a5a278a47cade70c16b78341",
+ "examples/design_showcase/fonts/BebasNeue-Regular.ttf": "08e4623805102d819f58601e46e345648846075e363b2ceb23313c2d1c83ec73",
+ "examples/design_showcase/fonts/DMSerifDisplay-Italic.ttf": "df74c0ac387baeaeb0fe4f2324e1668e6a3ed8c09cd9796fe162c71753e19e45",
+ "examples/design_showcase/fonts/DMSerifDisplay-OFL.txt": "a3e5cdd67d4571dd0a24fcc968de0efde7ae97ef752daf0906e4767619dd7231",
+ "examples/design_showcase/fonts/DMSerifDisplay-Regular.ttf": "8cc3643535edf039aa5d95440a8542735e9197e4f4b8d9303e980fefbf5ab616",
+ "examples/design_showcase/fonts/sources.json": "01c23f8e23d039ef6a9945183ff98fd0022975227ae949de4f1669f06ad18db7",
+ "examples/design_showcase/invoice.css": "4d9d4708b861dd2c43600dc695552c88a445517994a52fc817ed242aac9eaa25",
+ "examples/design_showcase/invoice.html": "448051114ebd9f641b9232437a8bcd9f94f6460aa1656ccaed74912b0fe0d359",
+ "examples/design_showcase/invoice_components.py": "cfcf0124615c43d63620b550ea8a308ef364da4b18b96a7c48025345cd512ee4",
+ "examples/design_showcase/landscape.svg": "a0a997dc5f04b3842830e9ba6610365c4e62a0a32e13619a66c4ea25cca3e488",
+ "examples/design_showcase/notice.css": "391f879bf794d55b29748147a10526ee493032cea46dae15296858951d5c0afc",
+ "examples/design_showcase/notice.html": "9596597db1e2e6942f86b8422d646a68342af6a2bc9b82e87229f26936ccdaf7",
+ "examples/design_showcase/preview.html": "b79af54a21fc5dba7c344be9a7eeb359e0de7d514d8e239ec41a798872d58535",
+ "examples/design_showcase/preview.js": "089c951807be3c7f99a3a8bf186a7af250e2363d64aba9c63bca8f2d29999b61",
+ "examples/design_showcase/preview.py": "d4f072007687ff628eb8e932b3ab17c7faf3adbe334d1e561b872680f6ce4fd1",
+ "examples/design_showcase/render.py": "c66c04fa37c9fdc9cff733b214d5514f9f134c45ddfdda1e6d7a10c8f248d483",
+ "examples/design_showcase/report.css": "33de04b117f1b0c99298c22beeed184429de748c729f78d183ec9b570e7e8f38",
+ "examples/design_showcase/report.html": "352d7174f3c42b111a69686cf41bf18253635a1f925f96e0d7d967067fc9c753",
+ "examples/design_showcase/report_components.py": "6caa62f11d124bc504990df5972230523a1b962619195043309b3c98a2803cd1",
+ "examples/design_showcase/requirements-components.txt": "058f91f852902be181df6d21cf5e5484cecbc11b14f920337d28d86950cc3d17",
+ "examples/design_showcase/statement.css": "c8ad4a1606bcab299202f750263af7bedf567d7b34164bda898fa01814ffd4a3",
+ "examples/design_showcase/statement.html": "b3b597349e474204a72398052bff19486d8a551562568e051375e03871b4c096",
+ "tools/check_showcase_preview.py": "125ab4b4b3836bd5d707d138eaf6a14a713fcce54fe32052efada398d49cbc19",
+ "tools/check_showcase_preview_browser.py": "7d61236aecde53dd0cb11ed94f8ffb1ec7430b5e64db2251dc5daed860b51b58"
+ },
+ "zip_sha256": "778b31539e274db5f36fd07bbd1bd6de0d09c167d9f977c3bc17b5fccd40e526",
+ "zip_bytes": 347575,
+ "package_files": {
+ "LICENSE": "36a2115938f6e68cf0d87eccff7a6a3e57c17017e909cbd640d51aff1fa0c5a9",
+ "README.md": "06551646e42a12bd3b0154a3021f191d66b8f889c5dfd7b6eea991cc2a7cadcd",
+ "SOURCE.json": "592ce4fdf8e7a78cdf37c6253e6f1834180d818b55309179d9c2b9631764ca6c",
+ "examples/design_showcase/.gitattributes": "3b2d2f910738670779137ecce4829c9d5e1a211d2b1174afb01ba87f06812564",
+ "examples/design_showcase/.gitignore": "7e2f65c80bddb76631f05a448b09378247e7f14af4ade18127925c07a6538dbf",
+ "examples/design_showcase/README.md": "a6463c5e9852adad8f69b23a8f986bbfe18eb3ef9676728b937c253cd3804f7a",
+ "examples/design_showcase/common.css": "59ed65ebed86dcebe554d6d2d48c53e0e75e67293e99f537fc767a45db1a84c7",
+ "examples/design_showcase/compare_authoring.py": "01bce371d15aac6821e3a6d00cf005d1c05927a51c5be5958100b1020c31c819",
+ "examples/design_showcase/component_primitives.py": "7cd0283d64abdb9d42076a5476eae83f2fdc6850fa9b5b88622542c365b16333",
+ "examples/design_showcase/data.json": "46cc3ad7cf6560349a41f8ba82bc9822c16176177f3c1236711fa28cb0baa13a",
+ "examples/design_showcase/fonts/BebasNeue-OFL.txt": "72082f6cb4d04be2ecf7cc7d9e1e7d73787f0af8a5a278a47cade70c16b78341",
+ "examples/design_showcase/fonts/BebasNeue-Regular.ttf": "08e4623805102d819f58601e46e345648846075e363b2ceb23313c2d1c83ec73",
+ "examples/design_showcase/fonts/DMSerifDisplay-Italic.ttf": "df74c0ac387baeaeb0fe4f2324e1668e6a3ed8c09cd9796fe162c71753e19e45",
+ "examples/design_showcase/fonts/DMSerifDisplay-OFL.txt": "a3e5cdd67d4571dd0a24fcc968de0efde7ae97ef752daf0906e4767619dd7231",
+ "examples/design_showcase/fonts/DMSerifDisplay-Regular.ttf": "8cc3643535edf039aa5d95440a8542735e9197e4f4b8d9303e980fefbf5ab616",
+ "examples/design_showcase/fonts/sources.json": "01c23f8e23d039ef6a9945183ff98fd0022975227ae949de4f1669f06ad18db7",
+ "examples/design_showcase/invoice.css": "4d9d4708b861dd2c43600dc695552c88a445517994a52fc817ed242aac9eaa25",
+ "examples/design_showcase/invoice.html": "448051114ebd9f641b9232437a8bcd9f94f6460aa1656ccaed74912b0fe0d359",
+ "examples/design_showcase/invoice_components.py": "cfcf0124615c43d63620b550ea8a308ef364da4b18b96a7c48025345cd512ee4",
+ "examples/design_showcase/landscape.svg": "a0a997dc5f04b3842830e9ba6610365c4e62a0a32e13619a66c4ea25cca3e488",
+ "examples/design_showcase/notice.css": "391f879bf794d55b29748147a10526ee493032cea46dae15296858951d5c0afc",
+ "examples/design_showcase/notice.html": "9596597db1e2e6942f86b8422d646a68342af6a2bc9b82e87229f26936ccdaf7",
+ "examples/design_showcase/preview.html": "b79af54a21fc5dba7c344be9a7eeb359e0de7d514d8e239ec41a798872d58535",
+ "examples/design_showcase/preview.js": "089c951807be3c7f99a3a8bf186a7af250e2363d64aba9c63bca8f2d29999b61",
+ "examples/design_showcase/preview.py": "d4f072007687ff628eb8e932b3ab17c7faf3adbe334d1e561b872680f6ce4fd1",
+ "examples/design_showcase/render.py": "c66c04fa37c9fdc9cff733b214d5514f9f134c45ddfdda1e6d7a10c8f248d483",
+ "examples/design_showcase/report.css": "33de04b117f1b0c99298c22beeed184429de748c729f78d183ec9b570e7e8f38",
+ "examples/design_showcase/report.html": "352d7174f3c42b111a69686cf41bf18253635a1f925f96e0d7d967067fc9c753",
+ "examples/design_showcase/report_components.py": "6caa62f11d124bc504990df5972230523a1b962619195043309b3c98a2803cd1",
+ "examples/design_showcase/requirements-components.txt": "058f91f852902be181df6d21cf5e5484cecbc11b14f920337d28d86950cc3d17",
+ "examples/design_showcase/statement.css": "c8ad4a1606bcab299202f750263af7bedf567d7b34164bda898fa01814ffd4a3",
+ "examples/design_showcase/statement.html": "b3b597349e474204a72398052bff19486d8a551562568e051375e03871b4c096",
+ "requirements.txt": "058f91f852902be181df6d21cf5e5484cecbc11b14f920337d28d86950cc3d17",
+ "tools/check_showcase_preview.py": "125ab4b4b3836bd5d707d138eaf6a14a713fcce54fe32052efada398d49cbc19",
+ "tools/check_showcase_preview_browser.py": "7d61236aecde53dd0cb11ed94f8ffb1ec7430b5e64db2251dc5daed860b51b58"
+ }
+}
diff --git a/docs/getting-started/component-notebook.md b/docs/getting-started/component-notebook.md
index 91e1346..3324387 100644
--- a/docs/getting-started/component-notebook.md
+++ b/docs/getting-started/component-notebook.md
@@ -11,12 +11,12 @@ The notebook contains the complete source, with no authored HTML strings.
Item cells return `Strong(...)` components, so emphasis stays part of the
component tree.
-[Open in Colab](https://colab.research.google.com/github/fullbleed-engine/docs/blob/393748f31499e0d4ea9fc9a129810a85b98e4652/examples/component-notebook-alpha5/bootstrap_components.ipynb){ .md-button .md-button--primary }
-[Download the notebook](../assets/component-notebook-alpha5/bootstrap_components.ipynb){ .md-button download="bootstrap_components.ipynb" }
-[View the source](https://github.com/fullbleed-engine/docs/blob/393748f31499e0d4ea9fc9a129810a85b98e4652/examples/component-notebook-alpha5/bootstrap_components.ipynb){ .md-button }
+[Open in Colab](https://colab.research.google.com/github/fullbleed-engine/docs/blob/ee8cfbef90116c4e1ea2db7c0f005dce946a11a8/examples/component-notebook-alpha6/bootstrap_components.ipynb){ .md-button .md-button--primary }
+[Download the notebook](../assets/component-notebook-alpha6/bootstrap_components.ipynb){ .md-button download="bootstrap_components.ipynb" }
+[View the source](https://github.com/fullbleed-engine/docs/blob/ee8cfbef90116c4e1ea2db7c0f005dce946a11a8/examples/component-notebook-alpha6/bootstrap_components.ipynb){ .md-button }
!!! warning "Opt-in component alpha"
- The notebook installs **Fullbleed 2.6.0a5**. Its APIs under
+ The notebook installs **Fullbleed 2.6.0a6**. Its APIs under
`fullbleed.ui.experimental` may change and have documented CSS limits.
Bootstrap components are static in PDF and HTML; no Bootstrap JavaScript
is included. The [stable Python guide](../guides/python-components.md)
@@ -37,11 +37,11 @@ a download link there.
## What you will make
-[{ width="480" }](../assets/component-notebook-alpha5/order.pdf)
+[{ width="480" }](../assets/component-notebook-alpha6/order.pdf)
-[Open the sample PDF](../assets/component-notebook-alpha5/order.pdf){ .md-button }
-[Open styled HTML](../assets/component-notebook-alpha5/order.styled.html){ .md-button }
-[Open unstyled HTML](../assets/component-notebook-alpha5/order.unstyled.html){ .md-button }
+[Open the sample PDF](../assets/component-notebook-alpha6/order.pdf){ .md-button }
+[Open styled HTML](../assets/component-notebook-alpha6/order.styled.html){ .md-button }
+[Open unstyled HTML](../assets/component-notebook-alpha6/order.unstyled.html){ .md-button }
The fictional order contains 44 items totaling USD 1,056.00. Python `Decimal`
calculates the total; the example omits tax, shipping and discounts. Try an empty
@@ -74,7 +74,7 @@ compare repeat renders; and check both HTML exports and the ZIP's exact contents
that rich item cells preserve their emphasis, order and escaped text.
Old page previews are excluded from a shorter order's download.
-The [verification record](../assets/component-notebook-alpha5/verification.json) includes
+The [verification record](../assets/component-notebook-alpha6/verification.json) includes
the sample and notebook hashes. These checks do not execute a hosted Colab runtime
or its download UI, or establish complete CSS, browser or PDF-standard conformance.
@@ -82,3 +82,5 @@ or its download UI, or establish complete CSS, browser or PDF-standard conforman
if a composition or styling task feels awkward. Use fictional data in public examples.
The [archived alpha 3 notebook](https://colab.research.google.com/github/fullbleed-engine/docs/blob/8cf4915321f2faf517ad7e5b0725e83754e227a6/examples/component-notebook/bootstrap_components.ipynb), [sample PDF](../assets/component-notebook/order.pdf) and [archived verification record](../assets/component-notebook/verification.json) retain their original runtime and bytes.
+
+The [alpha 5 notebook guide](https://github.com/fullbleed-engine/docs/blob/9aa0b2d9b26d398df58f55c8dd3b240a2457e96e/docs/getting-started/component-notebook.md) retains its original pinned notebook and sample files.
diff --git a/docs/guides/accessible-showcase.md b/docs/guides/accessible-showcase.md
index 6ddb551..b05cabd 100644
--- a/docs/guides/accessible-showcase.md
+++ b/docs/guides/accessible-showcase.md
@@ -10,18 +10,18 @@ reusable program cards, a captioned schedule and practical visitor information.
Its Python source carries headings, table headers, lists and an image description
through to the final PDF.
-[Read the component source](https://github.com/fullbleed-engine/fullbleed-official/blob/25ef51e152744e36716054005b7a964e0cccc6e9/examples/accessible_showcase/guide.py).
+[Read the component source](https://github.com/fullbleed-engine/fullbleed-official/blob/9da6a672e81fabebb5733aadcdd932355188bac5/examples/accessible_showcase/guide.py).
-[Read the PDF](../assets/accessible-showcase-alpha5/common-ground-guide.pdf){ .md-button .md-button--primary }
-[Download the source kit](../assets/accessible-showcase-alpha5/project.zip){ .md-button }
-[Open the responsive HTML](../assets/accessible-showcase-alpha5/guide.html){ .md-button }
+[Read the PDF](../assets/accessible-showcase-alpha6/common-ground-guide.pdf){ .md-button .md-button--primary }
+[Download the source kit](../assets/accessible-showcase-alpha6/project.zip){ .md-button }
+[Open the responsive HTML](../assets/accessible-showcase-alpha6/guide.html){ .md-button }
-
+
-[View the schedule and visitor-information page](../assets/accessible-showcase-alpha5/page-2.png).
+[View the schedule and visitor-information page](../assets/accessible-showcase-alpha6/page-2.png).
!!! info "Pinned component alpha"
- The kit uses `fullbleed.ui.experimental` from **2.6.0a5**. Its API may change
+ The kit uses `fullbleed.ui.experimental` from **2.6.0a6**. Its API may change
before stabilization. The PDF and all verification receipts below refer to
this specific specimen.
@@ -68,7 +68,7 @@ styled = document.to_html(include_styles=True, a11y_mode="raise")
unstyled = document.to_html(include_styles=False, a11y_mode="raise")
```
-[Open the unstyled HTML](../assets/accessible-showcase-alpha5/guide-unstyled.html) to see
+[Open the unstyled HTML](../assets/accessible-showcase-alpha6/guide-unstyled.html) to see
the semantic document without CSS. It retains authored class names, text, alt
text and the link, so another application can supply its own presentation.
The render command copies the local fonts and illustration beside both exports.
@@ -93,12 +93,12 @@ the exact PDF by SHA-256.
| Unstyled HTML | Semantic elements and authored classes retained; no CSS or inline style declarations |
| Authored text colors | Minimum contrast ratio 7.45:1 across the design's text/background pairs |
-[Validation receipt](../assets/accessible-showcase-alpha5/validation.json) ·
-[veraPDF report](../assets/accessible-showcase-alpha5/pdfua1.verapdf.json) ·
-[PDF tag and reading-order report](../assets/accessible-showcase-alpha5/structure.json) ·
-[Verifier failure control](../assets/accessible-showcase-alpha5/verification-guard.json) ·
-[Browser checks](../assets/accessible-showcase-alpha5/browser-verification.json) ·
-[Source manifest](../assets/accessible-showcase-alpha5/source.json)
+[Validation receipt](../assets/accessible-showcase-alpha6/validation.json) ·
+[veraPDF report](../assets/accessible-showcase-alpha6/pdfua1.verapdf.json) ·
+[PDF tag and reading-order report](../assets/accessible-showcase-alpha6/structure.json) ·
+[Verifier failure control](../assets/accessible-showcase-alpha6/verification-guard.json) ·
+[Browser checks](../assets/accessible-showcase-alpha6/browser-verification.json) ·
+[Source manifest](../assets/accessible-showcase-alpha6/source.json)
These checks are **not a screen-reader user test or blanket WCAG certification**.
The kit includes `verify.py` to inspect the actual output again after edits.
@@ -107,8 +107,9 @@ veraPDF. Alpha 5 corrects the [overlapping content tags in rich table
cells](https://github.com/fullbleed-engine/fullbleed-official/issues/97). The program
column now returns `Strong(row["program"])` directly, preserving that component's
content inside its table cell. The kit still rejects the retained defective
-alpha 4 PDF. Caption-containment issues in PDF/UA-2 and column-consistency issues
-in the oversized-row stress fixture remain separate limitations.
+alpha 4 PDF. Alpha 6 also corrects the oversized-cell fixture's column-consistency
+failure: both direct and styled-export PDFs now pass the PDF/UA-1 checks.
+Caption-containment findings in PDF/UA-2 remain a separate limitation.
For an external check, run [veraPDF's UA-1 profile](https://docs.verapdf.org/cli/validation/)
on the final PDF:
@@ -126,3 +127,5 @@ For another way to author the same design, see the
[paired Northstar and Common Ground examples](showcase-authoring.md).
The [alpha 4 guide](https://github.com/fullbleed-engine/docs/blob/fff03de311627b15291a527996b94fd3626cd79d/docs/guides/accessible-showcase.md), [PDF](../assets/accessible-showcase/common-ground-guide.pdf) and [source kit](../assets/accessible-showcase/project.zip) retain their original bytes, validation receipt and plain-text table workaround.
+
+The [alpha 5 guide](https://github.com/fullbleed-engine/docs/blob/9aa0b2d9b26d398df58f55c8dd3b240a2457e96e/docs/guides/accessible-showcase.md) retains its original runtime pins and download links.
diff --git a/docs/guides/bootstrap-components-preview.md b/docs/guides/bootstrap-components-preview.md
index bdb856e..a178d93 100644
--- a/docs/guides/bootstrap-components-preview.md
+++ b/docs/guides/bootstrap-components-preview.md
@@ -9,15 +9,15 @@ Build an order summary with a card, a data table and a status badge. Export it
as HTML or render it as a PDF. The component supplies its structure and default
styling; your Python supplies the content.
-!!! warning "Opt-in alpha 2.6.0a5"
- This guide uses **Fullbleed 2.6.0a5**, with experimental APIs under
+!!! warning "Opt-in alpha 2.6.0a6"
+ This guide uses **Fullbleed 2.6.0a6**, with experimental APIs under
`fullbleed.ui.experimental`. Install the alpha explicitly; a normal stable
installation does not select it. Names and behavior may change. Use the
[released component guide](python-components.md) for the stable API.
-[Download the Bootstrap kit](../assets/bootstrap-alpha5/project.zip){ .md-button .md-button--primary }
-[Open the report PDF](../assets/bootstrap-alpha5/report.pdf){ .md-button }
-[Browse the HTML catalog](../assets/bootstrap-alpha5/catalog.html){ .md-button }
+[Download the Bootstrap kit](../assets/bootstrap-alpha6/project.zip){ .md-button .md-button--primary }
+[Open the report PDF](../assets/bootstrap-alpha6/report.pdf){ .md-button }
+[Browse the HTML catalog](../assets/bootstrap-alpha6/catalog.html){ .md-button }
[Try the component notebook](../getting-started/component-notebook.md) to edit
data and styles in Colab or Jupyter, then download a PDF and both HTML exports.
@@ -34,7 +34,7 @@ their native browser behavior; PDF controls show printed values and selections.
-[](../assets/bootstrap-alpha5/report.pdf)
+[](../assets/bootstrap-alpha6/report.pdf)
@@ -45,8 +45,8 @@ compose a single document. Its content is fictional. The kit includes the
complete Python source, and this image is rendered from the downloadable PDF
with PDFium.
-[Open the styled HTML](../assets/bootstrap-alpha5/report.styled.html){ .md-button }
-[Compare unstyled HTML](../assets/bootstrap-alpha5/report.unstyled.html)
+[Open the styled HTML](../assets/bootstrap-alpha6/report.styled.html){ .md-button }
+[Compare unstyled HTML](../assets/bootstrap-alpha6/report.unstyled.html)
@@ -63,8 +63,8 @@ Activate it with `.venv\Scripts\Activate.ps1` in Windows PowerShell, or
`source .venv/bin/activate` on macOS/Linux. Then run:
```console
-python -m pip install --pre "fullbleed==2.6.0a5"
-fullbleed new remote python-components my-report --version 0.1.1
+python -m pip install --pre "fullbleed==2.6.0a6"
+fullbleed new remote python-components my-report --version 0.1.2
cd my-report
python first_document.py
python examples/component_bootstrap/main.py --out output --catalog-pdfs
@@ -74,15 +74,15 @@ The CLI downloads the pinned project and verifies its SHA-256 before extracting
the files. Choose a new or empty target directory. You can discover the available
component projects with `fullbleed new search components`.
-If you downloaded the [kit ZIP](../assets/bootstrap-alpha5/project.zip) instead,
-enter its `fullbleed-bootstrap-alpha5` folder and skip the `new remote` and
+If you downloaded the [kit ZIP](../assets/bootstrap-alpha6/project.zip) instead,
+enter its `fullbleed-bootstrap-alpha6` folder and skip the `new remote` and
`cd my-report` steps. The same Python commands render the document and catalog.
Open `order.pdf` and `order.html`, then `output/report.pdf` and
`output/catalog.html`. The kit's `requirements.txt` pins the same alpha version.
Compatible Windows, macOS and Linux wheels need no Rust build. On other platforms,
pip may build the source distribution, which needs Rust/Cargo and native build tools.
-See the [alpha release](https://github.com/fullbleed-engine/fullbleed-official/releases/tag/v2.6.0a5).
+See the [alpha release](https://github.com/fullbleed-engine/fullbleed-official/releases/tag/v2.6.0a6).
The [alpha 3 kit](../assets/bootstrap-alpha3/project.zip),
[alpha 2 kit](../assets/bootstrap-alpha2/project.zip),
@@ -185,7 +185,7 @@ Use `styled(bs.Card, ...)` to define reusable root defaults. `style(...)` checks
a vocabulary of common properties; additional declarations use the explicit
`css(...)` helper, such as `css("box-shadow: inset 4px 0 0 0 #205b47;")`.
Compose it with `.with_style(...)` or a named-part style. The
-[styling guide](https://github.com/fullbleed-engine/fullbleed-official/blob/v2.6.0a5/docs/component-bootstrap.md#how-styling-works)
+[styling guide](https://github.com/fullbleed-engine/fullbleed-official/blob/v2.6.0a6/docs/component-bootstrap.md#how-styling-works)
includes a complete reusable-card example.
Cards expose `header`, `body`, `title`, `subtitle` and `footer` as style parts.
@@ -198,7 +198,7 @@ Custom components declare required targets with `parts=(...)` and conditional
targets with `optional_parts=(...)`. A parent exposes a selected child part with
`.forward_parts(heading="label")`. Missing required targets produce a diagnostic
when the component is created; child implementation details stay private. The
-[part-styling guide](https://github.com/fullbleed-engine/fullbleed-official/blob/v2.6.0a5/examples/component_recipes/README.md#customize-a-root-or-an-exposed-part)
+[part-styling guide](https://github.com/fullbleed-engine/fullbleed-official/blob/v2.6.0a6/examples/component_recipes/README.md#customize-a-root-or-an-exposed-part)
shows reusable components and forwarding through containers.
## Export whole documents or fragments
@@ -227,7 +227,7 @@ source, or `target="html"` for ordinary HTML controls.
## Explore the component catalog
-The [HTML catalog](../assets/bootstrap-alpha5/catalog.html) shows all 23
+The [HTML catalog](../assets/bootstrap-alpha6/catalog.html) shows all 23
Bootstrap 5.0.0 component families, plus four groups for layout, forms, content
and utilities. The source is in `examples/component_bootstrap/catalog.py`.
@@ -246,8 +246,8 @@ state. Hidden panels remain hidden in unstyled HTML.
PDF controls print values and selections, including masked passwords and
selected options. They do not become fillable PDF fields. Compare the
-[form PDF](../assets/bootstrap-alpha5/forms.pdf) and
-[form preview](../assets/bootstrap-alpha5/forms-page-1.png) with the HTML catalog.
+[form PDF](../assets/bootstrap-alpha6/forms.pdf) and
+[form preview](../assets/bootstrap-alpha6/forms-page-1.png) with the HTML catalog.
## What has been checked
@@ -255,18 +255,26 @@ The source implementation has focused tests for the component and export
contracts. Its native catalog contains 27 one-page specimens; a separate
80-row table checks pagination and repeated headers. Browser checks exercise
authored states and styled/unstyled HTML at desktop and mobile widths.
-The [download manifest](../assets/bootstrap-alpha5/source.json) pins source
-files and wheel hashes. The [output verification record](../assets/bootstrap-alpha5/verification.json)
+The [download manifest](../assets/bootstrap-alpha6/source.json) pins source
+files and wheel hashes. The [output verification record](../assets/bootstrap-alpha6/verification.json)
records the published documents and checks.
-Alpha 5 includes the stable inline-spacing and rich-table tagging fixes.
+Alpha 6 includes the stable inline-spacing and rich-table tagging fixes.
Components such as `Strong(...)` can own their content inside table cells without
overlapping marked-content IDs. The [accessible showcase](accessible-showcase.md)
uses this in its program schedule and retains validation of the actual PDF.
+Long text cells aligned at the top or baseline, and top-aligned list cells,
+can continue across pages. The retained checks cover visible page margins,
+repeated headings, and content preserved through direct rendering, prepared
+documents, and both HTML exports. Rich-cell continuation with middle or bottom
+alignment remains unsupported; layout errors retain the component source ID.
+PDF/UA-2 caption containment remains an open issue, so these checks do not
+establish general table conformance.
+
Document class rules, inherited colors and named-part opacity reach supported
inline SVG content. Isolated translucent groups apply opacity once in saved-PDF
-previews. See the [SVG styling contract](https://github.com/fullbleed-engine/fullbleed-official/blob/v2.6.0a5/docs/embedded-stylesheets.md)
+previews. See the [SVG styling contract](https://github.com/fullbleed-engine/fullbleed-official/blob/v2.6.0a6/docs/embedded-stylesheets.md)
for the supported behavior.
Card root styles, custom class rules and named body parts share the corrected
@@ -286,8 +294,10 @@ reading the implementation. If a task requires generated HTML or an internal
selector, that is useful feedback for the API design.
[Share an editing task in the design discussion](https://github.com/fullbleed-engine/fullbleed-official/discussions/86){ .md-button }
-[Read the complete API guide](https://github.com/fullbleed-engine/fullbleed-official/blob/25ef51e152744e36716054005b7a964e0cccc6e9/docs/component-bootstrap.md)
-· [Read the implementation review](https://github.com/fullbleed-engine/fullbleed-official/blob/25ef51e152744e36716054005b7a964e0cccc6e9/docs/component-authoring-next-iteration.md)
+[Read the complete API guide](https://github.com/fullbleed-engine/fullbleed-official/blob/9da6a672e81fabebb5733aadcdd932355188bac5/docs/component-bootstrap.md)
+· [Read the implementation review](https://github.com/fullbleed-engine/fullbleed-official/blob/9da6a672e81fabebb5733aadcdd932355188bac5/docs/component-authoring-next-iteration.md)
· [Review the draft PR](https://github.com/fullbleed-engine/fullbleed-official/pull/85)
The [alpha 4 guide](https://github.com/fullbleed-engine/docs/blob/fff03de311627b15291a527996b94fd3626cd79d/docs/guides/bootstrap-components-preview.md) and [source kit](../assets/bootstrap-alpha4/project.zip) remain available with their original runtime pin and verification records.
+
+The [alpha 5 guide](https://github.com/fullbleed-engine/docs/blob/9aa0b2d9b26d398df58f55c8dd3b240a2457e96e/docs/guides/bootstrap-components-preview.md) retains its original runtime pins and download links.
diff --git a/docs/guides/showcase-authoring.md b/docs/guides/showcase-authoring.md
index ecd34ce..40f01f6 100644
--- a/docs/guides/showcase-authoring.md
+++ b/docs/guides/showcase-authoring.md
@@ -17,26 +17,26 @@ For a document with retained accessibility evidence, try the new
[component-authored Common Ground guide](accessible-showcase.md): two designed
pages, PDF/UA-1 machine validation, and styled or unstyled HTML exports.
-[Download both source versions](../assets/showcase-authoring-alpha5/project.zip){ .md-button .md-button--primary }
-[Northstar component PDF](../assets/showcase-authoring-alpha5/invoice-components.pdf){ .md-button }
-[Common Ground component PDF](../assets/showcase-authoring-alpha5/report-components.pdf){ .md-button }
+[Download both source versions](../assets/showcase-authoring-alpha6/project.zip){ .md-button .md-button--primary }
+[Northstar component PDF](../assets/showcase-authoring-alpha6/invoice-components.pdf){ .md-button }
+[Common Ground component PDF](../assets/showcase-authoring-alpha6/report-components.pdf){ .md-button }
-!!! info "Component alpha 2.6.0a5"
+!!! info "Component alpha 2.6.0a6"
These examples use `fullbleed.ui.experimental` from the explicitly pinned
- **2.6.0a5** prerelease. The API may change before stabilization. The original
+ **2.6.0a6** prerelease. The API may change before stabilization. The original
[2.4.0 showcase downloads](../examples.md#styled-invoice) remain available;
- this comparison renders both authoring paths on 2.6.0a5.
+ this comparison renders both authoring paths on 2.6.0a6.
## Keep the design, choose the source
| Document | HTML/CSS output | Component output | Pages |
| --- | --- | --- | --- |
-| Northstar Studio | [HTML-authored PDF](../assets/showcase-authoring-alpha5/invoice-html.pdf) | [Component-authored PDF](../assets/showcase-authoring-alpha5/invoice-components.pdf) | 1 |
-| Common Ground | [HTML-authored PDF](../assets/showcase-authoring-alpha5/report-html.pdf) | [Component-authored PDF](../assets/showcase-authoring-alpha5/report-components.pdf) | 3 |
+| Northstar Studio | [HTML-authored PDF](../assets/showcase-authoring-alpha6/invoice-html.pdf) | [Component-authored PDF](../assets/showcase-authoring-alpha6/invoice-components.pdf) | 1 |
+| Common Ground | [HTML-authored PDF](../assets/showcase-authoring-alpha6/report-html.pdf) | [Component-authored PDF](../assets/showcase-authoring-alpha6/report-components.pdf) | 3 |
-[](../assets/showcase-authoring-alpha5/invoice-components.pdf)
+[](../assets/showcase-authoring-alpha6/invoice-components.pdf)
@@ -47,7 +47,7 @@ typed table columns. `AmountDue` owns the total panel and exposes its label and
amount as named styling parts. The full document composes these pieces and
calculates totals with `Decimal`.
-[Read the component source](https://github.com/fullbleed-engine/fullbleed-official/blob/25ef51e152744e36716054005b7a964e0cccc6e9/examples/design_showcase/invoice_components.py)
+[Read the component source](https://github.com/fullbleed-engine/fullbleed-official/blob/9da6a672e81fabebb5733aadcdd932355188bac5/examples/design_showcase/invoice_components.py)
@@ -83,7 +83,7 @@ targets. Call it again with different values to create another field.
-[](../assets/showcase-authoring-alpha5/report-components.pdf)
+[](../assets/showcase-authoring-alpha6/report-components.pdf)
@@ -94,10 +94,10 @@ compose metrics, a participation chart and an allocation table. The illustration
uses the original local SVG asset; chart heights and allocation shares come from
the data.
-[Read the component source](https://github.com/fullbleed-engine/fullbleed-official/blob/25ef51e152744e36716054005b7a964e0cccc6e9/examples/design_showcase/report_components.py)
+[Read the component source](https://github.com/fullbleed-engine/fullbleed-official/blob/9da6a672e81fabebb5733aadcdd932355188bac5/examples/design_showcase/report_components.py)
-[Reach page](../assets/showcase-authoring-alpha5/report-2.png) ·
-[Resources page](../assets/showcase-authoring-alpha5/report-3.png)
+[Reach page](../assets/showcase-authoring-alpha6/report-2.png) ·
+[Resources page](../assets/showcase-authoring-alpha6/report-3.png)
CLEAR INFORMATION. CONNECTED PLACES. A BETTER EVERYDAY.
+
SERVICE NOTICE / RV-1020
WATER SUPPLY MAINTENANCE
TUESDAY20 OCT2026
6:00 AM — 4:00 PM
+
A planned upgrade to the neighborhood network. Here is what to expect and how to prepare.
+
Temporary interruption
Water service will be unavailable during the maintenance window in the areas listed below. Service is expected to return by 4:00 PM on Tuesday, 20 October.
+
Affected areas
Riverton Central
Maple Grove
East Harbor
Riverside Heights
This sample names fictional service areas. It is a document design demonstration, not a live service alert.
Plan ahead
Allow for the full maintenance window.
Check any equipment that needs a continuous water supply.
Contact the service team if you need this notice in another format.