fix: visual consistency - toasts, typography, focus rings, container padding
- Remove richColors from Sonner toasts, limit stacking to 3 - Add font-heading to all page H1s (7 files) - Add font-label (Outfit) to TagBadges component - Fix focus ring tokens on analytics pages - Replace deprecated glass-stat with design system tokens - Standardize container padding on analytics pages Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -12,7 +12,7 @@ export function PageHeader({ title, description, action, className }: PageHeader
|
|||||||
return (
|
return (
|
||||||
<div className={cn('flex items-start justify-between gap-4', className)}>
|
<div className={cn('flex items-start justify-between gap-4', className)}>
|
||||||
<div>
|
<div>
|
||||||
<h1 className="text-2xl font-bold text-foreground">{title}</h1>
|
<h1 className="text-2xl font-bold font-heading text-foreground">{title}</h1>
|
||||||
{description && (
|
{description && (
|
||||||
<p className="mt-1 text-sm text-muted-foreground">{description}</p>
|
<p className="mt-1 text-sm text-muted-foreground">{description}</p>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ export function TagBadges({
|
|||||||
}}
|
}}
|
||||||
disabled={!onTagClick}
|
disabled={!onTagClick}
|
||||||
className={cn(
|
className={cn(
|
||||||
'rounded-full transition-colors',
|
'rounded-full font-label transition-colors',
|
||||||
size === 'sm' ? 'px-2 py-0.5 text-xs' : 'px-2.5 py-1 text-sm',
|
size === 'sm' ? 'px-2 py-0.5 text-xs' : 'px-2.5 py-1 text-sm',
|
||||||
variant === 'default'
|
variant === 'default'
|
||||||
? 'bg-accent text-muted-foreground hover:bg-accent'
|
? 'bg-accent text-muted-foreground hover:bg-accent'
|
||||||
@@ -48,7 +48,7 @@ export function TagBadges({
|
|||||||
{hiddenCount > 0 && (
|
{hiddenCount > 0 && (
|
||||||
<span
|
<span
|
||||||
className={cn(
|
className={cn(
|
||||||
'rounded-full',
|
'rounded-full font-label',
|
||||||
size === 'sm' ? 'px-2 py-0.5 text-xs' : 'px-2.5 py-1 text-sm',
|
size === 'sm' ? 'px-2 py-0.5 text-xs' : 'px-2.5 py-1 text-sm',
|
||||||
'bg-accent/50 text-muted-foreground'
|
'bg-accent/50 text-muted-foreground'
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -10,8 +10,9 @@ createRoot(document.getElementById('root')!).render(
|
|||||||
<Toaster
|
<Toaster
|
||||||
position="top-right"
|
position="top-right"
|
||||||
expand={false}
|
expand={false}
|
||||||
richColors
|
|
||||||
closeButton
|
closeButton
|
||||||
|
visibleToasts={3}
|
||||||
|
gap={8}
|
||||||
/>
|
/>
|
||||||
<App />
|
<App />
|
||||||
</StrictMode>,
|
</StrictMode>,
|
||||||
|
|||||||
@@ -156,7 +156,7 @@ export function AccountSettingsPage() {
|
|||||||
<div className="mb-8">
|
<div className="mb-8">
|
||||||
<div className="flex items-center gap-3">
|
<div className="flex items-center gap-3">
|
||||||
<Building2 className="h-8 w-8 text-muted-foreground" />
|
<Building2 className="h-8 w-8 text-muted-foreground" />
|
||||||
<h1 className="text-2xl font-bold text-foreground sm:text-3xl">Account Settings</h1>
|
<h1 className="text-2xl font-bold font-heading text-foreground sm:text-3xl">Account Settings</h1>
|
||||||
</div>
|
</div>
|
||||||
<p className="mt-2 text-muted-foreground">
|
<p className="mt-2 text-muted-foreground">
|
||||||
Manage your account, subscription, and team
|
Manage your account, subscription, and team
|
||||||
@@ -586,7 +586,7 @@ function UsageStat({
|
|||||||
const isAtLimit = !isUnlimited && current >= max
|
const isAtLimit = !isUnlimited && current >= max
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="glass-stat rounded-md p-3">
|
<div className="rounded-md border border-border bg-card p-3">
|
||||||
<p className="text-xs font-medium text-muted-foreground">{label}</p>
|
<p className="text-xs font-medium text-muted-foreground">{label}</p>
|
||||||
<p
|
<p
|
||||||
className={cn(
|
className={cn(
|
||||||
|
|||||||
@@ -135,7 +135,7 @@ export function FeedbackPage() {
|
|||||||
<div className="mb-8">
|
<div className="mb-8">
|
||||||
<div className="flex items-center gap-3">
|
<div className="flex items-center gap-3">
|
||||||
<MessageSquareText className="h-8 w-8 text-muted-foreground" />
|
<MessageSquareText className="h-8 w-8 text-muted-foreground" />
|
||||||
<h1 className="text-2xl font-bold text-foreground sm:text-3xl">Send Feedback</h1>
|
<h1 className="text-2xl font-bold font-heading text-foreground sm:text-3xl">Send Feedback</h1>
|
||||||
</div>
|
</div>
|
||||||
<p className="mt-2 text-muted-foreground">
|
<p className="mt-2 text-muted-foreground">
|
||||||
Help us improve ResolutionFlow. Report bugs, request features, or share your thoughts.
|
Help us improve ResolutionFlow. Report bugs, request features, or share your thoughts.
|
||||||
|
|||||||
@@ -63,14 +63,14 @@ export default function MyAnalyticsPage() {
|
|||||||
const outcomeBreakdown = summary.outcome_breakdown
|
const outcomeBreakdown = summary.outcome_breakdown
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="p-6 space-y-6 max-w-7xl mx-auto">
|
<div className="container mx-auto px-4 py-6 sm:px-6 sm:py-8 space-y-6">
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div className="flex items-center gap-3">
|
<div className="flex items-center gap-3">
|
||||||
<span title="My Analytics">
|
<span title="My Analytics">
|
||||||
<BarChart3 size={24} className="text-foreground" />
|
<BarChart3 size={24} className="text-foreground" />
|
||||||
</span>
|
</span>
|
||||||
<h1 className="text-2xl font-bold text-foreground">My Analytics</h1>
|
<h1 className="text-2xl font-bold font-heading text-foreground">My Analytics</h1>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="flex items-center gap-3">
|
<div className="flex items-center gap-3">
|
||||||
@@ -85,7 +85,7 @@ export default function MyAnalyticsPage() {
|
|||||||
<select
|
<select
|
||||||
value={period}
|
value={period}
|
||||||
onChange={(e) => setPeriod(e.target.value as AnalyticsPeriod)}
|
onChange={(e) => setPeriod(e.target.value as AnalyticsPeriod)}
|
||||||
className="rounded-lg border border-border bg-card px-3 py-1.5 text-sm text-foreground focus:outline-none focus:ring-1 focus:ring-ring"
|
className="rounded-lg border border-border bg-card px-3 py-1.5 text-sm text-foreground focus:outline-none focus:ring-1 focus:ring-primary/20"
|
||||||
>
|
>
|
||||||
{PERIOD_OPTIONS.map((opt) => (
|
{PERIOD_OPTIONS.map((opt) => (
|
||||||
<option key={opt.value} value={opt.value}>
|
<option key={opt.value} value={opt.value}>
|
||||||
|
|||||||
@@ -116,7 +116,7 @@ export function MyTreesPage() {
|
|||||||
<div className="container mx-auto px-4 py-6 sm:px-6 sm:py-8">
|
<div className="container mx-auto px-4 py-6 sm:px-6 sm:py-8">
|
||||||
<div className="mb-6 flex items-center justify-between sm:mb-8">
|
<div className="mb-6 flex items-center justify-between sm:mb-8">
|
||||||
<div>
|
<div>
|
||||||
<h1 className="text-2xl font-bold text-foreground sm:text-3xl">My Flows</h1>
|
<h1 className="text-2xl font-bold font-heading text-foreground sm:text-3xl">My Flows</h1>
|
||||||
<p className="mt-2 text-muted-foreground">
|
<p className="mt-2 text-muted-foreground">
|
||||||
Your forked and custom flows
|
Your forked and custom flows
|
||||||
</p>
|
</p>
|
||||||
|
|||||||
@@ -68,14 +68,14 @@ export default function TeamAnalyticsPage() {
|
|||||||
const { summary, time_series, top_flows, top_engineers } = data
|
const { summary, time_series, top_flows, top_engineers } = data
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="p-6 space-y-6 max-w-7xl mx-auto">
|
<div className="container mx-auto px-4 py-6 sm:px-6 sm:py-8 space-y-6">
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div className="flex items-center gap-3">
|
<div className="flex items-center gap-3">
|
||||||
<span title="Team Analytics">
|
<span title="Team Analytics">
|
||||||
<BarChart3 size={24} className="text-foreground" />
|
<BarChart3 size={24} className="text-foreground" />
|
||||||
</span>
|
</span>
|
||||||
<h1 className="text-2xl font-bold text-foreground">Team Analytics</h1>
|
<h1 className="text-2xl font-bold font-heading text-foreground">Team Analytics</h1>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="flex items-center gap-3">
|
<div className="flex items-center gap-3">
|
||||||
@@ -88,7 +88,7 @@ export default function TeamAnalyticsPage() {
|
|||||||
<select
|
<select
|
||||||
value={period}
|
value={period}
|
||||||
onChange={(e) => setPeriod(e.target.value as AnalyticsPeriod)}
|
onChange={(e) => setPeriod(e.target.value as AnalyticsPeriod)}
|
||||||
className="rounded-lg border border-border bg-card px-3 py-1.5 text-sm text-foreground focus:outline-none focus:ring-1 focus:ring-ring"
|
className="rounded-lg border border-border bg-card px-3 py-1.5 text-sm text-foreground focus:outline-none focus:ring-1 focus:ring-primary/20"
|
||||||
>
|
>
|
||||||
{PERIOD_OPTIONS.map((opt) => (
|
{PERIOD_OPTIONS.map((opt) => (
|
||||||
<option key={opt.value} value={opt.value}>
|
<option key={opt.value} value={opt.value}>
|
||||||
|
|||||||
@@ -83,7 +83,7 @@ export function TeamCategoriesPage() {
|
|||||||
<div className="container mx-auto px-4 py-6 sm:px-6 sm:py-8">
|
<div className="container mx-auto px-4 py-6 sm:px-6 sm:py-8">
|
||||||
<div className="mb-6 flex items-center justify-between">
|
<div className="mb-6 flex items-center justify-between">
|
||||||
<div>
|
<div>
|
||||||
<h1 className="text-2xl font-bold text-foreground">Team Categories</h1>
|
<h1 className="text-2xl font-bold font-heading text-foreground">Team Categories</h1>
|
||||||
<p className="mt-1 text-sm text-muted-foreground">Manage tree categories for your team</p>
|
<p className="mt-1 text-sm text-muted-foreground">Manage tree categories for your team</p>
|
||||||
</div>
|
</div>
|
||||||
<button onClick={() => setCreateOpen(true)} className={cn('flex items-center gap-2 rounded-md px-4 py-2 text-sm font-medium', 'bg-gradient-brand text-white shadow-lg shadow-primary/20 hover:opacity-90')}>
|
<button onClick={() => setCreateOpen(true)} className={cn('flex items-center gap-2 rounded-md px-4 py-2 text-sm font-medium', 'bg-gradient-brand text-white shadow-lg shadow-primary/20 hover:opacity-90')}>
|
||||||
|
|||||||
Reference in New Issue
Block a user