Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
195 commits
Select commit Hold shift + click to select a range
58a1ed6
Give feed rows compact, content-aware story summaries
wieslawsoltes Oct 31, 2026
488b215
Refine reader surfaces and preserve accent contrast
wieslawsoltes Oct 31, 2026
9579ebd
Use native accessible icon commands and responsive form rows
wieslawsoltes Oct 31, 2026
935b9c7
Replace boxed controls with quiet commands and title-first feed rows
wieslawsoltes Oct 31, 2026
3c2b906
Streamline search with recent queries and expandable filters
wieslawsoltes Oct 31, 2026
a7b7826
Adapt reader settings and preview typography before applying
wieslawsoltes Oct 31, 2026
2ed1950
Unify adaptive navigation, discussion controls and contextual reading…
wieslawsoltes Oct 31, 2026
5258886
Give browser launch and recovery accessible, theme-aware surfaces
wieslawsoltes Oct 31, 2026
db4d12b
Preserve semantic headings and rich link labels in discussions
wieslawsoltes Oct 31, 2026
9b2c4bb
Exercise native search controls across pane widths
wieslawsoltes Oct 31, 2026
3f58628
Cover adaptive navigation, discussion find and retained feed position
wieslawsoltes Oct 31, 2026
5031b99
Avoid cloning the reading library and thread on interactive updates
wieslawsoltes Oct 31, 2026
52d8ad4
Balance startup errors at phone widths
wieslawsoltes Oct 31, 2026
9727a23
Use native numeric editors for reading preferences
wieslawsoltes Oct 31, 2026
8154bf9
Clarify startup when JavaScript is disabled
wieslawsoltes Oct 31, 2026
71405db
Refresh retained library excerpts when flagged-content visibility cha…
wieslawsoltes Oct 31, 2026
8334f30
Exercise reading preview and applied theme changes
wieslawsoltes Oct 31, 2026
2965a8e
Document the scaled and rotated Fluent glyphs
wieslawsoltes Oct 31, 2026
aa2ff50
Give profiles contextual loading, offline and retry states
wieslawsoltes Oct 31, 2026
b90ccd8
Keep reader shortcuts out of fields and preserve in-progress searches
wieslawsoltes Oct 31, 2026
d6f1674
Respect IME composition and keep recalled queries compact
wieslawsoltes Oct 31, 2026
78c48b1
Capture native search, preferences and navigation during visual QA
wieslawsoltes Oct 31, 2026
fae9162
Remove hover fills behind prose and align settings toggles
wieslawsoltes Oct 31, 2026
aa60fda
Keep long-feed fixtures representative in layout captures
wieslawsoltes Oct 31, 2026
0ea4393
Align menu labels and keep primary commands readable in every accent …
wieslawsoltes Oct 31, 2026
e3af7d9
Capture settled reader surfaces with deterministic reduced motion
wieslawsoltes Oct 31, 2026
8a923a8
Put thread-wide reply controls beside comment sorting
wieslawsoltes Oct 31, 2026
8057e65
Refresh desktop, tablet and phone screenshots from the tested reader
wieslawsoltes Oct 31, 2026
a6d5e50
Update the phone discussion preview from the native renderer
wieslawsoltes Oct 31, 2026
0015269
Restore the exact library snapshot reviewed in settings
wieslawsoltes Oct 31, 2026
ea4a28e
Add a distraction-free discussion layout with a bounded reading column
wieslawsoltes Oct 31, 2026
6b0a09d
Recall or rerun recent terms with visible search filters
wieslawsoltes Oct 31, 2026
c07caee
Navigate matching comments across virtualized discussions
wieslawsoltes Oct 31, 2026
81fb4b5
Navigate matching comments and return to the original reading position
wieslawsoltes Oct 31, 2026
eff3e15
Manage stories from the feed and undo individual library edits
wieslawsoltes Oct 31, 2026
9ab330b
Review local data changes before replacing a library or clearing history
wieslawsoltes Oct 31, 2026
30d5125
Exercise layered back navigation and reversible story commands
wieslawsoltes Oct 31, 2026
c09824d
Keep the story title visible and count each discussion visit once
wieslawsoltes Oct 31, 2026
12d09b4
Illustrate focus reading and document feed and find controls
wieslawsoltes Oct 31, 2026
267b1f9
Offer a bounded-memory WebAssembly development build
wieslawsoltes Oct 31, 2026
ef29c17
Exercise focus reading, match navigation and swipe undo in Chromium
wieslawsoltes Oct 31, 2026
be0374f
Show the verified phone discussion from the WebAssembly reader
wieslawsoltes Oct 31, 2026
60b179e
Retain navigation content and defer breakpoint layout until after arr…
wieslawsoltes Oct 31, 2026
cd04505
Test navigation identity across the phone and desktop breakpoints
wieslawsoltes Oct 31, 2026
001e33f
Verify selected discussions survive live phone and tablet resizing
wieslawsoltes Oct 31, 2026
71efe66
Offer a cache-only saved shelf and useful actions on empty feeds
wieslawsoltes Nov 1, 2026
56ac6d9
Separate story provenance and bylines with accessible vector reading …
wieslawsoltes Nov 1, 2026
1bd0ef8
Identify all invalid search fields and reveal the first editor
wieslawsoltes Nov 1, 2026
fea0820
Preview named accent choices and validate reader settings in place
wieslawsoltes Nov 1, 2026
a97f158
Paint bounded find matches across decoded native rich text runs
wieslawsoltes Nov 1, 2026
8d1efad
Track verified downloads per discussion and protect device-local state
wieslawsoltes Nov 1, 2026
ce32b48
Exercise correction of invalid native number input
wieslawsoltes Nov 1, 2026
08010e7
Mark find terms and matching authors in realized conversation rows
wieslawsoltes Nov 1, 2026
bc8f9f2
Resolve code samples to installed monospace families across platforms
wieslawsoltes Nov 1, 2026
38cdb8d
Exercise edits to the lazily opened storage limit
wieslawsoltes Nov 1, 2026
da70ee0
Describe verified offline reading, highlighted Find and accessible se…
wieslawsoltes Nov 1, 2026
5d67e9c
Exercise downloaded shelf isolation and reader empty-state recovery
wieslawsoltes Nov 1, 2026
50e03cc
Keep accent swatches distinct on similar custom backgrounds
wieslawsoltes Nov 1, 2026
4536ff2
Verify downloaded shelf and data review controls in Chromium
wieslawsoltes Nov 1, 2026
53e1228
Refresh feed previews from the native reader across themes and widths
wieslawsoltes Nov 1, 2026
90b2c3c
Verify refreshed offline payloads against the actual item content
wieslawsoltes Nov 1, 2026
9a3a64e
Exercise persisted themes and render a whole-word Find example
wieslawsoltes Nov 1, 2026
fe5cfc9
Wait for the arranged reader controls when resizing Chromium
wieslawsoltes Nov 1, 2026
63c2193
Revoke incomplete downloads and recover local manifests during backup…
wieslawsoltes Nov 1, 2026
059af5a
Keep the existing formatting of unrelated repository tests
wieslawsoltes Nov 1, 2026
6932240
Show highlighted prose and code alongside real custom theme controls
wieslawsoltes Nov 1, 2026
d29c122
Capture the downloaded shelf and reader discussion in release Chromium
wieslawsoltes Nov 1, 2026
9205350
Separate profile and Explore views and open exact item permalinks
wieslawsoltes Nov 1, 2026
ff9f192
Remove individual recent searches and return to a prefilled profile l…
wieslawsoltes Nov 1, 2026
7397e8f
Group Explore destinations and expose offline library counts and keyb…
wieslawsoltes Nov 1, 2026
9e3b8cc
Keep feed pages on return and expose native checked filter controls
wieslawsoltes Nov 1, 2026
3bf34f7
Show bounded recent activity and recover profile lookups in place
wieslawsoltes Nov 1, 2026
7515825
Navigate virtualized comment branches and expose collapsed replies
wieslawsoltes Nov 1, 2026
2f34dd0
Edit mute rules by type and turn pasted article links into domain fil…
wieslawsoltes Nov 1, 2026
d64a36a
Offer the next unread discussion in a contextual split-view reading desk
wieslawsoltes Nov 1, 2026
4f6ad08
Show accurate poll shares and useful partial discussion states
wieslawsoltes Nov 1, 2026
0274acf
Keep keyboard navigation anchored when reading hides the current story
wieslawsoltes Nov 1, 2026
ac97758
Preview coordinated reading-size presets in a native typography menu
wieslawsoltes Nov 1, 2026
c12db6b
Identify comment and poll-option permalinks and surface their parent …
wieslawsoltes Nov 1, 2026
a0b3088
Verify failed profile lookups recover in a visible phone editor
wieslawsoltes Nov 1, 2026
0a9df52
Update the reader guide for navigation, discovery and reading controls
wieslawsoltes Nov 1, 2026
fd7f7bb
Exercise profile activity and Explore downloads in release Chromium
wieslawsoltes Nov 1, 2026
181092e
Exercise exact profile activity and missing-user recovery through rea…
wieslawsoltes Nov 1, 2026
520ca54
Keep Explore counters current while the library loads or changes
wieslawsoltes Nov 1, 2026
b470832
Use a representative comment search in the profile walkthrough
wieslawsoltes Nov 1, 2026
449a968
Keep Hacker News permalinks reachable when the browser reader cannot …
wieslawsoltes Nov 1, 2026
a77b4f3
Refresh the reader gallery with current desk, profile, and Explore views
wieslawsoltes Nov 1, 2026
fec833c
Close the search fixture branch before resolving Hacker News requests
wieslawsoltes Nov 1, 2026
cf181d3
Document release Chromium previews for discussions, offline reading, …
wieslawsoltes Nov 1, 2026
e036e6b
Copy a comment permalink directly from its native actions
wieslawsoltes Nov 1, 2026
629c4c5
Open Hacker News item and profile links from the native search controls
wieslawsoltes Nov 1, 2026
0d4b95a
Move primary navigation to the side on short landscape readers
wieslawsoltes Nov 1, 2026
7c83b19
Find cached titles, authors, and domains across a whole reading colle…
wieslawsoltes Nov 1, 2026
a0482a7
Mute or restore an author in place from their public profile
wieslawsoltes Nov 1, 2026
6b3547f
Preview the default theme and typography before applying preferences
wieslawsoltes Nov 1, 2026
8ad39f3
Expose sticky phone reading options and retry unavailable discussions…
wieslawsoltes Nov 1, 2026
eedeb6a
Catch up on new replies with context and preserved reading position
wieslawsoltes Nov 1, 2026
ed57ddf
Verify direct-link actions and preserve saved author filters during s…
wieslawsoltes Nov 1, 2026
1dd8131
Use the reader filter palette for the new reply toggle
wieslawsoltes Nov 1, 2026
3d04a62
Exercise narrow discussion options and live landscape rotation in Chr…
wieslawsoltes Nov 1, 2026
03a58a7
Describe permalink lookup, author muting, and appearance reset in the…
wieslawsoltes Nov 1, 2026
f4794ea
Explain reply catch-up scope and comment link copying
wieslawsoltes Nov 1, 2026
1b0b85f
Replay a returning reader and verify the copied comment URL in Chromium
wieslawsoltes Nov 1, 2026
46dda3e
Describe landscape navigation and narrow discussion controls
wieslawsoltes Nov 1, 2026
4541f94
Wait for the saved library before offering preference edits or backup…
wieslawsoltes Nov 1, 2026
5b2ac6b
Keep the discussion toolbar and find strip beside the text on wide mo…
wieslawsoltes Nov 1, 2026
5040c38
Integrate reader routes and verify paged on-device library search
wieslawsoltes Nov 1, 2026
4042fd4
Search and reopen downloaded discussions in an offline browser session
wieslawsoltes Nov 1, 2026
f5e7f60
Explain offline collection search and returning to the original list
wieslawsoltes Nov 1, 2026
1a00140
Restore keyboard focus to the same comment disclosure or sort control
wieslawsoltes Nov 1, 2026
d100b41
Restore an unchanged library window immediately without refetching ex…
wieslawsoltes Nov 1, 2026
b96c9b0
Show local library search, landscape reading, and new replies in the …
wieslawsoltes Nov 1, 2026
c010d6d
Grant the Chromium copy test both clipboard permissions
wieslawsoltes Nov 1, 2026
4459485
Refresh the mobile gallery from release Chromium in portrait and land…
wieslawsoltes Nov 1, 2026
64d4a81
Search comments across an entire Hacker News discussion and open exac…
wieslawsoltes Nov 1, 2026
badb681
Support native code toolbars without changing source text or Find runs
wieslawsoltes Nov 1, 2026
76a08f2
Give code samples native wrap and copy tools and open related HN link…
wieslawsoltes Nov 1, 2026
715f44f
Keep mute-rule drafts explicit and discard edits across rule types
wieslawsoltes Nov 1, 2026
10ec1c0
Reveal the pending story action as a touch swipe crosses its threshold
wieslawsoltes Nov 1, 2026
f60fd7e
Separate download membership from bookmarks and protect pinned payloa…
wieslawsoltes Nov 1, 2026
97f3417
Verify code selection, per-sample wrapping, and exact multiline copyi…
wieslawsoltes Nov 1, 2026
68edcf9
Identify scoped results and exercise the complete phone discussion-se…
wieslawsoltes Nov 1, 2026
9b14e0a
Give compact stories one metadata line and verify reversible swipe pr…
wieslawsoltes Nov 1, 2026
e8d39ee
Replay a mobile search that opens a comment outside the loaded discus…
wieslawsoltes Nov 1, 2026
c30b56d
Exercise rich-link back navigation and preserve a selected code subst…
wieslawsoltes Nov 1, 2026
3f253fb
Explain full-discussion search and reversible mute drafts
wieslawsoltes Nov 1, 2026
0082424
Exercise threshold feedback and cancellation with a real browser touc…
wieslawsoltes Nov 1, 2026
ec6e1c7
Exercise wrapped source copying and internal reply links in release C…
wieslawsoltes Nov 1, 2026
11d9c15
Describe reversible swipe actions and compact feed metadata
wieslawsoltes Nov 1, 2026
316ca59
Describe code wrapping, exact clipboard copying, and in-reader rich l…
wieslawsoltes Nov 1, 2026
1753953
Manage individual offline discussions and review temporary storage cl…
wieslawsoltes Nov 1, 2026
8a70fff
Capture the settled phone form when showing scoped discussion search
wieslawsoltes Nov 1, 2026
5cfdbe5
Check that wrapping adds visible code lines at phone width
wieslawsoltes Nov 1, 2026
9b88acc
Keep measured storage current after reviewed cleanup and verify retai…
wieslawsoltes Nov 1, 2026
ab14c88
Explain offline copy management, storage measurements, and cleanup ch…
wieslawsoltes Nov 1, 2026
c094ef8
Verify individual download release after removing a bookmark in Chromium
wieslawsoltes Nov 1, 2026
5ab66b4
Verify reclaimed cache bytes and retained downloads in browser storage
wieslawsoltes Nov 1, 2026
93ac25b
Show compact feed, swipe feedback, scoped search, and code tools in t…
wieslawsoltes Nov 1, 2026
c081576
Publish verified WebAssembly previews for code, discussion search, sw…
wieslawsoltes Nov 1, 2026
6c5f4b3
Keep legacy discussion permalinks consistent when navigating back to …
wieslawsoltes Nov 1, 2026
5771746
Find unread stories across filtered pages and reveal the selected com…
wieslawsoltes Nov 1, 2026
fde042b
Read filtered replies in context and preserve the position inside lon…
wieslawsoltes Nov 1, 2026
cacf377
Restore search drafts on Back and reuse paged results for unchanged s…
wieslawsoltes Nov 1, 2026
39e45d1
Route Find and Back to the active pane and preserve focus during brow…
wieslawsoltes Nov 1, 2026
e96aac1
Cover retained search focus and clear legacy query routes on return
wieslawsoltes Nov 1, 2026
6258bfe
Verify touch and keyboard context navigation on the release and publi…
wieslawsoltes Nov 1, 2026
2a168d6
Recover offline installs when Chromium rejects the streamed Wasm cach…
wieslawsoltes Nov 1, 2026
ca9a32b
Report thread download and durable verification progress in the repos…
wieslawsoltes Nov 1, 2026
2b84d2a
Keep feed tabs in place and direct row shortcuts to the focused story
wieslawsoltes Nov 1, 2026
62c6af7
Preserve appearance drafts and support discarding changes and copying…
wieslawsoltes Nov 1, 2026
31286a4
Add background offline downloads with cancel, progress and local-only…
wieslawsoltes Nov 1, 2026
d86e43c
Resolve feed shortcuts through the owning items control
wieslawsoltes Nov 1, 2026
36190d5
Navigate sibling and standalone replies and restore deep discussion v…
wieslawsoltes Nov 1, 2026
306e29e
Exercise feed continuity, settings drafts, nested replies and cancela…
wieslawsoltes Nov 1, 2026
1f159fc
Honor bookmark changes made while an offline download is running
wieslawsoltes Nov 1, 2026
ec9eb5e
Show release captures of reply navigation, offline progress and prefe…
wieslawsoltes Nov 1, 2026
c992fc3
Start loading the selected Wasm sooner and reuse verified modules acr…
wieslawsoltes Nov 1, 2026
44f6f3c
Batch cache transactions and store compact reader snapshots without c…
wieslawsoltes Nov 1, 2026
b64cd1c
Prioritize permalink content and avoid unrelated theme and state inva…
wieslawsoltes Nov 1, 2026
fa10d73
Cache discussion Find text and project virtual rows without copying c…
wieslawsoltes Nov 1, 2026
3b9a3d5
Keep immutable feed rows and append or remove only the affected ranges
wieslawsoltes Nov 1, 2026
c93c753
Exercise an offline shell upgrade with no module available from the s…
wieslawsoltes Nov 1, 2026
b4dcedf
Limit eviction sorting to the removable tail and verify cache upgrade…
wieslawsoltes Nov 1, 2026
b431b19
Document performance workloads, operation counts and reproducible bas…
wieslawsoltes Nov 1, 2026
76362e6
Use a fresh cached discussion window without traversing it a second time
wieslawsoltes Nov 1, 2026
0e8b51f
Keep phone discussion refresh scoped to the visible pane and record r…
wieslawsoltes Nov 1, 2026
1593249
Dismiss reading-data reviews before leaving Settings and clear visits…
wieslawsoltes Nov 2, 2026
99bcd41
Recover missing profile activity in place and navigate local Find by …
wieslawsoltes Nov 2, 2026
5e2ef7a
Keep retained article metadata out of redacted stories and commands
wieslawsoltes Nov 2, 2026
abb2ab1
Open, copy and fold individual replies without losing reading context
wieslawsoltes Nov 2, 2026
ba93172
Keep active reader context and make adaptive navigation keyboard-oper…
wieslawsoltes Nov 2, 2026
0fc5bd8
Settle the search layout before retrying a profile in the interaction…
wieslawsoltes Nov 2, 2026
69c99d3
Recover unavailable feed rows in rank order without restarting pagina…
wieslawsoltes Nov 2, 2026
dcc61e4
Keep search and profile corrections in place across desktop and phone
wieslawsoltes Nov 2, 2026
c29fc11
Restore discussion Find, catch-up filters and reading position per visit
wieslawsoltes Nov 2, 2026
8ea72a4
Use owned browser history entries for reader Back and Forward
wieslawsoltes Nov 2, 2026
c7d1f38
Retain live feed rankings through mixed cache fallbacks and focus rec…
wieslawsoltes Nov 2, 2026
498964c
Replay skipped reader routes when traversing multiple browser entries
wieslawsoltes Nov 2, 2026
af77b3a
Keep newer discussions off the Back stack during detached browser tra…
wieslawsoltes Nov 2, 2026
9143179
Return through the browser-owned predecessor after leaving a feed tab
wieslawsoltes Nov 2, 2026
67fcd1a
Exercise direct permalinks and recovery actions at the smallest reade…
wieslawsoltes Nov 2, 2026
0b0d072
Show one accessible inline error for an oversized masthead search
wieslawsoltes Nov 2, 2026
4f493da
Report partial feed counts inline and keep retry feedback free of dup…
wieslawsoltes Nov 2, 2026
0f075c1
Show phone recovery and search correction in the reader guide
wieslawsoltes Nov 2, 2026
e52f18b
Resolve missing CJK glyphs lazily and reshape the active reader in place
wieslawsoltes Nov 2, 2026
f9e09ea
Package a licensed pan-CJK face and load its verified bytes only on d…
wieslawsoltes Nov 2, 2026
9b35f63
Run packaged reader regressions in CI and verify CJK shaping through …
wieslawsoltes Nov 2, 2026
f36b9c1
Keep font state and test counters in FerroUI thread-local storage
wieslawsoltes Nov 2, 2026
0ce4912
Use recorded reader positions when the browser history index is unava…
wieslawsoltes Nov 2, 2026
4435079
Show verified Wasm feed recovery and live multilingual text in the ga…
wieslawsoltes Nov 2, 2026
3846d00
Wait for the context command to accept a real pointer click
wieslawsoltes Nov 2, 2026
1d2fa76
Keep discussion Find feedback aligned with pending and composed text
wieslawsoltes Nov 2, 2026
481a5f5
Merge remote-tracking branch 'origin/main' into design/reader-polish
wieslawsoltes Nov 7, 2026
13a2607
FerroUI 4702de41a: url::Url for the launcher and font keys, detached …
wieslawsoltes Nov 7, 2026
cc9be65
FerroUI 0c0ea2a72: control themes as tables, type identities, newer JDKs
wieslawsoltes Nov 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,10 @@ jobs:
npm test --prefix Ember.Browser
browser-package: ember-browser
# The offline application shell of the default site.
browser-script: node Ember.Browser/write-offline-manifest.mjs . --out "$SITE"
browser-script: node Ember.Browser/write-offline-manifest.mjs . --package-font --out "$SITE"
# The packaged interactions reuse this site's artifact and the runner's Chrome.
browser-tests-setup: ''
browser-tests: node Ember.Browser/tests/browser-smoke.mjs "$SITE"
# The Android and iOS hosts, packaged as in docs/ember.md (artifacts android-apk and ios-app).
android: >-
--package ember-android --label Ember --application-id org.ferroui.ember
Expand Down
39 changes: 36 additions & 3 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

53 changes: 52 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,34 @@ repository = "https://github.com/FerroUI/Ember"

[workspace.dependencies]
# >>> FerroUI workspace dependencies (written by FerroUI/scripts/apps/sync-workspace.py from FerroUI/Cargo.toml; do not edit)
ferroui-media-camera-windows = { version = "=0.5.0-preview.1", path = "FerroUI/src/FerroUI.Media.Camera.Windows" }
ferroui-media-video-windows = { version = "=0.5.0-preview.1", path = "FerroUI/src/FerroUI.Media.Video.Windows" }
ferroui-media-windows = { version = "=0.5.0-preview.1", path = "FerroUI/src/FerroUI.Media.Windows" }
ferroui-media-camera-linux = { version = "=0.5.0-preview.1", path = "FerroUI/src/FerroUI.Media.Camera.Linux" }
ferroui-media-video-linux = { version = "=0.5.0-preview.1", path = "FerroUI/src/FerroUI.Media.Video.Linux" }
ferroui-media-linux = { version = "=0.5.0-preview.1", path = "FerroUI/src/FerroUI.Media.Linux" }
ferroui-media-video = { version = "=0.5.0-preview.1", path = "FerroUI/src/FerroUI.Media.Video" }
ferroui-media-camera = { version = "=0.5.0-preview.1", path = "FerroUI/src/FerroUI.Media.Camera" }
ferroui-media-video-controls = { version = "=0.5.0-preview.1", path = "FerroUI/src/FerroUI.Media.Video.Controls" }
ferroui-media-video-apple = { version = "=0.5.0-preview.1", path = "FerroUI/src/FerroUI.Media.Video.Apple" }
ferroui-media-camera-apple = { version = "=0.5.0-preview.1", path = "FerroUI/src/FerroUI.Media.Camera.Apple" }
ferroui-media-controls = { version = "=0.5.0-preview.1", path = "FerroUI/src/FerroUI.Media.Controls" }
ferroui-media-apple = { version = "=0.5.0-preview.1", path = "FerroUI/src/FerroUI.Media.Apple" }
ferroui-media-browser = { version = "=0.5.0-preview.1", path = "FerroUI/src/FerroUI.Media.Browser" }
ferroui-media-video-browser = { version = "=0.5.0-preview.1", path = "FerroUI/src/FerroUI.Media.Video.Browser" }
ferroui-media-camera-browser = { version = "=0.5.0-preview.1", path = "FerroUI/src/FerroUI.Media.Camera.Browser" }
ferroui-media = { version = "=0.5.0-preview.1", path = "FerroUI/src/FerroUI.Media" }
ferroui-media3d = { version = "=0.5.0-preview.1", path = "FerroUI/src/FerroUI.Media3D" }
ferroui-render3d = { version = "=0.5.0-preview.1", path = "FerroUI/src/FerroUI.Rendering3D" }
ferroui-media-metal = { version = "=0.5.0-preview.1", path = "FerroUI/src/FerroUI.Media.Metal" }
ferroui-media-opengl = { version = "=0.5.0-preview.1", path = "FerroUI/src/FerroUI.Media.OpenGL" }
ferroui-media-android = { version = "=0.5.0-preview.1", path = "FerroUI/src/FerroUI.Media.Android" }
ferroui-media-video-android = { version = "=0.5.0-preview.1", path = "FerroUI/src/FerroUI.Media.Video.Android" }
ferroui-media-camera-android = { version = "=0.5.0-preview.1", path = "FerroUI/src/FerroUI.Media.Camera.Android" }
ferroui-media-camera-controls = { version = "=0.5.0-preview.1", path = "FerroUI/src/FerroUI.Media.Camera.Controls" }
ferroui-media-qr = { version = "=0.5.0-preview.1", path = "FerroUI/src/FerroUI.Media.Qr", default-features = false }
ferroui-media-qr-android = { version = "=0.5.0-preview.1", path = "FerroUI/src/FerroUI.Media.Qr.Android" }
ferroui-media-qr-apple = { version = "=0.5.0-preview.1", path = "FerroUI/src/FerroUI.Media.Qr.Apple" }
# The Dock port (docs/porting/dock): its crates and the dependencies only it has.
ferrodock-controls-recycling-model = { version = "=0.5.0-preview.1", path = "FerroUI/src/Dock/FerroDock.Controls.Recycling.Model" }
ferrodock-controls-recycling-model-ferro = { version = "=0.5.0-preview.1", path = "FerroUI/src/Dock/FerroDock.Controls.Recycling.Model.Ferro" }
Expand Down Expand Up @@ -201,7 +229,7 @@ wayland-protocols-misc = { version = "=0.3.12", features = ["client"] }
jni-sys = { version = "=0.4.1" }
paste = "1"
cc = "1"
skia-safe = { version = "0.153" }
skia-safe = { version = "=0.153.3" }
# The Vello render backend (docs/porting/vello-backend.md, section 2): exact versions, because the
# renderers of the Vello project change their interfaces between minor releases. `vello_cpu` without
# its default features: its thread pool is added by the backend on targets with threads (the
Expand Down Expand Up @@ -238,6 +266,9 @@ gif = { version = "=0.14.2", default-features = false, features = ["std"] }
vello_gpu = { version = "=0.3.0", default-features = false, features = ["std", "text"] }
vello = { version = "=0.11.0", default-features = false, features = ["wgpu"] }
wgpu = { version = "=30.0.1", default-features = false, features = ["std", "wgsl", "metal"] }
# The shader translator of `wgpu`, at its version: `ferroui-build` translates the WGSL of the runtime
# shader effects to GLSL ES 3.0 for WebGL2 at build time (its features `wgsl-in` and `glsl-out`).
naga = { version = "=30.0.1", default-features = false }
# The version of the `wasm-bindgen` command-line tool on PATH has to be this exact version.
wasm-bindgen = "=0.2.129"
# The bindings of the WebGL2 renderer of `vello_gpu`, at the versions that belong to that release
Expand Down Expand Up @@ -285,11 +316,27 @@ lto = false
# then shows addresses (docs/binary-size.md, section 4.3). On Windows the executable never holds the
# symbols (they are in the PDB beside it), so the setting changes nothing there. Build with the
# release profile for a backtrace with names.
#
# Without unwinding (`panic = "abort"`, docs/binary-size.md, section 4.7, #567): a panic ends the
# process, after the panic hook has run. The unwind tables and the landing pads are left out: hello
# world's executable is 21 % smaller. No production path of the framework carries an expected
# error as a panic (docs/porting/panics-as-exceptions.md); what a catch of a panic still isolates
# is a bug, which then ends the process instead of being logged. The development tools that isolate
# the code of the application they inspect (the Designer, the previewer, hot reload, DevTools) are
# built with `dev`, `release` or `dist-unwind`. Cargo ignores the setting for tests, benches, build
# scripts and procedural macros, which always unwind.
[profile.dist]
inherits = "release"
lto = "fat"
codegen-units = 1
strip = "symbols"
panic = "abort"

# The shipped build with unwinding: `dist` with `panic = "unwind"`, for an application that catches
# panics to carry on (a plug-in host, a tool that isolates the code it runs).
[profile.dist-unwind]
inherits = "dist"
panic = "unwind"

# The WebAssembly module of the browser (scripts/build-browser.sh): optimised for size, because the
# module is downloaded and compiled by every visitor (docs/porting/browser-platform.md, section 18).
Expand Down Expand Up @@ -362,4 +409,8 @@ opt-level = 3

[profile.browser.package.read-fonts]
opt-level = 3

[patch.crates-io]
# Pinned source hotfix for Graphite Metal's retained Objective-C objects.
skia-bindings = { path = "FerroUI/external/rust-skia-bindings" }
# <<< FerroUI profiles
5 changes: 5 additions & 0 deletions Ember.Browser/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -27,4 +27,9 @@ ferroui-controls = { workspace = true }
ferroui-browser = { workspace = true }
ferroui-fonts-inter = { workspace = true }
wasm-bindgen = { workspace = true }
js-sys = { workspace = true }
serde_json = "1"
url = { workspace = true }

[target.'cfg(not(target_os = "emscripten"))'.dev-dependencies]
ferroui-skia = { workspace = true }
16 changes: 11 additions & 5 deletions Ember.Browser/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,15 +28,21 @@ The wrapper (`scripts/build-browser.sh` of this repository) accepts the options
framework's Skia backend. `--features vello` adds FerroUI's alternative renderer,
selected with `?Renderer=Vello`. All drawing remains behind the FerroUI rendering API.

For a development build on a machine with limited memory, optimize the Rust code
before the WebAssembly binding step. An entirely unoptimized framework module is
much larger:
For a single-threaded development build on a memory-constrained machine, use the
same pinned toolchain and run:

```sh
CARGO_PROFILE_DEV_OPT_LEVEL=1 CARGO_PROFILE_DEV_DEBUG=0 CARGO_INCREMENTAL=0 \
CARGO_BUILD_JOBS=1 scripts/build-browser.sh --debug
source /path/to/browser-tools/env.sh
EMBER_LOW_MEMORY=1 scripts/build-browser.sh --debug
```

This mode builds Rust at optimization level 1 with one build job, then uses the
SDK's Binaryen `wasm-opt` to reduce the linked module before the pinned
`wasm-bindgen` generates JavaScript. It strips WebAssembly debug symbols and
function names, so browser stack traces lack those names. The temporary optimized
module is removed after binding. The site location and offline shell are the same
as a standard non-threaded build.

## Database and offline behavior

`platform.rs` implements the reader core's `HttpClient` and `Store` contracts. Promises
Expand Down
Loading
Loading