Skip to content

Sync with upstream Ghost v6.30.0#65

Open
madewithlove-machine-user wants to merge 579 commits intomainfrom
chore/sync-v6.30.0
Open

Sync with upstream Ghost v6.30.0#65
madewithlove-machine-user wants to merge 579 commits intomainfrom
chore/sync-v6.30.0

Conversation

@madewithlove-machine-user
Copy link
Copy Markdown

Syncing fork to upstream release v6.30.0.

mike182uk and others added 30 commits April 1, 2026 16:09
…#27053)

ref https://linear.app/ghost/issue/BER-3484

Scaffolds the Portal gift page behind the `giftSubscriptions` labs flag.
When the flag is disabled, both hash links and `data-portal` attributes
are blocked and the URL is cleaned up
ref BER-3495

Browser password managers were detecting the filter input as a login
field and showing autofill suggestions. Added autoComplete="off" and
vendor-specific ignore attributes (1Password, LastPass, browser
heuristics) to prevent this.
no refs.

- The thousands indicator was missing in the actions menu on the Ember
member list screen when a filter was applied.
Context: the previous jq payload used shell string interpolation to
embed the changelog, which collapsed multi-line release notes into a
single line. Switching to --rawfile lets jq read the file directly,
preserving all newline characters in the JSON payload.
no ref
- Removed `usePerTestIsolation()` from 4 single-test files where it was
a no-op (per-file isolation is identical when there's only 1 test):
`private-site`, `staff-invites`, `newsletter-send`, `virtual-window`
- Merged `posts.test.ts` (1 test) and `post-settings.test.ts` (1 test)
into `publishing.test.ts` — same feature surface and setup, eliminates 2
Ghost instance spinups in CI
- Consolidated 3 post preview modal tests into 1 flow test that
exercises all dismiss methods (close button, ESC from header, ESC from
iframe) in sequence

No coverage removed. Net result: 2 fewer test files, 2 fewer tests, 2
fewer Ghost instances per CI run.
…ost#27064)

no ref

## Summary
**forEach collapse:**
- `force-upgrade.test.ts`: Two `NAV_ITEMS.forEach()` loops were
generating 14 per-test-isolated tests, each spinning up its own Ghost
instance to assert the billing iframe is visible. Collapsed into 2 flow
tests that iterate nav items within a single instance each. Eliminates
~11 Ghost instance spinups per CI run.
- `navigation.test.ts`: `NAV_ITEMS.forEach()` generating 7 tests
collapsed into 1 flow test that iterates all items in sequence.

**ISO removal:**
- `filter-actions.test.ts`: Removed `usePerTestIsolation()` — both tests
create their own fixture data and operate on independent label
operations with no shared state conflicts.

**No coverage removed.** Every assertion is preserved, just grouped into
fewer tests with fewer Ghost instances.

**Net impact:** ~19 fewer `test()` calls, ~13 fewer Ghost instance
spinups per CI run.

## Test plan

- [ ] CI e2e tests pass on all 8 shards
ref https://linear.app/ghost/issue/BER-3484

Implemented the gift page content behind the `giftSubscriptions` labs
flag: site header, purchaser email input, monthly/yearly toggle, paid
tier cards with pricing and benefits, and a `Purchase gift` button
The tier filter dropdown only matched on tier name, making it hard to
find tiers when the display name differs from the slug. Including the
slug as a detail field lets users search by either value.
no ref
- build the public app bundles for E2E once in a dedicated job
- build the final E2E Docker image once from the production Ghost image
plus those bundles
- have each E2E shard load the prebuilt image and skip rebuilding app
assets and the overlay image

## Why
Each shard currently runs `yarn workspace @tryghost/e2e build:apps` and `build:docker` during `prepare-ci-e2e-job.sh`, which duplicates the same work eight times.
closes
https://linear.app/ghost/issue/NY-1138/add-automated-email-design-settings-api-endpoint

## Summary
- Added a singleton automated email design Admin API subresource at
`GET` and `PUT /automated_emails/design` for reading and editing the
shared automated email design settings
- The endpoint resolves the shared default design setting by its slug
(`default-automated-email`) rather than requiring clients to know the ID
- Reuses `email_design_setting` permissions (admin/owner only) and
prevents slug modification
- Keeps `email_design_settings` as an internal persistence detail
instead of exposing a generic table-shaped API
- Moved `DEFAULT_EMAIL_DESIGN_SETTING_SLUG` constant to the shared
`constants.js` module to avoid duplication

## Advantages over a more generic `email-design-settings` BREAD resource
- For welcome emails customization, we only really need read and edit of
the default row. Creating a full BREAD resource is more code to maintain
and support, some of which isn't necessary for our current
implementation.
- Better decoupling between our DB schema and the frontend. The frontend
doesn't need to know or care about the `email_design_settings` table, it
only cares about "editing design settings for welcome emails".
Ultimately this means more flexibility in changing the schema in the
future without breaking the API
- Simpler implementation on both the backend and frontend

## Test plan
- [x] E2E tests covering read, edit, slug rejection, field validation,
and role-based permissions (editor, author, contributor denied)

---------

Co-authored-by: Troy Ciesco <tmciesco@gmail.com>
ref https://linear.app/ghost/issue/BER-3313
Cutover from Ghost-Release — releases now run from this repo
ref https://linear.app/ghost/issue/BER-3313

Ghost 5.x has reached end of life. Removed the IS_FIVE flag,
5.x from IS_DEVELOPMENT, and 5.x-specific package publishing
logic (version check and ghost-5x npm tag).

Push triggers remain generic ('v[0-9]+.*', '[0-9]+.x') so CI
tests still run if someone pushes to 5.x — packages just won't
be published.
ref https://linear.app/ghost/issue/BER-3484

After completing a Stripe gift checkout, Portal detects if the purchase
was successful and displays a modal with the shareable redemption link
The docker-container BuildKit driver runs in an isolated container that
cannot see locally loaded images, causing fork PR builds to fail. This
switches to the docker driver when using artifact transfer and skips the
registry cache-from when push is disabled, since the registry is
inaccessible in that context.
ref https://linear.app/ghost/issue/BER-3445

Extracted a composable MultiSelectCombobox component from Shade's existing filter internals, enabling custom item rendering, headers, and footers via slots. Migrated the label filter from a standalone LabelPicker to compose over MultiSelectCombobox, bringing inline label create/edit/delete into the standard filter combobox. Added E2E coverage for both label and offer multiselect filter workflows.
ref https://linear.app/ghost/issue/DES-1325/split-root-exports

- This change introduces clear, layered @tryghost/shade entrypoints
(tokens, primitives, components, patterns, app, utils) so consumers
import from explicit boundaries instead of a monolithic root barrel.
We’re doing this to reduce API drift and accidental coupling, enable
staged migration with soft deprecations, and give engineers/agents
stronger guardrails for consistent reuse and long-term maintainability.
…7015)

no issue

Uses `yarn setup` instead of separate commands, and builds sqlite3
native bindings and `parse-email-address` so e2e tests can run without
prompting agents to perform additional steps.
no issue

- `@tryghost/request` uses v13.0.0 but Ghost's direct usage of `got` was on an earlier v11.x
- updated dependency to match versions and modified all call sites to account for breaking changes in options shape
no issue

- bump `ghost/core`'s explicit `handlebars` dependency from `4.7.8` to `4.7.9`
- update the `split` helper and its unit test to use Ghost's frontend Handlebars runtime consistently when multiple `handlebars` copies are present

## Why
Ghost core frontend helpers rely on `SafeString` constructor identity.
If one helper creates `SafeString` values from a different `handlebars`
module instance than another helper checks with `instanceof`, those
values stop matching even though they look identical. Using the shared
frontend Handlebars runtime keeps helper behavior consistent across
dependency layouts.
ref TryGhost@353552f
ref TryGhost#27084

We recently added some tests which generate new snapshots, but forgot to
commit them. This fixes that.

TryGhost#27084 prevents this from happening again.

All I did was run `cd ghost/core && yarn test:e2e`. I don't really know
what this snapshot is about.
closes https://linear.app/ghost/issue/NY-1201

We aren't using this endpoint today, and its existence makes a future
change more difficult. Let's remove it.
ref
TryGhost@60a8165

This is a fix to the above commit. The `schedulerUrl` was used incorrect
- it was feeding the scheduler's URL to the scheduler, rather than the
`apiUrl`; in effect, it should be sending the destination.

This skips the scheduled publishing e2e tests which will be resolved in a follow-up commit.
TryGhost#27070)

closes
https://linear.app/ghost/issue/NY-1165/wiring-wire-up-the-customization-modal-to-the-api-for-persistence

## Summary

- Wired the welcome email customization modal to the
`automated_emails/design/` API so settings persist
- Added proper save UX with dirty tracking, loading states, error
toasts, and a retry flow
- Replaced `window.confirm` with an `AlertDialog` for unsaved changes
- Normalized semantic color values (`light`, `transparent`, `accent`) to
hex for the color picker

---------

Co-authored-by: Troy Ciesco <tmciesco@gmail.com>
no ref

We effectively had code like this:

```js
router.del = router.delete;

// ...

router.del('/route', handler);
```

This causes type errors and will make our future TypeScript migration
slightly harder. Let's just use `router.delete`.
no refs

## Summary

- Added `compose.dev.sqlite.yaml` Docker Compose override that disables
the MySQL container and configures Ghost to use SQLite
- Added `yarn dev:sqlite` script to `package.json` for running the dev
environment with SQLite instead of MySQL
- Mounts the SQLite database directory to the host for easy access
- Mostly this is useful when testing migrations on sqlite
ref TryGhost@f4eb79e
ref TryGhost/renovate-config@3a32889

Ghost's Renovate automerge has effectively been broken since Nov 1
2025.

The last clear Renovate self-merge after the long run of regular
automerge activity was PR TryGhost#25309 on Nov 1 2025. Since then,
Renovate has continued opening and revisiting PRs, but it has not
been merging them itself.

Our investigation found that automerge was working frequently through
late September and early October 2025. The clearest config
inflection point was Oct 15 2025, when Ghost added
platformAutomerge=false, pinned the automerge schedule to Etc/UTC,
and restricted automerge to weekends and Monday morning. This would
explain a slowdown, but not the complete stop.

Ghost was already carrying a local rebaseWhen=never override before
that change, which is not a recommended Renovate setting because it
prevents Renovate from rebasing. But it does not explain the change
by itself.

The likely problem is the combination: Renovate is now responsible
for merging PRs itself, but is still told not to rebase them when
they fall behind main.

Recent Mend logs show that failure mode repeatedly. Existing PRs are
revisited, Renovate logs rebaseWhen=never so skipping branch update
check, and branches finish as no-work without progressing to merge.
That suggests the longstanding rebaseWhen=never override became
actively harmful once Ghost switched to manual Renovate automerge on
a narrow schedule.

Removing the local override is the smallest targeted change to test
that hypothesis. It preserves Ghost's current schedule and
platformAutomerge=false behaviour while restoring the shared
preset's intended rebaseWhen=automerging support for automergeable
PRs.
renovate bot and others added 28 commits April 12, 2026 08:07
)

This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| stripe/stripe-cli | digest | `a7a01c0` → `aa500a8` |

---

### Configuration

📅 **Schedule**: (in timezone Etc/UTC)

- Branch creation
  - Only on Sunday and Saturday (`* * * * 0,6`)
  - Between 12:00 AM and 12:59 PM, only on Monday (`* 0-12 * * 1`)
- Between 09:00 PM and 11:59 PM, Monday through Friday (`* 21-23 * *
1-5`)
- Between 12:00 AM and 04:59 AM, Tuesday through Saturday (`* 0-4 * *
2-6`)
- Automerge
  - Only on Sunday and Saturday (`* * * * 0,6`)
  - Between 12:00 AM and 12:59 PM, only on Monday (`* 0-12 * * 1`)
- Between 10:00 PM and 11:59 PM, Monday through Friday (`* 22-23 * *
1-5`)
- Between 12:00 AM and 04:59 AM, Tuesday through Saturday (`* 0-4 * *
2-6`)

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Never, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/TryGhost/Ghost).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xMTAuMiIsInVwZGF0ZWRJblZlciI6IjQzLjExMC4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [lodash-es](https://lodash.com/custom-builds)
([source](https://redirect.github.com/lodash/lodash)) | [`4.17.23` →
`4.18.1`](https://renovatebot.com/diffs/npm/lodash-es/4.17.23/4.18.1) |
![age](https://developer.mend.io/api/mc/badges/age/npm/lodash-es/4.18.1?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/lodash-es/4.17.23/4.18.1?slim=true)
|

### GitHub Vulnerability Alerts

####
[CVE-2026-2950](https://redirect.github.com/lodash/lodash/security/advisories/GHSA-f23m-r3pf-42rh)

### Impact

Lodash versions 4.17.23 and earlier are vulnerable to prototype
pollution in the `_.unset` and `_.omit` functions. The fix for
[CVE-2025-13465](https://redirect.github.com/lodash/lodash/security/advisories/GHSA-xxjr-mmjv-4gpg)
only guards against string key members, so an attacker can bypass the
check by passing array-wrapped path segments. This allows deletion of
properties from built-in prototypes such as `Object.prototype`,
`Number.prototype`, and `String.prototype`.

The issue permits deletion of prototype properties but does not allow
overwriting their original behavior.

### Patches

This issue is patched in 4.18.0.

### Workarounds

None. Upgrade to the patched version.

####
[CVE-2026-4800](https://redirect.github.com/lodash/lodash/security/advisories/GHSA-r5fr-rjxr-66jc)

### Impact

The fix for
[CVE-2021-23337](https://redirect.github.com/advisories/GHSA-35jh-r3h4-6jhm)
added validation for the `variable` option in `_.template` but did not
apply the same validation to `options.imports` key names. Both paths
flow into the same `Function()` constructor sink.

When an application passes untrusted input as `options.imports` key
names, an attacker can inject default-parameter expressions that execute
arbitrary code at template compilation time.

Additionally, `_.template` uses `assignInWith` to merge imports, which
enumerates inherited properties via `for..in`. If `Object.prototype` has
been polluted by any other vector, the polluted keys are copied into the
imports object and passed to `Function()`.

### Patches

Users should upgrade to version 4.18.0.

The fix applies two changes:
1. Validate `importsKeys` against the existing
`reForbiddenIdentifierChars` regex (same check already used for the
`variable` option)
2. Replace `assignInWith` with `assignWith` when merging imports, so
only own properties are enumerated

### Workarounds

Do not pass untrusted input as key names in `options.imports`. Only use
developer-controlled, static key names.

---

### Release Notes

<details>
<summary>lodash/lodash (lodash-es)</summary>

###
[`v4.18.1`](https://redirect.github.com/lodash/lodash/releases/tag/4.18.1)

[Compare
Source](https://redirect.github.com/lodash/lodash/compare/4.18.0...4.18.1)

#### Bugs

Fixes a `ReferenceError` issue in `lodash` `lodash-es` `lodash-amd` and
`lodash.template` when using the `template` and `fromPairs` functions
from the modular builds. See [#&TryGhost#8203;6167
(comment)](https://redirect.github.com/lodash/lodash/issues/6167#issuecomment-4165269769)

These defects were related to how lodash distributions are built from
the main branch using <https://github.com/lodash-archive/lodash-cli>.
When internal dependencies change inside lodash functions, equivalent
updates need to be made to a mapping in the lodash-cli. (hey, it was
ahead of its time once upon a time!). We know this, but we missed it in
the last release. It's the kind of thing that passes in CI, but fails bc
the build is not the same thing you tested.

There is no diff on main for this, but you can see the diffs for each of
the npm packages on their respective branches:

`lodash`:
<lodash/lodash@4.18.0-npm...4.18.1-npm>
`lodash-es`:
<lodash/lodash@4.18.0-es...4.18.1-es>
`lodash-amd`:
<lodash/lodash@4.18.0-amd...4.18.1-amd>

`lodash.template`<lodash/lodash@4.18.0-npm-packages...4.18.1-npm-packages>

###
[`v4.18.0`](https://redirect.github.com/lodash/lodash/releases/tag/4.18.0)

[Compare
Source](https://redirect.github.com/lodash/lodash/compare/4.17.23...4.18.0)

#### v4.18.0

**Full Changelog**:
<lodash/lodash@4.17.23...4.18.0>

##### Security

**`_.unset` / `_.omit`**: Fixed prototype pollution via
`constructor`/`prototype` path traversal
([GHSA-f23m-r3pf-42rh](https://redirect.github.com/lodash/lodash/security/advisories/GHSA-f23m-r3pf-42rh),
[fe8d32e](https://redirect.github.com/lodash/lodash/commit/fe8d32eda854377349a4f922ab7655c8e5df9a0b)).
Previously, array-wrapped path segments and primitive roots could bypass
the existing guards, allowing deletion of properties from built-in
prototypes. Now `constructor` and `prototype` are blocked
unconditionally as non-terminal path keys, matching `baseSet`. Calls
that previously returned `true` and deleted the property now return
`false` and leave the target untouched.

**`_.template`**: Fixed code injection via `imports` keys
([GHSA-r5fr-rjxr-66jc](https://redirect.github.com/lodash/lodash/security/advisories/GHSA-r5fr-rjxr-66jc),
CVE-2026-4800,
[879aaa9](https://redirect.github.com/lodash/lodash/commit/879aaa93132d78c2f8d20c60279da9f8b21576d6)).
Fixes an incomplete patch for CVE-2021-23337. The `variable` option was
validated against `reForbiddenIdentifierChars` but `importsKeys` was
left unguarded, allowing code injection via the same `Function()`
constructor sink. `imports` keys containing forbidden identifier
characters now throw `"Invalid imports option passed into _.template"`.

##### Docs

- Add security notice for `_.template` in threat model and API docs
([#&TryGhost#8203;6099](https://redirect.github.com/lodash/lodash/pull/6099))
- Document `lower > upper` behavior in `_.random`
([#&TryGhost#8203;6115](https://redirect.github.com/lodash/lodash/pull/6115))
- Fix quotes in `_.compact` jsdoc
([#&TryGhost#8203;6090](https://redirect.github.com/lodash/lodash/pull/6090))

##### `lodash.*` modular packages

[Diff](https://redirect.github.com/lodash/lodash/pull/6157)

We have also regenerated and published a select number of the `lodash.*`
modular packages.

These modular packages had fallen out of sync significantly from the
minor/patch updates to lodash. Specifically, we have brought the
following packages up to parity w/ the latest lodash release because
they have had CVEs on them in the past:

- [lodash.orderby](https://www.npmjs.com/package/lodash.orderby)
- [lodash.tonumber](https://www.npmjs.com/package/lodash.tonumber)
- [lodash.trim](https://www.npmjs.com/package/lodash.trim)
- [lodash.trimend](https://www.npmjs.com/package/lodash.trimend)
-
[lodash.sortedindexby](https://www.npmjs.com/package/lodash.sortedindexby)
-
[lodash.zipobjectdeep](https://www.npmjs.com/package/lodash.zipobjectdeep)
- [lodash.unset](https://www.npmjs.com/package/lodash.unset)
- [lodash.omit](https://www.npmjs.com/package/lodash.omit)
- [lodash.template](https://www.npmjs.com/package/lodash.template)

</details>

---

### Configuration

📅 **Schedule**: (in timezone Etc/UTC)

- Branch creation
  - ""
- Automerge
  - Only on Sunday and Saturday (`* * * * 0,6`)
  - Between 12:00 AM and 12:59 PM, only on Monday (`* 0-12 * * 1`)
- Between 10:00 PM and 11:59 PM, Monday through Friday (`* 22-23 * *
1-5`)
- Between 12:00 AM and 04:59 AM, Tuesday through Saturday (`* 0-4 * *
2-6`)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/TryGhost/Ghost).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xMTAuMiIsInVwZGF0ZWRJblZlciI6IjQzLjExMC4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [iconv-lite](https://redirect.github.com/pillarjs/iconv-lite) |
[`0.6.3` →
`0.7.2`](https://renovatebot.com/diffs/npm/iconv-lite/0.6.3/0.7.2) |
![age](https://developer.mend.io/api/mc/badges/age/npm/iconv-lite/0.7.2?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/iconv-lite/0.6.3/0.7.2?slim=true)
|

---

### Release Notes

<details>
<summary>pillarjs/iconv-lite (iconv-lite)</summary>

###
[`v0.7.2`](https://redirect.github.com/pillarjs/iconv-lite/blob/HEAD/Changelog.md#072)

[Compare
Source](https://redirect.github.com/pillarjs/iconv-lite/compare/v0.7.1...v0.7.2)

##### 🐞 Bug fixes

- Correction of CommonJS exports in TypeScript definitions - by
[@&TryGhost#8203;plbstl](https://redirect.github.com/plbstl) in
[#&TryGhost#8203;366](https://redirect.github.com/pillarjs/iconv-lite/pull/366)

Fixed the TypeScript definitions to correctly represent the CommonJS
exports of the library.
This resolves issues where consumers using TypeScript would encounter
errors due to incorrect
  type definitions that did not align with the actual module exports.

###
[`v0.7.1`](https://redirect.github.com/pillarjs/iconv-lite/blob/HEAD/Changelog.md#071)

[Compare
Source](https://redirect.github.com/pillarjs/iconv-lite/compare/v0.7.0...v0.7.1)

##### 🚀 Improvements

- types: improve type definitions and add missing APIs - by
[@&TryGhost#8203;plbstl](https://redirect.github.com/plbstl) and
[@&TryGhost#8203;bjohansebas](https://redirect.github.com/bjohansebas) in
[#&TryGhost#8203;330](https://redirect.github.com/pillarjs/iconv-lite/pull/330)

###
[`v0.7.0`](https://redirect.github.com/pillarjs/iconv-lite/blob/HEAD/Changelog.md#070)

[Compare
Source](https://redirect.github.com/pillarjs/iconv-lite/compare/v0.6.3...v0.7.0)

##### 🐞 Bug fixes

- Handle split surrogate pairs when encoding utf8 - by
[@&TryGhost#8203;yosion-p](https://redirect.github.com/yosion-p) and
[@&TryGhost#8203;ashtuchkin](https://redirect.github.com/ashtuchkin) in
[#&TryGhost#8203;282](https://redirect.github.com/ashtuchkin/iconv-lite/pull/282):

Handle a case where streaming utf8 encoder (converting js strings ->
buffers) encounters
surrogate pairs split between chunks (last character of one chunk is
high surrogate and first
  character of the next chunk is a low surrogate).

- Avoid false positives in encodingExists by using objects without a
prototype - by
[@&TryGhost#8203;bjohansebas](https://redirect.github.com/bjohansebas) in
[#&TryGhost#8203;328](https://redirect.github.com/ashtuchkin/iconv-lite/pull/328)

The encodingExists method could return incorrect results if the lookup
matched properties inherited
from the prototype of the object that stores the encodings, such as
constructor and others. This change
replaces that object with one that has no prototype, ensuring that only
explicitly defined valid encodings
in the library are considered. In addition, the fix is applied to the
internal cache system to avoid the same
  kind of false positives

##### 🚀 Improvements

- Make explicit that decode() method supports Uint8Array input - by
[@&TryGhost#8203;jardicc](https://redirect.github.com/jardicc) in
[#&TryGhost#8203;271](https://redirect.github.com/ashtuchkin/iconv-lite/pull/271)
- Remove compatibility check for StringDecoder.end method - by
[@&TryGhost#8203;bjohansebas](https://redirect.github.com/bjohansebas) in
[#&TryGhost#8203;331](https://redirect.github.com/ashtuchkin/iconv-lite/pull/331)

</details>

---

### Configuration

📅 **Schedule**: (in timezone Etc/UTC)

- Branch creation
  - Only on Sunday and Saturday (`* * * * 0,6`)
  - Between 12:00 AM and 12:59 PM, only on Monday (`* 0-12 * * 1`)
- Between 09:00 PM and 11:59 PM, Monday through Friday (`* 21-23 * *
1-5`)
- Between 12:00 AM and 04:59 AM, Tuesday through Saturday (`* 0-4 * *
2-6`)
- Automerge
  - Only on Sunday and Saturday (`* * * * 0,6`)
  - Between 12:00 AM and 12:59 PM, only on Monday (`* 0-12 * * 1`)
- Between 10:00 PM and 11:59 PM, Monday through Friday (`* 22-23 * *
1-5`)
- Between 12:00 AM and 04:59 AM, Tuesday through Saturday (`* 0-4 * *
2-6`)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/TryGhost/Ghost).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xMTAuMiIsInVwZGF0ZWRJblZlciI6IjQzLjExMC4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [lucide-react](https://lucide.dev)
([source](https://redirect.github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react))
| [`0.553.0` →
`0.577.0`](https://renovatebot.com/diffs/npm/lucide-react/0.553.0/0.577.0)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/lucide-react/0.577.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/lucide-react/0.553.0/0.577.0?slim=true)
|

---

### Release Notes

<details>
<summary>lucide-icons/lucide (lucide-react)</summary>

###
[`v0.577.0`](https://redirect.github.com/lucide-icons/lucide/releases/tag/0.577.0):
Version 0.577.0

[Compare
Source](https://redirect.github.com/lucide-icons/lucide/compare/0.576.0...0.577.0)

#### What's Changed

- chore(deps): bump rollup from 4.53.3 to 4.59.0 by
[@&TryGhost#8203;dependabot](https://redirect.github.com/dependabot)\[bot] in
[#&TryGhost#8203;4106](https://redirect.github.com/lucide-icons/lucide/pull/4106)
- fix(repo): correctly ignore docs/releaseMetadata via .gitignore by
[@&TryGhost#8203;bhavberi](https://redirect.github.com/bhavberi) in
[#&TryGhost#8203;4100](https://redirect.github.com/lucide-icons/lucide/pull/4100)
- feat(icons): added `ellipse` icon by
[@&TryGhost#8203;KISHORE-KUMAR-S](https://redirect.github.com/KISHORE-KUMAR-S)
in
[#&TryGhost#8203;3749](https://redirect.github.com/lucide-icons/lucide/pull/3749)

#### New Contributors

- [@&TryGhost#8203;bhavberi](https://redirect.github.com/bhavberi) made their
first contribution in
[#&TryGhost#8203;4100](https://redirect.github.com/lucide-icons/lucide/pull/4100)
- [@&TryGhost#8203;KISHORE-KUMAR-S](https://redirect.github.com/KISHORE-KUMAR-S)
made their first contribution in
[#&TryGhost#8203;3749](https://redirect.github.com/lucide-icons/lucide/pull/3749)

**Full Changelog**:
<lucide-icons/lucide@0.576.0...0.577.0>

###
[`v0.576.0`](https://redirect.github.com/lucide-icons/lucide/releases/tag/0.576.0):
Version 0.576.0

[Compare
Source](https://redirect.github.com/lucide-icons/lucide/compare/0.575.0...0.576.0)

#### What's Changed

- Added zodiac signs by
[@&TryGhost#8203;karsa-mistmere](https://redirect.github.com/karsa-mistmere) in
[#&TryGhost#8203;712](https://redirect.github.com/lucide-icons/lucide/pull/712)
- fix(icons): fixes guideline violations in `package-*` icons. by
[@&TryGhost#8203;karsa-mistmere](https://redirect.github.com/karsa-mistmere) in
[#&TryGhost#8203;4074](https://redirect.github.com/lucide-icons/lucide/pull/4074)
- fix(icons): changed `receipt` icon by
[@&TryGhost#8203;karsa-mistmere](https://redirect.github.com/karsa-mistmere) in
[#&TryGhost#8203;4075](https://redirect.github.com/lucide-icons/lucide/pull/4075)
- fix(icons): updated `cuboid` icon tags and categories by
[@&TryGhost#8203;karsa-mistmere](https://redirect.github.com/karsa-mistmere) in
[#&TryGhost#8203;4095](https://redirect.github.com/lucide-icons/lucide/pull/4095)
- fix(icons): changed `cuboid` icon by
[@&TryGhost#8203;jamiemlaw](https://redirect.github.com/jamiemlaw) in
[#&TryGhost#8203;4098](https://redirect.github.com/lucide-icons/lucide/pull/4098)
- fix(lucide-font, lucide-static): Fixing stable code points by
[@&TryGhost#8203;ericfennis](https://redirect.github.com/ericfennis) in
[#&TryGhost#8203;3894](https://redirect.github.com/lucide-icons/lucide/pull/3894)
- feat(icons): added `fishing-rod` icon by
[@&TryGhost#8203;7ender](https://redirect.github.com/7ender) in
[#&TryGhost#8203;3839](https://redirect.github.com/lucide-icons/lucide/pull/3839)

**Full Changelog**:
<lucide-icons/lucide@0.575.0...0.576.0>

###
[`v0.575.0`](https://redirect.github.com/lucide-icons/lucide/releases/tag/0.575.0):
Version 0.575.0

[Compare
Source](https://redirect.github.com/lucide-icons/lucide/compare/0.574.0...0.575.0)

#### What's Changed

- feat(icons): added `message-square-check` icon by
[@&TryGhost#8203;karsa-mistmere](https://redirect.github.com/karsa-mistmere) in
[#&TryGhost#8203;4076](https://redirect.github.com/lucide-icons/lucide/pull/4076)
- fix(lucide): Fix ESM Module output path in build by
[@&TryGhost#8203;ericfennis](https://redirect.github.com/ericfennis) in
[#&TryGhost#8203;4084](https://redirect.github.com/lucide-icons/lucide/pull/4084)
- feat(icons): added `metronome` icon by
[@&TryGhost#8203;edwloef](https://redirect.github.com/edwloef) in
[#&TryGhost#8203;4063](https://redirect.github.com/lucide-icons/lucide/pull/4063)
- fix(icons): remove execution permission of SVG files by
[@&TryGhost#8203;duckafire](https://redirect.github.com/duckafire) in
[#&TryGhost#8203;4053](https://redirect.github.com/lucide-icons/lucide/pull/4053)
- fix(icons): changed `file-pen-line` icon by
[@&TryGhost#8203;jguddas](https://redirect.github.com/jguddas) in
[#&TryGhost#8203;3970](https://redirect.github.com/lucide-icons/lucide/pull/3970)
- feat(icons): added `square-arrow-right-exit` and
`square-arrow-right-enter` icons by
[@&TryGhost#8203;EthanHazel](https://redirect.github.com/EthanHazel) in
[#&TryGhost#8203;3958](https://redirect.github.com/lucide-icons/lucide/pull/3958)
- fix(icons): renamed `flip-*` to `square-centerline-dashed-*` by
[@&TryGhost#8203;jguddas](https://redirect.github.com/jguddas) in
[#&TryGhost#8203;3945](https://redirect.github.com/lucide-icons/lucide/pull/3945)

#### New Contributors

- [@&TryGhost#8203;edwloef](https://redirect.github.com/edwloef) made their
first contribution in
[#&TryGhost#8203;4063](https://redirect.github.com/lucide-icons/lucide/pull/4063)
- [@&TryGhost#8203;duckafire](https://redirect.github.com/duckafire) made their
first contribution in
[#&TryGhost#8203;4053](https://redirect.github.com/lucide-icons/lucide/pull/4053)

**Full Changelog**:
<lucide-icons/lucide@0.573.0...0.575.0>

###
[`v0.574.0`](https://redirect.github.com/lucide-icons/lucide/releases/tag/0.574.0):
Version 0.574.0

[Compare
Source](https://redirect.github.com/lucide-icons/lucide/compare/0.573.0...0.574.0)

#### What's Changed

- fix(icons): changed `rocking-chair` icon by
[@&TryGhost#8203;jamiemlaw](https://redirect.github.com/jamiemlaw) in
[#&TryGhost#8203;3445](https://redirect.github.com/lucide-icons/lucide/pull/3445)
- fix(icons): flipped `coins` icon by
[@&TryGhost#8203;jguddas](https://redirect.github.com/jguddas) in
[#&TryGhost#8203;3158](https://redirect.github.com/lucide-icons/lucide/pull/3158)
- feat(icons): added `x-line-top` icon by
[@&TryGhost#8203;jguddas](https://redirect.github.com/jguddas) in
[#&TryGhost#8203;2838](https://redirect.github.com/lucide-icons/lucide/pull/2838)
- feat(icons): added `mouse-left` icon by
[@&TryGhost#8203;marvfash](https://redirect.github.com/marvfash) in
[#&TryGhost#8203;2788](https://redirect.github.com/lucide-icons/lucide/pull/2788)
- feat(icons): added `mouse-right` icon by
[@&TryGhost#8203;marvfash](https://redirect.github.com/marvfash) in
[#&TryGhost#8203;2787](https://redirect.github.com/lucide-icons/lucide/pull/2787)

#### New Contributors

- [@&TryGhost#8203;marvfash](https://redirect.github.com/marvfash) made their
first contribution in
[#&TryGhost#8203;2788](https://redirect.github.com/lucide-icons/lucide/pull/2788)

**Full Changelog**:
<lucide-icons/lucide@0.572.0...0.574.0>

###
[`v0.573.0`](https://redirect.github.com/lucide-icons/lucide/releases/tag/0.573.0):
Version 0.573.0

[Compare
Source](https://redirect.github.com/lucide-icons/lucide/compare/0.572.0...0.573.0)

#### What's Changed

- fix(icons): changed `rocking-chair` icon by
[@&TryGhost#8203;jamiemlaw](https://redirect.github.com/jamiemlaw) in
[#&TryGhost#8203;3445](https://redirect.github.com/lucide-icons/lucide/pull/3445)
- fix(icons): flipped `coins` icon by
[@&TryGhost#8203;jguddas](https://redirect.github.com/jguddas) in
[#&TryGhost#8203;3158](https://redirect.github.com/lucide-icons/lucide/pull/3158)
- feat(icons): added `x-line-top` icon by
[@&TryGhost#8203;jguddas](https://redirect.github.com/jguddas) in
[#&TryGhost#8203;2838](https://redirect.github.com/lucide-icons/lucide/pull/2838)
- feat(icons): added `mouse-left` icon by
[@&TryGhost#8203;marvfash](https://redirect.github.com/marvfash) in
[#&TryGhost#8203;2788](https://redirect.github.com/lucide-icons/lucide/pull/2788)
- feat(icons): added `mouse-right` icon by
[@&TryGhost#8203;marvfash](https://redirect.github.com/marvfash) in
[#&TryGhost#8203;2787](https://redirect.github.com/lucide-icons/lucide/pull/2787)

#### New Contributors

- [@&TryGhost#8203;marvfash](https://redirect.github.com/marvfash) made their
first contribution in
[#&TryGhost#8203;2788](https://redirect.github.com/lucide-icons/lucide/pull/2788)

**Full Changelog**:
<lucide-icons/lucide@0.572.0...0.573.0>

###
[`v0.572.0`](https://redirect.github.com/lucide-icons/lucide/releases/tag/0.572.0):
Version 0.572.0

[Compare
Source](https://redirect.github.com/lucide-icons/lucide/compare/0.571.0...0.572.0)

#### What's Changed

- feat(icons): added `message-circle-check` icon by
[@&TryGhost#8203;Shrinks99](https://redirect.github.com/Shrinks99) in
[#&TryGhost#8203;3770](https://redirect.github.com/lucide-icons/lucide/pull/3770)

#### New Contributors

- [@&TryGhost#8203;Shrinks99](https://redirect.github.com/Shrinks99) made their
first contribution in
[#&TryGhost#8203;3770](https://redirect.github.com/lucide-icons/lucide/pull/3770)

**Full Changelog**:
<lucide-icons/lucide@0.571.0...0.572.0>

###
[`v0.571.0`](https://redirect.github.com/lucide-icons/lucide/releases/tag/0.571.0):
Version 0.571.0

[Compare
Source](https://redirect.github.com/lucide-icons/lucide/compare/0.570.0...0.571.0)

#### What's Changed

- fix(icons): rearange `circle`-icons path and circle order by
[@&TryGhost#8203;adamlindqvist](https://redirect.github.com/adamlindqvist) in
[#&TryGhost#8203;3746](https://redirect.github.com/lucide-icons/lucide/pull/3746)
- feat(icons): added `shelving-unit` icon by
[@&TryGhost#8203;karsa-mistmere](https://redirect.github.com/karsa-mistmere) in
[#&TryGhost#8203;3041](https://redirect.github.com/lucide-icons/lucide/pull/3041)

#### New Contributors

- [@&TryGhost#8203;adamlindqvist](https://redirect.github.com/adamlindqvist)
made their first contribution in
[#&TryGhost#8203;3746](https://redirect.github.com/lucide-icons/lucide/pull/3746)

**Full Changelog**:
<lucide-icons/lucide@0.570.0...0.571.0>

###
[`v0.570.0`](https://redirect.github.com/lucide-icons/lucide/releases/tag/0.570.0):
Version 0.570.0

[Compare
Source](https://redirect.github.com/lucide-icons/lucide/compare/0.569.0...0.570.0)

#### What's Changed

- feat(icons): added `towel-rack` icon by
[@&TryGhost#8203;jguddas](https://redirect.github.com/jguddas) in
[#&TryGhost#8203;3350](https://redirect.github.com/lucide-icons/lucide/pull/3350)

**Full Changelog**:
<lucide-icons/lucide@0.569.0...0.570.0>

###
[`v0.569.0`](https://redirect.github.com/lucide-icons/lucide/releases/tag/0.569.0):
Version 0.569.0

[Compare
Source](https://redirect.github.com/lucide-icons/lucide/compare/0.568.0...0.569.0)

#### What's Changed

- fix(icons): changed `clipboard-pen` icon by
[@&TryGhost#8203;Spleefies](https://redirect.github.com/Spleefies) in
[#&TryGhost#8203;4006](https://redirect.github.com/lucide-icons/lucide/pull/4006)
- feat(icons): add `mirror-round` and `mirror-rectangular` by
[@&TryGhost#8203;Muhammad-Aqib-Bashir](https://redirect.github.com/Muhammad-Aqib-Bashir)
in
[#&TryGhost#8203;3832](https://redirect.github.com/lucide-icons/lucide/pull/3832)

**Full Changelog**:
<lucide-icons/lucide@0.568.0...0.569.0>

###
[`v0.568.0`](https://redirect.github.com/lucide-icons/lucide/releases/tag/0.568.0):
Version 0.568.0

[Compare
Source](https://redirect.github.com/lucide-icons/lucide/compare/0.567.0...0.568.0)

#### What's Changed

- fix(icons): adjusted `clapperboard` so slash is no longer protruding
by [@&TryGhost#8203;torfmuer](https://redirect.github.com/torfmuer) in
[#&TryGhost#8203;3764](https://redirect.github.com/lucide-icons/lucide/pull/3764)
- feat(icons): Add `git-merge-conflict` icon by
[@&TryGhost#8203;timmy471](https://redirect.github.com/timmy471) in
[#&TryGhost#8203;3008](https://redirect.github.com/lucide-icons/lucide/pull/3008)

#### New Contributors

- [@&TryGhost#8203;torfmuer](https://redirect.github.com/torfmuer) made their
first contribution in
[#&TryGhost#8203;3764](https://redirect.github.com/lucide-icons/lucide/pull/3764)
- [@&TryGhost#8203;timmy471](https://redirect.github.com/timmy471) made their
first contribution in
[#&TryGhost#8203;3008](https://redirect.github.com/lucide-icons/lucide/pull/3008)

**Full Changelog**:
<lucide-icons/lucide@0.567.0...0.568.0>

###
[`v0.567.0`](https://redirect.github.com/lucide-icons/lucide/releases/tag/0.567.0):
Version 0.567.0

[Compare
Source](https://redirect.github.com/lucide-icons/lucide/compare/0.566.0...0.567.0)

#### What's Changed

- chore(tags): added tags to `info` by
[@&TryGhost#8203;jamiemlaw](https://redirect.github.com/jamiemlaw) in
[#&TryGhost#8203;4047](https://redirect.github.com/lucide-icons/lucide/pull/4047)
- fix(icons): changed `gift` icon by
[@&TryGhost#8203;jguddas](https://redirect.github.com/jguddas) in
[#&TryGhost#8203;3977](https://redirect.github.com/lucide-icons/lucide/pull/3977)
- feat(icons): added `line-dot-right-horizontal` icon by
[@&TryGhost#8203;nathan-de-pachtere](https://redirect.github.com/nathan-de-pachtere)
in
[#&TryGhost#8203;3742](https://redirect.github.com/lucide-icons/lucide/pull/3742)

**Full Changelog**:
<lucide-icons/lucide@0.566.0...0.567.0>

###
[`v0.566.0`](https://redirect.github.com/lucide-icons/lucide/releases/tag/0.566.0):
Version 0.566.0

[Compare
Source](https://redirect.github.com/lucide-icons/lucide/compare/0.565.0...0.566.0)

#### What's Changed

- fix(icons): changed `forklift` icon by
[@&TryGhost#8203;jguddas](https://redirect.github.com/jguddas) in
[#&TryGhost#8203;4069](https://redirect.github.com/lucide-icons/lucide/pull/4069)
- fix(icons): changed `rocket` icon by
[@&TryGhost#8203;jguddas](https://redirect.github.com/jguddas) in
[#&TryGhost#8203;4067](https://redirect.github.com/lucide-icons/lucide/pull/4067)
- feat(icons): added `globe-off` icon by
[@&TryGhost#8203;TimNekk](https://redirect.github.com/TimNekk) in
[#&TryGhost#8203;4051](https://redirect.github.com/lucide-icons/lucide/pull/4051)

#### New Contributors

- [@&TryGhost#8203;TimNekk](https://redirect.github.com/TimNekk) made their
first contribution in
[#&TryGhost#8203;4051](https://redirect.github.com/lucide-icons/lucide/pull/4051)

**Full Changelog**:
<lucide-icons/lucide@0.565.0...0.566.0>

###
[`v0.565.0`](https://redirect.github.com/lucide-icons/lucide/releases/tag/0.565.0):
Version 0.565.0

[Compare
Source](https://redirect.github.com/lucide-icons/lucide/compare/0.564.0...0.565.0)

#### What's Changed

- feat(icons): add `lens-concave` and `lens-convex` by
[@&TryGhost#8203;Muhammad-Aqib-Bashir](https://redirect.github.com/Muhammad-Aqib-Bashir)
in
[#&TryGhost#8203;3831](https://redirect.github.com/lucide-icons/lucide/pull/3831)

**Full Changelog**:
<lucide-icons/lucide@0.564.0...0.565.0>

###
[`v0.564.0`](https://redirect.github.com/lucide-icons/lucide/releases/tag/0.564.0):
Version 0.564.0

[Compare
Source](https://redirect.github.com/lucide-icons/lucide/compare/0.563.0...0.564.0)

#### What's Changed

- chore(docs): Improve SEO icon detail pages by
[@&TryGhost#8203;ericfennis](https://redirect.github.com/ericfennis) in
[#&TryGhost#8203;4040](https://redirect.github.com/lucide-icons/lucide/pull/4040)
- feat(icons): added `database-search` icon by
[@&TryGhost#8203;Spleefies](https://redirect.github.com/Spleefies) in
[#&TryGhost#8203;4003](https://redirect.github.com/lucide-icons/lucide/pull/4003)
- fix(icons): changed `user-lock` icon by
[@&TryGhost#8203;jguddas](https://redirect.github.com/jguddas) in
[#&TryGhost#8203;3971](https://redirect.github.com/lucide-icons/lucide/pull/3971)
- fix(icons): changed `bug-off` icon by
[@&TryGhost#8203;jguddas](https://redirect.github.com/jguddas) in
[#&TryGhost#8203;3972](https://redirect.github.com/lucide-icons/lucide/pull/3972)
- fix(icons): changed `bell-dot` icon by
[@&TryGhost#8203;jguddas](https://redirect.github.com/jguddas) in
[#&TryGhost#8203;3973](https://redirect.github.com/lucide-icons/lucide/pull/3973)
- fix(icons): changed `bandage` icon by
[@&TryGhost#8203;jguddas](https://redirect.github.com/jguddas) in
[#&TryGhost#8203;3967](https://redirect.github.com/lucide-icons/lucide/pull/3967)
- fix(icons): changed `hard-drive` icon by
[@&TryGhost#8203;jguddas](https://redirect.github.com/jguddas) in
[#&TryGhost#8203;3622](https://redirect.github.com/lucide-icons/lucide/pull/3622)
- fix(icons): changed `git-branch` icon by
[@&TryGhost#8203;jguddas](https://redirect.github.com/jguddas) in
[#&TryGhost#8203;3938](https://redirect.github.com/lucide-icons/lucide/pull/3938)
- fix(icons): changed `file-cog` icon by
[@&TryGhost#8203;jguddas](https://redirect.github.com/jguddas) in
[#&TryGhost#8203;3965](https://redirect.github.com/lucide-icons/lucide/pull/3965)
- fix(icons): changed `cloud-alert` and `cloud-check` icon by
[@&TryGhost#8203;jguddas](https://redirect.github.com/jguddas) in
[#&TryGhost#8203;3976](https://redirect.github.com/lucide-icons/lucide/pull/3976)
- feat(icons): adds `user-key` and `user-round-key`, updates other
`-key` icons to match by
[@&TryGhost#8203;karsa-mistmere](https://redirect.github.com/karsa-mistmere) in
[#&TryGhost#8203;4044](https://redirect.github.com/lucide-icons/lucide/pull/4044)

#### New Contributors

- [@&TryGhost#8203;Spleefies](https://redirect.github.com/Spleefies) made their
first contribution in
[#&TryGhost#8203;4003](https://redirect.github.com/lucide-icons/lucide/pull/4003)

**Full Changelog**:
<lucide-icons/lucide@0.563.1...0.564.0>

###
[`v0.563.0`](https://redirect.github.com/lucide-icons/lucide/releases/tag/0.563.0):
Version 0.563.0

[Compare
Source](https://redirect.github.com/lucide-icons/lucide/compare/0.562.0...0.563.0)

#### What's Changed

- chore(dev): Enable ligatures in font build configuration by
[@&TryGhost#8203;dcxo](https://redirect.github.com/dcxo) in
[#&TryGhost#8203;3876](https://redirect.github.com/lucide-icons/lucide/pull/3876)
- chore(repo): add Android to brand stopwords by
[@&TryGhost#8203;karsa-mistmere](https://redirect.github.com/karsa-mistmere) in
[#&TryGhost#8203;3895](https://redirect.github.com/lucide-icons/lucide/pull/3895)
- fix(site): add missing titles and a title template by
[@&TryGhost#8203;taimar](https://redirect.github.com/taimar) in
[#&TryGhost#8203;3920](https://redirect.github.com/lucide-icons/lucide/pull/3920)
- fix(site): unify and improve the styling of input fields by
[@&TryGhost#8203;taimar](https://redirect.github.com/taimar) in
[#&TryGhost#8203;3919](https://redirect.github.com/lucide-icons/lucide/pull/3919)
- fix(icons): changed `star-off` icon by
[@&TryGhost#8203;jguddas](https://redirect.github.com/jguddas) in
[#&TryGhost#8203;3952](https://redirect.github.com/lucide-icons/lucide/pull/3952)
- fix(icons): changed `tickets-plane` icon by
[@&TryGhost#8203;jguddas](https://redirect.github.com/jguddas) in
[#&TryGhost#8203;3928](https://redirect.github.com/lucide-icons/lucide/pull/3928)
- fix(icons): changed `monitor-off` icon by
[@&TryGhost#8203;jguddas](https://redirect.github.com/jguddas) in
[#&TryGhost#8203;3962](https://redirect.github.com/lucide-icons/lucide/pull/3962)
- fix(icons): changed `lasso` icon by
[@&TryGhost#8203;jguddas](https://redirect.github.com/jguddas) in
[#&TryGhost#8203;3961](https://redirect.github.com/lucide-icons/lucide/pull/3961)
- fix(icons): changed `cloud-off` icon by
[@&TryGhost#8203;jguddas](https://redirect.github.com/jguddas) in
[#&TryGhost#8203;3942](https://redirect.github.com/lucide-icons/lucide/pull/3942)
- docs(site): added lucide-web-components third-party package by
[@&TryGhost#8203;midesweb](https://redirect.github.com/midesweb) in
[#&TryGhost#8203;3948](https://redirect.github.com/lucide-icons/lucide/pull/3948)
- chore(deps-dev): bump preact from 10.27.2 to 10.27.3 by
[@&TryGhost#8203;dependabot](https://redirect.github.com/dependabot)\[bot] in
[#&TryGhost#8203;3955](https://redirect.github.com/lucide-icons/lucide/pull/3955)
- feat(icon): add globe-x icon with metadata by
[@&TryGhost#8203;Muhammad-Aqib-Bashir](https://redirect.github.com/Muhammad-Aqib-Bashir)
in
[#&TryGhost#8203;3827](https://redirect.github.com/lucide-icons/lucide/pull/3827)
- fix(icons): changed `waypoints` icon by
[@&TryGhost#8203;karsa-mistmere](https://redirect.github.com/karsa-mistmere) in
[#&TryGhost#8203;3990](https://redirect.github.com/lucide-icons/lucide/pull/3990)
- fix(icons): changed `bookmark` icon by
[@&TryGhost#8203;jguddas](https://redirect.github.com/jguddas) in
[#&TryGhost#8203;2906](https://redirect.github.com/lucide-icons/lucide/pull/2906)
- fix(icons): changed `message-square-dashed` icon by
[@&TryGhost#8203;jguddas](https://redirect.github.com/jguddas) in
[#&TryGhost#8203;3959](https://redirect.github.com/lucide-icons/lucide/pull/3959)
- fix(icons): changed `cloudy` icon by
[@&TryGhost#8203;jguddas](https://redirect.github.com/jguddas) in
[#&TryGhost#8203;3966](https://redirect.github.com/lucide-icons/lucide/pull/3966)
- fix(github-actions): resolved spelling mistake in gh issue close
command by [@&TryGhost#8203;jguddas](https://redirect.github.com/jguddas) in
[#&TryGhost#8203;4000](https://redirect.github.com/lucide-icons/lucide/pull/4000)
- Update LICENSE by
[@&TryGhost#8203;alxgraphy](https://redirect.github.com/alxgraphy) in
[#&TryGhost#8203;4009](https://redirect.github.com/lucide-icons/lucide/pull/4009)
- feat(packages): Added aria-hidden fallback for decorative icons to all
packages by [@&TryGhost#8203;ericfennis](https://redirect.github.com/ericfennis)
in
[#&TryGhost#8203;3604](https://redirect.github.com/lucide-icons/lucide/pull/3604)
- chore(deps): bump lodash from 4.17.21 to 4.17.23 by
[@&TryGhost#8203;dependabot](https://redirect.github.com/dependabot)\[bot] in
[#&TryGhost#8203;4020](https://redirect.github.com/lucide-icons/lucide/pull/4020)
- chore(deps): bump lodash-es from 4.17.21 to 4.17.23 by
[@&TryGhost#8203;dependabot](https://redirect.github.com/dependabot)\[bot] in
[#&TryGhost#8203;4019](https://redirect.github.com/lucide-icons/lucide/pull/4019)
- Suggest anchoring to a specific lucide version when using a cdn by
[@&TryGhost#8203;drago1520](https://redirect.github.com/drago1520) in
[#&TryGhost#8203;3727](https://redirect.github.com/lucide-icons/lucide/pull/3727)
- feat(docs): upgraded backers block by
[@&TryGhost#8203;karsa-mistmere](https://redirect.github.com/karsa-mistmere) in
[#&TryGhost#8203;4014](https://redirect.github.com/lucide-icons/lucide/pull/4014)
- fix(site): hide native search input clear "X" icon by
[@&TryGhost#8203;epifaniofrancisco](https://redirect.github.com/epifaniofrancisco)
in
[#&TryGhost#8203;3933](https://redirect.github.com/lucide-icons/lucide/pull/3933)
- feat(icons): added `printer-x` icon by
[@&TryGhost#8203;lt25106](https://redirect.github.com/lt25106) in
[#&TryGhost#8203;3941](https://redirect.github.com/lucide-icons/lucide/pull/3941)

#### New Contributors

- [@&TryGhost#8203;dcxo](https://redirect.github.com/dcxo) made their first
contribution in
[#&TryGhost#8203;3876](https://redirect.github.com/lucide-icons/lucide/pull/3876)
- [@&TryGhost#8203;midesweb](https://redirect.github.com/midesweb) made their
first contribution in
[#&TryGhost#8203;3948](https://redirect.github.com/lucide-icons/lucide/pull/3948)
- [@&TryGhost#8203;alxgraphy](https://redirect.github.com/alxgraphy) made their
first contribution in
[#&TryGhost#8203;4009](https://redirect.github.com/lucide-icons/lucide/pull/4009)
- [@&TryGhost#8203;drago1520](https://redirect.github.com/drago1520) made their
first contribution in
[#&TryGhost#8203;3727](https://redirect.github.com/lucide-icons/lucide/pull/3727)
- [@&TryGhost#8203;lt25106](https://redirect.github.com/lt25106) made their
first contribution in
[#&TryGhost#8203;3941](https://redirect.github.com/lucide-icons/lucide/pull/3941)

**Full Changelog**:
<lucide-icons/lucide@0.562.0...0.563.0>

###
[`v0.562.0`](https://redirect.github.com/lucide-icons/lucide/compare/0.561.0...0.562.0)

[Compare
Source](https://redirect.github.com/lucide-icons/lucide/compare/0.561.0...0.562.0)

###
[`v0.561.0`](https://redirect.github.com/lucide-icons/lucide/releases/tag/0.561.0):
Version 0.561.0

[Compare
Source](https://redirect.github.com/lucide-icons/lucide/compare/0.560.0...0.561.0)

#### What's Changed

- fix(site): Small adjustments color picker and add clear button search
bar by [@&TryGhost#8203;ericfennis](https://redirect.github.com/ericfennis) in
[#&TryGhost#8203;3851](https://redirect.github.com/lucide-icons/lucide/pull/3851)
- feat(icons): added `stone` icon by
[@&TryGhost#8203;Alportan](https://redirect.github.com/Alportan) in
[#&TryGhost#8203;3850](https://redirect.github.com/lucide-icons/lucide/pull/3850)

**Full Changelog**:
<lucide-icons/lucide@0.560.0...0.561.0>

###
[`v0.560.0`](https://redirect.github.com/lucide-icons/lucide/releases/tag/0.560.0):
Version 0.560.0

[Compare
Source](https://redirect.github.com/lucide-icons/lucide/compare/0.559.0...0.560.0)

#### What's Changed

- feat(icons): added `cannabis-off` icon by
[@&TryGhost#8203;NickVeles](https://redirect.github.com/NickVeles) in
[#&TryGhost#8203;3748](https://redirect.github.com/lucide-icons/lucide/pull/3748)

#### New Contributors

- [@&TryGhost#8203;NickVeles](https://redirect.github.com/NickVeles) made their
first contribution in
[#&TryGhost#8203;3748](https://redirect.github.com/lucide-icons/lucide/pull/3748)

**Full Changelog**:
<lucide-icons/lucide@0.559.0...0.560.0>

###
[`v0.559.0`](https://redirect.github.com/lucide-icons/lucide/releases/tag/0.559.0):
Version 0.559.0

[Compare
Source](https://redirect.github.com/lucide-icons/lucide/compare/0.558.0...0.559.0)

#### What's Changed

- feat(icons): added `fishing-hook` icon by
[@&TryGhost#8203;7ender](https://redirect.github.com/7ender) in
[#&TryGhost#8203;3837](https://redirect.github.com/lucide-icons/lucide/pull/3837)

#### New Contributors

- [@&TryGhost#8203;7ender](https://redirect.github.com/7ender) made their first
contribution in
[#&TryGhost#8203;3837](https://redirect.github.com/lucide-icons/lucide/pull/3837)

**Full Changelog**:
<lucide-icons/lucide@0.558.0...0.559.0>

###
[`v0.558.0`](https://redirect.github.com/lucide-icons/lucide/releases/tag/0.558.0):
Version 0.558.0

[Compare
Source](https://redirect.github.com/lucide-icons/lucide/compare/0.557.0...0.558.0)

#### What's Changed

- feat(icons): added `hd` icon by
[@&TryGhost#8203;jamiemlaw](https://redirect.github.com/jamiemlaw) in
[#&TryGhost#8203;2958](https://redirect.github.com/lucide-icons/lucide/pull/2958)

**Full Changelog**:
<lucide-icons/lucide@0.557.0...0.558.0>

###
[`v0.557.0`](https://redirect.github.com/lucide-icons/lucide/releases/tag/0.557.0):
Version 0.557.0

[Compare
Source](https://redirect.github.com/lucide-icons/lucide/compare/0.556.0...0.557.0)

#### What's Changed

- fix(github/workflows/ci): fixes linting issues by
[@&TryGhost#8203;karsa-mistmere](https://redirect.github.com/karsa-mistmere) in
[#&TryGhost#8203;3858](https://redirect.github.com/lucide-icons/lucide/pull/3858)
- fix(icons): changed `memory-stick` icon by
[@&TryGhost#8203;karsa-mistmere](https://redirect.github.com/karsa-mistmere) in
[#&TryGhost#8203;3017](https://redirect.github.com/lucide-icons/lucide/pull/3017)
- fix(icons): changed `microchip` icon by
[@&TryGhost#8203;karsa-mistmere](https://redirect.github.com/karsa-mistmere) in
[#&TryGhost#8203;3018](https://redirect.github.com/lucide-icons/lucide/pull/3018)
- chore(repo): Update Node version and overal cleanup by
[@&TryGhost#8203;ericfennis](https://redirect.github.com/ericfennis) in
[#&TryGhost#8203;3861](https://redirect.github.com/lucide-icons/lucide/pull/3861)
- fix(icons): changed `paint-bucket` icon by
[@&TryGhost#8203;jguddas](https://redirect.github.com/jguddas) in
[#&TryGhost#8203;3865](https://redirect.github.com/lucide-icons/lucide/pull/3865)
- fix(icons): changed `brush-cleaning` icon by
[@&TryGhost#8203;jguddas](https://redirect.github.com/jguddas) in
[#&TryGhost#8203;3863](https://redirect.github.com/lucide-icons/lucide/pull/3863)
- fix(icons): Swap `thumbs-up` `thumbs-down` paths to fix fill issue by
[@&TryGhost#8203;theianjones](https://redirect.github.com/theianjones) in
[#&TryGhost#8203;3873](https://redirect.github.com/lucide-icons/lucide/pull/3873)
- fix(icons): changed `tickets` icon by
[@&TryGhost#8203;karsa-mistmere](https://redirect.github.com/karsa-mistmere) in
[#&TryGhost#8203;3859](https://redirect.github.com/lucide-icons/lucide/pull/3859)
- feat(icons): added `layers-plus` icon by
[@&TryGhost#8203;juanisidoro](https://redirect.github.com/juanisidoro) in
[#&TryGhost#8203;3367](https://redirect.github.com/lucide-icons/lucide/pull/3367)
- docs(dev): Fix code sample for vanilla JS by
[@&TryGhost#8203;wavebeem](https://redirect.github.com/wavebeem) in
[#&TryGhost#8203;3836](https://redirect.github.com/lucide-icons/lucide/pull/3836)
- feat(icons): add `search-error` icon by
[@&TryGhost#8203;Veatec22](https://redirect.github.com/Veatec22) in
[#&TryGhost#8203;3292](https://redirect.github.com/lucide-icons/lucide/pull/3292)
- feat(icons): Add `cloud-sync` and `cloud-backup` by
[@&TryGhost#8203;ericfennis](https://redirect.github.com/ericfennis) in
[#&TryGhost#8203;3466](https://redirect.github.com/lucide-icons/lucide/pull/3466)
- feat(icons): added `circle-pile` icon by
[@&TryGhost#8203;nathan-de-pachtere](https://redirect.github.com/nathan-de-pachtere)
in
[#&TryGhost#8203;3681](https://redirect.github.com/lucide-icons/lucide/pull/3681)
- feat(icons): added `balloon` icon by
[@&TryGhost#8203;peteruithoven](https://redirect.github.com/peteruithoven) in
[#&TryGhost#8203;2519](https://redirect.github.com/lucide-icons/lucide/pull/2519)

#### New Contributors

- [@&TryGhost#8203;theianjones](https://redirect.github.com/theianjones) made
their first contribution in
[#&TryGhost#8203;3873](https://redirect.github.com/lucide-icons/lucide/pull/3873)
- [@&TryGhost#8203;juanisidoro](https://redirect.github.com/juanisidoro) made
their first contribution in
[#&TryGhost#8203;3367](https://redirect.github.com/lucide-icons/lucide/pull/3367)
- [@&TryGhost#8203;wavebeem](https://redirect.github.com/wavebeem) made their
first contribution in
[#&TryGhost#8203;3836](https://redirect.github.com/lucide-icons/lucide/pull/3836)
- [@&TryGhost#8203;Veatec22](https://redirect.github.com/Veatec22) made their
first contribution in
[#&TryGhost#8203;3292](https://redirect.github.com/lucide-icons/lucide/pull/3292)

**Full Changelog**:
<lucide-icons/lucide@0.556.0...0.557.0>

###
[`v0.556.0`](https://redirect.github.com/lucide-icons/lucide/releases/tag/0.556.0):
Version 0.556.0

[Compare
Source](https://redirect.github.com/lucide-icons/lucide/compare/0.555.0...0.556.0)

#### What's Changed

- feat(icon): add `book-search` icon
([#&TryGhost#8203;3573](https://redirect.github.com/lucide-icons/lucide/issues/3573))
by
[@&TryGhost#8203;Muhammad-Aqib-Bashir](https://redirect.github.com/Muhammad-Aqib-Bashir)
in
[#&TryGhost#8203;3580](https://redirect.github.com/lucide-icons/lucide/pull/3580)
- chore(dependencies): Update dependencies by
[@&TryGhost#8203;ericfennis](https://redirect.github.com/ericfennis) in
[#&TryGhost#8203;3809](https://redirect.github.com/lucide-icons/lucide/pull/3809)
- ci(workflows): Enable trusted publishing in release by
[@&TryGhost#8203;ericfennis](https://redirect.github.com/ericfennis) in
[#&TryGhost#8203;3808](https://redirect.github.com/lucide-icons/lucide/pull/3808)
- feat(icons): added `scooter` icon by
[@&TryGhost#8203;Ahmed-Dghaies](https://redirect.github.com/Ahmed-Dghaies) in
[#&TryGhost#8203;3818](https://redirect.github.com/lucide-icons/lucide/pull/3818)
- fix(icons): changed `plug` icon by
[@&TryGhost#8203;jamiemlaw](https://redirect.github.com/jamiemlaw) in
[#&TryGhost#8203;3841](https://redirect.github.com/lucide-icons/lucide/pull/3841)
- fix(icons): changed `thermometer-sun` icon by
[@&TryGhost#8203;jguddas](https://redirect.github.com/jguddas) in
[#&TryGhost#8203;3773](https://redirect.github.com/lucide-icons/lucide/pull/3773)
- fix(icons): Shrink square-scissors icons to match optical volume by
[@&TryGhost#8203;eden881](https://redirect.github.com/eden881) in
[#&TryGhost#8203;3603](https://redirect.github.com/lucide-icons/lucide/pull/3603)
- feat(preview-comment): add symmetry preview by
[@&TryGhost#8203;jguddas](https://redirect.github.com/jguddas) in
[#&TryGhost#8203;3823](https://redirect.github.com/lucide-icons/lucide/pull/3823)
- feat(icons): added `estimated-weight` icon by
[@&TryGhost#8203;nathan-de-pachtere](https://redirect.github.com/nathan-de-pachtere)
in
[#&TryGhost#8203;3822](https://redirect.github.com/lucide-icons/lucide/pull/3822)
- fix(icons): changed `flashlight` icons by
[@&TryGhost#8203;jamiemlaw](https://redirect.github.com/jamiemlaw) in
[#&TryGhost#8203;3843](https://redirect.github.com/lucide-icons/lucide/pull/3843)
- fix(icons): changed `bubbles` icon by
[@&TryGhost#8203;jguddas](https://redirect.github.com/jguddas) in
[#&TryGhost#8203;3774](https://redirect.github.com/lucide-icons/lucide/pull/3774)
- feat(site): add brand stop words to icon search by
[@&TryGhost#8203;karsa-mistmere](https://redirect.github.com/karsa-mistmere) in
[#&TryGhost#8203;3824](https://redirect.github.com/lucide-icons/lucide/pull/3824)
- feat(icons): added `van` icon by
[@&TryGhost#8203;Ahmed-Dghaies](https://redirect.github.com/Ahmed-Dghaies) in
[#&TryGhost#8203;3821](https://redirect.github.com/lucide-icons/lucide/pull/3821)

#### New Contributors

-
[@&TryGhost#8203;Muhammad-Aqib-Bashir](https://redirect.github.com/Muhammad-Aqib-Bashir)
made their first contribution in
[#&TryGhost#8203;3580](https://redirect.github.com/lucide-icons/lucide/pull/3580)
- [@&TryGhost#8203;Ahmed-Dghaies](https://redirect.github.com/Ahmed-Dghaies)
made their first contribution in
[#&TryGhost#8203;3818](https://redirect.github.com/lucide-icons/lucide/pull/3818)
- [@&TryGhost#8203;eden881](https://redirect.github.com/eden881) made their
first contribution in
[#&TryGhost#8203;3603](https://redirect.github.com/lucide-icons/lucide/pull/3603)
-
[@&TryGhost#8203;nathan-de-pachtere](https://redirect.github.com/nathan-de-pachtere)
made their first contribution in
[#&TryGhost#8203;3822](https://redirect.github.com/lucide-icons/lucide/pull/3822)

**Full Changelog**:
<lucide-icons/lucide@0.555.0...0.556.0>

###
[`v0.555.0`](https://redirect.github.com/lucide-icons/lucide/releases/tag/0.555.0):
Version 0.555.0

[Compare
Source](https://redirect.github.com/lucide-icons/lucide/compare/0.554.0...0.555.0)

#### What's Changed

- fix(icons): changed `calendars` icon by
[@&TryGhost#8203;jguddas](https://redirect.github.com/jguddas) in
[#&TryGhost#8203;3795](https://redirect.github.com/lucide-icons/lucide/pull/3795)
- fix(docs): correct package name and description for Flutter and Lustre
package
([#&TryGhost#8203;3701](https://redirect.github.com/lucide-icons/lucide/issues/3701))
by
[@&TryGhost#8203;epifaniofrancisco](https://redirect.github.com/epifaniofrancisco)
in
[#&TryGhost#8203;3703](https://redirect.github.com/lucide-icons/lucide/pull/3703)
- feat(angular): Angular V21 Support by
[@&TryGhost#8203;JeevanMahesha](https://redirect.github.com/JeevanMahesha) in
[#&TryGhost#8203;3807](https://redirect.github.com/lucide-icons/lucide/pull/3807)
- chore(metadata): Adjust navigation category by
[@&TryGhost#8203;ericfennis](https://redirect.github.com/ericfennis) in
[#&TryGhost#8203;3461](https://redirect.github.com/lucide-icons/lucide/pull/3461)
- feat(icons): Add `waves-arrow-up` and `waves-arrow-down` by
[@&TryGhost#8203;ericfennis](https://redirect.github.com/ericfennis) in
[#&TryGhost#8203;3463](https://redirect.github.com/lucide-icons/lucide/pull/3463)
- fix(icons): changed `scale` icon by
[@&TryGhost#8203;jamiemlaw](https://redirect.github.com/jamiemlaw) in
[#&TryGhost#8203;3800](https://redirect.github.com/lucide-icons/lucide/pull/3800)
- feat(icons): added `form` icon by
[@&TryGhost#8203;jguddas](https://redirect.github.com/jguddas) in
[#&TryGhost#8203;3558](https://redirect.github.com/lucide-icons/lucide/pull/3558)

**Full Changelog**:
<lucide-icons/lucide@0.554.0...0.555.0>

###
[`v0.554.0`](https://redirect.github.com/lucide-icons/lucide/releases/tag/0.554.0):
Version 0.554.0

[Compare
Source](https://redirect.github.com/lucide-icons/lucide/compare/0.553.0...0.554.0)

#### What's Changed

- fix(icons): Rename fingerprint icon to fingerprint-pattern by
[@&TryGhost#8203;ericfennis](https://redirect.github.com/ericfennis) in
[#&TryGhost#8203;3767](https://redirect.github.com/lucide-icons/lucide/pull/3767)
- feat(docs): added lucide-rails third-party package by
[@&TryGhost#8203;theiereman](https://redirect.github.com/theiereman) in
[#&TryGhost#8203;3769](https://redirect.github.com/lucide-icons/lucide/pull/3769)
- fix(icons): changed `ampersand` icon by
[@&TryGhost#8203;jguddas](https://redirect.github.com/jguddas) in
[#&TryGhost#8203;3771](https://redirect.github.com/lucide-icons/lucide/pull/3771)
- fix(icons): changed `folder-git-2` icon by
[@&TryGhost#8203;jguddas](https://redirect.github.com/jguddas) in
[#&TryGhost#8203;3790](https://redirect.github.com/lucide-icons/lucide/pull/3790)
- fix(icons): update `anchor` icon by
[@&TryGhost#8203;jamiemlaw](https://redirect.github.com/jamiemlaw) in
[#&TryGhost#8203;2523](https://redirect.github.com/lucide-icons/lucide/pull/2523)
- feat(icons): added `calendars` icon by
[@&TryGhost#8203;jguddas](https://redirect.github.com/jguddas) in
[#&TryGhost#8203;3788](https://redirect.github.com/lucide-icons/lucide/pull/3788)

#### Breaking change

For `lucide-react` and `lucide-solid`, imports for `Fingerprint` icon
are changed to `FingerprintPattern`.

##### Lucide React

```diff
- import { Fingerprint } from "lucide-react";
+ import { FingerprintPattern } from "lucide-react";
```

##### Lucide Solid

```diff
- import { Fingerprint } from "lucide/solid";
+ import { FingerprintPattern } from "lucide/solid";

// Or

- import Fingerprint from "lucide/solid/icons/fingerprint";
+ import FingerprintPattern from "lucide/solid/icons/fingerprint-pattern";
```

#### New Contributors

- [@&TryGhost#8203;theiereman](https://redirect.github.com/theiereman) made
their first contribution in
[#&TryGhost#8203;3769](https://redirect.github.com/lucide-icons/lucide/pull/3769)

**Full Changelog**:
<lucide-icons/lucide@0.553.0...0.554.0>

</details>

---

### Configuration

📅 **Schedule**: (in timezone Etc/UTC)

- Branch creation
  - Only on Sunday and Saturday (`* * * * 0,6`)
  - Between 12:00 AM and 12:59 PM, only on Monday (`* 0-12 * * 1`)
- Between 09:00 PM and 11:59 PM, Monday through Friday (`* 21-23 * *
1-5`)
- Between 12:00 AM and 04:59 AM, Tuesday through Saturday (`* 0-4 * *
2-6`)
- Automerge
  - Only on Sunday and Saturday (`* * * * 0,6`)
  - Between 12:00 AM and 12:59 PM, only on Monday (`* 0-12 * * 1`)
- Between 10:00 PM and 11:59 PM, Monday through Friday (`* 22-23 * *
1-5`)
- Between 12:00 AM and 04:59 AM, Tuesday through Saturday (`* 0-4 * *
2-6`)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/TryGhost/Ghost).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xMTAuMiIsInVwZGF0ZWRJblZlciI6IjQzLjExMC4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
This PR contains the following updates:

| Package | Type | Update | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|---|---|
|
[@types/color](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/color)
([source](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/color))
| dependencies | pin | [`^4.2.1` →
`4.2.1`](https://renovatebot.com/diffs/npm/@types%2fcolor/4.2.1/4.2.1) |
![age](https://developer.mend.io/api/mc/badges/age/npm/@types%2fcolor/4.2.1?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@types%2fcolor/4.2.1/4.2.1?slim=true)
|
|
[@types/express](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/express)
([source](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/express))
| devDependencies | pin | [`^4.17.25` →
`4.17.25`](https://renovatebot.com/diffs/npm/@types%2fexpress/4.17.25/4.17.25)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@types%2fexpress/4.17.25?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@types%2fexpress/4.17.25/4.17.25?slim=true)
|
|
[@types/jsdom](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/jsdom)
([source](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/jsdom))
| devDependencies | pin | [`^28.0.1` →
`28.0.1`](https://renovatebot.com/diffs/npm/@types%2fjsdom/28.0.1/28.0.1)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@types%2fjsdom/28.0.1?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@types%2fjsdom/28.0.1/28.0.1?slim=true)
|
|
[@types/lodash](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/lodash)
([source](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/lodash))
| devDependencies | pin | [`^4.17.24` →
`4.17.24`](https://renovatebot.com/diffs/npm/@types%2flodash/4.17.24/4.17.24)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@types%2flodash/4.17.24?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@types%2flodash/4.17.24/4.17.24?slim=true)
|
|
[@types/mocha](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/mocha)
([source](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/mocha))
| devDependencies | pin | [`^10.0.10` →
`10.0.10`](https://renovatebot.com/diffs/npm/@types%2fmocha/10.0.10/10.0.10)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@types%2fmocha/10.0.10?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@types%2fmocha/10.0.10/10.0.10?slim=true)
|
|
[@types/node](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/node)
([source](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node))
| devDependencies | pin | [`^25.6.0` →
`25.6.0`](https://renovatebot.com/diffs/npm/@types%2fnode/25.6.0/25.6.0)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@types%2fnode/25.6.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@types%2fnode/25.6.0/25.6.0?slim=true)
|
|
[@types/node](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/node)
([source](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node))
| devDependencies | minor | [`22.18.10` →
`22.19.17`](https://renovatebot.com/diffs/npm/@types%2fnode/22.18.10/22.19.17)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@types%2fnode/22.19.17?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@types%2fnode/22.18.10/22.19.17?slim=true)
|
|
[@types/node-fetch](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/node-fetch)
([source](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node-fetch))
| devDependencies | pin | [`^2.6.13` →
`2.6.13`](https://renovatebot.com/diffs/npm/@types%2fnode-fetch/2.6.13/2.6.13)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@types%2fnode-fetch/2.6.13?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@types%2fnode-fetch/2.6.13/2.6.13?slim=true)
|
|
[@types/on-headers](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/on-headers)
([source](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/on-headers))
| devDependencies | pin | [`^1.0.4` →
`1.0.4`](https://renovatebot.com/diffs/npm/@types%2fon-headers/1.0.4/1.0.4)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@types%2fon-headers/1.0.4?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@types%2fon-headers/1.0.4/1.0.4?slim=true)
|

⚠️ Renovate's pin functionality [does not
currently](https://redirect.github.com/renovatebot/renovate/issues/40288)
wire in the release age for a package, so the Minimum Release Age checks
can apply. You will need to manually validate the Minimum Release Age
for these package(s).

Add the preset `:preserveSemverRanges` to your config if you don't want
to pin your dependencies.

---

### Configuration

📅 **Schedule**: (in timezone Etc/UTC)

- Branch creation
  - Only on Sunday and Saturday (`* * * * 0,6`)
  - Between 12:00 AM and 12:59 PM, only on Monday (`* 0-12 * * 1`)
- Between 09:00 PM and 11:59 PM, Monday through Friday (`* 21-23 * *
1-5`)
- Between 12:00 AM and 04:59 AM, Tuesday through Saturday (`* 0-4 * *
2-6`)
- Automerge
  - Only on Sunday and Saturday (`* * * * 0,6`)
  - Between 12:00 AM and 12:59 PM, only on Monday (`* 0-12 * * 1`)
- Between 10:00 PM and 11:59 PM, Monday through Friday (`* 22-23 * *
1-5`)
- Between 12:00 AM and 04:59 AM, Tuesday through Saturday (`* 0-4 * *
2-6`)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these
updates again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/TryGhost/Ghost).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xMTAuMiIsInVwZGF0ZWRJblZlciI6IjQzLjExMC4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [rewire](https://redirect.github.com/jhnns/rewire) | [`8.0.0` →
`9.0.1`](https://renovatebot.com/diffs/npm/rewire/8.0.0/9.0.1) |
![age](https://developer.mend.io/api/mc/badges/age/npm/rewire/9.0.1?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/rewire/8.0.0/9.0.1?slim=true)
|

---

### Release Notes

<details>
<summary>jhnns/rewire (rewire)</summary>

###
[`v9.0.1`](https://redirect.github.com/jhnns/rewire/blob/HEAD/CHANGELOG.md#901)

[Compare
Source](https://redirect.github.com/jhnns/rewire/compare/v9.0.0...v9.0.1)

- Fix: Use pirates for proper load extensions install/uninstall handling
[#&TryGhost#8203;219](https://redirect.github.com/jhnns/rewire/pull/219)

###
[`v9.0.0`](https://redirect.github.com/jhnns/rewire/blob/HEAD/CHANGELOG.md#900)

[Compare
Source](https://redirect.github.com/jhnns/rewire/compare/v8.0.0...v9.0.0)

- **Breaking**: Update ESLint runtime dependency to v9
[#&TryGhost#8203;218](https://redirect.github.com/jhnns/rewire/pull/218). This
is most likely not a breaking change for rewire users but we can't know
for certain.

</details>

---

### Configuration

📅 **Schedule**: (in timezone Etc/UTC)

- Branch creation
  - Only on Sunday and Saturday (`* * * * 0,6`)
  - Between 12:00 AM and 12:59 PM, only on Monday (`* 0-12 * * 1`)
- Between 09:00 PM and 11:59 PM, Monday through Friday (`* 21-23 * *
1-5`)
- Between 12:00 AM and 04:59 AM, Tuesday through Saturday (`* 0-4 * *
2-6`)
- Automerge
  - Only on Sunday and Saturday (`* * * * 0,6`)
  - Between 12:00 AM and 12:59 PM, only on Monday (`* 0-12 * * 1`)
- Between 10:00 PM and 11:59 PM, Monday through Friday (`* 22-23 * *
1-5`)
- Between 12:00 AM and 04:59 AM, Tuesday through Saturday (`* 0-4 * *
2-6`)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/TryGhost/Ghost).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xMTAuMiIsInVwZGF0ZWRJblZlciI6IjQzLjExMC4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
closes https://linear.app/ghost/issue/NY-1189
ref TryGhost#27183
ref TryGhost#27184

This creates a table and model for Welcome Email Automation Runs.
Currently unused.

This change was originally written by Claude Sonnet 4.6 on Low effort
mode against the following prompt, but then was later edited a bit.

```
I'm starting to build a "welcome email automations" feature. See the attached design document below for background.

I've already built the `welcome_email_automations` and `welcome_email_automated_emails` tables/models. But now I need to build the `welcome_email_automation_runs` table/model. It should have the following fields:

* `welcomeEmailAutomationId: string` (foreign key reference to `welcome_email_automations`)
* `memberId: string` (foreign key reference to members)
* `nextWelcomeEmailAutomatedEmailId: null | string` (foreign key reference to `welcome_email_automated_emails`. `null` if finished)
* `readyAt: null | Date`
* `stepStartedAt: null | Date`
* `stepAttempts: uint`
* `exitReason: null | 'member not found' | 'email send failed' | 'member unsubscribed' | 'member changed status' | 'finished'`

This table and model should be dormant. That is, there should be no way to interact with it right now. We'll add all that in the future.

There should be no special database indexes (other than what's automatically created on the `id` primary key and the foreign keys).

Use red/green TDD to accomplish this task.

<design_document>
{design document copy-pasted here}
</design_document>
```
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [@codemirror/state](https://redirect.github.com/codemirror/state) |
devDependencies | pin | [`^6.6.0` →
`6.6.0`](https://renovatebot.com/diffs/npm/@codemirror%2fstate/6.6.0/6.6.0)
|

⚠️ Renovate's pin functionality [does not
currently](https://redirect.github.com/renovatebot/renovate/issues/40288)
wire in the release age for a package, so the Minimum Release Age checks
can apply. You will need to manually validate the Minimum Release Age
for these package(s).

Add the preset `:preserveSemverRanges` to your config if you don't want
to pin your dependencies.

---

### Configuration

📅 **Schedule**: (in timezone Etc/UTC)

- Branch creation
  - Only on Sunday and Saturday (`* * * * 0,6`)
  - Between 12:00 AM and 12:59 PM, only on Monday (`* 0-12 * * 1`)
- Between 09:00 PM and 11:59 PM, Monday through Friday (`* 21-23 * *
1-5`)
- Between 12:00 AM and 04:59 AM, Tuesday through Saturday (`* 0-4 * *
2-6`)
- Automerge
  - Only on Sunday and Saturday (`* * * * 0,6`)
  - Between 12:00 AM and 12:59 PM, only on Monday (`* 0-12 * * 1`)
- Between 10:00 PM and 11:59 PM, Monday through Friday (`* 22-23 * *
1-5`)
- Between 12:00 AM and 04:59 AM, Tuesday through Saturday (`* 0-4 * *
2-6`)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/TryGhost/Ghost).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xMTAuMiIsInVwZGF0ZWRJblZlciI6IjQzLjExMC4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
|
[@tryghost/mongo-utils](https://redirect.github.com/TryGhost/NQL/tree/main#readme)
([source](https://redirect.github.com/TryGhost/NQL)) | dependencies |
pin | [`^0.6.3` →
`0.6.3`](https://renovatebot.com/diffs/npm/@tryghost%2fmongo-utils/0.6.3/0.6.3)
|

⚠️ Renovate's pin functionality [does not
currently](https://redirect.github.com/renovatebot/renovate/issues/40288)
wire in the release age for a package, so the Minimum Release Age checks
can apply. You will need to manually validate the Minimum Release Age
for these package(s).

Add the preset `:preserveSemverRanges` to your config if you don't want
to pin your dependencies.

---

### Configuration

📅 **Schedule**: (in timezone Etc/UTC)

- Branch creation
  - Only on Sunday and Saturday (`* * * * 0,6`)
  - Between 12:00 AM and 12:59 PM, only on Monday (`* 0-12 * * 1`)
- Between 09:00 PM and 11:59 PM, Monday through Friday (`* 21-23 * *
1-5`)
- Between 12:00 AM and 04:59 AM, Tuesday through Saturday (`* 0-4 * *
2-6`)
- Automerge
  - Only on Sunday and Saturday (`* * * * 0,6`)
  - Between 12:00 AM and 12:59 PM, only on Monday (`* 0-12 * * 1`)
- Between 10:00 PM and 11:59 PM, Monday through Friday (`* 22-23 * *
1-5`)
- Between 12:00 AM and 04:59 AM, Tuesday through Saturday (`* 0-4 * *
2-6`)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/TryGhost/Ghost).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xMTAuMiIsInVwZGF0ZWRJblZlciI6IjQzLjExMC4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
ref f186b6a

This fixes two bugs when booting a fresh development container:

- Fixes `Cannot find module
'/home/ghost/.github/scripts/enforce-package-manager.js'` by copying all
of `.github/scripts`, not just the `install-deps.sh` script
- `ghost/i18n` required `@tryghost/debug` but did not declare it, which
meant a fresh container couldn't start
…yGhost#27338)

ref
https://linear.app/ghost/issue/DES-1341/design-and-branding-ui-issues-on-ios

- the edit/delete buttons relied on hover to become visible, leaving
them inaccessible on touch devices where hover doesn't exist
- added a `[@media(hover:none)]:visible!` variant so the buttons are
always shown when the device has no hover capability
ref https://linear.app/ghost/issue/ONC-1601/

- Updated Koenig packages
- Includes fix for long snippet names causing horizontal scroll and difficult to use delete buttons in card menus
- Updated `ember-svg-jar` to 2.7.1
  - The Koenig package update pulled in cheerio 1.0+ which dropped the
`.default` export that ember-svg-jar 2.4.9 relied on, breaking the
admin build. v2.7.1 uses the correct cheerio API.
ref https://linear.app/ghost/issue/BER-3481

Added gift member status filter in admin to allow filtering members who
have a gift subscription
TryGhost#27369)

ref https://linear.app/ghost/issue/BER-3523

We decided to remove the email toggle for when a member redeems a gift
and instead use the existing `new paid members` toggle
…dal (TryGhost#27331)

refs 71d7802

## Summary

This fixes a bug in the welcome email customization flow where pressing
`Escape` on the unsaved changes confirmation could close both the
confirmation dialog and the parent customize modal.

The issue was caused by nesting two independent dialog flows around the
same interaction. Once the unsaved changes confirmation was open,
`Escape` could still be handled in a way that allowed the parent modal's
close path to run again, which made the behavior flaky and caused the
customize modal to close when it should have stayed open.

The fix moves the unsaved changes confirmation into its own `NiceModal`
flow and gives it a single close/resolve path. That keeps the
confirmation dialog responsible for deciding whether the user is staying
or leaving, and prevents duplicate close handling from the parent modal.
As part of that cleanup, the confirmation modal's `description` prop was
also tightened to `React.ReactElement` so it matches the `asChild` usage
in `AlertDialogDescription` and can't be passed an unsafe node type.

## Behavior

- pressing `Escape` with unsaved changes now opens the confirmation
dialog
- pressing `Escape` again closes only the confirmation dialog and keeps
the customize modal open
- dismissing nested controls like the color picker or font select with
`Escape` still works without bypassing the unsaved changes confirmation

## Testing

- `yarn workspace @tryghost/e2e test
e2e/tests/admin/settings/member-welcome-emails.test.ts`
The functionality is already live on main behind the labs flag; this
change just promotes the flag to GA so welcome emails customization will
be enabled by default.
…TryGhost#27367)

closes https://linear.app/ghost/issue/BER-3476

## Summary

This PR wires up gift redemption for both logged-in members and
anonymous visitors:
- logged-in free members can now redeem a gift immediately from Portal
- anonymous visitors start from the same gift link, enter their details,
receive a magic link, and have the gift redeemed as part of the
sign-in/sign-up flow.

On success, Ghost marks the gift as redeemed, records the redeemer and
redemption timestamps, sets consumes_at, updates the member onto the
gifted tier with status: "gift", and returns the user to Portal with a
gift-specific success notification. The gift redemption flow remains
gated behind the giftSubscriptions labs flag.

## Redemption flows

### 1. Logged-in member flow

This is the fast path for an authenticated free member.

1. The member opens a gift redemption link in Portal:
`#/portal/gift/redeem/:token`.
2. Portal loads the gift details and shows the gift summary.
3. Because the visitor already has a member session, Portal shows a
direct `Redeem gift membership` CTA instead of the sign-up form.
4. Clicking the CTA calls `POST /members/api/gifts/:token/redeem/` (new
endpoint, documented in the API section below)
5. Ghost redeems the gift for the current member, updates the member
record to the gifted tier, and marks the gift as redeemed.
6. Portal refreshes member session data, routes the user to account
home, and shows a success notification.

In short: signed-in members redeem immediately in one step, without
email confirmation.

### 2. Anonymous visitor flow

This is the multi-step path for someone who is not yet signed in.

1. The visitor opens the same gift redemption link in Portal.
2. Portal loads the gift details and shows the gift summary plus a form
for name and email.
3. After submission, Portal sends a magic-link request that now
includes:
   - the entered email
   - the entered name
   - the `giftToken`
- a redirect back to Portal account with gift-redemption state in the
URL
4. The visitor receives and clicks the magic link.
5. During magic-link exchange, Ghost loads the existing member or
creates a new one.
6. If gift subscriptions are enabled and a `giftToken` is present, Ghost
redeems the gift for that member during the same flow.
7. Ghost redirects the visitor back into Portal with `success=true` or
`success=false`, while preserving the gift metadata needed for the final
notification state.
8. Portal lands on the account page and shows either a gift success or
gift failure notification.

In short: anonymous visitors authenticate first, and redemption happens
as part of completing that sign-in/sign-up step.


## API

### New endpoint

`POST /members/api/gifts/:token/redeem/`

### Authentication

Requires an authenticated member session cookie. If the request is made
without a valid member session, the endpoint returns `401 Unauthorized`.

### Request

```http
POST /members/api/gifts/gift-token-123/redeem/
Content-Type: application/json
Cookie: members-ssr=...
```

Request body:

```json
{}
```

### Success response

`200 OK`

```json
{
  "gifts": [
    {
      "token": "gift-token-123",
      "cadence": "year",
      "duration": 1,
      "currency": "usd",
      "amount": 5000,
      "expires_at": "2030-01-01T00:00:00.000Z",
      "status": "redeemed",
      "consumes_at": "2031-01-01T00:00:00.000Z",
      "tier": {
        "id": "tier_1",
        "name": "Premium",
        "description": "Full access membership",
        "benefits": [
          "Bonus newsletter",
          "Archive access"
        ]
      }
    }
  ]
}
```

### Error response samples

Member already has an active paid/comped subscription:

```json
{
  "errors": [
    {
      "type": "BadRequestError",
      "message": "You already have an active subscription."
    }
  ]
}
```

Gift is no longer redeemable:

```json
{
  "errors": [
    {
      "type": "BadRequestError",
      "message": "This gift has already been redeemed."
    }
  ]
}
```

Other expected errors from the same endpoint include:

- `This gift has already been consumed.`
- `This gift has expired.`
- `This gift has been refunded.`
- `This gift does not exist.`
- `Gift subscriptions are not enabled on this site.`
…Ghost#27320)

fixes TryGhost#27317
closes https://linear.app/ghost/issue/NY-1221

## Summary

- The CSS refactor in e1fffbb moved shared card styles into a
separate partial (`card-styles.hbs`) that gets included before
newsletter-specific styles in `styles.hbs`. This changed the source
order so that `.post-content a { color: {{linkColor}} }` (line ~555) now
appears **after** `.kg-callout-card-accent a { color: #fff }` (from
`card-styles.hbs` included at line 26). Since both selectors have the
same specificity `(0,1,0,1)`, the later rule wins and overrides the
white link color with `{{linkColor}}`, making links invisible on
accent-colored callout backgrounds.
- Added `!important` to `.kg-callout-card-accent a { color: #fff; }` to
preserve white link text regardless of source order, consistent with CTA
card link styles in the same file.

## Test plan

- [ ] Create a post with a callout card using the **accent** background
option
- [ ] Add a link inside the callout text
- [ ] Preview as email — link text should be white, not the accent/link
color
- [ ] Verified locally: integration tests pass, email preview confirmed
fix

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Low Risk**
> Low risk, single CSS specificity change in email rendering templates
to prevent accent callout link colors being overridden by later link
styles.
> 
> **Overview**
> Fixes newsletter email rendering where links inside accent-colored
callout cards could inherit the global post link color and become hard
to read.
> 
> Updates `.kg-callout-card-accent a` in `card-styles.hbs` to set
`color: #fff !important;`, ensuring callout links remain white
regardless of stylesheet source order.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
20023f2. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
refs
https://github.com/TryGhost/Ghost/actions/runs/24363396931/job/71148722202

## Summary

Skip Nx SHA and affected-project setup during tag-triggered CI runs.

## Problem

The `v6.29.0` release failed in `job_setup` on the tag-triggered `CI`
workflow. After `TryGhost#27297`, `job_setup` started using `nrwl/nx-set-shas`
to derive `NX_BASE`, and then passed that value into `paths-filter` and
Nx affected-project detection.

On a tag push, `github.ref_name` is the tag itself, so `nx-set-shas`
tried to resolve workflow history for `v6.29.0` as though it were a
branch. That failed, so it fell back to the empty-tree hash
(`4b825dc...`). `dorny/paths-filter` then errored because that object is
a tree, not a commit.

## Why this fix

Tag-triggered release runs do not need Nx base resolution, changed-file
detection, or affected-project calculation:
- the downstream jobs that use those outputs are already skipped on tags
- the release path only needs `job_setup` to succeed so artifact
build/publish jobs can proceed

Instead of trying to infer a “correct” comparison base for tags, this
change skips the tag-incompatible diff logic entirely on tag runs while
preserving the existing behavior for PRs and branch pushes.

**Changes**

- Skip `Set SHAs for Nx Commands` on tag runs
- Skip `Determine added packages` on tag runs
- Skip `Determine changed packages` on tag runs
- Skip `Determine Affected Projects` on tag runs

**Result**

Branch and PR CI continue to use Nx/affected diffing as before, while
tag-triggered releases no longer fail in setup due to an invalid
`NX_BASE`.
This reverts commit 60ba212.

The `v6.29.0` release failed after creating the tag. This reverts the
version in package.json back to `v6.29.0` so that we can release
`v6.29.1`
…t#27378)

ref
https://github.com/TryGhost/Ghost/actions/runs/24369399597/job/71170929638

The CI workflow is failing at the "Prepare docker build context" step on
runs on tags because `ghost/core/package/` doesn't exist:

```mv: cannot stat 'ghost/core/package/': No such file or directory```

At this stage in the workflow, `ghost/core/package/` doesn't exist, because it was deleted by the `pack:tarball` script a few steps prior in the same workflow by the `&& rm -rf package` addition to the `pack:tarball` script. Prior to the pnpm migration, the `package` directory wasn't cleaned up at all. This commit returns to that state, so that `ghost/core/package/` should still exist once it gets to the "Prepare docker build context" step.
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.