Commit c8c5cdb
Admin UI on @plugpress/ui (migration → v0.8.2) + header refresh + hygiene (#37)
* feat: migrate admin UI to @plugpress/ui v0.6.0
Retire the @wordpress/components compat shim (admin/src/ui.jsx) and compose
every admin screen directly on @plugpress/ui design-system components; bump
the pin v0.2.0 → v0.6.0.
- Screens on DS components: TopBar (Tabs/StatusDot), Onboarding + Permissions
(CardRadioGroup, ApplyBar, toast), Home (Hero/CalloutCard/CardGrid/RowList),
Connect tab (PageHeader/EmptyState/RowList/useConfirm/Snippet), ConnectionHealth
(CodeBlock/CalloutCard), ConnectWizard (Steps/CodeBlock/Snippet/LiveIndicator/
useCopy — everCopied gate + back-out revoke preserved), Guidance/Memory
(Card/RowList/Switch/Field/useConfirm/toast), Activity (FilterTabs/EmptyState/Badge).
- Mount TooltipProvider/ConfirmProvider/Toaster once at the app root.
- Delete admin/src/ui.jsx shim and dead theme icons; drop wp-components from the
PHP fallback deps + stylesheet deps (no @wordpress/components left anywhere).
- style.scss 2,203 → 1,109 lines (kept: token aliases, setup shell, permissions
lanes/chips, activity timeline, wizard flourishes).
- Single-source the brand mark: assets/brand/mark.svg is the only copy; React
<BrandMark/> (SVGR) and the PHP admin-menu icon both read it.
- Reconcile CLAUDE.md + admin/DESIGN-ALIGNMENT.md to name @plugpress/ui as the kit.
v0.6.0 verified non-breaking for Saddle (all 34 imports resolve; flat Tabs/
FilterTabs/Steps + every pp-* class Saddle targets survive; adds a WCAG 2.2 AA
pass). Verified: build clean, react/wp-* externalized, no google-fonts; 300
PHPUnit tests green; wp-playground smoke test (app renders, DS + product
stylesheets ordered, pp-scope on body, monochrome accent wins, menu icon reads
the single-source SVG).
Follow-up: #35 (full-width header + Home stat tiles + a11y).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01W7RDwBHyNgrKKcDKYeuVLk
* chore: align @plugpress/ui to v0.6.1 (lockfile + fleet:agents guide)
The fleet:agents tooling bumped the pin to v0.6.1; package.json already carried
it but node_modules/lockfile lagged at v0.6.0. Reinstalled at v0.6.1 and rebuilt
— admin/build is byte-identical (v0.6.1 changed only README, a consumer-agent
guide, and fleet tooling; zero component/CSS/JS changes), so nothing visual
differs from the tested v0.6.0 build.
- package-lock.json: v0.6.0 → v0.6.1 (now consistent with package.json).
- AGENTS.md: fleet:agents-managed pointer to the @plugpress/ui consumer guide
(matches waggle/knovia).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01W7RDwBHyNgrKKcDKYeuVLk
* feat: real app header (logo, version, docs, rate, nav) + drop redundant Home hero
Header (TopBar) becomes a full-bleed product bar: brand logo + name + version
tag on the left; the safety status pill + Pause, then Docs and ★ Rate links on
the right; section nav below. Reads version/docsUrl/rateUrl from saddleData
(new, filterable PHP fields). Layout: the width constraint moves off .saddle-app
onto .saddle-top__inner + a new centered .saddle-content (id=pp-main) so the bar
spans edge-to-edge, sticky under the admin bar.
Home: remove the "Right now" hero — it restated the access level the header now
shows. Home leads with the connect callout + cards; unused props cleaned up.
Also bumps @plugpress/ui to v0.6.2, which fixes the Activity filter tabs: the DS
FilterTabs never reset the native <button> chrome, so wp-admin borders bled
through into ugly bordered pills (fixed upstream to match SegmentedControl/Tabs).
Verified: 300 tests green; build clean, react/wp-* externalized, no google-fonts;
FilterTabs reset present in the built CSS; saddleData serves version/docs/rate
end-to-end in wp-playground; app mounts with no fatal.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01W7RDwBHyNgrKKcDKYeuVLk
* Admin UI: Home stat tiles + SkipLink, resync @plugpress/ui v0.8.0
Complete the remaining scope of #35 (the full-bleed header and #pp-main
anchor were already shipped on this branch):
- Home: three DS StatCard tiles in a StatGrid — Connected apps, Access
level, Actions logged — sourced from data Home already loads. Drop the
now-redundant "%d apps" header badge (and its unused sprintf/_n).
- App: DS SkipLink -> #pp-main as the first focusable element (a11y).
- SCSS: .saddle-stats outer spacing only; StatGrid owns its layout.
- Resync @plugpress/ui 0.6.2 -> v0.8.0 (pin was already bumped but the
install was never re-run) and rebuild. Externals unchanged, no
google-fonts in built CSS.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* Fix TopBar crash on @plugpress/ui v0.8.0 (Button asChild → Slot)
v0.8.0 newly implements Button `asChild` via Slot, whose React.Children.only
rejects the `children: [loading && spinner, children]` array the Button always
builds — so any `Button asChild` throws "expected to receive a single React
element child" at render. Our TopBar Docs/Rate links used that path.
Drop asChild + the inner <a>; pass `href` directly so Button renders an <a>
itself (Comp = href ? 'a' : 'button'). Same markup and classes, no Slot.
Upstream: the DS Button asChild path is broken for every consumer on v0.8.0 —
needs a separate fix in plugpress-ui.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* #8 free L1: dedup four log() wrappers into Saddle_Log::record_action()
The block/core-content/memory/site ability groups each carried an identical
private static log() wrapper around Saddle_Log::record(). Replace all four with
one shared Saddle_Log::record_action( $action, $target, $summary ) helper (17
call sites). Saddle_Log is required unconditionally in saddle.php, so the
per-wrapper class_exists() guard was dead defensiveness and is dropped.
Maintainability only — no behavior change. Relevant suites green (79 tests).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* Bump @plugpress/ui pin v0.8.0 → v0.8.1 (Button asChild fix)
Consume the upstream fix for the Button asChild → Slot Children.only crash
(plugpress-ui a303a8f / v0.8.1). Saddle's TopBar already sidesteps it by using
`Button href=…`; this keeps the DS itself sound as belt-and-suspenders.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* Bump @plugpress/ui pin v0.8.1 → v0.8.2 (Dialog a11y-name fix)
Picks up the DS fix for the "Dialog has no accessible name" warning that fired
on ConfirmProvider's idle (closed) dialog on every admin load. Console is clean.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* docs: STATUS — 2026-07-11 UI refresh + DS crash fixes + #8, PR #37
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>1 parent 1fc6710 commit c8c5cdb
33 files changed
Lines changed: 1557 additions & 2841 deletions
File tree
- admin
- build
- src
- components
- assets/brand
- includes
- abilities
- admin
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
93 | 93 | | |
94 | 94 | | |
95 | 95 | | |
96 | | - | |
97 | | - | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
98 | 103 | | |
99 | 104 | | |
100 | 105 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
7 | | - | |
8 | | - | |
9 | | - | |
10 | | - | |
11 | | - | |
12 | | - | |
13 | | - | |
14 | | - | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
15 | 21 | | |
16 | 22 | | |
17 | | - | |
18 | | - | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
19 | 28 | | |
20 | 29 | | |
21 | 30 | | |
22 | | - | |
| 31 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | | - | |
4 | | - | |
5 | | - | |
6 | | - | |
7 | | - | |
8 | | - | |
9 | | - | |
10 | | - | |
11 | | - | |
12 | | - | |
13 | | - | |
14 | | - | |
15 | | - | |
16 | | - | |
17 | | - | |
18 | | - | |
19 | | - | |
20 | | - | |
21 | | - | |
22 | | - | |
23 | | - | |
24 | | - | |
25 | | - | |
26 | | - | |
27 | | - | |
28 | | - | |
29 | | - | |
30 | | - | |
31 | | - | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
32 | 19 | | |
33 | 20 | | |
34 | 21 | | |
35 | | - | |
36 | | - | |
37 | | - | |
| 22 | + | |
| 23 | + | |
38 | 24 | | |
39 | | - | |
40 | | - | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
41 | 34 | | |
42 | | - | |
| 35 | + | |
43 | 36 | | |
44 | | - | |
45 | | - | |
46 | | - | |
47 | | - | |
48 | | - | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | | - | |
| 1 | + | |
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
0 commit comments