Conversation
PRODUCT.md captures the strategic brief: register (product-led mixed), primary user, brand personality (confident, principled, plain), the "visibly not-a-wallet" anti-reference set, and design principles. DESIGN.md captures the visual system in the Stitch six-section format with YAML frontmatter (13 colors, 7 typography roles, components). North Star: "The Notary's Ledger". Civic palette names. Flat-by-default elevation. Nine named rules across colors, typography, and elevation. .impeccable/design.json sidecar carries tonal ramps, the single overlay shadow, motion tokens, breakpoints, and 8 ready-to-render component snippets for the impeccable live panel. AGENTS.md gets a section 0 Design Context pointer at the top so future agent sessions surface PRODUCT.md and DESIGN.md without prompting. The pointer also flags that tailwind.config.ts holds stale tokens from a prior visual system; canonical source is --color-* in globals.css. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Imports system depth from certs-social/DESIGN.md while keeping certified-app's two-register reality (brand on /welcome and /about, product everywhere else). Light-only; semantic layer is structured so a future [data-theme="dark"] is a value-flip, not a refactor. DESIGN.md now describes target state: - Two-layer color system: invariant primitives plus semantic tokens (--bg-canvas, --bg-sunken, --bg-raised, --bg-elevated, --fg-primary, --fg-secondary, --fg-muted, --btn-primary-bg). - Two-register layout doctrine: brand register full-bleed and grids on /welcome and /about; product register centered narrow column up to ~1024px with no desktop sidebars. - Three-step shadow vocabulary (--shadow-sm/md/lg), confined to floating elements. - Component library is canonical: Button (4 variants, 3 sizes), Badge, Avatar, Input, Textarea in src/components/ui/. BEM-style classes in globals.css are marked legacy and slated to migrate. - OpenType features documented: tnum on numeric UI, case on uppercase labels, zero on DID and AT URI strings. - iOS 16px auto-zoom rule on mobile inputs (<=768px). - Spring easing cubic-bezier(0.16, 1, 0.3, 1) named as the signature motion curve. - Type scale formalized as a per-role table with weight ceiling on Inter (max 600; 700 reserved for Noto Serif headlines). - 12 named rules total (was 9): adds Semantic-Token, Weight-Ceiling-on-Inter, Uppercase-Plus-Tracking; renames Overlay-Only-Shadow to Floating-Only-Shadow. - Border-radius scale with documented exceptions (4px hero CTA, 999px pills, 50% circles). - New Don'ts: mix registers, desktop sidebars, Inter 700, raw hex in tailwind utilities, fill on Lucide icons, image without onError fallback. The .impeccable/design.json sidecar is regenerated to match (12 components, 20 colors, 12 rules, 3 shadows, 3 motion tokens). AGENTS.md section 0 pointer is updated to flag both implied migrations: token refactor (concrete --color-* to semantic two-layer) and component canonicalization (BEM legacy to ui/* components). Skipped from certs-social: bottom nav, single-column-everywhere doctrine, feed cards, dark mode, three-mode navbar, skeleton states, agent-prompt-guide section. None of those fit this product. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Drop ConnectedAppsList, IdentityOverviewCard, RecentActivityCard, and SignInPreviewCard. These components had zero references in the source — they were not mounted from any route and not imported by any other component. Surfaced during the current-state audit. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds a comma-separated text input for app.certified.actor.organization record's organizationType field. The profile view already rendered this as "Type" but there was no edit affordance — the value could only be written by editing the record outside the app. Save logic trims, drops empties, and dedupes case-insensitively. The field is omitted from the metadata record when empty so the PDS record stays minimal (atproto convention). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
A planning-grade snapshot of every feature shipped today, grouped by user-facing surface, with a status column (Shipped/Beta/Placeholder/Gap). Includes a verification-scope section noting which routes were browser-checked vs. source-only, and a known-gaps table to seed the next-features planning. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
Claude Code Review
This repository is configured for manual code reviews. Comment @claude review to trigger a review and subscribe this PR to future pushes, or @claude review once for a one-time review.
Tip: disable this comment in your organization's Code Review settings.
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Warning Rate limit exceeded
You’ve run out of usage credits. Purchase more in the billing tab. ⌛ How to resolve this issue?After the wait time has elapsed, a review can be triggered using the We recommend that you space out your commits to avoid hitting the rate limit. 🚦 How do rate limits work?CodeRabbit enforces hourly rate limits for each developer per organization. Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout. Please see our FAQ for further information. ℹ️ Review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (7)
📝 WalkthroughWalkthroughThe PR introduces a comprehensive design system specification (tokens, components, rules) and product guidance, alongside implementation directives for agents. It adds a feature inventory snapshot documenting shipped/gap features, enhances group metadata editing with a "Type" field, and removes four unused dashboard card components. ChangesDesign System & Implementation Guidance
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes The review spans two independent streams: (1) validation of comprehensive design system specification and product/brand guidance documentation (high volume but largely self-documenting), and (2) evaluation of focused code changes (group metadata field and straightforward component removals). The mixed composition—substantial but homogeneous documentation with small, straightforward code edits—requires moderate review attention. Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
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. Comment |
…nt guide sections Restructure DESIGN.md to match the awesome-design-md 9-section schema and add explicit guidance for AI agents working in this repo. The existing strong content (Notary's Ledger north star, two-register doctrine, Named Rules, anti-references) is preserved verbatim; this is additive. - New section 4 Layout Principles: container widths (1536/1024/720/640/480), spacing scale, grid behavior, page padding, plus four new Named Rules (Centered-Column, No-Nested-Card, Five-Widths, One-Hero-Per-Page). - New section 7 Responsive Behavior: breakpoint table (single 768px break), touch-target floor, collapsing strategy, iOS-specific rules, plus two new Named Rules (One-Breakpoint, Hit-Area). - New section 8 Accessibility: contrast pairings with verdict column, focus ring spec per element, keyboard rules, semantic structure, atproto-fluency on-ramps, color-plus-icon-or-label rule, plus two new Named Rules (Glossed-Concept, Color-Plus-Icon-Or-Label). - New section 10 Agent Prompt Guide: 12-token quick reference, component cheat sheet, legacy-to-target migration hints, five ready-to-use prompts, paste-on-rejection lines pointing back to canonical sections. - Section 6 Components: add explicit state matrices for Button and Input (default/hover/focus/active/disabled/loading/error/read-only). - Section 9 Do's and Don'ts: add four Don'ts (second breakpoint, sixth container width, body in --fg-muted on canvas, status without icon/label) and two Dos (canonical container widths, color-plus-icon pairing). - Frontmatter: add cssTokens block mirroring live globals.css custom properties, plus containers, breakpoints, shadows, transitions, fonts, navbar blocks. Existing colors/typography/rounded/spacing/components blocks preserved so the impeccable live-mode design panel keeps rendering. Schema modeled after the 9-section structure documented at https://github.com/voltagent/awesome-design-md. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 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 `@docs/current-state/feature-inventory.md`:
- Around line 80-83: The table rows for RecentActivityCard, SignInPreviewCard,
IdentityOverviewCard, and ConnectedAppsList are missing the "Where" column so
they only have 3 cells; update each row so it has four pipe-separated cells
matching "Feature | Where | Status | Notes" — put the feature label (e.g.,
"Recent activity card") in the first cell, the component identifier (e.g.,
`RecentActivityCard`, `SignInPreviewCard`, `IdentityOverviewCard`,
`ConnectedAppsList`) in the "Where" column, the word "Unverified" in the
"Status" column, and move the longer description (e.g., "exists but currently
not wired into any rendered page..." or the specific note about standalone
route) into the "Notes" column, ensuring proper backticks around component names
and correct pipe alignment for each row.
🪄 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: defaults
Review profile: CHILL
Plan: Pro
Run ID: cc1396b8-40b9-402d-ac0a-efd0fa2d7437
📒 Files selected for processing (10)
.impeccable/design.jsonAGENTS.mdDESIGN.mdPRODUCT.mddocs/current-state/feature-inventory.mdsrc/app/groups/[groupDid]/edit-profile/page.tsxsrc/components/dashboard/connected-apps-list.tsxsrc/components/dashboard/identity-overview-card.tsxsrc/components/dashboard/recent-activity-card.tsxsrc/components/dashboard/sign-in-preview-card.tsx
💤 Files with no reviewable changes (4)
- src/components/dashboard/identity-overview-card.tsx
- src/components/dashboard/sign-in-preview-card.tsx
- src/components/dashboard/recent-activity-card.tsx
- src/components/dashboard/connected-apps-list.tsx
The metadata builder picked named fields (urls, location, foundedDate) rather than spreading the loaded record. Any forward-compat field added by another writer (CLI, a future feature) would be silently dropped on every save through this form. Switch to spread-then-override: spread the loaded record first, then overwrite the fields this form actually owns. Setting a field to `undefined` lets JSON.stringify drop it, so atproto putRecord replaces the record without the field — same observable behavior as the previous conditional-spread for emptiness, but unknown fields survive the round-trip. Pre-existing risk surfaced by the round-1 reviewers; fix is co-located with the new organizationType field added in 3235532. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…r ref Round-1 reviewers flagged that the inventory doc and AGENTS.md still referenced state that this same PR resolved: - Four "Unverified — possibly retired" rows for the dashboard components this PR deletes. - "Dashboard cleanup" planning seed and the matching gaps row. - `organizationType` listed as a "metadata field without UI" gap that 3235532 closes. - AGENTS.md file-map entries for the four deleted dashboard files. - AGENTS.md §21 mentioning the "Heads up: Groups are in beta" banner that has since been removed from the UI. Adds review-round-1.md recording the three reviewer verdicts and the accept/reject rationale per the project's review-doc convention. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Disambiguates from the primary "Website" field on the same profile card. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The metadata urls field was readable on the group profile but had no edit affordance. Adds a row-based editor: each row has a URL input + an optional Label input + a remove button; an "Add link" button appends blank rows. Save behavior: fully-empty rows are dropped silently; label-only rows and invalid URLs surface per-row errors and abort save (same pattern as the Website field). URLs are normalized via normalizeWebsiteUrl so bare hostnames like "example.org" become "https://example.org" on save. Closes the urls half of the "Group metadata fields without UI" gap from the current-state inventory; location remains a follow-up. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Replaces the comma-separated Type input with a select of fixed options: Nonprofit, Business, Community Group, Government, Indigenous Group, plus Other. Picking Other reveals a text input; only the user's text is saved (not the literal "Other"). Empty Other is a validation error and blocks save. Underlying record stays `string[]`. Save preserves the loaded array verbatim until the user actively changes the selection (`typeDirty`), so legacy records that contain multiple values from the previous free-form input aren't silently collapsed to a single value just by opening the form. Once the user picks something, the saved array is length-1 (or omitted when nothing is selected). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds a one-line description to each Type option (Nonprofit / Business / Community Group / Government / Indigenous Group / Other) so users can read what each one means without having to look it up. To make the descriptions actually visible while choosing, the picker switches from a native <select> (which hides options until clicked) to a radio-card list. Each card shows the type name + description; clicking the card selects the radio. Selected card uses an accent border + tinted background to mark the choice. Save behavior is unchanged: picking a preset stores [<presetValue>], picking "Other" with text stores [<userText>] (never the literal "Other"), empty Other still blocks save with the same validation message. The typeDirty guard against collapsing legacy multi-value records is preserved. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
… when blank
Previously the profile details card always rendered every field, with
em-dashes in place of missing values. Now:
- Each field row only renders when it has content. Empty values (no
description, no website, no founded date, no type, no urls) are
hidden rather than showing "—".
- Display Name is removed from the personal-profile details list
entirely — it's already shown in the profile header above, so
duplicating it added no information.
- When the section ends up empty:
- If the viewer can edit (own profile, or owner/admin of the group),
the heading is replaced by a single "Add account details" or
"Add group details" button that links to the edit form.
- If the viewer can't edit, the whole card is suppressed (no point
showing an empty card to a non-owner).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Round-2 reviewer C flagged the link-level analogue of round-1's
top-level forward-compat issue: the additional-links save loop
reconstructed each {url, label} from scratch, dropping any per-item
extras a future writer (CLI or feature) might add (e.g. verified,
addedAt). Each row now carries a `loadedRef` to the original record
item; the save spreads loadedRef under the new url/label, mirroring
the same pattern used for the top-level metadata builder. Cleared
labels still come off the wire because `label: undefined` is dropped
by JSON.stringify.
Same change adds a stable per-row id (round-2 reviewer A nit #4 / C
suggestion #2): inputs are now React-keyed by `row.id` instead of array
index, so removing a middle row no longer reuses DOM nodes / focus /
selection from a different row.
Smaller round-2 nits in the same diff:
- Trash button gains `disabled={isSaving}` for parity with Add link
(B nit #4); adds disabled-style classes for visual feedback.
- Inline comment on the Type radio onChange documents that
typeOtherText is intentionally preserved when toggling Other → preset
(A nit #2). Save logic is unaffected.
- profile-client.tsx: the empty-state branch's redundant
`editHref &&` guard was removed (B nit #6); converted the wrapping
`(hasDetails || editHref) && <div>...` block to a clean ternary that
TypeScript narrows correctly. Also reflowed indentation inside the
Details `<dl>` after the ternary collapse.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Round-2 reviewer B flagged feature-inventory.md as stale: the urls editor that 72e8b94 shipped means urls is no longer a "field without UI" gap. Updated: - Planning seed §4: urls now lists alongside foundedDate and organizationType as "has edit affordance"; only location remains read-only. - Gaps table §15: split the old "fields without UI (urls, location)" row — location keeps its row, and a new row is added for the "no way to clear organizationType from the UI" UX gap that round 2 surfaced. Adds review-round-2.md recording the three reviewer verdicts and the accept/reject rationale, including the outstanding Display Name report (awaiting user clarification on the URL where it appears) and the deferred BEM-extraction items (trash button + radio-card → globals.css) that fold naturally into the round-1 orphan-CSS sweep. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Summary
Promotes the current staging head to main. Three new commits on top of the design-doc work already on staging (PRODUCT.md, DESIGN.md):
chore(dashboard)— remove four unmounted dashboard components (ConnectedAppsList,IdentityOverviewCard,RecentActivityCard,SignInPreviewCard). They had zero source references; surfaced during a current-state audit.feat(groups)— add a "Type" input to the group edit-profile form, writing theorganizationTypearray onapp.certified.actor.organization. The profile view already rendered this field but there was no edit affordance.docs— adddocs/current-state/feature-inventory.md, a planning-grade snapshot of every shipped feature (status column: Shipped / Beta / Placeholder / Gap) plus a gaps table to seed the next-features work.Already on staging from prior commits (carried along by this PR):
docs(design): add PRODUCT.md and DESIGN.md design contextdocs(design): adopt semantic token layer and component-library canonVerification
Local quality gates green:
npx tsc --noEmit— no errorsnpm run lint— 8 errors / 16 warnings, all pre-existing on unrelated files (no regressions from this PR)npm run build— cleanTest plan
/groups/<your-group-did>/edit-profile. The "Type" input is visible after "Founded date" and pre-populated with the comma-joined existing types.Foundation, Nonprofit , foundationand save — the saved record should haveorganizationType: ["Foundation", "Nonprofit"](deduped case-insensitively, trimmed).organizationTypefield should be omitted from the record (rather than an empty array)./profile/<group-did>, the saved types render as comma-joined under the "Type" label./settings(the four removed cards were not mounted).docs/current-state/feature-inventory.mdrenders cleanly on GitHub.🤖 Generated with Claude Code
Summary by CodeRabbit
Release Notes
New Features
Documentation
UI Changes