A native item pane, with the show notes still rendered as HTML #4

Closed
opened 2026-09-19 16:56:09 -07:00 by rays · 1 comment
Owner

The reading pane: title, feed, date, duration, the read and pin controls, the files with their play, save and delete buttons, and the show notes.

Blocked by #3 -- it needs a list to select from.

The show notes are the awkward part and the reason this is its own ticket. They are feed-supplied HTML, sanitized server-side with ammonia before they are sent, and there is no good native renderer for them: NSAttributedString(html:) is slow, ugly and single-threaded, and writing a real one is a project in itself. A small WKWebView carrying only the notes, styled to match the Glass palette, is the honest answer, and it is what native podcast clients generally do.

So this is not a step towards removing the web view. It keeps one, deliberately, in the place where it earns its keep.

The reading pane: title, feed, date, duration, the read and pin controls, the files with their play, save and delete buttons, and the show notes. **Blocked by #3** -- it needs a list to select from. The show notes are the awkward part and the reason this is its own ticket. They are feed-supplied HTML, sanitized server-side with ammonia before they are sent, and there is no good native renderer for them: `NSAttributedString(html:)` is slow, ugly and single-threaded, and writing a real one is a project in itself. A small `WKWebView` carrying only the notes, styled to match the Glass palette, is the honest answer, and it is what native podcast clients generally do. So this is not a step towards removing the web view. It keeps one, deliberately, in the place where it earns its keep.
rays added the enhancement label 2026-09-19 16:56:09 -07:00
rays added a new dependency 2026-09-19 16:58:58 -07:00
Author
Owner

Done in 2929415.

The pane carries the item, its files with play, download and delete, read and pin in the toolbar, a link to the original, and the notes.

The notes are a WKWebView carrying only the notes, with just enough stylesheet to belong to the app — system font at body size, label colours, links in the accent. Nothing else is imposed; the markup is the publisher's. A link opens in Safari rather than inside the view, where it would replace the notes and leave no way back.

Deleting asks first and says when the file is shared, since one file serves every subscriber.

Navigation took two goes, both worth recording: a row with a selection binding on the List highlights and goes nowhere, because the binding takes the tap before the link sees it; and with the binding gone, NavigationLink(value:) with a matching navigationDestination still pushed nothing and gave no reason. The link carries its own destination now.

Fourteen tests pass. The new one opens an item and looks for its notes, its delete button and its read control, so a pane that renders empty fails rather than passing quietly.

Done in 2929415. The pane carries the item, its files with play, download and delete, read and pin in the toolbar, a link to the original, and the notes. The notes are a `WKWebView` carrying only the notes, with just enough stylesheet to belong to the app — system font at body size, label colours, links in the accent. Nothing else is imposed; the markup is the publisher's. A link opens in Safari rather than inside the view, where it would replace the notes and leave no way back. Deleting asks first and says when the file is shared, since one file serves every subscriber. Navigation took two goes, both worth recording: a row with a selection binding on the `List` highlights and goes nowhere, because the binding takes the tap before the link sees it; and with the binding gone, `NavigationLink(value:)` with a matching `navigationDestination` still pushed nothing and gave no reason. The link carries its own destination now. Fourteen tests pass. The new one opens an item and looks for its notes, its delete button and its read control, so a pane that renders empty fails rather than passing quietly.
rays closed this issue 2026-09-20 06:34:36 -07:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Depends on
Reference: rays/ipodderx-app#4