diff --git a/demo-video/src/BrightClauseDemo.tsx b/demo-video/src/BrightClauseDemo.tsx index 1ae7db4..6967e33 100644 --- a/demo-video/src/BrightClauseDemo.tsx +++ b/demo-video/src/BrightClauseDemo.tsx @@ -21,7 +21,7 @@ const SLIDE_T = 20; export const BrightClauseDemo: React.FC = () => { return ( - + {/* Intro */} diff --git a/demo-video/src/styles.ts b/demo-video/src/styles.ts index 1798cc5..fe17abf 100644 --- a/demo-video/src/styles.ts +++ b/demo-video/src/styles.ts @@ -1,9 +1,9 @@ import { CSSProperties } from "react"; export const colors = { - bg: "#06060a", - bgCard: "#0d0d14", - bgCardHover: "#12121c", + bg: "#0d0b08", + bgCard: "#14120e", + bgCardHover: "#1c1a15", border: "#1a1a2e", borderLight: "#252540", accent: "#c9a227", diff --git a/frontend/src/app/analytics/page.tsx b/frontend/src/app/analytics/page.tsx index a5c2b43..5b219ed 100644 --- a/frontend/src/app/analytics/page.tsx +++ b/frontend/src/app/analytics/page.tsx @@ -228,7 +228,7 @@ export default function AnalyticsPage() { className="col-span-2 lg:col-span-1 card p-6" >
-
+
Portfolio Health
@@ -249,7 +249,7 @@ export default function AnalyticsPage() {
-

+

{portfolioStats.healthScore >= 70 ? 'Good Standing' : portfolioStats.healthScore >= 40 ? 'Needs Review' : 'At Risk'}

@@ -282,7 +282,7 @@ export default function AnalyticsPage() {

{portfolioStats[level]}

-

+

{riskConfig[level].label} Risk

@@ -304,7 +304,7 @@ export default function AnalyticsPage() { Clause types vs. documents · {loadingAnalyses ? 'Loading...' : `${docAnalyses.length} contracts`}

-
+
{(['critical', 'high', 'medium', 'low'] as RiskLevel[]).map(level => (
@@ -323,17 +323,17 @@ export default function AnalyticsPage() { - {allClauseTypes.map(type => ( ))} - @@ -359,7 +359,7 @@ export default function AnalyticsPage() { initial={{ scale: 0 }} animate={{ scale: 1 }} transition={{ delay: rowIdx * 0.02 + allClauseTypes.indexOf(type) * 0.01 }} - className={`w-8 h-8 rounded-md mx-auto flex items-center justify-center text-[10px] font-mono font-bold + className={`w-8 h-8 rounded-md mx-auto flex items-center justify-center text-[11px] font-mono font-bold ${topRisk ? riskCellColors[topRisk] : riskCellColors.none} ${topRisk ? 'text-ink-100' : 'text-ink-700'}`} title={clauseData ? `${clauseData.total} clause(s) - ${topRisk || 'unknown'} risk` : 'Not found'} @@ -370,7 +370,7 @@ export default function AnalyticsPage() { ) })}
+ Document - + {formatClauseType(type)} + Overall
- {summary?.overall_risk || '?'} @@ -415,7 +415,7 @@ export default function AnalyticsPage() {
{formatClauseType(type)}
- + {topRisk?.toUpperCase() || 'N/A'} {data.total} @@ -423,10 +423,10 @@ export default function AnalyticsPage() {
@@ -480,7 +480,7 @@ export default function AnalyticsPage() { {formatClauseType(highlight.clause_type)} -
- + {entity.entity_type} {entity.normalized_name} @@ -598,15 +598,15 @@ export default function AnalyticsPage() { - - - - - - - - - + + + + + + + + + @@ -634,7 +634,7 @@ export default function AnalyticsPage() {
DocumentClausesCritHighMedLowOverallRisk BarDocumentClausesCritHighMedLowOverallRisk Bar
{summary?.risk_summary.medium || 0} {summary?.risk_summary.low || 0} - {summary?.overall_risk || '?'} diff --git a/frontend/src/app/compare/page.tsx b/frontend/src/app/compare/page.tsx index a956bba..82bb5bb 100644 --- a/frontend/src/app/compare/page.tsx +++ b/frontend/src/app/compare/page.tsx @@ -196,7 +196,7 @@ function ComparePageContent() { )} {cd.doc.filename} {cd.summary && ( - {cd.summary.overall_risk} @@ -251,7 +251,7 @@ function ComparePageContent() {

{doc.filename}

-

+

{doc.page_count ? `${doc.page_count} pages` : 'Unknown pages'} · {doc.chunk_count} chunks

@@ -333,17 +333,17 @@ function ComparePageContent() { - {compareDocs.map(cd => (
+ Clause Type
- + {cd.doc.filename} {cd.summary && ( - {cd.summary.overall_risk} @@ -384,12 +384,12 @@ function ComparePageContent() { cellData.topRisk === 'medium' ? 'bg-amber-500/40' : 'bg-emerald-500/30' }`} /> - {cellData.topRisk} + {cellData.topRisk}
- {cellData.breakdown.total} clause(s) + {cellData.breakdown.total} clause(s) ) : ( - + Not found @@ -412,7 +412,7 @@ function ComparePageContent() { {cellData.clauses.slice(0, 3).map((clause) => (
{clause.risk_level && ( - {clause.risk_level} @@ -426,7 +426,7 @@ function ComparePageContent() {
View Full Document @@ -483,7 +483,7 @@ function ComparePageContent() {
{doc.filename} - + missing {missing.length} clause type{missing.length !== 1 ? 's' : ''}
@@ -491,7 +491,7 @@ function ComparePageContent() { {missing.map(type => ( {formatClauseType(type)} diff --git a/frontend/src/app/dashboard/page.tsx b/frontend/src/app/dashboard/page.tsx index 2f4d900..4e2c9de 100644 --- a/frontend/src/app/dashboard/page.tsx +++ b/frontend/src/app/dashboard/page.tsx @@ -22,12 +22,6 @@ const riskColors: Record = { low: 'text-emerald-400 bg-emerald-500/10 border-emerald-500/20', } -const riskAccentBorder: Record = { - critical: 'border-l-red-500', - high: 'border-l-orange-500', - medium: 'border-l-amber-500', - low: 'border-l-emerald-500', -} function formatRelativeTime(iso: string): string { const now = Date.now() @@ -469,6 +463,7 @@ function DashboardContent() { {/* Search Results */} +
{searchResults.length > 0 && ( {result.document_name}
- Relevance + Relevance {(result.combined_score * 100).toFixed(0)}% @@ -518,6 +513,7 @@ function DashboardContent() { )} +
{/* Main Grid */}
@@ -578,7 +574,7 @@ function DashboardContent() { {/* Value outcome steps */}
-

What you get

+

What you get

@@ -619,8 +615,8 @@ function DashboardContent() { className={`px-6 py-5 cursor-pointer transition-all duration-200 relative group focus:outline-none focus-visible:ring-2 focus-visible:ring-accent/50 ${selectedDoc === doc.id - ? 'bg-accent/5 border-l-3 border-accent' - : 'hover:bg-ink-900/30 border-l-3 border-transparent hover:border-ink-600' + ? 'bg-accent/5 ring-1 ring-inset ring-accent/25' + : 'hover:bg-ink-900/30' }`} >
@@ -668,7 +664,7 @@ function DashboardContent() { }[risk] return (
- {/* Risk Analysis Panel - Enhanced & Data Dense */} -
+ {/* Risk Analysis Panel */} +
{(selectedDoc && selectedAnalysis) || (!selectedDoc && portfolioRisk) ? ( - {/* Overall Risk - Left-border treatment */} + {/* Overall Risk */} +
{riskCounts[level]}
-
{level}
+
{level}
))}
diff --git a/frontend/src/app/deals/[id]/page.tsx b/frontend/src/app/deals/[id]/page.tsx index 4dbdbb1..5f32d4d 100644 --- a/frontend/src/app/deals/[id]/page.tsx +++ b/frontend/src/app/deals/[id]/page.tsx @@ -249,7 +249,7 @@ export default function DealDetailPage() {
{(['critical', 'high', 'medium', 'low'] as RiskLevel[]).map((level) => ( - + {level}: {deal.risk_summary[level] || 0} ))} diff --git a/frontend/src/app/deals/page.tsx b/frontend/src/app/deals/page.tsx index 1c75539..1c85462 100644 --- a/frontend/src/app/deals/page.tsx +++ b/frontend/src/app/deals/page.tsx @@ -152,7 +152,7 @@ export default function DealsPage() { ].map(({ label, icon: Icon }) => (
-

{label}

+

{label}

))}
@@ -198,12 +198,12 @@ export default function DealsPage() { {deal.documents.length > 0 && (
{deal.documents.slice(0, 3).map((doc) => ( - + {doc.filename} ))} {deal.document_count > 3 && ( - +{deal.document_count - 3} more + +{deal.document_count - 3} more )}
)} diff --git a/frontend/src/app/documents/[id]/chat-panel.tsx b/frontend/src/app/documents/[id]/chat-panel.tsx index 164b47f..4e22ef3 100644 --- a/frontend/src/app/documents/[id]/chat-panel.tsx +++ b/frontend/src/app/documents/[id]/chat-panel.tsx @@ -146,7 +146,7 @@ export function ChatPanel({ documentId }: { documentId: string }) { diff --git a/frontend/src/app/documents/[id]/graph/page.tsx b/frontend/src/app/documents/[id]/graph/page.tsx index 27dd272..7c7f13b 100644 --- a/frontend/src/app/documents/[id]/graph/page.tsx +++ b/frontend/src/app/documents/[id]/graph/page.tsx @@ -885,7 +885,7 @@ export default function GraphPage() {
-
+
{otherNode.type} {edge.label && edge.label !== 'relates_to' && ( <> @@ -933,11 +933,11 @@ export default function GraphPage() {

{connectedCount}

-

Connections

+

Connections

{sameTypeCount}

-

Same Type

+

Same Type

) @@ -1076,7 +1076,7 @@ export default function GraphPage() {
{edge.label && edge.label !== 'relates_to' && ( - {edge.label.replace(/_/g, ' ')} + {edge.label.replace(/_/g, ' ')} )} ) @@ -1102,11 +1102,11 @@ export default function GraphPage() {

{connectedCount}

-

Connections

+

Connections

{sameTypeCount}

-

Same Type

+

Same Type

) diff --git a/frontend/src/app/documents/[id]/page.tsx b/frontend/src/app/documents/[id]/page.tsx index 5fa99da..e6a21c3 100644 --- a/frontend/src/app/documents/[id]/page.tsx +++ b/frontend/src/app/documents/[id]/page.tsx @@ -58,7 +58,7 @@ function ByokForm({ onSubmit, initialKey, onCancel }: { }`} /> {showValidationHint && ( -

Key must start with "sk-ant-"

+

Key must start with "sk-ant-"

)} {!showValidationHint &&
}
@@ -69,7 +69,7 @@ function ByokForm({ onSubmit, initialKey, onCancel }: { Cancel
-

+

Get your key at console.anthropic.com

@@ -942,7 +942,7 @@ export default function DocumentDetailPage() { const risk = riskConfig[clause.risk_level as RiskLevel] || riskConfig.low return (
- + {clause.risk_level}
diff --git a/frontend/src/app/documents/[id]/pdf-viewer.tsx b/frontend/src/app/documents/[id]/pdf-viewer.tsx index 6f0aa4b..68870e5 100644 --- a/frontend/src/app/documents/[id]/pdf-viewer.tsx +++ b/frontend/src/app/documents/[id]/pdf-viewer.tsx @@ -61,7 +61,7 @@ export function PdfViewer({ documentId, clauses, activeClauseId, onClauseClick } ) : ( sortedPages.map((page) => (
-
+
{page === 0 ? 'Unknown Page' : `Page ${page}`}
{clausesByPage[page].map((clause) => { diff --git a/frontend/src/app/documents/[id]/timeline.tsx b/frontend/src/app/documents/[id]/timeline.tsx index 7bcabaa..def2014 100644 --- a/frontend/src/app/documents/[id]/timeline.tsx +++ b/frontend/src/app/documents/[id]/timeline.tsx @@ -60,7 +60,7 @@ export function Timeline({ documentId }: { documentId: string }) { {Object.entries(typeConfig) .filter(([type]) => events.some(e => e.type === type)) .map(([type, config]) => ( - + {config.label} @@ -102,7 +102,7 @@ export function Timeline({ documentId }: { documentId: string }) { )} {event.page_number != null && ( - p.{event.page_number} + p.{event.page_number} )}

diff --git a/frontend/src/app/globals.css b/frontend/src/app/globals.css index b1130b0..372726f 100644 --- a/frontend/src/app/globals.css +++ b/frontend/src/app/globals.css @@ -7,27 +7,27 @@ --font-body: 'DM Sans', -apple-system, sans-serif; --font-mono: 'JetBrains Mono', 'Fira Code', monospace; - /* Dark theme (default) — RGB triplets for Tailwind opacity support */ - --ink-50: 247 247 248; - --ink-100: 238 238 240; - --ink-200: 217 217 222; - --ink-300: 184 184 193; - --ink-400: 145 145 159; - --ink-500: 140 140 158; - --ink-600: 93 93 108; - --ink-700: 76 76 88; - --ink-800: 65 65 75; - --ink-900: 57 57 65; - --ink-925: 40 40 48; - --ink-950: 24 24 27; - - --bg-primary: #0a0a0c; - --bg-secondary: #111114; - --bg-tertiary: #18181b; - --text-primary: #f4f4f5; - --text-secondary: #a1a1aa; - --text-muted: #71717a; - --border: #27272a; + /* Dark theme (default) — warm ink palette echoing gold/cream editorial identity */ + --ink-50: 248 247 244; + --ink-100: 240 238 234; + --ink-200: 222 219 213; + --ink-300: 190 186 178; + --ink-400: 154 148 138; + --ink-500: 148 143 132; + --ink-600: 138 133 124; + --ink-700: 84 79 70; + --ink-800: 72 67 58; + --ink-900: 62 58 52; + --ink-925: 44 41 36; + --ink-950: 26 24 21; + + --bg-primary: #0d0b08; + --bg-secondary: #14120e; + --bg-tertiary: #1c1a15; + --text-primary: #f5f4f1; + --text-secondary: #a8a49c; + --text-muted: #7a7770; + --border: #2c2922; --accent: #c9a227; } @@ -62,8 +62,8 @@ html.light { --ink-200: 52 52 78; --ink-300: 74 74 106; --ink-400: 100 100 130; - --ink-500: 122 122 142; - --ink-600: 165 165 180; + --ink-500: 105 105 125; + --ink-600: 140 140 155; --ink-700: 200 196 188; --ink-800: 212 207 197; --ink-900: 240 237 230; @@ -96,20 +96,20 @@ html.light { animation: shimmer 1.8s ease-in-out infinite; } -/* Dark frame — preserves dark palette for product previews on light pages */ +/* Dark frame — preserves warm dark palette for product previews on light pages */ .theme-dark-frame { - --ink-50: 247 247 248; - --ink-100: 238 238 240; - --ink-200: 217 217 222; - --ink-300: 184 184 193; - --ink-400: 145 145 159; - --ink-500: 140 140 158; - --ink-600: 93 93 108; - --ink-700: 76 76 88; - --ink-800: 65 65 75; - --ink-900: 57 57 65; - --ink-925: 40 40 48; - --ink-950: 24 24 27; + --ink-50: 248 247 244; + --ink-100: 240 238 234; + --ink-200: 222 219 213; + --ink-300: 190 186 178; + --ink-400: 154 148 138; + --ink-500: 148 143 132; + --ink-600: 138 133 124; + --ink-700: 84 79 70; + --ink-800: 72 67 58; + --ink-900: 62 58 52; + --ink-925: 44 41 36; + --ink-950: 26 24 21; --accent: #c9a227; } @@ -188,7 +188,7 @@ body { } ::-webkit-scrollbar-thumb:hover { - background: #3f3f46; + background: #46433c; } /* Risk glow effects */ @@ -296,9 +296,9 @@ body { .skeleton { background: linear-gradient( 90deg, - rgba(39, 39, 42, 0.4) 25%, - rgba(63, 63, 70, 0.4) 50%, - rgba(39, 39, 42, 0.4) 75% + rgba(44, 41, 36, 0.4) 25%, + rgba(62, 58, 52, 0.4) 50%, + rgba(44, 41, 36, 0.4) 75% ); background-size: 200% 100%; animation: shimmer 1.8s ease-in-out infinite; diff --git a/frontend/src/app/hero-visual.tsx b/frontend/src/app/hero-visual.tsx index 290c8af..842d8d2 100644 --- a/frontend/src/app/hero-visual.tsx +++ b/frontend/src/app/hero-visual.tsx @@ -59,10 +59,8 @@ export function HeroVisual() { transition={{ delay: 0.5, duration: 0.8, ease: [0.22, 1, 0.36, 1] }} className="relative" > -

-
+ shadow-[0_20px_60px_rgba(0,0,0,0.5),0_0_80px_rgba(201,162,39,0.08)]"> {/* Browser chrome */}
@@ -71,7 +69,7 @@ export function HeroVisual() {
-
+
brightclause.com/documents/acme-techstart-ma
@@ -83,10 +81,10 @@ export function HeroVisual() {
-

Document Analysis

+

Document Analysis

Acme Corp – TechStart Service Agreement

- HIGH RISK @@ -104,13 +102,13 @@ export function HeroVisual() { > {r.count} -

{r.level}

+

{r.level}

@@ -119,7 +117,7 @@ export function HeroVisual() {
{/* Clause list */} -

Extracted Clauses

+

Extracted Clauses

{mockClauses.map((c, i) => (
- {c.section} + {c.section} {c.type}
- + {c.risk}
@@ -144,8 +142,8 @@ export function HeroVisual() { {/* Right: Knowledge Graph */}
-

Knowledge Graph

-

6 entities · 7 relations

+

Knowledge Graph

+

6 entities · 7 relations

@@ -198,7 +196,7 @@ export function HeroVisual() { {entityLegend.map(t => (
- {t.label} + {t.label}
))}
diff --git a/frontend/src/app/layout.tsx b/frontend/src/app/layout.tsx index 3efbc15..c241ac9 100644 --- a/frontend/src/app/layout.tsx +++ b/frontend/src/app/layout.tsx @@ -59,7 +59,7 @@ export const metadata: Metadata = { alternates: { canonical: 'https://brightclause.com' }, robots: { index: true, follow: true }, verification: { google: 'hjZkahLqQJUWRBpHS6iz4i4zyuy4MEC5WqFCRmbgFek' }, - other: { 'theme-color': '#0a0a1a' }, + other: { 'theme-color': '#0d0b08' }, manifest: '/manifest.json', appleWebApp: { capable: true, diff --git a/frontend/src/app/obligations/page.tsx b/frontend/src/app/obligations/page.tsx index b9396cb..67a3378 100644 --- a/frontend/src/app/obligations/page.tsx +++ b/frontend/src/app/obligations/page.tsx @@ -258,10 +258,10 @@ export default function ObligationsPage() {

{ob.description}

- + {sCfg.label} - + {cfg.label} {ob.due_date && ( diff --git a/frontend/src/app/page.tsx b/frontend/src/app/page.tsx index aa81c89..68b9b21 100644 --- a/frontend/src/app/page.tsx +++ b/frontend/src/app/page.tsx @@ -161,22 +161,19 @@ function TrustCard({ signal, index }: { signal: typeof trustSignals[number]; ind transition={{ delay: index * 0.1 }} className="p-6 bg-ink-900/30 border border-ink-800/40 rounded-xl group hover:border-accent/30 transition-all" > - - - -
- - {signal.statPrefix ?? ''}{signal.statDisplay ?? count}{signal.statSuffix} - - - {signal.statLabel} - +
+
+ +
+
+

{signal.title}

+ + {signal.statPrefix ?? ''}{signal.statDisplay ?? count}{signal.statSuffix} {signal.statLabel} + +
-

{signal.title}

{signal.description}

) @@ -357,7 +354,7 @@ export default function LandingPage() {
- {String(i + 1).padStart(2, '0')} + {String(i + 1).padStart(2, '0')}

{item.title}

@@ -436,26 +433,32 @@ export default function LandingPage() {
- {/* Remaining 9 features — compact */} -
- {features.slice(3).map((feature, i) => ( - -
- -
-
-

{feature.title}

-

{feature.description}

-
-
- ))} + {/* Remaining 9 features — alternating wide/compact rhythm */} +
+ {features.slice(3).map((feature, i) => { + const isWide = i % 3 === 0 + return ( + +
+ +
+
+

{feature.title}

+

{feature.description}

+
+
+ ) + })}
@@ -605,7 +608,7 @@ export default function LandingPage() { >
- + {tier.label}
diff --git a/frontend/src/app/providers.tsx b/frontend/src/app/providers.tsx index b194816..3837730 100644 --- a/frontend/src/app/providers.tsx +++ b/frontend/src/app/providers.tsx @@ -1,12 +1,15 @@ 'use client' +import { MotionConfig } from 'framer-motion' import { ToastProvider } from '@/lib/toast' import { ThemeProvider } from '@/lib/theme' export function Providers({ children }: { children: React.ReactNode }) { return ( - {children} + + {children} + ) } diff --git a/frontend/src/components/DemoVideoModal.tsx b/frontend/src/components/DemoVideoModal.tsx index 8054787..60a600a 100644 --- a/frontend/src/components/DemoVideoModal.tsx +++ b/frontend/src/components/DemoVideoModal.tsx @@ -144,7 +144,7 @@ export const DemoVideoModal: React.FC = ({ open, onClose }) )} {/* Player container */} -
+
= ({ open, onClose })
{isActive && (
)} {i > 0 &&
} @@ -200,7 +200,7 @@ export const DemoVideoModal: React.FC = ({ open, onClose })