diff --git a/frontend/src/components/common/ErrorBoundary.tsx b/frontend/src/components/common/ErrorBoundary.tsx index bdee3079..e2f4a371 100644 --- a/frontend/src/components/common/ErrorBoundary.tsx +++ b/frontend/src/components/common/ErrorBoundary.tsx @@ -1,5 +1,5 @@ import { Component, type ReactNode } from 'react' -import { cn } from '@/lib/utils' +import { Button } from '@/components/ui/Button' interface Props { children: ReactNode @@ -45,15 +45,9 @@ export class ErrorBoundary extends Component { {this.state.error.message} )} - + ) diff --git a/frontend/src/components/common/RouteError.tsx b/frontend/src/components/common/RouteError.tsx index 71e9ae63..01931aea 100644 --- a/frontend/src/components/common/RouteError.tsx +++ b/frontend/src/components/common/RouteError.tsx @@ -1,6 +1,6 @@ import { useEffect } from 'react' import { useRouteError, isRouteErrorResponse, useNavigate } from 'react-router-dom' -import { cn } from '@/lib/utils' +import { Button } from '@/components/ui/Button' function isChunkLoadError(error: unknown): boolean { if (!(error instanceof Error)) return false @@ -55,24 +55,12 @@ export function RouteError() {

{errorDetails}

)}
- - + +
diff --git a/frontend/src/components/procedural/CompletionSummary.tsx b/frontend/src/components/procedural/CompletionSummary.tsx index a563e2eb..0f283c5e 100644 --- a/frontend/src/components/procedural/CompletionSummary.tsx +++ b/frontend/src/components/procedural/CompletionSummary.tsx @@ -1,4 +1,5 @@ import { CheckCircle2, Clock, FileText, Download } from 'lucide-react' +import { Button } from '@/components/ui/Button' import type { ProceduralStep } from '@/types' interface StepCompletion { @@ -128,19 +129,13 @@ export function CompletionSummary({ {/* Actions */}
- - + +
) diff --git a/frontend/src/components/step-library/StepLibraryBrowser.tsx b/frontend/src/components/step-library/StepLibraryBrowser.tsx index ad71e7da..3f28805e 100644 --- a/frontend/src/components/step-library/StepLibraryBrowser.tsx +++ b/frontend/src/components/step-library/StepLibraryBrowser.tsx @@ -1,5 +1,6 @@ import { useState, useEffect, useMemo } from 'react' import { Search, ChevronDown, ChevronUp, Loader2 } from 'lucide-react' +import { Button } from '@/components/ui/Button' import { cn } from '@/lib/utils' import { stepsApi } from '@/api/steps' import { stepCategoriesApi } from '@/api/stepCategories' @@ -253,12 +254,9 @@ export function StepLibraryBrowser({ onInsert, onCreateNew, showCreateButton = f ) : error ? (

{error}

- +
) : steps.length === 0 ? (
@@ -374,12 +372,9 @@ export function StepLibraryBrowser({ onInsert, onCreateNew, showCreateButton = f {/* Footer - Optional Create Button */} {showCreateButton && onCreateNew && (
- +
)} diff --git a/frontend/src/pages/AccountSettingsPage.tsx b/frontend/src/pages/AccountSettingsPage.tsx index 156a9c6e..51bd8bdb 100644 --- a/frontend/src/pages/AccountSettingsPage.tsx +++ b/frontend/src/pages/AccountSettingsPage.tsx @@ -6,6 +6,7 @@ import type { Account, AccountMember, AccountInvite } from '@/types' import { TransferOwnershipModal } from '@/components/account/TransferOwnershipModal' import { LeaveAccountModal } from '@/components/account/LeaveAccountModal' import { DeleteAccountModal } from '@/components/account/DeleteAccountModal' +import { Button } from '@/components/ui/Button' import { Spinner } from '@/components/common/Spinner' import { cn } from '@/lib/utils' import { usePermissions } from '@/hooks/usePermissions' @@ -200,29 +201,23 @@ export function AccountSettingsPage() { } }} /> - - + +
) : (
@@ -429,23 +424,13 @@ export function AccountSettingsPage() { - + {isInviting ? 'Sending...' : 'Send Invite'} +
{inviteError && ( @@ -633,30 +618,27 @@ export function AccountSettingsPage() {

Transfer Ownership

Make another member the account owner

- +

Delete Account

Permanently delete your account and all data

- +
) : ( @@ -665,15 +647,13 @@ export function AccountSettingsPage() {

Leave Account

Leave this account and create a personal one

- + )} diff --git a/frontend/src/pages/MySharesPage.tsx b/frontend/src/pages/MySharesPage.tsx index 17ea9a4a..020f7bfd 100644 --- a/frontend/src/pages/MySharesPage.tsx +++ b/frontend/src/pages/MySharesPage.tsx @@ -1,6 +1,7 @@ import { useState, useEffect, useCallback } from 'react' import { Link, useNavigate } from 'react-router-dom' import { Globe, Users, Copy, Check, Link2, ExternalLink, Trash2, ArrowLeft } from 'lucide-react' +import { Button } from '@/components/ui/Button' import { Spinner } from '@/components/common/Spinner' import { EmptyState } from '@/components/common/EmptyState' import { ConfirmDialog } from '@/components/common/ConfirmDialog' @@ -110,12 +111,9 @@ export default function MySharesPage() {

{error}

- +
@@ -147,12 +145,9 @@ export default function MySharesPage() { title="No shared sessions" description="Share a session from the session detail page to create a link" action={ - + } /> @@ -201,14 +196,10 @@ export default function MySharesPage() { {/* Actions */}
- + - +
) diff --git a/frontend/src/pages/MyTreesPage.tsx b/frontend/src/pages/MyTreesPage.tsx index 38e6df6f..44dabe7f 100644 --- a/frontend/src/pages/MyTreesPage.tsx +++ b/frontend/src/pages/MyTreesPage.tsx @@ -1,6 +1,7 @@ import { useEffect, useState } from 'react' import { useNavigate, Link } from 'react-router-dom' import { Play, Pencil, Share2, Trash2, GitBranch, Clock, TrendingUp, FolderTree, Plus, ListOrdered, ChevronDown, Wrench } from 'lucide-react' +import { Button } from '@/components/ui/Button' import { treesApi } from '@/api/trees' import { sessionsApi } from '@/api/sessions' import type { TreeListItem } from '@/types' @@ -125,14 +126,13 @@ export function MyTreesPage() { {canCreateTrees && (
- + {showCreateMenu && ( <>
setShowCreateMenu(false)} /> @@ -297,17 +297,13 @@ export function MyTreesPage() { {/* Actions */}
- + {canEditTree({ author_id: tree.author_id, account_id: tree.account_id }) && ( )} - - - +
))} diff --git a/frontend/src/pages/ProceduralEditorPage.tsx b/frontend/src/pages/ProceduralEditorPage.tsx index 5419b0ce..b1c6a73e 100644 --- a/frontend/src/pages/ProceduralEditorPage.tsx +++ b/frontend/src/pages/ProceduralEditorPage.tsx @@ -1,6 +1,7 @@ import { useEffect, useState, useCallback } from 'react' import { useParams, useNavigate, useSearchParams } from 'react-router-dom' import { Save, ArrowLeft, ListOrdered, Wrench, Settings, FileText, Calendar, Sparkles, Layers } from 'lucide-react' +import { Button } from '@/components/ui/Button' import { treesApi } from '@/api/trees' import { useProceduralEditorStore } from '@/store/proceduralEditorStore' import { CollapsibleEditorSection } from '@/components/procedural-editor/CollapsibleEditorSection' @@ -220,21 +221,20 @@ export function ProceduralEditorPage() { AI Assist - - +
diff --git a/frontend/src/pages/SessionDetailPage.tsx b/frontend/src/pages/SessionDetailPage.tsx index 0c1a6074..71710514 100644 --- a/frontend/src/pages/SessionDetailPage.tsx +++ b/frontend/src/pages/SessionDetailPage.tsx @@ -1,6 +1,7 @@ import { useEffect, useState } from 'react' import { useParams, useNavigate } from 'react-router-dom' import { Copy, Check, Eye, Save, Share2, CheckCircle2, AlertTriangle, ArrowUpRight, HelpCircle, Flag } from 'lucide-react' +import { Button } from '@/components/ui/Button' import { sessionsApi } from '@/api/sessions' import { stepsApi } from '@/api/steps' import { ExportPreviewModal } from '@/components/session/ExportPreviewModal' @@ -391,13 +392,10 @@ export function SessionDetailPage() { {/* Primary action: Copy for Ticket */} - + ) : !session.completed_at ? ( @@ -410,12 +408,9 @@ export function SessionDetailPage() {

Set an outcome to finalize this session and generate documentation.

- + ) : null} @@ -462,14 +457,15 @@ export function SessionDetailPage() { > {copied ? : } - + {/* Copy for ticket (secondary position when session is complete) */} {session.completed_at && ( + )} @@ -147,20 +145,22 @@ export default function StepLibraryPage() {

{deleteError}

)}
- - +
diff --git a/frontend/src/pages/TreeEditorPage.tsx b/frontend/src/pages/TreeEditorPage.tsx index 344a5284..2b47b0ee 100644 --- a/frontend/src/pages/TreeEditorPage.tsx +++ b/frontend/src/pages/TreeEditorPage.tsx @@ -2,6 +2,7 @@ import { useEffect, useState, useCallback, useRef } from 'react' import { useParams, useNavigate, useBlocker } from 'react-router-dom' import { useStore } from 'zustand' import { Undo2, Redo2, Save, CheckCircle2, Monitor, FileText, Code2, LayoutList, BarChart3, Settings, Download, Sparkles } from 'lucide-react' +import { Button } from '@/components/ui/Button' import { getMonacoEditor } from '@/components/tree-editor/code-mode' import { treesApi } from '@/api/trees' import { treeMarkdownApi } from '@/api/treeMarkdown' @@ -508,15 +509,9 @@ export function TreeEditorPage() {

The tree editor requires a larger screen for the best experience. Please open this page on a desktop or tablet in landscape mode.

- + ) } @@ -535,24 +530,12 @@ export function TreeEditorPage() { You have an unsaved draft from a previous session. Would you like to restore it?

- - + +
@@ -567,24 +550,12 @@ export function TreeEditorPage() { You have unsaved changes. Are you sure you want to leave?

- - + +
@@ -787,32 +758,26 @@ export function TreeEditorPage() { {/* Save Draft */} - + {/* Publish */} - + diff --git a/frontend/src/pages/TreeLibraryPage.tsx b/frontend/src/pages/TreeLibraryPage.tsx index aed0be7d..1865314c 100644 --- a/frontend/src/pages/TreeLibraryPage.tsx +++ b/frontend/src/pages/TreeLibraryPage.tsx @@ -1,6 +1,7 @@ import { useEffect, useState, useCallback, useMemo } from 'react' import { useNavigate, useSearchParams } from 'react-router-dom' import { X, RotateCcw, Play, FileUp } from 'lucide-react' +import { Button } from '@/components/ui/Button' import { treesApi } from '@/api/trees' import { categoriesApi } from '@/api/categories' import { foldersApi } from '@/api/folders' @@ -283,13 +284,13 @@ export function TreeLibraryPage() { {canCreateTrees && (
- + - +