Skip to content

Added a Bluesky share button to the published post modal - #30356

Merged
minimaluminium merged 4 commits into
mainfrom
bluesky-share-DES-1367
Sep 2, 2026
Merged

Added a Bluesky share button to the published post modal#30356
minimaluminium merged 4 commits into
mainfrom
bluesky-share-DES-1367

Conversation

@minimaluminium

Copy link
Copy Markdown
Member

ref https://linear.app/ghost/issue/DES-1367/add-bluesky-share-button-to-published-post-popup

Bluesky is already offered in Portal's native share, so this brings the admin modal
in line — same intent URL and payload, placed last so the existing buttons keep
their order.

Also fixes the social buttons leaving a gap on the right when the footer stacks on
mobile — they now fill the row at that width.

@nx-cloud

nx-cloud Bot commented Aug 28, 2026

Copy link
Copy Markdown

🤖 Nx Cloud AI Fix

Ensure the fix-ci command is configured to always run in your CI pipeline to get automatic fixes in future runs. For more information, please see https://nx.dev/ci/features/self-healing-ci


View your CI Pipeline Execution ↗ for commit cde4761

Command Status Duration Result
nx run @tryghost/admin:test:acceptance ✅ Succeeded 7m 23s View ↗
nx run @tryghost/activitypub:test:acceptance ✅ Succeeded 49s View ↗
nx run-many -t test:unit -p @tryghost/admin,@tr... ✅ Succeeded 7s View ↗
nx run @tryghost/admin:build ✅ Succeeded 8s View ↗
nx run ghost-monorepo:lint:boundaries ✅ Succeeded <1s View ↗
nx run @tryghost/e2e:test:fixtures ✅ Succeeded 1s View ↗
nx run-many -t lint -p @tryghost/admin,ghost-ad... ✅ Succeeded 3s View ↗
nx run-many --target=build --projects=tag:publi... ✅ Succeeded <1s View ↗
nx run ghost-admin:test ✅ Succeeded 1s View ↗

💡 Verify your cache is correct by running tasks in a sandbox. Read docs ↗


☁️ Nx Cloud last updated this comment at 2026-09-01 04:08:19 UTC

@coderabbitai

coderabbitai Bot commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: QUIET

Plan: Team

Run ID: 3b2bae60-4de3-4942-ab25-0255612ba14d

📥 Commits

Reviewing files that changed from the base of the PR and between 8b4c212 and cde4761.

⛔ Files ignored due to path filters (1)
  • apps/ember-admin/public/assets/icons/social-bluesky.svg is excluded by !**/*.svg
📒 Files selected for processing (6)
  • apps/admin/src/shared/analytics/post-share-modal.tsx
  • apps/ember-admin/app/components/modal-post-success.hbs
  • apps/ember-admin/app/styles/app-dark.css
  • apps/ember-admin/app/styles/components/publishmenu.css
  • apps/shade/src/components/patterns/share-modal.stories.tsx
  • apps/shade/src/components/patterns/share-modal.tsx

Included review availability: Your plan provides up to 10 included reviews per hour; 8 remain after this review.

📜 Recent review details
⏰ Context from checks skipped due to timeout. (2)
  • GitHub Check: App Playwright Acceptance Tests (@tryghost/admin)
  • GitHub Check: Build Docker Images
🧰 Additional context used
📓 Path-based instructions (7)
Review Admin UI for existing Shade reuse, correct component layer, semantic

⚙️ CodeRabbit configuration file

Files:

  • apps/admin/src/shared/analytics/post-share-modal.tsx
  • apps/shade/src/components/patterns/share-modal.stories.tsx
  • apps/shade/src/components/patterns/share-modal.tsx
Review lens: "where does this data become trusted?"

⚙️ CodeRabbit configuration file

Files:

  • apps/admin/src/shared/analytics/post-share-modal.tsx
  • apps/shade/src/components/patterns/share-modal.stories.tsx
  • apps/shade/src/components/patterns/share-modal.tsx
Prioritise concrete correctness, security, data-integrity, compatibility,

⚙️ CodeRabbit configuration file

Files:

  • apps/admin/src/shared/analytics/post-share-modal.tsx
  • apps/shade/src/components/patterns/share-modal.stories.tsx
  • apps/ember-admin/app/components/modal-post-success.hbs
  • apps/ember-admin/app/styles/app-dark.css
  • apps/ember-admin/app/styles/components/publishmenu.css
  • apps/shade/src/components/patterns/share-modal.tsx
do not import `@tryghost/shade/styles.css` from an

📄 CodeRabbit inference engine (AGENTS.md)

Files:

  • apps/ember-admin/app/styles/app-dark.css
  • apps/ember-admin/app/styles/components/publishmenu.css
Type-safe boundaries: Fail only if the PR:

📄 CodeRabbit inference engine (Custom checks)

Files:

  • apps/admin/src/shared/analytics/post-share-modal.tsx
  • apps/shade/src/components/patterns/share-modal.stories.tsx
  • apps/shade/src/components/patterns/share-modal.tsx
Build new features in React,

📄 CodeRabbit inference engine (AGENTS.md)

Files:

  • apps/admin/src/shared/analytics/post-share-modal.tsx
Always use `pnpm`, never npm or Yarn.

📄 CodeRabbit inference engine (AGENTS.md)

Files:

  • apps/admin/src/shared/analytics/post-share-modal.tsx
  • apps/shade/src/components/patterns/share-modal.stories.tsx
  • apps/ember-admin/app/components/modal-post-success.hbs
  • apps/ember-admin/app/styles/app-dark.css
  • apps/ember-admin/app/styles/components/publishmenu.css
  • apps/shade/src/components/patterns/share-modal.tsx
🧠 Learnings (1)
📚 Learning: 2026-07-21T19:57:01.324Z
Learnt from: troyciesco
Repo: TryGhost/Ghost PR: 29497
File: apps/admin/src/automations/components/canvas/off-value.tsx:4-4
Timestamp: 2026-07-21T19:57:01.324Z
Learning: Admin UI in Ghost is intentionally not localized. During code review, do not request adding i18n/translation hooks, wrappers, or new locale keys (e.g., updates to `packages/i18n/locales/en/ghost.json`) for Admin UI strings, including any React components under `apps/admin/src/`.

Applied to files:

  • apps/admin/src/shared/analytics/post-share-modal.tsx
🔇 Additional comments (6)
apps/admin/src/shared/analytics/post-share-modal.tsx (1)

70-74: LGTM!

apps/shade/src/components/patterns/share-modal.stories.tsx (1)

48-52: LGTM!

apps/shade/src/components/patterns/share-modal.tsx (1)

16-16: LGTM!

Also applies to: 201-211, 261-261

apps/ember-admin/app/components/modal-post-success.hbs (1)

164-166: LGTM!

apps/ember-admin/app/styles/app-dark.css (1)

1173-1177: LGTM!

apps/ember-admin/app/styles/components/publishmenu.css (1)

1050-1051: LGTM!

Also applies to: 1088-1099, 1138-1138


Walkthrough

The share configurations now include Bluesky compose links built from the encoded post title and URL. The share modal recognizes the bluesky service and renders its icon. The publish-success modal includes a Bluesky share button with matching dark-theme and responsive styles.

Suggested reviewers: 9larsons

Merge Risk: ⚪ Minimal · up to cde47

The change adds Bluesky sharing and adjusts mobile footer button layout without any identified merge-blocking risk; it is ready to merge after normal checks and review.

🚥 Pre-merge checks | ✅ 6
✅ Passed checks (6 passed)
Check name Status Explanation
Description check ✅ Passed The description accurately covers the Bluesky share button and the mobile footer layout update.
Title check ✅ Passed The title clearly identifies the primary change: adding a Bluesky share button to the published post modal.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Type-Safe Boundaries ✅ Passed PASS. The feature commits add static Bluesky URL construction, a string-literal service value, UI markup, CSS, and SVG data. They add no HTTP, SDK, environment, filesystem, queue, or event read. The n…
New Files Are Typescript ✅ Passed PASS: The pull-request range adds only apps/ember-admin/public/assets/icons/social-bluesky.svg. It adds no .js, .jsx, .cjs, or .mjs source file. The listed TypeScript/TSX files are modified,…
Full details: Type-Safe Boundaries

Explanation

PASS. The feature commits add static Bluesky URL construction, a string-literal service value, UI markup, CSS, and SVG data. They add no HTTP, SDK, environment, filesystem, queue, or event read. The new URL reuses postTitle and postURL, which are existing typed component props already used by the existing share links. No any, unchecked as, @ts-ignore, @ts-nocheck, or duplicated Zod-described type was introduced.

Full details: New Files Are Typescript

Explanation

PASS: The pull-request range adds only apps/ember-admin/public/assets/icons/social-bluesky.svg. It adds no .js, .jsx, .cjs, or .mjs source file. The listed TypeScript/TSX files are modified, not added. The check therefore has no failure condition.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch bluesky-share-DES-1367

Comment @coderabbitai help to get the list of available commands.

@codecov

codecov Bot commented Aug 28, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 76.13%. Comparing base (8b4c212) to head (cde4761).

Additional details and impacted files
@@           Coverage Diff           @@
##             main   #30356   +/-   ##
=======================================
  Coverage   76.13%   76.13%           
=======================================
  Files        1679     1679           
  Lines      160277   160277           
  Branches    19669    19669           
=======================================
  Hits       122030   122030           
  Misses      37227    37227           
  Partials     1020     1020           

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@weylandswart
weylandswart self-requested a review August 31, 2026 10:33

@weylandswart weylandswart left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good to me!

ref https://linear.app/ghost/issue/DES-1367/add-bluesky-share-button-to-published-post-popup

Portal's native share already offers Bluesky, so the mark comes over
with it. Portal's asset is a bad export though: its viewBox pads the
artwork to the bottom, and its width and height attributes don't match
that ratio. Sized by height alone it rendered short and sat high in its
box, so this uses the official mark on a square viewBox instead, which
makes it 16x16 like every other icon here without a CSS override.

Bluesky goes last in the union and in the branch order to match the
order the services render in.
ref https://linear.app/ghost/issue/DES-1367/add-bluesky-share-button-to-published-post-popup

A customer asked for Bluesky in the prompt shown after publishing.

The intent URL and its payload are the same ones Portal's native share
uses, so a post shared from Admin and from the site compose the same
post. Bluesky goes last so the four existing buttons keep the order
publishers are used to.
ref https://linear.app/ghost/issue/DES-1367/add-bluesky-share-button-to-published-post-popup

Below sm the dialog footer stacks, so the copy button spans the full
width but the social buttons kept their fixed width and left a gap on
the right that read as a missing button.

They now grow to fill the row at that width and return to the fixed
width at sm, on the same breakpoint the footer itself switches on.
ref https://linear.app/ghost/issue/DES-1367/add-bluesky-share-button-to-published-post-popup

The React posts list already has this modal, but it is still behind a
flag, so the Ember one is what publishers see after publishing today.
Leaving it out would mean Bluesky comes and goes depending on which list
the post was published from.

The intent URL and its payload match the React modal and Portal's native
share, so a post shared from any of them composes the same post. Bluesky
goes last to keep the order of the four existing buttons. In dark mode it
keeps its brand colour like Facebook and LinkedIn rather than joining the
rule that recolours the monochrome X and Threads marks.

A fifth button did not fit the existing layout. The row was a fixed
four-column grid, so it now takes its track count from the number of
buttons. The chips also ask for 56px but were held at 64px by the generic
footer button min-width, which made the five of them wider than the 478px
the modal has to spend and wrapped the copy link label onto a second
line; clearing that min-width lets the declared width apply.

Below 500px the grid dropped to two columns, which leaves a hole in the
last row with an odd number of buttons. They now stay on one row and fill
the width, the same as the React modal at that size.
@coderabbitai

coderabbitai Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Note

GitHub couldn't provide a complete incremental comparison for this pull request, so CodeRabbit is performing a full review instead. This review may take a little longer.

@minimaluminium
minimaluminium merged commit 7f371ff into main Sep 2, 2026
53 checks passed
@minimaluminium
minimaluminium deleted the bluesky-share-DES-1367 branch September 2, 2026 01:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants