Commits
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The firehose UPDATE path was also running the newsletter claim/send logic.
Combined with the fact that the idempotency row in publication_post_sends
is only inserted when newsletters are enabled at upsert time, this meant
that editing an old post after newsletters were turned on for the
publication would mail the post out to subscribers retroactively.
Gate the newsletter block on event_type === "create" so only firehose
creates can fire sends. Metadata sync (indexed flag, bsky like counts,
bridgy deletion) still runs on updates as before.
Co-authored-by: Claude <noreply@anthropic.com>
Introduces editable pages attached to a publication (separate from
draft posts). Each page is backed by its own leaflet, listed under
`publication_pages`, and edited through a new
`/lish/[did]/[publication]/edit/[[...route]]` route with its own
header/nav. PublicationContent is refactored to share
PublicationHeader and PublicationPostsList. createNewLeaflet gains
`firstBlocks` + `addToHomepage` so createPublicationPage can seed a
page with a text + posts-list block without polluting the user's
homepage. Page/Sidebar/PageOptions/PublicationMetadata hide
post-only chrome when viewing a publication page, and the block
command bar exposes Posts List + Subscribe Form via a new
`publicationOnly` flag.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds a Settings popover to the on-block options strip on posts-list
blocks, persisting `posts-list/view` (compact|full) and
`posts-list/highlight-first-post` as block facts. Introduces
PublicationPostItemSmall/Medium/Large variants and wires
PublicationPostsList to render Large for the highlighted first post,
Small for compact, and Medium for full.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* clear cursor marks when arrow keys hit block boundary inside a mark
When the cursor sits at the start or end of a text block and is inside a
mark (e.g. bold), the first ArrowLeft/ArrowRight press now clears the
stored marks instead of navigating to the adjacent block. A second press
moves between blocks as before. This lets users escape an inclusive mark
without first typing a character.
* step the cursor past footnotes when arrow keys are pressed
Footnotes render as empty <span> elements (with the number coming from
a CSS ::after pseudo-element), so browser-native arrow navigation can
skip past the span without stopping on either side. Detect when
$from.nodeBefore/nodeAfter is a footnote and explicitly move the
selection across it.
* extract skipFootnote and clearStoredMarks helpers
ArrowLeft and ArrowRight had two copies each of the footnote-skip and
stored-marks-clearing logic. Pull them into small helpers and use
state.selection.empty instead of allocating a Slice via content().size.
---------
Co-authored-by: Claude <noreply@anthropic.com>
In get_publication_analytics.ts, the code checks if the user has entitlements but does not verify that the user actually owns or has access to the specific publication_uri being queried. Any entitled user could potentially access analytics for any publication.
Signed-off-by: tomaioo <203048277+tomaioo@users.noreply.github.com>
* move tabs into sidebar
* move dashboard pages into new layout, tweak mobile layout
* renaming and componentizing things in the Dashboard Layouts for clarity
* componentize the search input on pages
* added sidebar on mobile, refactored some stuff
* added sticky scroll behavior to mobile header
* animations for the mobile pageHeader
* fix mobile nav trigger and component structure
* futzing
* more futzing
* Added logged out state to Reader Inbox, refactored reader to use new
layout
* fix a z-index issue
* use route based navigation
* remove logs and small fixes
* simplify
* small fixes
* updates to leaflet to accomodate sidebar changes
* dynamic notification page
* fix search when signed out
* prevent default and add stop propogration to email submit
* added new tab to the reader, decodeds urls in pickActiveTab function
* tweaks to publish banner in sidebar to avoid redundancy
* bubble up notifactions, scroll very long pub lists
* rm interaction drawer in reader, add a layout component to reader pages
* added leaflet about
* move mobile nav to the bottom
* added icons to the tabs
* handle signed out users side bar actions
---------
Co-authored-by: celine <celine@hyperlink.academy>
The firehose UPDATE path was also running the newsletter claim/send logic.
Combined with the fact that the idempotency row in publication_post_sends
is only inserted when newsletters are enabled at upsert time, this meant
that editing an old post after newsletters were turned on for the
publication would mail the post out to subscribers retroactively.
Gate the newsletter block on event_type === "create" so only firehose
creates can fire sends. Metadata sync (indexed flag, bsky like counts,
bridgy deletion) still runs on updates as before.
Co-authored-by: Claude <noreply@anthropic.com>
Introduces editable pages attached to a publication (separate from
draft posts). Each page is backed by its own leaflet, listed under
`publication_pages`, and edited through a new
`/lish/[did]/[publication]/edit/[[...route]]` route with its own
header/nav. PublicationContent is refactored to share
PublicationHeader and PublicationPostsList. createNewLeaflet gains
`firstBlocks` + `addToHomepage` so createPublicationPage can seed a
page with a text + posts-list block without polluting the user's
homepage. Page/Sidebar/PageOptions/PublicationMetadata hide
post-only chrome when viewing a publication page, and the block
command bar exposes Posts List + Subscribe Form via a new
`publicationOnly` flag.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds a Settings popover to the on-block options strip on posts-list
blocks, persisting `posts-list/view` (compact|full) and
`posts-list/highlight-first-post` as block facts. Introduces
PublicationPostItemSmall/Medium/Large variants and wires
PublicationPostsList to render Large for the highlighted first post,
Small for compact, and Medium for full.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* clear cursor marks when arrow keys hit block boundary inside a mark
When the cursor sits at the start or end of a text block and is inside a
mark (e.g. bold), the first ArrowLeft/ArrowRight press now clears the
stored marks instead of navigating to the adjacent block. A second press
moves between blocks as before. This lets users escape an inclusive mark
without first typing a character.
* step the cursor past footnotes when arrow keys are pressed
Footnotes render as empty <span> elements (with the number coming from
a CSS ::after pseudo-element), so browser-native arrow navigation can
skip past the span without stopping on either side. Detect when
$from.nodeBefore/nodeAfter is a footnote and explicitly move the
selection across it.
* extract skipFootnote and clearStoredMarks helpers
ArrowLeft and ArrowRight had two copies each of the footnote-skip and
stored-marks-clearing logic. Pull them into small helpers and use
state.selection.empty instead of allocating a Slice via content().size.
---------
Co-authored-by: Claude <noreply@anthropic.com>
In get_publication_analytics.ts, the code checks if the user has entitlements but does not verify that the user actually owns or has access to the specific publication_uri being queried. Any entitled user could potentially access analytics for any publication.
Signed-off-by: tomaioo <203048277+tomaioo@users.noreply.github.com>
* move tabs into sidebar
* move dashboard pages into new layout, tweak mobile layout
* renaming and componentizing things in the Dashboard Layouts for clarity
* componentize the search input on pages
* added sidebar on mobile, refactored some stuff
* added sticky scroll behavior to mobile header
* animations for the mobile pageHeader
* fix mobile nav trigger and component structure
* futzing
* more futzing
* Added logged out state to Reader Inbox, refactored reader to use new
layout
* fix a z-index issue
* use route based navigation
* remove logs and small fixes
* simplify
* small fixes
* updates to leaflet to accomodate sidebar changes
* dynamic notification page
* fix search when signed out
* prevent default and add stop propogration to email submit
* added new tab to the reader, decodeds urls in pickActiveTab function
* tweaks to publish banner in sidebar to avoid redundancy
* bubble up notifactions, scroll very long pub lists
* rm interaction drawer in reader, add a layout component to reader pages
* added leaflet about
* move mobile nav to the bottom
* added icons to the tabs
* handle signed out users side bar actions
---------
Co-authored-by: celine <celine@hyperlink.academy>