feat(launcher): compact icon+name tiles in the 9-dots app menu - #268
Conversation
The 9-dots top-bar launcher reused the full-detail <AppCard> (icon, name,
integration badge, health, description), making it a dense wall of text.
Model it on the Google app launcher instead: a new <AppTile> DS primitive
renders only the app icon and its menu label in a 3-column grid.
- Add design-system/components/launcher/AppTile.{jsx,d.ts,prompt.md} — a
compact icon+name cell reusing the HealthDot primitive; offline apps stay
grayscaled/dimmed/inert. <AppCard> remains for the dashboard/management
surfaces that legitimately need full detail.
- Regenerate the DS barrels + manifest (build.mjs).
- AppSelector: swap AppCard -> AppTile, drop the description, widen the grid
to 3 columns. The .app-grid-button hook and per-app name text are
unchanged, so the existing launcher e2e assertions still match.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016PMVXVQ5XUh8ZfFx8Vr7XW
Automated code review (gate-code-review)
Report-only — this check never blocks merge. |
The onError handler only hid the broken <img>, leaving a blank space and
contradicting the documented contract ("falls back to a per-type emoji glyph
on error or when absent"). Track the load failure in state and render the
emoji fallback node instead of just hiding the image.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016PMVXVQ5XUh8ZfFx8Vr7XW
CI Fix — lock file regeneratedRoot cause: The Fix: Ran Branch with fix: The fix branch is ready — once merged into |
master's lockfile drifted: the packages/security workspace (@fuzefront/security-client@0.1.0) and its dev-deps (@types/node@18.19.0, openapi-typescript@7.13.0, typescript@5.1.6) were declared in package.json but never added to package-lock.json (introduced by #260), so `npm ci` failed strictly on every PR. Regenerated the lock (npm install --package-lock-only) to add only the missing workspace + dev-deps; no other dependency versions change. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016PMVXVQ5XUh8ZfFx8Vr7XW
CI Fix: Lock file regenerated for
|
CI Fix — lock file syncBranch with fix: `claude-auto-fix-ci-claude/9dots-menu-icon-name-68pjzm-29425846456` Root causeThe
FixRan The fix branch cannot be auto-merged into this PR via Actions (repo policy blocks bot-created PRs), but the commit can be cherry-picked or the fix branch merged manually. |
CI fix pushed — branch
|
CI Fix — gate-frontend-build failureRoot cause: Fix: Regenerated Branch with fix: The fix is a single-file, 3-line change to |
The packages/chat-client and packages/chat-ui workspaces were bumped to 1.1.0, but frontend/package-lock.json (the frontend is a standalone npm project, not a root workspace) still pinned them at 1.0.0, so `npm ci` in gate-frontend-build failed on the version mismatch. Regenerated the frontend lock (npm install --package-lock-only); only the chat-client/chat-ui versions change. `npm ci --dry-run` now exits 0. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016PMVXVQ5XUh8ZfFx8Vr7XW
CI Fix — gate-frontend-buildRoot cause:
The lock file had hoisted Fix: Added two missing nested entries to
No source code or Branch: Note: Could not open a PR automatically (Actions token lacks |
CI Failure Root Cause & FixRoot cause: Both PostgreSQL service containers in --health-cmd pg_isreadyInside the This is unrelated to the PR's frontend/design-system changes; the workflow file had a latent bug that became visible (e.g. due to Docker/runner environment drift). Fix — two lines in In the --health-cmd pg_isreadyto: --health-cmd "pg_isready -U postgres"This makes the health check authenticate as the
|
CI fix — branch pushedCI was failing on all three jobs (Backend tests Node 22.x/24.x, Permit.io integration tests) with the same root cause:
Root cause: PR #252 ( Fix: Ran Fix is on branch |
CI Fix — Playwright sign-in flowBranch pushed: Root CauseTwo combined issues caused the "Playwright sign-in flow" timeout in run #29425945512:
Fix (3 files)
The fix is on the branch above. PR creation is blocked for the bot ( |
CI Fix Investigation —
|
CI Fix Applied — Branch ReadyThe Playwright sign-in CI failure has been diagnosed and fixed. The fix has been pushed to branch Root cause: The frontend was updated to POST to Fix applied (cherry-picked from sibling auto-fix branch
Note: Unable to open a PR automatically (GitHub Actions PR-create permission is restricted). The fix branch is pushed and ready for review/merge at |
📋 Description
The 9-dots top-bar launcher (
AppSelector) reused the full-detail design-systemAppCard— icon, name, integration badge, health state and description — turning the popup into a dense wall of text. This reworks it to look like the Google app launcher: each app is now just its icon and name.🔄 Type of Change
🧪 Testing
@fuzefront/design-system→ regeneratedindex.d.tsnow exportsAppTile; frontendtype-checkshows only a pre-existing unrelatedbaseUrldeprecation)Runtime console-clean gate (
ui-runtime-validation) not run: the Chrome DevTools MCP plugin is user/environment-scoped and is not installed in this cloud session, so the mandated real-Chromium render/console check could not be executed here. It should be run before merge.Test Instructions
npm install npm run test npm run build🔧 Implementation Details
Changes Made
frontend/src/components/AppSelector.tsx: swapAppCard→AppTile, drop the per-app description, widen the grid from 2 to 3 columns. The.app-grid-buttonhook and the per-app name text are unchanged, so the existing launcher e2e assertions (clock-load.spec.ts,federated-apps-register-activate.frontend.spec.ts) still match.design-system/components/launcher/AppTile.{jsx,d.ts,prompt.md}— a compact icon+name cell reusing the existingHealthDotprimitive. Offline apps stay grayscaled/dimmed/inert with a corner health dot. Tokens-only, no raw hex/px/type.build.mjs(index.js,index.d.ts,_ds_manifest.json).AppCardis left untouched — the dashboard / Applications management surfaces legitimately need the full-detail card.Code Quality
🚨 Breaking Changes
None.
AppTileis additive;AppCardand its consumers are unchanged.📊 Performance Impact
Bundle Size Impact: No significant impact (one small component added; the launcher renders fewer nodes per app).
🔄 Backwards Compatibility
📝 Additional Notes
The launcher popup keeps its existing width/positioning math (
dropdownWidth = 360); only the inner grid layout and per-app cell changed.🤖 Generated with Claude Code
https://claude.ai/code/session_016PMVXVQ5XUh8ZfFx8Vr7XW
Generated by Claude Code