tr
TryGhost
GitHub
Ghost
Workspace
GitHub
CI Pipeline Executions
Filtered
Runs
Demo
Insights
Compare tasks
Analytics
Sign in
Toggle sidebar
Overview
⌘K
Ghost
Loading workspace stats
Loading workspace insights...
Statistics interval
7 days
30 days
Latest CI Pipeline Executions
Status
Fix filter
Filter
Fuzzy
Filter range
Sort by
Sort by
Start time
Sort ascending
Sort descending
Succeeded
30183
3cf0799b Cleaned up comments across the theme dialog files ref DES-1421 The comments in these files had accumulated over several review rounds and were narrating how the fixes were found rather than what the code does — `confirmation-modal.tsx` alone carried 40 comment lines in 193, including a 27-line block above the sticky footer. That is far out of step with the rest of Admin. Only the notes a future reader would otherwise "fix" back into a bug are kept: the grid-item sticky trap, StickyFooter's pixel sizing against Shade's 0.4rem scale, the legacy unlayered `code, tt` and `.rotate-180` collisions, Tailwind's literal class extraction, and the outcome phrase reading severity rather than count. No behaviour, class name or copy changed. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
by Peter Zimon
P
Succeeded
30183
3cf0799b Cleaned up comments across the theme dialog files ref DES-1421 The comments in these files had accumulated over several review rounds and were narrating how the fixes were found rather than what the code does — `confirmation-modal.tsx` alone carried 40 comment lines in 193, including a 27-line block above the sticky footer. That is far out of step with the rest of Admin. Only the notes a future reader would otherwise "fix" back into a bug are kept: the grid-item sticky trap, StickyFooter's pixel sizing against Shade's 0.4rem scale, the legacy unlayered `code, tt` and `.rotate-180` collisions, Tailwind's literal class extraction, and the outcome phrase reading severity rather than count. No behaviour, class name or copy changed. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
by Peter Zimon
P
Succeeded
30183
3cf0799b Cleaned up comments across the theme dialog files ref DES-1421 The comments in these files had accumulated over several review rounds and were narrating how the fixes were found rather than what the code does — `confirmation-modal.tsx` alone carried 40 comment lines in 193, including a 27-line block above the sticky footer. That is far out of step with the rest of Admin. Only the notes a future reader would otherwise "fix" back into a bug are kept: the grid-item sticky trap, StickyFooter's pixel sizing against Shade's 0.4rem scale, the legacy unlayered `code, tt` and `.rotate-180` collisions, Tailwind's literal class extraction, and the outcome phrase reading severity rather than count. No behaviour, class name or copy changed. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
by Peter Zimon
P
Succeeded
30183
3cf0799b Cleaned up comments across the theme dialog files ref DES-1421 The comments in these files had accumulated over several review rounds and were narrating how the fixes were found rather than what the code does — `confirmation-modal.tsx` alone carried 40 comment lines in 193, including a 27-line block above the sticky footer. That is far out of step with the rest of Admin. Only the notes a future reader would otherwise "fix" back into a bug are kept: the grid-item sticky trap, StickyFooter's pixel sizing against Shade's 0.4rem scale, the legacy unlayered `code, tt` and `.rotate-180` collisions, Tailwind's literal class extraction, and the outcome phrase reading severity rather than count. No behaviour, class name or copy changed. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
by Peter Zimon
P
Succeeded
30183
3cf0799b Cleaned up comments across the theme dialog files ref DES-1421 The comments in these files had accumulated over several review rounds and were narrating how the fixes were found rather than what the code does — `confirmation-modal.tsx` alone carried 40 comment lines in 193, including a 27-line block above the sticky footer. That is far out of step with the rest of Admin. Only the notes a future reader would otherwise "fix" back into a bug are kept: the grid-item sticky trap, StickyFooter's pixel sizing against Shade's 0.4rem scale, the legacy unlayered `code, tt` and `.rotate-180` collisions, Tailwind's literal class extraction, and the outcome phrase reading severity rather than count. No behaviour, class name or copy changed. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
by Peter Zimon
P
Succeeded
30183
b120ed06 Cleaned up comments across the theme dialog files ref DES-1421 The comments in these files had accumulated over several review rounds and were narrating how the fixes were found rather than what the code does — `confirmation-modal.tsx` alone carried 40 comment lines in 193, including a 27-line block above the sticky footer. That is far out of step with the rest of Admin. Only the notes a future reader would otherwise "fix" back into a bug are kept: the grid-item sticky trap, StickyFooter's pixel sizing against Shade's 0.4rem scale, the legacy unlayered `code, tt` and `.rotate-180` collisions, Tailwind's literal class extraction, and the outcome phrase reading severity rather than count. No behaviour, class name or copy changed. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
by Peter Zimon
P
Succeeded
30183
7f06af22 Fixed the theme dialog's dark-mode dividers and its live-theme copy The issue list drew its container edge and row dividers with `border-border`, the compositing colour floating surfaces blend with — translucent in dark mode. The list is an opaque card, so in dark mode its hairlines rendered against the wrong ground: measured on the open dialog, `oklab(0.3677 ... / 0.5)` where `border-border-default` gives an opaque `oklch(0.2595 0.0016 258.4)`. Both the container and the rows now take the opaque token, including the `border-b` Shade's `AccordionItem` leaves to the cascade. The "It's live!" dialog reported an active theme as "was saved successfully" even with a list of problems rendered directly beneath the sentence. Reachable by saving the active theme in the code editor and by re-uploading over it. A set with anything in it is now named instead — "is now visible to your readers, but it has some warnings" — through the same classification the badges and the heading read, extracted as `describeProblemSet` so no two sentences can call one set different things. The rest is the duplication that made those two possible. Two callers passed a `statusMessage` that rebuilt, by hand, the sentence `ThemeInstalledModal` already derives from `action`; both are gone, and the prop now carries only the default-theme case that has no derived form. `getDisplayVariant` sat in the view while `getDisplaySeverity` sat in the model, so two files switched on `problem.level` independently; they are now one map, one row per level, so a badge cannot be labelled and coloured from different places. The near- duplicate `InvalidThemeAction` and `ThemeInstalledAction` unions become one `ThemeAction`, which `describeThemeOutcome` takes in place of a bare `string`. The legacy `code` reset was written twice, once prefixed and once bare; the bare copy existed only for the one `<code>` we render ourselves, which now inherits the prefixed reset from its list instead. And `ValidationProblemList` accepted a `className` neither caller passed. Two acceptance tests cover the live-theme sentence, one carrying warnings and one carrying an error; both fail against the old copy. The sticky-footer and two-list assertions no longer select on `.z-[297]`, `.z-[299]` or `div.overflow-hidden.rounded-lg.border` — Shade internals and utility-class soup — but on test ids on our own markup. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
by Peter Zimon
P
Succeeded
30183
d91f2d7c Changed the copy and labels across the theme validation dialogs Four things the theme dialogs couldn't say. The issue list headed a set with "1 error, 2 warnings" without saying what an error costs, and the button under it read "Activate theme" whether or not Ghost had flagged one; both now come from the same `hasErrorProblem` classification, so neither can disagree with the badges in the list between them. The sub-line is the sentence the sidebar's theme-errors dialog already uses, verbatim, and follows its precedent of explaining errors only — warnings and recommendations restrict nothing. The invalid-theme dialog badged the problems that blocked the action identically to the non-blocking errors listed underneath them, leaving the two indistinguishable; `ValidationProblemList` now takes the label its error rows carry, so the blocking group reads BLOCKING. Finally, the "It's live!" sentence said a theme "was saved" however it arrived, describing an upload or a marketplace install as a save. The verb is now a prop the three callers set. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
by Peter Zimon
P
Succeeded
30183
d91f2d7c Changed the copy and labels across the theme validation dialogs Four things the theme dialogs couldn't say. The issue list headed a set with "1 error, 2 warnings" without saying what an error costs, and the button under it read "Activate theme" whether or not Ghost had flagged one; both now come from the same `hasErrorProblem` classification, so neither can disagree with the badges in the list between them. The sub-line is the sentence the sidebar's theme-errors dialog already uses, verbatim, and follows its precedent of explaining errors only — warnings and recommendations restrict nothing. The invalid-theme dialog badged the problems that blocked the action identically to the non-blocking errors listed underneath them, leaving the two indistinguishable; `ValidationProblemList` now takes the label its error rows carry, so the blocking group reads BLOCKING. Finally, the "It's live!" sentence said a theme "was saved" however it arrived, describing an upload or a marketplace install as a save. The verb is now a prop the three callers set. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
by Peter Zimon
P
Succeeded
30183
840eb633 Changed the copy and labels across the theme validation dialogs Four things the theme dialogs couldn't say. The issue list headed a set with "1 error, 2 warnings" without saying what an error costs, and the button under it read "Activate theme" whether or not Ghost had flagged one; both now come from the same `hasErrorProblem` classification, so neither can disagree with the badges in the list between them. The sub-line is the sentence the sidebar's theme-errors dialog already uses, verbatim, and follows its precedent of explaining errors only — warnings and recommendations restrict nothing. The invalid-theme dialog badged the problems that blocked the action identically to the non-blocking errors listed underneath them, leaving the two indistinguishable; `ValidationProblemList` now takes the label its error rows carry, so the blocking group reads BLOCKING. Finally, the "It's live!" sentence said a theme "was saved" however it arrived, describing an upload or a marketplace install as a save. The verb is now a prop the three callers set. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
by Peter Zimon
P
Succeeded
30183
c693bb1c Reformatted branch with Oxfmt
by Steve Larson
S
Succeeded
30183
c693bb1c Reformatted branch with Oxfmt
by Steve Larson
S
Succeeded
30183
b350ed05 Changed theme issue list to match the reviewed design ref https://linear.app/ghost/issue/DES-1421/improve-theme-installationactivation-modal-layout-and-copy Follows the mockup on Figma node 4199:479, which supersedes the interim treatment: the count heading drops both rules and leads with an amber warning icon, and the rows move inside a single bordered container rather than sitting as a borderless ruled list on the dialog background. Rows keep `border-b` with `last:border-b-0` rather than `divide-y`, whose zero-specificity `:where()` selector loses to any border utility on the child. Expanding a row collapses the trigger's bottom padding so the detail text sits under the rule line instead of a row's worth of space. gscan writes `rule` and `details` as HTML, so the mono treatment for inline code is a descendant selector on the container rather than any change to the markup or to what the validator produces. Everything comes from Shade tokens: `state-warning` for the icon, `Badge variant='warning'` for the amber, `text-base`/`text-md` for the 13px and 14px steps, `border-border` and `rounded-lg` for the container. Two values in the design have no exact token — a 7px container radius and an 11px badge gap — and take the nearest step, 8px and 12px. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
by Peter Zimon
P
Succeeded
30183
b350ed05 Changed theme issue list to match the reviewed design ref https://linear.app/ghost/issue/DES-1421/improve-theme-installationactivation-modal-layout-and-copy Follows the mockup on Figma node 4199:479, which supersedes the interim treatment: the count heading drops both rules and leads with an amber warning icon, and the rows move inside a single bordered container rather than sitting as a borderless ruled list on the dialog background. Rows keep `border-b` with `last:border-b-0` rather than `divide-y`, whose zero-specificity `:where()` selector loses to any border utility on the child. Expanding a row collapses the trigger's bottom padding so the detail text sits under the rule line instead of a row's worth of space. gscan writes `rule` and `details` as HTML, so the mono treatment for inline code is a descendant selector on the container rather than any change to the markup or to what the validator produces. Everything comes from Shade tokens: `state-warning` for the icon, `Badge variant='warning'` for the amber, `text-base`/`text-md` for the 13px and 14px steps, `border-border` and `rounded-lg` for the container. Two values in the design have no exact token — a 7px container radius and an 11px badge gap — and take the nearest step, 8px and 12px. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
by Peter Zimon
P
Succeeded
30183
cf96680f Changed theme dialog type scale, list rules and footer spacing ref https://linear.app/ghost/issue/DES-1421/improve-theme-installationactivation-modal-layout-and-copy Design review on the dialog asked for a larger status sentence and issue heading, a rule under the heading so it joins the list's rhythm, and two fixes. The rules between issue rows were not painting. Tailwind v4 compiles `divide-y` to `:where(& > :not(:last-child))`, which has zero specificity, so the `border-b-0` this file put on `AccordionItem` to cancel Shade's base border won a straight specificity contest and removed the separator instead. Rows now use one mechanism throughout — Shade's own `border-b` with `last:border-b-0`, which is more specific than the base rule rather than in a tie with it — and `divide-y` is gone. The gap above the footer was `AlertDialogContent`'s `gap-6` landing on top of the 24px spacer StickyFooter already opens with. The gap only ever separated the header block from the footer, so dropping it for the sticky-footer branch closes the hole without touching the fade treatment: 38.4px of dead space between the list and the footer box becomes 0. Sizes come from Shade's scale rather than pixel values — `text-base` (1.3rem) for the status sentence and `text-md` (1.4rem) for the heading, which at Shade's 62.5% root are the 13px and 14px asked for. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
by Peter Zimon
P
Failed
30183
b7e98144 🎨 Improved theme upload dialog layout and copy ref https://linear.app/ghost/issue/DES-1421/improve-theme-installationactivation-modal-layout-and-copy The upload dialog led with a large green banner that repeated what the title already said, then stacked three different treatments underneath it: a show/hide toggle, bordered cards per issue, and a red card for bare error strings. The result buried the one decision the dialog exists to ask — activate this theme or not. The banner is replaced by a single sentence that names the theme and states the outcome, the issue list is always visible under a plain count heading, and every issue now renders as one row in a single hairline-separated list that expands in place. The outcome sentence is derived from the problems' severity rather than their count. `getIssuesFromInstalledTheme` merges errors and warnings, so keying the wording off the count alone would have said "some warnings" directly above a heading reading "1 error, 2 warnings". The chevron previously turned a full 360 degrees and landed back where it started. Ghost's legacy Ember stylesheet ships Tachyons' `.rotate-180`, which sets `transform`, while Tailwind v4 compiles the same class name to the `rotate` property. Both sheets are unlayered in Admin, so an element carrying the literal class got both declarations. Moving to Shade's Accordion sidesteps it: Radix rotates via a parent arbitrary variant that compiles to a class name the legacy rule cannot match. Two layout fixes in the shared confirmation modal, both scoped to the sticky-footer branch so no other dialog is affected. A sticky grid item is boxed in by its own grid area and never sticks, so the footer needs a flex column. And StickyFooter sizes its box in raw pixels but spaces its parts with `h-6`/`-mb-6`, which Shade's 0.4rem spacing scale renders as 38.4px — pinning those offsets back to 24px removes the dead space below the footer and lets the buttons sit right-aligned, matching Shade's dialog default. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
by Peter Zimon
P
Succeeded
30183
b7e98144 🎨 Improved theme upload dialog layout and copy ref https://linear.app/ghost/issue/DES-1421/improve-theme-installationactivation-modal-layout-and-copy The upload dialog led with a large green banner that repeated what the title already said, then stacked three different treatments underneath it: a show/hide toggle, bordered cards per issue, and a red card for bare error strings. The result buried the one decision the dialog exists to ask — activate this theme or not. The banner is replaced by a single sentence that names the theme and states the outcome, the issue list is always visible under a plain count heading, and every issue now renders as one row in a single hairline-separated list that expands in place. The outcome sentence is derived from the problems' severity rather than their count. `getIssuesFromInstalledTheme` merges errors and warnings, so keying the wording off the count alone would have said "some warnings" directly above a heading reading "1 error, 2 warnings". The chevron previously turned a full 360 degrees and landed back where it started. Ghost's legacy Ember stylesheet ships Tachyons' `.rotate-180`, which sets `transform`, while Tailwind v4 compiles the same class name to the `rotate` property. Both sheets are unlayered in Admin, so an element carrying the literal class got both declarations. Moving to Shade's Accordion sidesteps it: Radix rotates via a parent arbitrary variant that compiles to a class name the legacy rule cannot match. Two layout fixes in the shared confirmation modal, both scoped to the sticky-footer branch so no other dialog is affected. A sticky grid item is boxed in by its own grid area and never sticks, so the footer needs a flex column. And StickyFooter sizes its box in raw pixels but spaces its parts with `h-6`/`-mb-6`, which Shade's 0.4rem spacing scale renders as 38.4px — pinning those offsets back to 24px removes the dead space below the footer and lets the buttons sit right-aligned, matching Shade's dialog default. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
by Peter Zimon
P
Previous
Next