Skip to content

Phase 7: visual polish & solid icons + wp.org 1.0.0 release prep#25

Merged
dknauss merged 19 commits into
mainfrom
feat/phase-07-visual-polish-icons
Jun 17, 2026
Merged

Phase 7: visual polish & solid icons + wp.org 1.0.0 release prep#25
dknauss merged 19 commits into
mainfrom
feat/phase-07-visual-polish-icons

Conversation

@dknauss

@dknauss dknauss commented Jun 17, 2026

Copy link
Copy Markdown
Owner

What's in this branch

Two threads of work, layered:

Phase 7 — Visual Polish & Icons (code)

  • ICON-01: regenerated the bundled icon set with solid *-fill variants so the picker mixes naturally with WordPress's solid dashicons; fill-resolution policy is unit-tested.
  • UX-02 (partial): clearer toolbar zone hierarchy, non-color status states, a scannable ~20px icon grid, and a dismissible first-run cue.
  • e2e regression coverage for the solid grid, toolbar polish, and first-run cue.

wp.org 1.0.0 release prep (docs + tooling)

  • Accepted by WordPress.org 2026-06-16 — slug maestro-menu-editor (matches the text domain), public URL https://wordpress.org/plugins/maestro-menu-editor.
  • bin/deploy-svn.sh — builds the runtime tree, checks out the SVN repo to build/svn, syncs trunk/ + the directory assets/ (banners, icons, screenshot-1..4), copies tags/1.0.0, and stops before svn ci so publishing stays a manual, credentialed step.
  • Captured the 2026-06-10 meta post on the new core-block screenshot gallery (our uniform 1440×980 set → grid; no change required).

⚠️ Not a complete Phase 7 — UX-02 is reopened

Five edit-mode UI defects were triaged from wp-sudo-thread screenshots and are NOT fixed here — they're scoped into plan 07-04:

  • BUG-01 ✓ Saved ✓ double check (i18n string + status glyph both render)
  • BUG-02 rename input shifts horizontally; "Title" label unclear (keep breadcrumb, move it right of the input)
  • BUG-03 toolbar buttons overlap at narrow widths (.maestro-toolbar lacks flex-wrap)
  • BUG-04 idle "Editor active" reads as a dead control
  • BUG-05 status states use emoji glyphs (○⏳✓⚠) → replace with dashicons

BUG-01 and BUG-03 falsify UX-02's "no text-overlap / control-resize regressions" criterion, so UX-02 stays open until 07-04 lands. V2-15 (role cloning for per-user menu hiding) was also scoped into the v2 backlog.

Test baseline

Per Phase 7 execution (STATE.md): unit 44/44, integration 29/29, e2e 9/9, Plugin Check 0 errors. Not re-run in the doc/tooling commits (docs + a deploy script only).

🤖 Generated with Claude Code

Dan Knauss and others added 19 commits June 16, 2026 00:03
- 11 tests for resolveIcon policy: fill preference, synonym map, outline fallback
- SYNONYM_FILL target existence assertion (hard check — missing target is failure)
- No-silent-drop invariant: all 87 CURATED names resolve to existing files
- Data-URI shape: base64, baked #a7aaad grey, no currentColor
- RED phase confirmed: generator lacks exports + is side-effectful on import

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Export resolveIcon(name) -> {file, source:'fill'|'synonym'|'outline'}
  Prefers <name>-fill.svg; falls back to SYNONYM_FILL (7 validated synonyms);
  else retains outline. Never drops a CURATED name.
- Export SYNONYM_FILL map (7 entries, all validated existsSync at load time)
  files->file-earmark-fill, pencil-square->pencil-fill, images->image-fill,
  folder2-open->folder-fill, cart3->cart-fill, person-circle->person-fill,
  person-lock->person-fill-lock
- Export bakeDataUri(name): reads resolved SVG, bakes #a7aaad, strips
  width/height/class, returns base64 data:image/svg+xml
- Export CURATED (87 names), ICON_DIR, MENU_GREY
- Guard writeFileSync behind main() called only when run directly
  (process.argv[1] === fileURLToPath(import.meta.url)) — import is side-effect-free
- All 35 JS tests green (11 new icons-bundle + 24 existing)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- 58 names now use <name>-fill.svg (direct Bootstrap fill variant)
- 7 names use validated solid synonyms (SYNONYM_FILL map)
- 22 names retained as outline (no solid form in Bootstrap Icons v1.13.1):
  speedometer2, journal-text, card-text, layout-text-window, film,
  music-note-beamed, list-ul, table, shop, cash-stack, receipt, truck,
  graph-up, gear-wide-connected, sliders, tools, wrench, server, globe,
  link-45deg, code-slash, search
- Bundle still has exactly 87 entries; no silent drops
- All entries are valid data:image/svg+xml;base64, data-URIs at #a7aaad

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- 07-01-SUMMARY.md: fill-resolution policy + 87-entry bundle regeneration
- STATE.md: progress 40%, decisions, session, metrics recorded
- ROADMAP.md: Phase 7 plan progress updated (1/3 plans complete)
- REQUIREMENTS.md: ICON-01 marked complete

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Widened inter-zone gap to 16px for deliberate status | panel | right-actions rhythm
- Panel left-border widened to 2px; right-actions group gets matching 2px left-border
- Status zone: flex-shrink:0 prevents compression when label is long
- Panel label: max-width tightened to 200px to guard against status overrun
- Non-color ::before glyph per state: ○ idle, ⏳ saving, ✓ saved, ⚠ error
- Pulsing animation on saving glyph guarded by prefers-reduced-motion
- All existing Phase 6 modified-indicator / reset-item rules untouched
- Icon grid: cell min-size 36px -> 40px, padding 9px for precise 20px glyph centering
- Icon grid: gap tightened to 3px; both tabs now share same visual density
- 44px touch target in <=782px media rule preserved with matching padding:12px
- .maestro-firstrun styles: fixed bar above toolbar, native admin tokens, keyboard-focusable dismiss
- .maestro-firstrun-dismiss: focus-visible outline, hover color change (no color-only)
- assets/maestro.js: buildFirstRunCue() injects cue, localStorage-gated, try/catch guarded
- Dismiss by click or Enter/Space; does not steal focus from menu
- includes/class-assets.php: firstRun + firstRunDismiss i18n strings (WPCS-aligned)
- composer lint clean; PHP unit 44/44; integration 29/29; JS 35/35
…tatus glyphs, icon grid, first-run cue

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
… cue

- ICON-01: Bootstrap tab asserts >50 visible cells, data-URI src on imgs,
  search filter narrows visible set (Phase 6 filter regression guard reused)
- UX-02: bounding-box assertions at 1200px and 700px — toolbar width <=
  viewport, rename input right edge <= panel right edge (no overflow/resize)
- First-run: page.evaluate() clears localStorage once before first nav so the
  cue appears fresh; dismiss removes it immediately; reload suppresses it
- Screenshots written: icons-bootstrap-tab.png, icons-dashicons-tab.png,
  icons-side-by-side.png, toolbar-1200.png, toolbar-700.png
- All 15 e2e tests pass (11 Phase 6 baseline + 4 new Phase 7 specs)
Triage screenshots from the wp-sudo thread into the v1.1 plan; no code changed.

- BUG-01 double "Saved" check: i18n string + status glyph both render the mark
- BUG-02 rename input shifts: breadcrumb label sits left of the input — keep it
  (it's specific about the target) but move it right of the input; relabel "Title"
- BUG-03 toolbar buttons overlap at narrow widths: .maestro-toolbar lacks flex-wrap
- BUG-04 idle "Editor active" circle reads as a dead control: it's the status glyph
- BUG-05 status states use emoji glyphs (o/hourglass/check/warn) that go color-emoji
  or can be disabled — replace with dashicons (already loaded), keep WCAG 1.4.1 shapes

All map to Phase 7 / plan 07-04; UX-02 reopened (BUG-01 + BUG-03 falsify its
no-text-overlap criterion). V2-15 (role cloning for per-user menu hiding) added to
the v2 backlog as a feasibility note: static snapshot vs dynamic user_has_cap
inheritance vs per-user visibility, staying within the cosmetic-visibility principle.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
v1.0.0 accepted by WordPress.org 2026-06-16. Pending todo flipped from
"await review" to the actionable SVN deploy checklist (trunk + tags/1.0.0 +
assets/), gated on confirming the granted slug. Captured the 2026-06-10 meta
post on the new core-block screenshot gallery: our uniform 1440x980 set renders
as a grid with no change required; optional Phase 8 caption polish noted.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Slug confirmed maestro-menu-editor (matches the text domain). The script reuses
bin/build.sh's runtime set, checks out the SVN repo to build/svn, syncs trunk/
and the directory assets/ (banners, icons, screenshot-1..4), and copies the
tags/<version> tag. It deliberately stops before `svn ci` so publishing stays a
manual, credentialed step. Version is read from readme Stable tag and checked
against the main-file Version header. STATE.md records the confirmed slug + URL.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1.0.0 is live at wordpress.org/plugins/maestro-menu-editor (deployed via GitHub
Actions → SVN). Flag the pre-next-release listing work into Phase 8:

- DOC-02: readme.txt copy rewrite (wp-readme-optimizer)
- DOC-03: WordPress Playground "Try it first" demo link (blueprint-hosted.json
  ready; quick 1.0.1 candidate) in readme + GitHub README
- REL-07: stronger banner graphic via the REL-06 pipeline
- REL-08: refreshed screenshots + gallery-aware captions for the new
  core-block directory gallery

Phase 8 gains plans 08-05 (copy + playground) and 08-06 (banner + screenshots).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
REL-07 primary design goal: balance the banner's stacked text rows (MAESTRO
wordmark, subtitle, tagline) and the gold underline rule to approximately the
same horizontal width, rather than mismatched line widths. Image work deferred.

Mark DOC-02 (readme rewrite) and DOC-03 (Playground link) as drafted in PR #28.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- BUG-01: drop the trailing ✓ from the localized "Saved" string; the status
  glyph is now the single canonical mark (no more "✓ Saved ✓").
- BUG-02: the rename input is appended first so its left edge is fixed and no
  longer shifts with the selected item's name; the breadcrumb label (kept for
  context) moves to its right. "Title" label relabeled to "Rename".
- BUG-03: .maestro-toolbar and .maestro-panel now flex-wrap, so zones and panel
  controls stack onto rows at narrow widths instead of overlapping.
- BUG-04 + BUG-05: status indicators use dashicons instead of Unicode dingbats
  (idle → de-emphasised dashicons-marker dot, not an interactive-looking ring;
  saving → dashicons-update with a spin; saved → dashicons-yes; error →
  dashicons-warning). dashicons declared as a style dependency. Distinct shapes
  preserve the WCAG 1.4.1 non-color cue; emoji substitution/disabling no longer
  affects rendering.

Test: extend the UX-02 no-overlap e2e to 480px and assert no two toolbar
controls overlap (the width-only checks couldn't catch overlapping flex items).
Local: phpcs clean, PHP unit 44/44, JS logic 35/35. e2e runs in CI.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…en RED→GREEN

Running the no-overlap assertion red-first exposed that the 480px viewport I'd
added was invalid: below 782px wp-admin switches to the off-canvas mobile menu,
so the test can't select a menu item at all — it failed in setup, not on the
assertion. Removed it.

The 700px viewport is a real guard: with the BUG-03 flex-wrap reverted the
assertion fails ("toolbar controls 1 and 3 overlap at 700px"); with the wrap it
passes. Full local e2e suite: 15/15. Deliverable screenshots refreshed against
the fixed UI (dashicons status glyphs, single "Saved" check).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
RED→GREEN proven for BUG-03's no-overlap e2e at 700px; full local e2e 15/15;
phpcs + PHP unit 44/44 + JS logic 35/35. UX-02 unblocked (defects cleared).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
RED: asserts the .maestro-status ::before content is `none` when idle (and a
glyph for the saved state). Fails against current code where idle still renders
the dashicons-marker dot.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The idle leading icon was unnecessary — the visible toolbar and "Editor active"
text already signal edit mode, and the dot read as a fake control (BUG-04
follow-up). Set the base .maestro-status::before to content:none; the dashicon
now appears only while saving / saved / error. Idle test goes GREEN; full e2e
16/16. Deliverable screenshots refreshed.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Phase 7 (Visual Polish & Icons) marked Complete 2026-06-17. UX-02 and
BUG-01..05 flipped to Complete in the traceability; plans 07-01..07-04 ticked;
progress table + STATE position advanced to "Phase 8 next".

Verification gate (honest sign-off): PHP unit 44/44, integration 29/29, e2e
16/16, JS logic 35/35, phpcs clean. BUG-03 no-overlap and idle-icon guards
proven RED→GREEN. (Plugin Check is the wp.org scanner gate; re-verified at the
1.1.0 deploy — these changes are i18n/CSS/JS-DOM, no PCP surface.)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@dknauss dknauss merged commit 8e0ba34 into main Jun 17, 2026
4 checks passed
@dknauss dknauss deleted the feat/phase-07-visual-polish-icons branch June 17, 2026 14:30
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.

1 participant