diff --git a/frontend/src/components/admin/CreateCategoryModal.tsx b/frontend/src/components/admin/CreateCategoryModal.tsx
index 4c2f5e33..752d0ce5 100644
--- a/frontend/src/components/admin/CreateCategoryModal.tsx
+++ b/frontend/src/components/admin/CreateCategoryModal.tsx
@@ -1,6 +1,7 @@
import { useState } from 'react'
import { cn } from '@/lib/utils'
import { Modal } from '@/components/common/Modal'
+import { Button } from '@/components/ui/Button'
interface CreateCategoryModalProps {
isOpen: boolean
@@ -62,28 +63,22 @@ export function CreateCategoryModal({
size="sm"
footer={
-
-
}
>
diff --git a/frontend/src/components/admin/EditCategoryModal.tsx b/frontend/src/components/admin/EditCategoryModal.tsx
index c51d6f0c..fb586940 100644
--- a/frontend/src/components/admin/EditCategoryModal.tsx
+++ b/frontend/src/components/admin/EditCategoryModal.tsx
@@ -2,6 +2,7 @@ import { useState } from 'react'
import { cn } from '@/lib/utils'
import type { StepCategoryListItem } from '@/types'
import { Modal } from '@/components/common/Modal'
+import { Button } from '@/components/ui/Button'
interface EditCategoryModalProps {
isOpen: boolean
@@ -74,28 +75,22 @@ export function EditCategoryModal({
size="sm"
footer={
-
Cancel
-
-
+
- {isSaving ? 'Saving...' : 'Save Changes'}
-
+ Save Changes
+
}
>
diff --git a/frontend/src/components/library/ExportFlowModal.tsx b/frontend/src/components/library/ExportFlowModal.tsx
index 5d044dce..e241491c 100644
--- a/frontend/src/components/library/ExportFlowModal.tsx
+++ b/frontend/src/components/library/ExportFlowModal.tsx
@@ -2,6 +2,7 @@ import { useState, useEffect } from 'react'
import { Download, X } from 'lucide-react'
import { flowTransferApi } from '@/api/flowTransfer'
import { toast } from '@/lib/toast'
+import { Button } from '@/components/ui/Button'
interface ExportFlowModalProps {
treeId: string
@@ -79,20 +80,16 @@ export function ExportFlowModal({ treeId, treeName, onClose }: ExportFlowModalPr
{/* Footer */}
-
+
Cancel
-
-
+
- {isExporting ? 'Exporting…' : 'Download .rfflow'}
-
+ Download .rfflow
+
diff --git a/frontend/src/components/library/FolderEditModal.tsx b/frontend/src/components/library/FolderEditModal.tsx
index 63b8415c..25a3c596 100644
--- a/frontend/src/components/library/FolderEditModal.tsx
+++ b/frontend/src/components/library/FolderEditModal.tsx
@@ -4,6 +4,7 @@ import { foldersApi } from '@/api/folders'
import type { FolderListItem, FolderCreate, FolderUpdate } from '@/types'
import { cn } from '@/lib/utils'
import { toast } from '@/lib/toast'
+import { Button } from '@/components/ui/Button'
// Predefined color options
const FOLDER_COLORS = [
@@ -259,24 +260,19 @@ export function FolderEditModal({
{/* Actions */}
-
Cancel
-
-
+
- {isSubmitting ? 'Saving...' : isEditMode ? 'Save Changes' : 'Create Folder'}
-
+ {isEditMode ? 'Save Changes' : 'Create Folder'}
+
diff --git a/frontend/src/components/library/ForkModal.tsx b/frontend/src/components/library/ForkModal.tsx
index c56b532e..7e7f1f31 100644
--- a/frontend/src/components/library/ForkModal.tsx
+++ b/frontend/src/components/library/ForkModal.tsx
@@ -4,6 +4,7 @@ import { treesApi } from '@/api/trees'
import { toast } from '@/lib/toast'
import { cn } from '@/lib/utils'
import { useNavigate } from 'react-router-dom'
+import { Button } from '@/components/ui/Button'
interface ForkModalProps {
treeId: string
@@ -116,20 +117,20 @@ export function ForkModal({ treeId, treeName, onClose }: ForkModalProps) {
{/* Footer */}
-
Cancel
-
-
+
- {isSubmitting ? 'Forking…' : 'Fork Flow'}
-
+ Fork Flow
+
diff --git a/frontend/src/components/library/ImportFlowModal.tsx b/frontend/src/components/library/ImportFlowModal.tsx
index ec44fe46..45f6aad0 100644
--- a/frontend/src/components/library/ImportFlowModal.tsx
+++ b/frontend/src/components/library/ImportFlowModal.tsx
@@ -7,6 +7,7 @@ import { toast } from '@/lib/toast'
import { cn } from '@/lib/utils'
import { useNavigate } from 'react-router-dom'
import { getTreeEditorPath } from '@/lib/routing'
+import { Button } from '@/components/ui/Button'
interface ImportFlowModalProps {
onClose: () => void
@@ -227,28 +228,26 @@ export function ImportFlowModal({ onClose }: ImportFlowModalProps) {
{/* Footer */}
{step === 'preview' && (
- { setStep('pick'); setParsed(null); setParseError(null) }}
- className="mr-auto rounded-lg border border-border px-3 py-2 text-sm text-muted-foreground hover:bg-accent hover:text-foreground"
+ className="mr-auto"
>
Back
-
+
)}
-
+
Cancel
-
+
{step === 'preview' && (
-
- {isImporting ? 'Importing…' : 'Import as Draft'}
-
+ Import as Draft
+
)}
diff --git a/frontend/src/components/library/ShareTreeModal.tsx b/frontend/src/components/library/ShareTreeModal.tsx
index 3fab9b62..cc97b08f 100644
--- a/frontend/src/components/library/ShareTreeModal.tsx
+++ b/frontend/src/components/library/ShareTreeModal.tsx
@@ -4,6 +4,7 @@ import type { TreeListItem, TreeShare, TreeVisibility } from '@/types'
import { treesApi } from '@/api/trees'
import { cn } from '@/lib/utils'
import { toast } from '@/lib/toast'
+import { Button } from '@/components/ui/Button'
interface ShareTreeModalProps {
tree: TreeListItem
@@ -201,16 +202,13 @@ export function ShareTreeModal({ tree, isOpen, onClose }: ShareTreeModalProps) {
{/* Generate Button */}
{!activeShare && (
-
- {isGenerating ? 'Generating...' : 'Generate Share Link'}
-
+ Generate Share Link
+
)}
{/* Active Share Link */}
@@ -263,15 +261,9 @@ export function ShareTreeModal({ tree, isOpen, onClose }: ShareTreeModalProps) {
{/* Footer */}
-
+
Close
-
+
diff --git a/frontend/src/components/procedural/IntakeFormModal.tsx b/frontend/src/components/procedural/IntakeFormModal.tsx
index d3b09355..19fae7ff 100644
--- a/frontend/src/components/procedural/IntakeFormModal.tsx
+++ b/frontend/src/components/procedural/IntakeFormModal.tsx
@@ -2,6 +2,7 @@ import { useState } from 'react'
import type { IntakeFormField } from '@/types'
import { PasswordInput } from '@/components/common/PasswordInput'
import { cn } from '@/lib/utils'
+import { Button } from '@/components/ui/Button'
interface IntakeFormModalProps {
isOpen: boolean
@@ -240,19 +241,16 @@ export function IntakeFormModal({ isOpen, fields, treeName, onSubmit, onCancel }
{/* Footer */}
-
Cancel
-
-
+
+
Start Procedure
-
+
diff --git a/frontend/src/components/session/ForkTreeModal.tsx b/frontend/src/components/session/ForkTreeModal.tsx
index 34a1d210..a5dba031 100644
--- a/frontend/src/components/session/ForkTreeModal.tsx
+++ b/frontend/src/components/session/ForkTreeModal.tsx
@@ -1,7 +1,8 @@
import { useState } from 'react'
import { Modal } from '@/components/common/Modal'
-import { GitFork, Loader2 } from 'lucide-react'
+import { GitFork } from 'lucide-react'
import { cn } from '@/lib/utils'
+import { Button } from '@/components/ui/Button'
interface ForkTreeModalProps {
isOpen: boolean
@@ -44,38 +45,21 @@ export function ForkTreeModal({
const footer = (
-
Skip
-
-
+
- {isSaving ? (
- <>
-
- Saving...
- >
- ) : (
- <>
-
- Save as Personal Tree
- >
- )}
-
+
+ Save as Personal Tree
+
)
diff --git a/frontend/src/components/session/SaveSessionAsTreeModal.tsx b/frontend/src/components/session/SaveSessionAsTreeModal.tsx
index aceaa836..11f5635b 100644
--- a/frontend/src/components/session/SaveSessionAsTreeModal.tsx
+++ b/frontend/src/components/session/SaveSessionAsTreeModal.tsx
@@ -1,6 +1,7 @@
import { useState } from 'react'
import { X } from 'lucide-react'
import { cn } from '@/lib/utils'
+import { Button } from '@/components/ui/Button'
interface SaveSessionAsTreeModalProps {
isOpen: boolean
@@ -130,27 +131,20 @@ export function SaveSessionAsTreeModal({
{/* Actions */}
-
Cancel
-
-
+
- {isSaving ? 'Saving...' : 'Save as Tree'}
-
+ Save as Tree
+
diff --git a/frontend/src/components/session/SessionOutcomeModal.tsx b/frontend/src/components/session/SessionOutcomeModal.tsx
index ac5e1f31..b011444e 100644
--- a/frontend/src/components/session/SessionOutcomeModal.tsx
+++ b/frontend/src/components/session/SessionOutcomeModal.tsx
@@ -2,6 +2,7 @@ import { useRef } from 'react'
import { Modal } from '@/components/common/Modal'
import { cn } from '@/lib/utils'
import type { SessionOutcome } from '@/types'
+import { Button } from '@/components/ui/Button'
interface SessionOutcomeModalProps {
isOpen: boolean
@@ -46,28 +47,21 @@ export function SessionOutcomeModal({
title="Session Outcome"
footer={(
-
Cancel
-
-
+
- {isSubmitting ? 'Completing...' : 'Complete Session'}
-
+ Complete Session
+
)}
>
diff --git a/frontend/src/components/session/ShareSessionModal.tsx b/frontend/src/components/session/ShareSessionModal.tsx
index 338875b3..d3ebd42b 100644
--- a/frontend/src/components/session/ShareSessionModal.tsx
+++ b/frontend/src/components/session/ShareSessionModal.tsx
@@ -7,6 +7,7 @@ import { cn } from '@/lib/utils'
import { toast } from '@/lib/toast'
import { Spinner } from '@/components/common/Spinner'
import { Modal } from '@/components/common/Modal'
+import { Button } from '@/components/ui/Button'
interface ShareSessionModalProps {
sessionId: string
@@ -180,15 +181,9 @@ export function ShareSessionModal({ sessionId, sessionLabel, isOpen, onClose }:
size="lg"
footer={
-
+
Close
-
+
}
>
@@ -300,17 +295,15 @@ export function ShareSessionModal({ sessionId, sessionLabel, isOpen, onClose }:
{/* Generate Button */}
-
- {isGenerating ? 'Generating...' : 'Generate Link'}
-
+ Generate Link
+
{/* Existing Shares */}
diff --git a/frontend/src/components/session/StepRatingModal.tsx b/frontend/src/components/session/StepRatingModal.tsx
index 1d1b604f..06966d72 100644
--- a/frontend/src/components/session/StepRatingModal.tsx
+++ b/frontend/src/components/session/StepRatingModal.tsx
@@ -3,6 +3,7 @@ import { X, ThumbsUp, ThumbsDown } from 'lucide-react'
import { StarRating } from '@/components/common/StarRating'
import { cn } from '@/lib/utils'
import type { Step } from '@/types'
+import { Button } from '@/components/ui/Button'
interface StepRatingData {
rating: number
@@ -190,28 +191,21 @@ export function StepRatingModal({
{/* Footer */}
-
Skip
-
-
+
- {isSaving ? 'Submitting...' : 'Submit Ratings'}
-
+ Submit Ratings
+
diff --git a/frontend/src/components/session/VariablePromptModal.tsx b/frontend/src/components/session/VariablePromptModal.tsx
index 9182b9aa..8467548b 100644
--- a/frontend/src/components/session/VariablePromptModal.tsx
+++ b/frontend/src/components/session/VariablePromptModal.tsx
@@ -1,5 +1,6 @@
import { useState } from 'react'
import { cn } from '@/lib/utils'
+import { Button } from '@/components/ui/Button'
interface VariablePromptModalProps {
/** The prompt text from [USER_INPUT:prompt] */
@@ -45,26 +46,20 @@ export function VariablePromptModal({ prompt, onSubmit, onCancel }: VariableProm
/>
-
Continue
-
-
+
Skip
-
+
diff --git a/frontend/src/components/step-library/StepDetailModal.tsx b/frontend/src/components/step-library/StepDetailModal.tsx
index 56fe83c2..2b13975e 100644
--- a/frontend/src/components/step-library/StepDetailModal.tsx
+++ b/frontend/src/components/step-library/StepDetailModal.tsx
@@ -4,6 +4,7 @@ import { cn } from '@/lib/utils'
import { MarkdownContent } from '@/components/ui/MarkdownContent'
import { stepsApi } from '@/api/steps'
import type { Step, Review } from '@/types/step'
+import { Button } from '@/components/ui/Button'
interface StepDetailModalProps {
stepId: string
@@ -318,22 +319,20 @@ export function StepDetailModal({ stepId, onClose, onInsert }: StepDetailModalPr
{/* Footer - Actions */}
-
Cancel
-
-
+
Insert Into Session
-
+
diff --git a/frontend/src/components/step-library/StepForm.tsx b/frontend/src/components/step-library/StepForm.tsx
index df73d3fa..5dc01dd9 100644
--- a/frontend/src/components/step-library/StepForm.tsx
+++ b/frontend/src/components/step-library/StepForm.tsx
@@ -3,6 +3,7 @@ import { Plus, X, HelpCircle, Zap, CheckCircle } from 'lucide-react'
import { cn } from '@/lib/utils'
import { stepCategoriesApi } from '@/api/stepCategories'
import type { StepCreate, StepCategory, StepCommand } from '@/types/step'
+import { Button } from '@/components/ui/Button'
interface StepFormProps {
onSubmit: (data: StepCreate) => void
@@ -369,20 +370,21 @@ export function StepForm({ onSubmit, onCancel, initialData, submitLabel, isSubmi
{/* Actions */}
-
Cancel
-
-
+
- {isSubmitting ? 'Saving...' : (submitLabel ?? 'Insert Step')}
-
+ {submitLabel ?? 'Insert Step'}
+
)
diff --git a/frontend/src/components/tree-editor/AIFixReviewModal.tsx b/frontend/src/components/tree-editor/AIFixReviewModal.tsx
index 1f3a096e..17f21a64 100644
--- a/frontend/src/components/tree-editor/AIFixReviewModal.tsx
+++ b/frontend/src/components/tree-editor/AIFixReviewModal.tsx
@@ -2,6 +2,7 @@ import { useState } from 'react'
import { X, Check, SkipForward, Sparkles, ChevronDown, ChevronUp } from 'lucide-react'
import { cn } from '@/lib/utils'
import type { AIFixProposal } from '@/types'
+import { Button } from '@/components/ui/Button'
interface AIFixReviewModalProps {
fixes: AIFixProposal[]
@@ -125,20 +126,21 @@ export function AIFixReviewModal({ fixes, onApply, onApplyAll, onClose }: AIFixR
{/* Action buttons */}
- handleApply(fix)}
- className="flex items-center gap-1 rounded-md bg-gradient-brand px-3 py-1.5 text-xs font-medium text-white shadow-xs shadow-primary/20 hover:opacity-90"
>
Apply
-
-
+ handleSkip(fix)}
- className="flex items-center gap-1 rounded-md border border-border px-3 py-1.5 text-xs font-medium text-muted-foreground hover:bg-accent hover:text-foreground"
>
Skip
-
+
>
)}
@@ -149,19 +151,13 @@ export function AIFixReviewModal({ fixes, onApply, onApplyAll, onClose }: AIFixR
{/* Footer */}
-
+
{allHandled ? 'Done' : 'Cancel'}
-
+
{!allHandled && (
-
+
Apply All ({pendingFixes.length})
-
+
)}
diff --git a/frontend/src/components/tree-editor/NodeEditorModal.tsx b/frontend/src/components/tree-editor/NodeEditorModal.tsx
index 96fbc31e..43312d96 100644
--- a/frontend/src/components/tree-editor/NodeEditorModal.tsx
+++ b/frontend/src/components/tree-editor/NodeEditorModal.tsx
@@ -5,6 +5,7 @@ import { NodeFormDecision } from './NodeFormDecision'
import { NodeFormAction } from './NodeFormAction'
import { NodeFormResolution } from './NodeFormResolution'
import type { TreeStructure } from '@/types'
+import { Button } from '@/components/ui/Button'
interface NodeEditorModalProps {
node: TreeStructure
@@ -65,20 +66,19 @@ export function NodeEditorModal({ node, onClose, isNewNode = false }: NodeEditor
const footerContent = (
-
Cancel
-
-
+
Done
-
+
)