Skip to content

fix: sync configurator from SLASHED PR 460/461, close release-sync gap - #122

Merged
jackgranatowski merged 9 commits into
mainfrom
claude/configurator-sync-pr-460-461-g1f2w4
Jun 30, 2026
Merged

jackgranatowski merged 9 commits into
mainfrom
claude/configurator-sync-pr-460-461-g1f2w4

Conversation

@jackgranatowski

@jackgranatowski jackgranatowski commented Jun 30, 2026

Copy link
Copy Markdown
Contributor

Summary

The configurator changes from framework PRs #460 (saved themes, motion panel overhaul) and #461 (base color palette, live semantic preview) merged cleanly into codeslash-dev/SLASHED but never reached this repo's vendored admin-app/src/. Two compounding bugs in the sync pipeline:

  1. release.yml silently discarded every sync. The "Build admin-app" step runs npm run build:admin-app, whose prebuild hook (sync-core.mjs) correctly fetches the latest configurator/src/ from GitHub on every release. But the next step ("Commit framework sync to default branch") does git checkout "$DEFAULT_BRANCH" and only re-stages a hardcoded list of framework-CSS paths (dist/, data/, the PHP *_CSS_REF files, etc.) — admin-app/src/, .vendored-manifest.json, framework-css/, and the compiled assets/admin-app/ bundle were never on that list. So each release's sync was built into that release's zip and then thrown away instead of being committed to git. The repo's tracked vendored files were frozen at a one-off manual local sync from before either PR merged.
  2. A stale .syncignore. It was still protecting App.svelte, PreviewPanel.svelte, StudioHeader.svelte, main.ts, vite-env.d.ts, and lib/persistence.ts against divergence from SLASHED#443 — a companion PR that merged to main on 2026-06-28, two days before #460/#461. Those protections were obsolete and, left in place, would have skipped App.svelte's new handleApplyTheme(overrides) signature while ThemesPanel.svelte (unprotected) called it with the new contract — a runtime breakage waiting to happen.

Changes

  • Removed the stale .syncignore entries.
  • Re-ran npm run sync against current framework main, pulling in both PRs (savedThemes.ts, removal of themes.ts/stylePresets.ts/StylePresetCards.svelte, the colors panel base-ramp/semantic-preview work, mobile fold toggle, etc.).
  • Fixed AppOverlay.svelte (plugin-specific, not vendored) — it still imported the PresetTheme type #460 removed and called handleApplyTheme(theme) with the old shape; updated to the new (overrides: Record<string,string>) contract to match App.svelte.
  • Patched release.yml to preserve/restore/stage admin-app/src/, .vendored-manifest.json, framework-css/, and assets/admin-app/ across the branch checkout, so future releases actually commit what they sync instead of discarding it.
  • Rebuilt the admin-app bundle (assets/admin-app/app.js, app.css).

Type

  • fix
  • feat
  • docs
  • chore / tooling

Checklist

  • Conventional Commit messages (feat:, fix:, docs:, …)
  • npm test passes (67/67)
  • npm run lint — not run (no PHP/CSS changes in this PR)
  • npm run verify passes (version metadata in sync)
  • Generated artifacts not hand-edited (admin-app/src/, framework-css/ came from npm run sync)
  • CHANGELOG.md updated under ## [Unreleased]
  • Built SPA assets committed (admin-app source changed)

Notes

svelte-check is clean except a pre-existing, unrelated error in plugin-main.ts (allowImportingTsExtensions) — confirmed via git stash that it predates this change and is unaffected by it.


Generated by Claude Code

Summary by CodeRabbit

  • New Features

    • Added a mobile-friendly controls/preview toggle and improved responsive layout.
    • Introduced live semantic color previews, saved theme management, and a reset confirmation dialog.
    • Expanded preview, typography, motion, spacing, shadows, borders, and effects panels with richer live editing and previews.
  • Bug Fixes

    • Improved theme syncing so generated changes are kept in the published release flow.
    • Updated color token handling for more consistent light/dark behavior and cleaner palette values.
    • Improved save/change detection and import handling for override data.

claude added 2 commits June 30, 2026 19:34
The configurator changes from SLASHED PR #460 (saved themes, motion panel
overhaul) and #461 (base color palette, semantic preview) never made it
into the vendored admin-app/src/ — two compounding bugs:

1. release.yml's "Commit framework sync" step runs build:admin-app (which
   syncs configurator/src/ fresh via its prebuild hook) but then checks out
   the default branch and only re-stages a fixed list of framework-CSS
   paths. admin-app/src/, .vendored-manifest.json, framework-css/, and the
   compiled assets/admin-app/ bundle were never in that list, so every
   release's sync was built into that release's zip and then silently
   discarded instead of being committed. Add those paths to the preserve/
   restore/git-add steps so future syncs land for real.

2. .syncignore was still protecting App.svelte, PreviewPanel.svelte,
   StudioHeader.svelte, main.ts, vite-env.d.ts, and lib/persistence.ts
   against a divergence from SLASHED#443 that merged to main on 2026-06-28,
   two days before #460/#461. Removed the stale entries so these vendor
   normally.

Re-ran the sync against current framework main to pull in both PRs, and
fixed AppOverlay.svelte (plugin-specific, not vendored) to match the new
onApplyTheme(overrides) contract now that ThemesPanel no longer passes a
PresetTheme — it still imported the type #460 removed, which broke
svelte-check. Rebuilt the admin-app bundle; verify-sync and the full test
suite pass.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SQXr34nocCi1jrGcp5TPVm
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SQXr34nocCi1jrGcp5TPVm
@coderabbitai

coderabbitai Bot commented Jun 30, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@jackgranatowski, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 28 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 5d03ef70-20ab-4e4e-8e8c-d8df1677bdfb

📥 Commits

Reviewing files that changed from the base of the PR and between 848aab3 and 9aa27ca.

📒 Files selected for processing (16)
  • .github/workflows/codeql.yml
  • .github/workflows/release.yml
  • SLASHED-for-WP/admin-app/.vendored-manifest.json
  • SLASHED-for-WP/admin-app/src/App.svelte
  • SLASHED-for-WP/admin-app/src/AppOverlay.svelte
  • SLASHED-for-WP/admin-app/src/components/inputs/ColorInput.svelte
  • SLASHED-for-WP/admin-app/src/components/inputs/OklchColorDesk.svelte
  • SLASHED-for-WP/admin-app/src/components/inputs/TokenRow.svelte
  • SLASHED-for-WP/admin-app/src/components/panels/ColorsPanel.svelte
  • SLASHED-for-WP/admin-app/src/components/panels/EffectsPanel.svelte
  • SLASHED-for-WP/admin-app/src/components/panels/MotionPanel.svelte
  • SLASHED-for-WP/admin-app/src/components/panels/SpacingPanel.svelte
  • SLASHED-for-WP/admin-app/src/components/panels/ThemesPanel.svelte
  • SLASHED-for-WP/admin-app/src/lib/codec.ts
  • SLASHED-for-WP/admin-app/src/lib/persistence.ts
  • SLASHED-for-WP/assets/admin-app/app.js
📝 Walkthrough

Walkthrough

This PR refactors the SLASHED admin-app configurator from preset-based theming to an overrides-snapshot model with localStorage-backed saved themes, rewrites the base color OKLCH ramp across CSS tokens and generated data, updates multiple panel UIs, rewrites the preview iframe skin, adds a reset confirmation dialog, and updates the release workflow/changelog/sync config.

Changes

Configurator theming and overrides refactor

Layer / File(s) Summary
Theme type contract changes
SLASHED-for-WP/admin-app/src/types.ts
Removes PresetTheme and StylePreset interfaces and narrows PreviewTemplate to drop "docs"/"dashboard".
Saved themes persistence module
SLASHED-for-WP/admin-app/src/lib/savedThemes.ts
New module managing localStorage-backed theme slots with listSavedThemes, saveTheme, deleteTheme, renameTheme.
App shell wiring for overrides and theme apply
SLASHED-for-WP/admin-app/src/App.svelte, AppOverlay.svelte, components/DomainPanel.svelte
Switches change detection to shallowEq, changes onApplyTheme to accept Record<string,string>, adds mobile fold view, removes onBulkChange prop passing.
Saved themes UI integration
components/panels/ThemesPanel.svelte, components/panels/HomePanel.svelte
Replaces curated theme presets with saved-theme management UI (save current, apply, delete) and token-domain shortcuts.
Panel UI cleanup of preset/bulk controls
components/panels/BordersPanel.svelte, ShadowsPanel.svelte, SpacingPanel.svelte, EffectsPanel.svelte, TypographyPanel.svelte, MotionPanel.svelte, MacrosPanel.svelte, components/inputs/PowerKnobRow.svelte
Removes onBulkChange/preset arrays in favor of per-token editors, raw-token slider wiring, and consolidated "Advanced" sections.
ColorsPanel base ramp and live semantic preview
components/panels/ColorsPanel.svelte
Adds fixed-lightness OKLCH base ramp, sourceValue() resolver, paletteSwatch() routing, and a live semantic preview grid.
Base color ramp updates in CSS and generated data
framework-css/badges/slashed.full.css, framework-css/core/tokens.css, data/api-index.generated.json, data/token-registry.generated.json
Replaces color-mix-based base ramp with fixed-lightness OKLCH formulas; removes semantic alias tokens and marks them removed in the registry.
Preview panel skin rewrite and derived overrides
src/lib/persistence.ts, components/shell/PreviewPanel.svelte
Loosens derived-token gating in computeDerivedOverrides, adds reduced-motion-aware override merging, and rewrites iframe template bodies/head around previewSkinCSS().
Reset confirmation dialog
components/shell/StudioHeader.svelte
Adds confirmation modal with focus management before calling onResetAll; minor label/transition tweaks.

Release workflow and sync configuration

Layer / File(s) Summary
Release workflow artifact staging and restoration
.github/workflows/release.yml, CHANGELOG.md
Stages and restores admin-app src, vendored manifest, framework CSS, and assets so they're committed to the default branch; documents fixes in CHANGELOG.
Sync ignore list and vendored manifest updates
SLASHED-for-WP/admin-app/.syncignore, .vendored-manifest.json
Narrows ignore list to plugin overlay files only; updates manifest's tracked vendored files to match configurator source changes.

Sequence Diagram(s)

sequenceDiagram
  participant User
  participant ThemesPanel
  participant AppSvelte
  participant SavedThemesModule
  participant PreviewPanel

  User->>ThemesPanel: Click Save current as...
  ThemesPanel->>SavedThemesModule: saveTheme(name, overrides)
  SavedThemesModule->>SavedThemesModule: persist to localStorage
  User->>ThemesPanel: Click Apply on saved theme
  ThemesPanel->>AppSvelte: onApplyTheme(theme.overrides)
  AppSvelte->>AppSvelte: setOverrides({...theme.overrides})
  AppSvelte->>PreviewPanel: pass updated overrides
  PreviewPanel->>PreviewPanel: withDerivedOverrides(overrides) + previewSkinCSS()
  PreviewPanel-->>User: render updated iframe preview
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~75 minutes

Possibly related PRs

Suggested labels

codex

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 9.09% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main change: syncing the configurator from SLASHED PRs and fixing the release sync gap.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch claude/configurator-sync-pr-460-461-g1f2w4

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@coderabbitai coderabbitai Bot added the codex label Jun 30, 2026
@qodo-code-review

qodo-code-review Bot commented Jun 30, 2026

Copy link
Copy Markdown

Code Review by Qodo

🐞 Bugs (0) 📘 Rule violations (0) 📜 Skill insights (0)

Context used
✅ Compliance rules (platform): 1 rule

Grey Divider


Action required

1. Null JSON import crash ✓ Resolved 🐞 Bug ≡ Correctness
Description
In App.svelte, JSON import accepts any typeof data === "object" value (including null) and
passes it to setOverrides(), which calls shallowEq(prev,next) and will throw when next is null
or otherwise not a flat record. This can crash the configurator (or corrupt overrides) during
import.
Code

SLASHED-for-WP/admin-app/src/App.svelte[R167-170]

        if (file.name.endsWith(".json")) {
          try {
            const data = JSON.parse(text);
-            if (data !== null && typeof data === "object" && !Array.isArray(data)) {
-              const safe = Object.fromEntries(
-                Object.entries(data as Record<string, unknown>).filter(([, v]) => typeof v === "string")
-              ) as Record<string, string>;
-              setOverrides(safe);
-            }
+            if (typeof data === "object") setOverrides(data);
Relevance

⭐⭐⭐ High

They accept App.svelte robustness fixes (e.g., save-flow correctness in PR #90).

PR-#90

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
handleImport() passes any parsed object to setOverrides(). setOverrides() calls
shallowEq(prev,next), and shallowEq calls Object.keys(b), which throws if b is null (and
is not correct for non-record shapes).

SLASHED-for-WP/admin-app/src/App.svelte[55-80]
SLASHED-for-WP/admin-app/src/App.svelte[156-171]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
`handleImport()` in `SLASHED-for-WP/admin-app/src/App.svelte` now treats any parsed JSON object as overrides. Because `typeof null === "object"`, importing a JSON file containing `null` (or other non-plain-object shapes) can break `setOverrides()`/`shallowEq()` and crash or corrupt state.

### Issue Context
This import flow is user-triggered (file picker). `setOverrides()` assumes a flat `Record<string,string>` and immediately compares objects using `Object.keys()`.

### Fix
- Restore the previous safe validation:
 - Require `data !== null`, `typeof data === "object"`, and `!Array.isArray(data)`.
 - Filter entries to `typeof v === "string"` (and optionally restrict keys to `--sf-` names) before calling `setOverrides()`.
- Consider reusing the stricter logic already present in `AppOverlay.svelte`'s import flow.

### Fix Focus Areas
- SLASHED-for-WP/admin-app/src/App.svelte[55-80]
- SLASHED-for-WP/admin-app/src/App.svelte[156-171]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


2. Vendored App.svelte modified ✗ Dismissed 📘 Rule violation § Compliance
Description
SLASHED-for-WP/admin-app/src/App.svelte is listed as a vendored file in .vendored-manifest.json,
but it is modified in this PR. This violates the policy that vendored files must not be changed
directly in this repository, to prevent divergence from the upstream framework source.
Code

SLASHED-for-WP/admin-app/src/App.svelte[R129-131]

+  // Applying a saved theme replaces the entire override set with the snapshot.
+  function handleApplyTheme(themeOverrides: Record<string, string>) {
+    setOverrides({ ...themeOverrides });
Relevance

⭐⭐⭐ High

Vendored manifest/docs added to prevent editing vendored admin-app/src directly (PR #111).

PR-#111

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The manifest explicitly marks src/App.svelte as a vendored file, and the PR changes that same file
(see the updated handleApplyTheme block). Per the compliance rule, any modification to a path
listed in .vendored-manifest.json constitutes a violation.

Rule 1514148: Do not modify vendored files listed in .vendored-manifest.json
SLASHED-for-WP/admin-app/.vendored-manifest.json[14-17]
SLASHED-for-WP/admin-app/src/App.svelte[129-131]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
This PR modifies files that are explicitly listed as vendored in `SLASHED-for-WP/admin-app/.vendored-manifest.json`, which is prohibited by the compliance rule.

## Issue Context
`SLASHED-for-WP/admin-app/.vendored-manifest.json` lists `src/App.svelte` as vendored. The PR changes `SLASHED-for-WP/admin-app/src/App.svelte` (e.g., `handleApplyTheme(...)` implementation), which triggers a compliance violation.

## Fix Focus Areas
- SLASHED-for-WP/admin-app/src/App.svelte[129-131]
- SLASHED-for-WP/admin-app/.vendored-manifest.json[14-17]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Remediation recommended

3. Infinity derived CSS ✓ Resolved 🐞 Bug ☼ Reliability
Description
getNum() in persistence.ts now only guards isNaN, allowing Infinity/-Infinity to flow into
derived-token calculations and be serialized into CSS strings (e.g. Infinityrem/NaN). This can
invalidate the injected preview stylesheet and break live preview rendering for those derived
tokens.
Code

SLASHED-for-WP/admin-app/src/lib/persistence.ts[R67-76]

  const v = ov[key];
  if (v === undefined) return def;
  const n = parseFloat(v);
-  return Number.isFinite(n) ? n : def;
-}
-
-function isNumericLiteral(v: string): boolean {
-  return /^-?(\d+\.?\d*|\.\d+)([eE][+-]?\d+)?$/.test(v.trim()) && Number.isFinite(parseFloat(v));
+  return isNaN(n) ? def : n;
}

function fmt(n: number): string {
-  if (!Number.isFinite(n)) return '0';
  const s = n.toFixed(6);
  const trimmed = s.replace(/\.?0+$/, '');
  return trimmed === '' || trimmed === '-' ? '0' : trimmed;
Relevance

⭐⭐⭐ High

They accept hardening against invalid values/CSS output (PRs #83, #81); non-finite guard fits
pattern.

PR-#83
PR-#81

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
getNum() no longer rejects non-finite results from parseFloat, and fluidClamp()/fmt()
directly interpolate formatted numbers into CSS output strings.

SLASHED-for-WP/admin-app/src/lib/persistence.ts[66-77]
SLASHED-for-WP/admin-app/src/lib/persistence.ts[81-90]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
`SLASHED-for-WP/admin-app/src/lib/persistence.ts` changed numeric parsing to treat non-NaN values as valid, which includes `Infinity` and `-Infinity`. Those values can propagate into derived token math and then into CSS via `fmt()`/`fluidClamp()`.

### Issue Context
`computeDerivedOverrides()` generates unlayered `:root` CSS for preview using `fluidClamp()` and `fmt()`. Emitting non-finite numbers produces invalid CSS values.

### Fix
- Update `getNum()` to return `def` unless `Number.isFinite(n)`.
- Add a defensive guard in `fmt()` (e.g., `if (!Number.isFinite(n)) return '0';`) to prevent accidental invalid CSS emission.

### Fix Focus Areas
- SLASHED-for-WP/admin-app/src/lib/persistence.ts[66-77]
- SLASHED-for-WP/admin-app/src/lib/persistence.ts[81-90]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


4. Workflow preserves deleted files ✓ Resolved 🐞 Bug ☼ Reliability
Description
The release workflow restores admin-app/framework-css/ and assets/admin-app/ by copying into
existing directories without deleting them first, so files removed by the sync/build won’t be
removed on the default branch. This can cause the default branch’s vendored tree to drift from the
synced source over time.
Code

.github/workflows/release.yml[R106-111]

+          rm -rf SLASHED-for-WP/admin-app/src
+          mkdir -p SLASHED-for-WP/admin-app/src
+          cp -a /tmp/fw-admin-app-src/. SLASHED-for-WP/admin-app/src/
+          cp /tmp/fw-admin-app-manifest.json SLASHED-for-WP/admin-app/.vendored-manifest.json
+          cp -a /tmp/fw-admin-app-framework-css/. SLASHED-for-WP/admin-app/framework-css/
+          cp -a /tmp/fw-assets-admin-app/. SLASHED-for-WP/assets/admin-app/
Relevance

⭐⭐ Medium

Team accepts release.yml fixes (PRs #76, #74); no history on cleaning dirs before cp -a.

PR-#76
PR-#74

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The workflow explicitly deletes admin-app/src but not the other restored directories, and then
copies into them, which does not propagate deletions.

.github/workflows/release.yml[106-111]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
In `.github/workflows/release.yml`, the workflow clears `admin-app/src` before restoring, but does not clear `admin-app/framework-css` or `assets/admin-app` before copying from `/tmp`. Copying with `cp -a src/. dest/` will not remove destination files that were deleted in the source, so deletions won’t be reflected on the default branch.

### Issue Context
This PR’s goal is to close the release-sync gap and keep the default branch accurately updated. Handling deletions is required for a true mirror.

### Fix
- Before restoring, `rm -rf SLASHED-for-WP/admin-app/framework-css` and recreate it (or use `rsync -a --delete`).
- Before restoring, `rm -rf SLASHED-for-WP/assets/admin-app` and recreate it (or use `rsync -a --delete`).

### Fix Focus Areas
- .github/workflows/release.yml[106-111]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

Qodo Logo

Comment thread SLASHED-for-WP/admin-app/src/App.svelte
Comment thread SLASHED-for-WP/admin-app/src/App.svelte Outdated
Comment thread SLASHED-for-WP/admin-app/src/lib/persistence.ts
Comment thread .github/workflows/release.yml
@qodo-code-review

Copy link
Copy Markdown

PR Summary by Qodo

fix: sync configurator from SLASHED PRs #460/#461, close release-sync gap

🐞 Bug fix ✨ Enhancement 🕐 40+ Minutes

Grey Divider

AI Description

• Syncs vendored admin-app/src/ with upstream framework PRs #460/#461 that never landed here.
• Fixes release.yml so release-time sync artifacts are committed, not discarded.
• Removes stale .syncignore protections now that upstream SLASHED#443 is merged.
• Updates plugin-only AppOverlay.svelte to match the new theme-apply contract.
• Rebuilds assets/admin-app/ bundles to reflect the synced configurator.
Diagram

graph TD
    A["release.yml\n(CI pipeline)"] -->|"preserve/restore/stage"| B["admin-app/src/\n(vendored Svelte source)"] --> F["App.svelte\n(mobile fold)"]
    A -->|"preserve/restore/stage"| C["framework-css/\n(vendored CSS tokens)"]
    A -->|"preserve/restore/stage"| D["assets/admin-app/\n(compiled bundle)"]
    A -->|"preserve/restore/stage"| E[".vendored-manifest.json"]

    B --> H["ThemesPanel\n(saved themes)"]
    B --> I["ColorsPanel\n(semantic preview)"]
    B --> J["MotionPanel\n(live preview)"]

    L["savedThemes.ts\n(localStorage)"] --> H

    subgraph Legend
      direction LR
      _ci["CI Workflow"] ~~~ _src["Vendored Source"] ~~~ _bundle["Compiled Assets"]
    end
Loading
High-Level Assessment

The PR’s approach is the correct and minimal fix: the release workflow must stage the vendored and compiled configurator outputs, and the stale .syncignore entries must be removed to allow upstream changes to sync. The AppOverlay update is the necessary contract alignment after upstream removed PresetTheme.

Files changed (32) +3774 / -2118

Enhancement (14) +1019 / -580
slashed.full.cssUpdate bundled framework CSS (v0.6.29) including base ramp change +43/-57

Update bundled framework CSS (v0.6.29) including base ramp change

• Bumps embedded framework version and updates the base color family to a fixed-lightness OKLCH ramp. Removes relative alias tokens for base and adjusts hover/active tokens.

SLASHED-for-WP/admin-app/framework-css/badges/slashed.full.css

tokens.cssSwitch base palette tokens to fixed-lightness OKLCH steps +42/-56

Switch base palette tokens to fixed-lightness OKLCH steps

• Replaces base-50..950 from color-mix formulas to 'oklch(from var(--sf-color-base) <L> c h)' with fixed L values. Removes base relative alias tokens and updates base hover/active behavior.

SLASHED-for-WP/admin-app/framework-css/core/tokens.css

App.svelteSync App: mobile fold toggle, efficient dirty tracking, theme apply signature +59/-29

Sync App: mobile fold toggle, efficient dirty tracking, theme apply signature

• Adds mobile Controls/Preview folding UI and updates layout visibility accordingly. Replaces JSON.stringify comparisons with shallow record equality for undo/redo and pending-save detection. Changes theme application to accept an overrides record directly.

SLASHED-for-WP/admin-app/src/App.svelte

PowerKnobRow.svelteDe-emphasize power knob UI +1/-2

De-emphasize power knob UI

• Removes the ⚡ badge and adjusts label styling to better match the new panel layouts.

SLASHED-for-WP/admin-app/src/components/inputs/PowerKnobRow.svelte

ColorsPanel.svelteAdd semantic preview and base fixed-lightness ramp support +156/-18

Add semantic preview and base fixed-lightness ramp support

• Adds a live semantic color grid (light/dark) resolved from the preview canvas for legibility checks. Implements base ramp rendering with fixed L steps to match framework tokens and unifies source resolution precedence via 'sourceValue()'.

SLASHED-for-WP/admin-app/src/components/panels/ColorsPanel.svelte

EffectsPanel.svelteSwitch text-shadow editing to direct token inputs +23/-22

Switch text-shadow editing to direct token inputs

• Replaces preset buttons with per-token text fields for '--sf-text-shadow-{s,m,l}', allowing explicit raw CSS values (including 'none').

SLASHED-for-WP/admin-app/src/components/panels/EffectsPanel.svelte

HomePanel.svelteRestructure home panel: token domains, tools, and quick-save themes +126/-42

Restructure home panel: token domains, tools, and quick-save themes

• Replaces curated theme preset entry points with a domain list (including new domains) and per-domain override counts. Adds a Tools section and a quick-save widget for saving the current overrides as a theme.

SLASHED-for-WP/admin-app/src/components/panels/HomePanel.svelte

MacrosPanel.svelteEnable raw token value entry for selected macro sliders +19/-7

Enable raw token value entry for selected macro sliders

• Adds raw default/current value wiring so sliders can set raw CSS expressions (e.g., 'var(...)') instead of only numeric rem/px values for several macro tokens.

SLASHED-for-WP/admin-app/src/components/panels/MacrosPanel.svelte

MotionPanel.svelteMotion panel overhaul with live preview and safer parsing +202/-214

Motion panel overhaul with live preview and safer parsing

• Adds a live animation preview (select easing + duration token, play) and reorganizes durations/easing/stagger/advanced sections. Adds NaN guards and updates easing definitions to match upstream tokens.

SLASHED-for-WP/admin-app/src/components/panels/MotionPanel.svelte

ShadowsPanel.svelteReplace presets with previews; move power knobs to Advanced +50/-62

Replace presets with previews; move power knobs to Advanced

• Removes curated shadow presets and introduces always-visible elevation preview and glow preview. Simplifies control structure and moves less-used power knobs behind an Advanced toggle.

SLASHED-for-WP/admin-app/src/components/panels/ShadowsPanel.svelte

ThemesPanel.svelteReplace curated presets with user-saved themes stored in localStorage +121/-53

Replace curated presets with user-saved themes stored in localStorage

• Adds save/list/apply/delete flows for user themes using localStorage. Updates apply behavior to replace the full override snapshot and highlights the currently active saved theme.

SLASHED-for-WP/admin-app/src/components/panels/ThemesPanel.svelte

TypographyPanel.svelteExpand font weights and move scale knobs to Advanced +26/-13

Expand font weights and move scale knobs to Advanced

• Supports weights 100–900 and updates Google Fonts import accordingly. Moves modular scale power knobs behind an Advanced toggle to reduce clutter.

SLASHED-for-WP/admin-app/src/components/panels/TypographyPanel.svelte

StudioHeader.svelteAdd reset confirmation modal and mobile-responsive header tweaks +72/-5

Add reset confirmation modal and mobile-responsive header tweaks

• Adds an accessible reset-all confirmation dialog with focus management and keyboard handling. Adjusts header layout for smaller screens and routes reset through the confirm flow.

SLASHED-for-WP/admin-app/src/components/shell/StudioHeader.svelte

savedThemes.tsAdd localStorage-backed saved theme persistence utilities +79/-0

Add localStorage-backed saved theme persistence utilities

• Introduces helper functions to list/save/rename/delete themes stored in localStorage with runtime guards to safely parse saved data.

SLASHED-for-WP/admin-app/src/lib/savedThemes.ts

Bug fix (4) +37 / -36
release.ymlPreserve and re-stage admin-app sync artifacts across branch checkout +24/-4

Preserve and re-stage admin-app sync artifacts across branch checkout

• Adds 'SLASHED-for-WP/admin-app/src/', '.vendored-manifest.json', 'framework-css/', and 'assets/admin-app/' to the preserve/restore and 'git add' list. Prevents release-time configurator syncs from being lost after checking out the default branch.

.github/workflows/release.yml

.syncignoreRemove stale ignore rules for previously divergent upstream files +4/-18

Remove stale ignore rules for previously divergent upstream files

• Removes now-obsolete exclusions for App.svelte, PreviewPanel, StudioHeader, main.ts, vite-env.d.ts, and persistence.ts so they vendor normally. Updates the comment to note SLASHED#443 has merged.

SLASHED-for-WP/admin-app/.syncignore

AppOverlay.svelteFix AppOverlay theme-apply call for new overrides-only contract +4/-4

Fix AppOverlay theme-apply call for new overrides-only contract

• Removes references to deleted 'PresetTheme' and updates 'handleApplyTheme' to accept 'Record<string,string>' and replace the override set, matching upstream App/ThemesPanel behavior.

SLASHED-for-WP/admin-app/src/AppOverlay.svelte

persistence.tsSimplify numeric validation in derived token computation +5/-10

Simplify numeric validation in derived token computation

• Removes regex-based numeric literal checking and relies on 'getNum'’s NaN handling. Keeps derived token generation consistent while reducing duplicated validation logic.

SLASHED-for-WP/admin-app/src/lib/persistence.ts

Refactor (8) +370 / -677
DomainPanel.sveltePropagate new onApplyTheme signature and update panel wiring +5/-5

Propagate new onApplyTheme signature and update panel wiring

• Updates 'onApplyTheme' typing to use override snapshots instead of PresetTheme. Removes 'onBulkChange' from panels that no longer use it after upstream refactors.

SLASHED-for-WP/admin-app/src/components/DomainPanel.svelte

StylePresetCards.svelteRemove StylePresetCards (deleted upstream) +0/-46

Remove StylePresetCards (deleted upstream)

• Deletes the preset-card component that supported curated style presets; callers are updated accordingly.

SLASHED-for-WP/admin-app/src/components/inputs/StylePresetCards.svelte

BordersPanel.svelteRemove style presets; reorganize radius controls +28/-36

Remove style presets; reorganize radius controls

• Drops corner-style preset UI and no longer requires 'onBulkChange'. Moves power-knob scale controls into an 'Advanced' section and keeps main border/radius controls focused.

SLASHED-for-WP/admin-app/src/components/panels/BordersPanel.svelte

SpacingPanel.sveltePromote space-scale preview; remove density presets and bulk patching +39/-78

Promote space-scale preview; remove density presets and bulk patching

• Moves the space scale visualization to the top of the panel. Removes density presets and 'onBulkChange' dependency, and shifts advanced knobs into a collapsed section.

SLASHED-for-WP/admin-app/src/components/panels/SpacingPanel.svelte

PreviewPanel.svelteRefactor preview templates to token-driven CSS skin and trim templates +297/-359

Refactor preview templates to token-driven CSS skin and trim templates

• Introduces a generated preview skin stylesheet to eliminate inline styles and ensure all visuals track tokens. Removes Docs and Dashboard templates and passes reduced-motion state into derived override computation.

SLASHED-for-WP/admin-app/src/components/shell/PreviewPanel.svelte

stylePresets.tsRemove obsolete stylePresets library +0/-17

Remove obsolete stylePresets library

• Deletes CORNER_PRESETS/SHADOW_PRESETS now that upstream removed curated style presets and their UI.

SLASHED-for-WP/admin-app/src/lib/stylePresets.ts

themes.tsRemove curated theme presets library +0/-120

Remove curated theme presets library

• Deletes THEME_PRESETS now that themes are user-saved snapshots (localStorage) instead of shipped presets.

SLASHED-for-WP/admin-app/src/lib/themes.ts

types.tsRemove PresetTheme/StylePreset types and trim PreviewTemplate union +1/-16

Remove PresetTheme/StylePreset types and trim PreviewTemplate union

• Deletes types tied to removed curated presets and reduces PreviewTemplate to match the templates that remain in PreviewPanel.

SLASHED-for-WP/admin-app/src/types.ts

Documentation (1) +6 / -0
CHANGELOG.mdDocument configurator sync and release pipeline fixes +6/-0

Document configurator sync and release pipeline fixes

• Adds Unreleased 'Fixed' entries describing the upstream configurator sync, the release.yml staging fix, and the '.syncignore' cleanup.

CHANGELOG.md

Other (5) +2342 / -825
.vendored-manifest.jsonRefresh vendored manifest for new/removed configurator files +26/-10

Refresh vendored manifest for new/removed configurator files

• Updates metadata and file list to include newly-vendored files (e.g., savedThemes.ts) and remove deleted preset/theme files. Updates the sync timestamp/source.

SLASHED-for-WP/admin-app/.vendored-manifest.json

api-index.generated.jsonRegenerate API index for updated token set and base palette changes +47/-185

Regenerate API index for updated token set and base palette changes

• Updates token counts/hashes and reflects removal of base relative aliases. Updates base ramp token values/notes and hover/active definitions to match new implementation.

SLASHED-for-WP/admin-app/src/data/api-index.generated.json

token-registry.generated.jsonMark removed base alias tokens as removed +12/-6

Mark removed base alias tokens as removed

• Flags base alias tokens (e.g., base-darker/xlight) as removed to align registry and UI metadata with the new base ramp model.

SLASHED-for-WP/admin-app/src/data/token-registry.generated.json

app.cssRegenerate compiled admin-app CSS bundle +1/-1

Regenerate compiled admin-app CSS bundle

• Updates built Tailwind output to include styles required by the synced configurator UI changes.

SLASHED-for-WP/assets/admin-app/app.css

app.jsRegenerate compiled admin-app JS bundle +2256/-623

Regenerate compiled admin-app JS bundle

• Updates the compiled Svelte/Vite bundle to reflect all synced configurator features and contract changes.

SLASHED-for-WP/assets/admin-app/app.js

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 7

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
SLASHED-for-WP/admin-app/src/lib/persistence.ts (1)

66-71: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

getNum no longer rejects non-finite numbers.

isNaN(n) only catches actual NaN; parseFloat can also return Infinity/-Infinity (e.g. from an overflowing numeric override), which now passes through unguarded. Downstream, fmt() calls .toFixed(6) on it, which returns the literal string "Infinity" (confirmed: toFixed never throws on non-finite values, per MDN/ECMA-262) — producing invalid generated CSS like "Infinityrem" instead of falling back to def.

🛠️ Proposed fix
 function getNum(ov: Record<string, string>, key: string, def: number): number {
   const v = ov[key];
   if (v === undefined) return def;
   const n = parseFloat(v);
-  return isNaN(n) ? def : n;
+  return Number.isFinite(n) ? n : def;
 }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@SLASHED-for-WP/admin-app/src/lib/persistence.ts` around lines 66 - 71,
`getNum` in `persistence.ts` only checks `isNaN`, so non-finite values like
`Infinity` can still pass through and later break `fmt()` output. Update
`getNum` to reject non-finite parsed numbers as well as `NaN`, and fall back to
`def` whenever the override is not a finite number. Use the existing `getNum`
helper and its callers in the persistence flow to keep invalid numeric overrides
from propagating into CSS generation.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/release.yml:
- Around line 106-111: The restore step is asymmetric: `admin-app/src` is fully
wiped before copying, but `admin-app/framework-css/` and `assets/admin-app/` are
only overlaid, so deleted upstream files can linger as stale tracked files.
Update the release workflow restore logic around the `cp -a` steps to clear
those destination directories first, matching the `rm -rf` + recreate pattern
used for `admin-app/src`, then copy in the staged contents.

In `@SLASHED-for-WP/admin-app/src/App.svelte`:
- Around line 167-170: Restore the JSON import guard in App.svelte before
calling setOverrides: the current `typeof data === "object"` check in the file
import flow allows `null`, arrays, and other invalid shapes through. Update the
JSON parsing path so it only accepts a plain non-null object, matching the safer
import validation used by AppOverlay’s import logic, and only then call
`setOverrides`.

In `@SLASHED-for-WP/admin-app/src/components/panels/ColorsPanel.svelte`:
- Around line 298-305: Route the remaining source-token reads through
sourceValue so every endpoint uses the same precedence as edited colors. Update
the surface/text endpoint helpers in ColorsPanel.svelte that currently read
overrides or hardcoded defaults to call sourceValue with sourceByName for the
light/dark base sources and the matching neutral sources, so tokens with
synced/default values resolve consistently with swatches and live preview.

In `@SLASHED-for-WP/admin-app/src/components/panels/EffectsPanel.svelte`:
- Around line 283-292: The EffectsPanel.svelte input handler is checking
v.trim() but still passes the untrimmed value to onSet, so whitespace can be
saved in overrides. Update the oninput callback on the text input to trim the
value once and pass the trimmed string to onSet when it is non-empty, while
keeping onReset for empty input; use the existing overrides[t.token] binding and
onSet/onReset handlers as the anchors for the change.

In `@SLASHED-for-WP/admin-app/src/components/panels/MotionPanel.svelte`:
- Around line 39-43: Use $derived.by for staggerBase in MotionPanel so it
recomputes as a numeric value when overrides or scale change instead of
returning a stale function. Update the staggerBase declaration to derive the
number directly, and adjust any related call sites in MotionPanel that read
staggerBase so they treat it as a plain number rather than invoking it like a
function.

In `@SLASHED-for-WP/admin-app/src/components/panels/SpacingPanel.svelte`:
- Around line 55-61: The space scale preview in SpacingPanel.svelte is using the
wrong exponent offset, causing every bar in the SPACE_STEPS loop to render one
step too low. Update the offset calculation inside the SPACE_STEPS each block so
it matches the actual --sf-space-* mapping (with m at index 3), and verify the
rawRem/barWidth preview values now align with the real fluid scale for steps
like m and l.

In `@SLASHED-for-WP/admin-app/src/components/panels/ThemesPanel.svelte`:
- Around line 114-118: The swatch rendering in ThemesPanel.svelte is
interpolating persisted theme data directly into a raw style string, which can
turn malicious or malformed values into extra CSS declarations. Update the theme
preview block inside the Object.entries(theme.overrides) loop to avoid
string-based style interpolation for the swatch, and instead use a safe
property-level style binding or validate v as a real color before applying it.
Keep the fix localized to the k.includes("color") || k.includes("source") branch
so the rendered preview cannot trigger unintended CSS or outbound requests.

---

Outside diff comments:
In `@SLASHED-for-WP/admin-app/src/lib/persistence.ts`:
- Around line 66-71: `getNum` in `persistence.ts` only checks `isNaN`, so
non-finite values like `Infinity` can still pass through and later break `fmt()`
output. Update `getNum` to reject non-finite parsed numbers as well as `NaN`,
and fall back to `def` whenever the override is not a finite number. Use the
existing `getNum` helper and its callers in the persistence flow to keep invalid
numeric overrides from propagating into CSS generation.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 701edf11-9046-46f7-be6c-46b298425741

📥 Commits

Reviewing files that changed from the base of the PR and between d9db52f and 848aab3.

📒 Files selected for processing (32)
  • .github/workflows/release.yml
  • CHANGELOG.md
  • SLASHED-for-WP/admin-app/.syncignore
  • SLASHED-for-WP/admin-app/.vendored-manifest.json
  • SLASHED-for-WP/admin-app/framework-css/badges/slashed.full.css
  • SLASHED-for-WP/admin-app/framework-css/core/tokens.css
  • SLASHED-for-WP/admin-app/src/App.svelte
  • SLASHED-for-WP/admin-app/src/AppOverlay.svelte
  • SLASHED-for-WP/admin-app/src/components/DomainPanel.svelte
  • SLASHED-for-WP/admin-app/src/components/inputs/PowerKnobRow.svelte
  • SLASHED-for-WP/admin-app/src/components/inputs/StylePresetCards.svelte
  • SLASHED-for-WP/admin-app/src/components/panels/BordersPanel.svelte
  • SLASHED-for-WP/admin-app/src/components/panels/ColorsPanel.svelte
  • SLASHED-for-WP/admin-app/src/components/panels/EffectsPanel.svelte
  • SLASHED-for-WP/admin-app/src/components/panels/HomePanel.svelte
  • SLASHED-for-WP/admin-app/src/components/panels/MacrosPanel.svelte
  • SLASHED-for-WP/admin-app/src/components/panels/MotionPanel.svelte
  • SLASHED-for-WP/admin-app/src/components/panels/ShadowsPanel.svelte
  • SLASHED-for-WP/admin-app/src/components/panels/SpacingPanel.svelte
  • SLASHED-for-WP/admin-app/src/components/panels/ThemesPanel.svelte
  • SLASHED-for-WP/admin-app/src/components/panels/TypographyPanel.svelte
  • SLASHED-for-WP/admin-app/src/components/shell/PreviewPanel.svelte
  • SLASHED-for-WP/admin-app/src/components/shell/StudioHeader.svelte
  • SLASHED-for-WP/admin-app/src/data/api-index.generated.json
  • SLASHED-for-WP/admin-app/src/data/token-registry.generated.json
  • SLASHED-for-WP/admin-app/src/lib/persistence.ts
  • SLASHED-for-WP/admin-app/src/lib/savedThemes.ts
  • SLASHED-for-WP/admin-app/src/lib/stylePresets.ts
  • SLASHED-for-WP/admin-app/src/lib/themes.ts
  • SLASHED-for-WP/admin-app/src/types.ts
  • SLASHED-for-WP/assets/admin-app/app.css
  • SLASHED-for-WP/assets/admin-app/app.js
💤 Files with no reviewable changes (3)
  • SLASHED-for-WP/admin-app/src/lib/stylePresets.ts
  • SLASHED-for-WP/admin-app/src/lib/themes.ts
  • SLASHED-for-WP/admin-app/src/components/inputs/StylePresetCards.svelte

Comment thread .github/workflows/release.yml
Comment thread SLASHED-for-WP/admin-app/src/App.svelte Outdated
Comment thread SLASHED-for-WP/admin-app/src/components/panels/ColorsPanel.svelte
Comment thread SLASHED-for-WP/admin-app/src/components/panels/EffectsPanel.svelte
Comment thread SLASHED-for-WP/admin-app/src/components/panels/MotionPanel.svelte Outdated
Comment thread SLASHED-for-WP/admin-app/src/components/panels/SpacingPanel.svelte
Comment thread SLASHED-for-WP/admin-app/src/components/panels/ThemesPanel.svelte
…elease.yml

cp -a src/. dest/ only adds/overwrites — it never removes files that no
longer exist upstream. admin-app/src/ was already rm -rf'd before restore;
apply the same wipe-then-copy to framework-css/ and assets/admin-app/ so
deletions actually propagate to the default branch instead of leaving
stale tracked files behind indefinitely.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SQXr34nocCi1jrGcp5TPVm
claude added 6 commits June 30, 2026 21:18
Re-syncs the configurator now that codeslash-dev/SLASHED#462 fixes the
bugs CodeRabbit and Qodo found in this PR's vendored files:

- App.svelte: null-safe JSON import (typeof null === "object" crash)
- lib/persistence.ts: Number.isFinite guards against Infinity/-Infinity
  leaking into generated CSS
- ColorsPanel.svelte: surface/text helpers now route through
  sourceValue()'s override precedence instead of reading overrides[...]
  directly
- EffectsPanel.svelte: trim value before onSet
- MotionPanel.svelte: staggerBase uses $derived.by so it actually
  recomputes
- SpacingPanel.svelte: off-by-one exponent in the space-scale preview
- ThemesPanel.svelte + swatch sites in ColorsPanel/EffectsPanel/
  TokenRow/ColorInput/OklchColorDesk: style:background={value} instead
  of raw style={`background: ${value}`} string interpolation, closing
  the CSS-declaration-injection path the failing CodeQL check flagged

These were pre-existing upstream bugs (not introduced by this PR's sync),
fixed in SLASHED#462 since this repo has no CodeQL/CodeRabbit coverage of
its own. verify-sync and the full test suite pass.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SQXr34nocCi1jrGcp5TPVm
Re-syncs after codeslash-dev/SLASHED#462 added a follow-up fix Qodo
found on that PR: codec.ts's fa() interpolated override keys verbatim
into generated CSS while only sanitizing values, letting a crafted
override key (from imported JSON, the URL hash, localStorage, or WP
hydration) break out of its CSS declaration in the live-preview
<style> tag or exported stylesheet. Keys are now filtered to the
--sf-[\w-]+ pattern every real token name matches.

verify-sync and the full test suite (67/67) pass.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SQXr34nocCi1jrGcp5TPVm
…HED#462

Re-syncs two more CodeRabbit findings fixed upstream:
- App.svelte: JSON import no longer wipes all overrides when the
  imported file has no string-valued keys
- ColorsPanel.svelte: getDarkSurface() now resolves through the
  documented override -> loaded-token -> default precedence instead of
  reading overrides[...] directly, matching getLightSurface()

verify-sync and the full test suite (67/67) pass.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SQXr34nocCi1jrGcp5TPVm
GitHub's CodeQL flagged the JSON-import handler as
js/remote-property-injection: imported file keys flowed into
Object.fromEntries() with only values filtered, so attacker-controlled
property names from an untrusted JSON file ended up on the overrides
object with no shape validation.

- Re-syncs App.svelte's fix from SLASHED#462 (filters keys to
  --sf-[\w-]+ matching codec.fa()'s existing emission-time filter).
- Applies the identical fix directly to AppOverlay.svelte, which has
  the same JSON-import pattern but is plugin-specific (not vendored,
  so it needs its own fix rather than a sync).

verify-sync and the full test suite (67/67) pass.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SQXr34nocCi1jrGcp5TPVm
The CodeQL check has reported the same "8 high" alert count on every
commit to PR #122 regardless of which source files actually changed —
including after real fixes landed for the exact pattern one of those
alerts named (js/remote-property-injection in handleImport()'s JSON
import). That's because CodeQL was scanning the committed, minified
assets/admin-app/app.js and bricks editor-app/app.js bundles: their
line numbers shift on every rebuild, so alert fingerprinting can't
match an alert to itself across commits and instead reports the same
handful of flagged patterns as "new" every single push. GitHub's own
UI can't even render a code preview for them ("snippet too large...
may be minified").

Both directories are 100% build output (npm run build:apps); the
actual hand-written source lives in admin-app/src/ and
integrations/bricks/editor-app/src/, which remain fully scanned.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SQXr34nocCi1jrGcp5TPVm
The previous commit's top-level `paths-ignore` action input was silently
rejected — that input doesn't exist on this codeql-action version
('Unexpected input(s) paths-ignore', confirmed in the job log — the
action just warned and proceeded to scan everything, unfiltered, which
is why the alert count didn't change). paths-ignore must be nested
inside the inline `config` YAML input instead, which is how this
version of the action actually expects it.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SQXr34nocCi1jrGcp5TPVm
@jackgranatowski
jackgranatowski merged commit f0fa5f4 into main Jun 30, 2026
9 checks passed
jackgranatowski pushed a commit that referenced this pull request Jul 1, 2026
Pulls in the App.svelte fix from codeslash-dev/SLASHED#464: the
domain panel used w-full + shrink-0 in the same flex row as the icon
nav rail, so it demanded 100% of the whole row's width instead of
just the space left after the rail — overflowing the viewport by the
rail's width with no scrollbar. Now flex-1 min-w-0 on mobile so it
fills only what's actually left; desktop keeps its fixed 360px width
via md:flex-none. Same root cause affects the WP admin Tokens page on
mobile, independent of the earlier embedded-sizing fix (#122).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SQXr34nocCi1jrGcp5TPVm
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants