Skip to content

Refine dashboard shell and simplify local dev setup#16

Open
leoisadev1 wants to merge 1 commit into
mainfrom
t3code/df97f5cf
Open

Refine dashboard shell and simplify local dev setup#16
leoisadev1 wants to merge 1 commit into
mainfrom
t3code/df97f5cf

Conversation

@leoisadev1
Copy link
Copy Markdown
Member

Summary

  • Simplifies the default dev and Convex setup flow around a fixed amend / docs.amend portless layout.
  • Removes the old worktree-scoped Convex setup script and preview HTTP assertion step in favor of direct convex dev setup.
  • Refines the dashboard shell with cleaner navigation, a dedicated settings section nav, and less redundant context chrome when settings is open.
  • Standardizes button, input, and sidebar affordances with smoother, non-scaling hover/active states and more consistent rounded surfaces.
  • Updates README guidance to match the new local dev and docs URLs.

Testing

  • Not run (PR content only).
  • Suggested checks: bun run readiness
  • Suggested checks: bun run check-types
  • Suggested checks: bun run build

- Move settings into an in-page section nav
- Remove panel slide wrappers and simplify sidebar states
- Smooth shared button and input styling
@greptile-apps
Copy link
Copy Markdown

greptile-apps Bot commented May 31, 2026

Greptile Summary

This PR refines the dashboard shell by moving settings section navigation from a left sidebar into a horizontal tab bar inside the settings workspace itself, and applies a consistent visual polish pass (rounded corners, ring-based active states, removed t-panel-slide animations, non-scaling hover/active transitions) across buttons, inputs, and sidebar nav items.

  • Settings nav relocation: SettingsModuleSidebar is removed from ModuleSidebar; the sidebar is hidden entirely when settings is active (showContextSidebar flag). A new inline SettingsSectionNav horizontal tab bar is rendered inside SettingsWorkspace, wired through a new onSettingsSectionChange prop added to DashboardContentProps.
  • Global component polish: button.tsx and input.tsx change from rounded-none to rounded-xl/rounded-lg; sidebar nav items swap the absolute left-indicator bar for a ring+shadow pill; workspace switcher grows from min-h-12 to min-h-14.
  • Animation cleanup: All t-panel-slide / data-open="true" pairs are removed from workspace wrappers, and transition-[…,scale] is replaced with transition-colors duration-150 ease-linear in composer controls.

Confidence Score: 4/5

Safe to merge — all changes are UI-layer restructuring and visual polish with no data or state logic altered.

The settings nav relocation is wired correctly end-to-end, the showContextSidebar guard is sound, and the shared component updates (button, input) are purely cosmetic. The only loose ends are the orphaned SettingsModuleSidebar export and a missing aria-current on the new tab bar, both of which are style-level issues that don't affect runtime behaviour.

dashboard-module-sidebar-admin.tsx still exports SettingsModuleSidebar with no remaining consumers; settings-workspace.tsx has the accessibility gap on the new tab buttons.

Important Files Changed

Filename Overview
apps/web/src/components/settings-workspace.tsx Adds inline SettingsSectionNav horizontal tab bar, replacing the left-sidebar approach; icons stored as JSX elements at module level and active tab lacks aria-current.
apps/web/src/components/dashboard-module-sidebar-admin.tsx SettingsModuleSidebar is still exported here but its only consumer was removed, leaving it as dead code.
apps/web/src/components/dashboard-module-sidebar.tsx Removes SettingsModuleSidebar import and returns null for the settings view, cleanly hiding the context sidebar when settings is active.
apps/web/src/components/dashboard-sidebar-chrome.tsx Introduces showContextSidebar flag to hide the divider and module-sidebar panel when the settings view is active; also removes the absolute indicator line from SidebarMainNavButton.
packages/ui/src/components/button.tsx Standardises button corners from rounded-none to rounded-xl/rounded-lg across all size variants; a global change that will affect every button in the app.
packages/ui/src/components/input.tsx Changes input corner radius from rounded-none to rounded-xl; straightforward visual-only update.
apps/web/src/components/use-amend-dashboard-controller.ts Wires onSettingsSectionChange into contentProps so the settings workspace can update the active section directly.
apps/web/src/components/amend-dashboard-content-types.ts Adds onSettingsSectionChange to the DashboardContentProps interface to propagate the new callback.
apps/web/src/components/dashboard-workspace-surface.tsx Removes t-panel-slide animation class and data-open attribute from the workspace surface wrapper.
apps/web/src/components/post-composer-footer-controls.tsx Replaces transition-[background-color,border-color,color,scale] with transition-colors duration-150 ease-linear in both FooterControl and IconControl, removing the scale transition.
apps/web/src/components/dashboard-module-sidebar-primitives.tsx Removes the absolute left-indicator bar from SidebarNavItem active state and replaces it with a ring+shadow pill style; also widens padding from px-3 to px-3.5.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[DashboardSidebarChrome] -->|activeView === settings| B{showContextSidebar}
    B -->|false| C[Hide divider + ModuleSidebar]
    B -->|true| D[Show ModuleSidebar]
    D --> E[ModuleSidebar]
    E -->|settings view| F[return null]
    E -->|other views| G[roadmap / changelog / feedback / etc.]

    A --> H[AmendDashboardMainWorkspace]
    H -->|activeView === settings| I[SettingsWorkspace]
    I --> J[SettingsSectionNav]
    J -->|onSectionChange| K[uiState.setActiveSettingsSection]
    K -->|activeSection prop| J
Loading

Fix All in Claude Code

Reviews (1): Last reviewed commit: "Refine dashboard shell and settings navi..." | Re-trigger Greptile

Comment on lines +89 to +99
const SETTINGS_SECTIONS: Array<{
icon: ReactElement;
id: SettingsSection;
label: string;
}> = [
{ id: "general", icon: <Settings />, label: "General" },
{ id: "services", icon: <GitPullRequestArrow />, label: "Services" },
{ id: "portal", icon: <Globe />, label: "Portal" },
{ id: "automation", icon: <DatabaseZap />, label: "Automation" },
{ id: "accounts", icon: <Users />, label: "Accounts" },
];
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 JSX elements stored in a module-level constant

SETTINGS_SECTIONS initialises ReactElement objects (e.g. <Settings />) once at module load time. While Lucide icons carry no context and this works today, the pattern means the same element object is shared across every render; if any icon ever needs a className, size, or theme-derived prop, callers can't pass it without replacing the whole array. Storing icon components (the function/class references) is the more idiomatic and flexible approach.

Confidence this is an issue: 2/5

Suggested change
const SETTINGS_SECTIONS: Array<{
icon: ReactElement;
id: SettingsSection;
label: string;
}> = [
{ id: "general", icon: <Settings />, label: "General" },
{ id: "services", icon: <GitPullRequestArrow />, label: "Services" },
{ id: "portal", icon: <Globe />, label: "Portal" },
{ id: "automation", icon: <DatabaseZap />, label: "Automation" },
{ id: "accounts", icon: <Users />, label: "Accounts" },
];
const SETTINGS_SECTIONS: Array<{
icon: ComponentType;
id: SettingsSection;
label: string;
}> = [
{ id: "general", icon: Settings, label: "General" },
{ id: "services", icon: GitPullRequestArrow, label: "Services" },
{ id: "portal", icon: Globe, label: "Portal" },
{ id: "automation", icon: DatabaseZap, label: "Automation" },
{ id: "accounts", icon: Users, label: "Accounts" },
];

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

Fix in Claude Code

Comment on lines +114 to +120
className={cn(
"inline-flex h-10 shrink-0 items-center gap-2 rounded-xl px-3 text-sm font-semibold transition-colors duration-150 ease-linear active:opacity-75 [&_svg]:size-3.5 [&_svg]:shrink-0",
activeSection === section.id
? "bg-[#232327] text-foreground shadow-[inset_0_1px_0_rgb(255_255_255/0.05)] ring-1 ring-white/[0.06]"
: "text-muted-foreground hover:bg-foreground/[0.045] hover:text-foreground",
)}
onClick={() => onSectionChange(section.id)}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Missing aria-current on active settings nav tab

Screen readers have no signal for which tab is currently selected. Adding aria-current="page" (or aria-selected with a role="tab") on the active button fixes this with a one-liner. This applies to all five tab buttons.

Confidence this is an issue: 4/5

Suggested change
className={cn(
"inline-flex h-10 shrink-0 items-center gap-2 rounded-xl px-3 text-sm font-semibold transition-colors duration-150 ease-linear active:opacity-75 [&_svg]:size-3.5 [&_svg]:shrink-0",
activeSection === section.id
? "bg-[#232327] text-foreground shadow-[inset_0_1px_0_rgb(255_255_255/0.05)] ring-1 ring-white/[0.06]"
: "text-muted-foreground hover:bg-foreground/[0.045] hover:text-foreground",
)}
onClick={() => onSectionChange(section.id)}
aria-current={activeSection === section.id ? "page" : undefined}
className={cn(
"inline-flex h-10 shrink-0 items-center gap-2 rounded-xl px-3 text-sm font-semibold transition-colors duration-150 ease-linear active:opacity-75 [&_svg]:size-3.5 [&_svg]:shrink-0",
activeSection === section.id
? "bg-[#232327] text-foreground shadow-[inset_0_1px_0_rgb(255_255_255/0.05)] ring-1 ring-white/[0.06]"
: "text-muted-foreground hover:bg-foreground/[0.045] hover:text-foreground",
)}
onClick={() => onSectionChange(section.id)}

Fix in Claude Code

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