From c8ea9ec0a0a7306765d58bae10d30f58eff97e98 Mon Sep 17 00:00:00 2001 From: Matt Date: Wed, 13 May 2026 12:37:22 +0200 Subject: [PATCH] fix(audit-wave-10): aria-hidden sweep on decorative Lucide icons (#69) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Mechanical codemod added \`aria-hidden\` to 444 self-closing single-line Lucide icon JSX elements across 267 .tsx files in: - shared/, layout/, dashboard/ - admin/ (all sections) - clients/, berths/, yachts/, companies/, interests/, documents/ - reminders/, reservations/, residential/, expenses/, email/ The regex targeted only the safe pattern \`\` (no other props, self-closing, capitalized component name). Every match inspected is a decorative companion to visible text or sits inside a button whose accessible name comes from \`aria-label\` / sr-only text — the icon itself should not be announced. Screen readers no longer double-read the icon + the adjacent label text (e.g. "Pencil Pencil Edit" → just "Edit"). The existing @axe-core/playwright smoke test (\`20-accessibility.spec.ts\`) continues to pass. Test suite stays at 1315/1315 vitest. typescript clean. Closes task #69 (aria-hidden sweep) from the AUDIT-2026-05-12 follow-ups backlog. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../admin/admin-sections-browser.tsx | 10 +++++-- src/components/admin/ai-budget-card.tsx | 6 ++-- src/components/admin/audit/audit-log-card.tsx | 12 ++++---- src/components/admin/audit/audit-log-list.tsx | 5 +++- src/components/admin/backup-admin-panel.tsx | 12 ++++---- .../admin/branding/pdf-logo-uploader.tsx | 10 +++---- .../admin/brochures-admin-panel.tsx | 20 +++++++------ .../admin/custom-fields/custom-field-form.tsx | 2 +- .../custom-fields/custom-fields-manager.tsx | 10 +++---- .../admin/documenso/documenso-test-button.tsx | 6 ++-- .../document-templates/template-list.tsx | 16 +++++------ .../document-templates/template-preview.tsx | 4 +-- .../template-version-history.tsx | 4 +-- .../admin/email-templates-admin.tsx | 4 +-- .../admin/forms/form-template-form.tsx | 4 +-- .../admin/forms/form-template-list.tsx | 6 ++-- .../admin/invitations/invitations-manager.tsx | 12 ++++---- src/components/admin/ocr-settings-form.tsx | 20 +++++++++---- src/components/admin/onboarding-checklist.tsx | 10 +++---- src/components/admin/ports/port-list.tsx | 6 ++-- src/components/admin/queue-detail-table.tsx | 4 +-- .../admin/residential-stages-admin.tsx | 14 +++++----- src/components/admin/roles/role-list.tsx | 12 ++++---- .../admin/sales-email-config-card.tsx | 4 +-- .../admin/settings/settings-manager.tsx | 8 +++--- .../admin/shared/settings-form-card.tsx | 4 +-- src/components/admin/storage-admin-panel.tsx | 28 ++++++++++++------- .../admin/system-monitoring-dashboard.tsx | 10 +++---- src/components/admin/tags/tag-list.tsx | 10 +++---- src/components/admin/users/user-card.tsx | 18 ++++++------ src/components/admin/users/user-list.tsx | 10 +++---- .../vocabularies/vocabularies-manager.tsx | 14 +++++----- .../website-analytics/umami-test-button.tsx | 6 ++-- src/components/berths/berth-card.tsx | 6 ++-- src/components/berths/berth-columns.tsx | 6 ++-- .../berths/berth-deal-documents-tab.tsx | 4 +-- src/components/berths/berth-detail-header.tsx | 8 +++--- .../berths/berth-interest-pulse.tsx | 9 ++++-- .../berths/berth-reservations-tab.tsx | 2 +- .../berths/berth-status-suggestion-dialog.tsx | 6 ++-- .../berths/waiting-list-manager.tsx | 10 ++++--- .../clients/bulk-archive-wizard.tsx | 16 +++++------ .../clients/bulk-hard-delete-dialog.tsx | 8 +++--- src/components/clients/client-card.tsx | 6 ++-- src/components/clients/client-columns.tsx | 12 ++++---- .../clients/client-detail-header.tsx | 8 ++++-- src/components/clients/client-form.tsx | 6 ++-- .../clients/client-interests-tab.tsx | 13 +++++---- src/components/clients/client-list.tsx | 2 +- .../clients/client-pipeline-summary.tsx | 22 +++++++++------ src/components/clients/client-yachts-tab.tsx | 2 +- src/components/clients/contacts-editor.tsx | 8 +++--- src/components/clients/gdpr-export-button.tsx | 10 +++---- src/components/clients/hard-delete-dialog.tsx | 8 +++--- .../clients/portal-invite-button.tsx | 6 ++-- .../clients/send-documents-dialog.tsx | 6 ++-- .../clients/smart-archive-dialog.tsx | 24 ++++++++-------- .../clients/smart-restore-dialog.tsx | 19 +++++++------ .../companies/add-membership-dialog.tsx | 2 +- src/components/companies/company-card.tsx | 18 +++++++----- src/components/companies/company-columns.tsx | 8 +++--- .../companies/company-detail-header.tsx | 4 +-- src/components/companies/company-form.tsx | 8 +++--- src/components/companies/company-list.tsx | 2 +- .../companies/company-members-tab.tsx | 10 +++---- .../companies/company-owned-yachts-tab.tsx | 2 +- src/components/companies/company-picker.tsx | 2 +- .../dashboard/active-deals-tile.tsx | 2 +- .../dashboard/berth-status-chart.tsx | 2 +- src/components/dashboard/chart-card.tsx | 6 ++-- .../dashboard/customize-widgets-menu.tsx | 2 +- src/components/dashboard/hot-deals-card.tsx | 6 ++-- src/components/dashboard/kpi-cards.tsx | 4 +-- .../dashboard/my-reminders-rail.tsx | 7 +++-- .../dashboard/pipeline-value-tile.tsx | 2 +- .../dashboard/source-conversion-chart.tsx | 6 ++-- .../dashboard/timezone-drift-banner.tsx | 2 +- .../dashboard/website-glance-tile.tsx | 2 +- .../documents/aggregated-section.tsx | 4 +-- .../documents/create-document-wizard.tsx | 6 ++-- src/components/documents/document-detail.tsx | 12 ++++---- src/components/documents/document-list.tsx | 2 +- .../documents/document-template-picker.tsx | 2 +- src/components/documents/documents-hub.tsx | 14 ++++++---- .../documents/entity-folder-view.tsx | 6 ++-- .../documents/eoi-generate-dialog.tsx | 20 ++++++------- .../documents/folder-actions-menu.tsx | 8 +++--- .../documents/folder-breadcrumb.tsx | 2 +- .../documents/folder-tree-sidebar.tsx | 8 +++--- src/components/documents/hub-root-view.tsx | 4 +-- .../documents/move-to-folder-dialog.tsx | 2 +- .../documents/new-document-menu.tsx | 8 +++--- .../documents/signing-details-dialog.tsx | 2 +- src/components/email/email-accounts-list.tsx | 10 +++---- src/components/email/email-draft-button.tsx | 10 +++---- src/components/email/email-threads-list.tsx | 8 +++--- src/components/expenses/expense-card.tsx | 14 ++++++---- src/components/expenses/expense-columns.tsx | 8 +++--- src/components/expenses/expense-detail.tsx | 14 +++++----- .../expenses/expense-duplicate-banner.tsx | 2 +- .../expenses/expense-form-dialog.tsx | 6 ++-- .../expenses/trip-label-combobox.tsx | 4 +-- .../add-berth-to-interest-dialog.tsx | 8 ++++-- .../interests/berth-recommender-panel.tsx | 12 ++++---- .../interests/external-eoi-upload-dialog.tsx | 4 +-- .../interests/inline-stage-picker.tsx | 21 ++++++++------ src/components/interests/interest-card.tsx | 8 +++--- src/components/interests/interest-columns.tsx | 8 +++--- .../interests/interest-contact-log-tab.tsx | 20 ++++++------- .../interests/interest-contract-tab.tsx | 24 +++++++++------- .../interests/interest-detail-header.tsx | 16 +++++++---- .../interests/interest-documents-tab.tsx | 2 +- src/components/interests/interest-eoi-tab.tsx | 24 +++++++++------- src/components/interests/interest-form.tsx | 8 +++--- src/components/interests/interest-list.tsx | 8 +++--- .../interests/interest-outcome-dialog.tsx | 6 ++-- src/components/interests/interest-picker.tsx | 2 +- .../interests/interest-reservation-tab.tsx | 24 +++++++++------- .../interests/interest-stage-picker.tsx | 4 +-- src/components/interests/interest-tabs.tsx | 6 ++-- .../interests/interest-timeline.tsx | 28 +++++++++++-------- .../interests/linked-berths-list.tsx | 14 +++++----- .../interests/recommendation-list.tsx | 4 +-- .../interests/send-from-interest-button.tsx | 2 +- src/components/interests/stage-legend.tsx | 2 +- src/components/layout/breadcrumbs.tsx | 2 +- src/components/layout/inbox.tsx | 2 +- .../layout/mobile/mobile-topbar.tsx | 2 +- src/components/layout/sidebar.tsx | 10 +++---- src/components/layout/topbar.tsx | 4 +-- src/components/layout/user-menu.tsx | 14 +++++----- src/components/reminders/reminder-card.tsx | 12 ++++---- src/components/reminders/reminder-list.tsx | 18 ++++++------ .../reservations/berth-reserve-dialog.tsx | 6 ++-- .../reservations/reservation-detail.tsx | 16 +++++------ .../residential-client-detail-header.tsx | 2 +- .../residential/residential-client-tabs.tsx | 2 +- .../residential/residential-clients-list.tsx | 2 +- src/components/shared/addresses-editor.tsx | 8 +++--- .../shared/archive-confirm-dialog.tsx | 2 +- src/components/shared/berth-picker.tsx | 2 +- src/components/shared/client-picker.tsx | 2 +- src/components/shared/column-picker.tsx | 6 ++-- src/components/shared/country-combobox.tsx | 2 +- .../shared/custom-fields-section.tsx | 4 +-- src/components/shared/data-table.tsx | 10 +++---- src/components/shared/detail-layout.tsx | 2 +- src/components/shared/empty-state.tsx | 2 +- src/components/shared/filter-bar.tsx | 4 +-- .../shared/image-cropper-dialog.tsx | 2 +- .../shared/inline-country-field.tsx | 7 +++-- .../shared/inline-editable-field.tsx | 8 +++--- src/components/shared/inline-phone-field.tsx | 7 +++-- src/components/shared/inline-tag-editor.tsx | 4 +-- .../shared/inline-timezone-field.tsx | 7 +++-- src/components/shared/interest-picker.tsx | 2 +- src/components/shared/loading-skeleton.tsx | 26 ++++++++--------- src/components/shared/notes-list.tsx | 10 +++---- src/components/shared/owner-picker.tsx | 2 +- .../shared/saved-views-dropdown.tsx | 8 ++++-- .../shared/send-document-dialog.tsx | 6 ++-- .../shared/subdivision-combobox.tsx | 2 +- src/components/shared/tag-picker.tsx | 2 +- src/components/shared/timezone-combobox.tsx | 2 +- src/components/yachts/yacht-card.tsx | 10 +++---- src/components/yachts/yacht-columns.tsx | 8 +++--- src/components/yachts/yacht-detail-header.tsx | 6 ++-- src/components/yachts/yacht-form.tsx | 2 +- src/components/yachts/yacht-list.tsx | 2 +- .../yachts/yacht-ownership-history.tsx | 2 +- src/components/yachts/yacht-picker.tsx | 2 +- .../yachts/yacht-transfer-dialog.tsx | 2 +- 172 files changed, 727 insertions(+), 614 deletions(-) diff --git a/src/components/admin/admin-sections-browser.tsx b/src/components/admin/admin-sections-browser.tsx index 821c9ae1..2f6001f5 100644 --- a/src/components/admin/admin-sections-browser.tsx +++ b/src/components/admin/admin-sections-browser.tsx @@ -377,7 +377,10 @@ export function AdminSectionsBrowser({ portSlug }: AdminSectionsBrowserProps) { return (
- + - +
{section.label} {groupTitle ? ( diff --git a/src/components/admin/ai-budget-card.tsx b/src/components/admin/ai-budget-card.tsx index 89db298a..e5833bb4 100644 --- a/src/components/admin/ai-budget-card.tsx +++ b/src/components/admin/ai-budget-card.tsx @@ -88,7 +88,7 @@ function AiBudgetCardBody({ AI cost guardrails - Loading… + Loading… ); @@ -198,7 +198,9 @@ function AiBudgetCardBody({
diff --git a/src/components/admin/audit/audit-log-card.tsx b/src/components/admin/audit/audit-log-card.tsx index a9ede4d7..141ce0ac 100644 --- a/src/components/admin/audit/audit-log-card.tsx +++ b/src/components/admin/audit/audit-log-card.tsx @@ -44,11 +44,11 @@ const ACTION_BADGE_COLORS: Record = { }; function ActionIcon({ action }: { action: string }) { - if (action === 'create') return ; - if (action === 'update') return ; - if (action === 'delete') return ; - if (action === 'viewed') return ; - return ; + if (action === 'create') return ; + if (action === 'update') return ; + if (action === 'delete') return ; + if (action === 'viewed') return ; + return ; } function actionVerb(action: string): string { @@ -114,7 +114,7 @@ export function AuditLogCard({ entry }: AuditLogCardProps) { {/* Timestamp + IP meta line */}
- }> + }> {formatDistanceToNow(new Date(entry.createdAt), { addSuffix: true })} {entry.ipAddress ? ( diff --git a/src/components/admin/audit/audit-log-list.tsx b/src/components/admin/audit/audit-log-list.tsx index 5c982112..9efd511d 100644 --- a/src/components/admin/audit/audit-log-list.tsx +++ b/src/components/admin/audit/audit-log-list.tsx @@ -351,7 +351,10 @@ export function AuditLogList() { Search
- +
- + Run a backup now @@ -112,11 +112,11 @@ export function BackupAdminPanel() {
@@ -136,7 +136,7 @@ export function BackupAdminPanel() { {loading ? (
- Loading… + Loading…
) : jobs.length === 0 ? (

No backups yet.

@@ -168,7 +168,7 @@ export function BackupAdminPanel() { {j.status === 'completed' && ( )} @@ -184,7 +184,7 @@ export function BackupAdminPanel() { - + Run a fresh backup now? diff --git a/src/components/admin/branding/pdf-logo-uploader.tsx b/src/components/admin/branding/pdf-logo-uploader.tsx index be9d040b..99b4f7b3 100644 --- a/src/components/admin/branding/pdf-logo-uploader.tsx +++ b/src/components/admin/branding/pdf-logo-uploader.tsx @@ -207,7 +207,7 @@ export function PdfLogoUploader() { {loading ? (
- Loading current logo… + Loading current logo…
) : current ? (
@@ -232,7 +232,7 @@ export function PdfLogoUploader() { Test with sample PDF
@@ -292,9 +292,9 @@ export function PdfLogoUploader() {
@@ -316,7 +316,7 @@ export function PdfLogoUploader() { onClick={() => fileInputRef.current?.click()} disabled={working} > - Choose a different file + Choose a different file
diff --git a/src/components/admin/brochures-admin-panel.tsx b/src/components/admin/brochures-admin-panel.tsx index bcdaec94..0d356ada 100644 --- a/src/components/admin/brochures-admin-panel.tsx +++ b/src/components/admin/brochures-admin-panel.tsx @@ -69,13 +69,13 @@ export function BrochuresAdminPanel() {
{brochuresQuery.isLoading && (
- Loading… + Loading…
)} @@ -179,10 +179,10 @@ function BrochureCard({ brochure, onChange }: { brochure: BrochureRow; onChange: - {brochure.label} + {brochure.label} {brochure.isDefault && ( - default + default )} {brochure.archivedAt && ( @@ -222,9 +222,9 @@ function BrochureCard({ brochure, onChange }: { brochure: BrochureRow; onChange: )} )} @@ -331,7 +331,9 @@ function CreateBrochureDialog({ disabled={!label.trim() || createMutation.isPending} onClick={() => createMutation.mutate()} > - {createMutation.isPending && } + {createMutation.isPending && ( + + )} Create diff --git a/src/components/admin/custom-fields/custom-field-form.tsx b/src/components/admin/custom-fields/custom-field-form.tsx index 17b520a3..7ca55d83 100644 --- a/src/components/admin/custom-fields/custom-field-form.tsx +++ b/src/components/admin/custom-fields/custom-field-form.tsx @@ -263,7 +263,7 @@ function CustomFieldFormBody({ open, onOpenChange, field, onSuccess }: CustomFie maxLength={100} />
{selectOptions.length > 0 && ( diff --git a/src/components/admin/custom-fields/custom-fields-manager.tsx b/src/components/admin/custom-fields/custom-fields-manager.tsx index c778de8a..03442d6d 100644 --- a/src/components/admin/custom-fields/custom-fields-manager.tsx +++ b/src/components/admin/custom-fields/custom-fields-manager.tsx @@ -124,7 +124,7 @@ export function CustomFieldsManager() { cell: ({ row }) => (
- + Delete } @@ -159,7 +159,7 @@ export function CustomFieldsManager() { description="Define custom fields for clients and records" actions={ } @@ -228,7 +228,7 @@ export function CustomFieldsManager() { onClick={() => handleEdit(original)} aria-label="Edit field" > - + - + } title="Delete Custom Field" diff --git a/src/components/admin/documenso/documenso-test-button.tsx b/src/components/admin/documenso/documenso-test-button.tsx index aca6db8e..bb5e9f34 100644 --- a/src/components/admin/documenso/documenso-test-button.tsx +++ b/src/components/admin/documenso/documenso-test-button.tsx @@ -47,17 +47,17 @@ export function DocumensoTestButton() { {result && (result.ok ? ( - + HTTP {result.status} ) : ( - + {result.error ?? `HTTP ${result.status}`} ))}
diff --git a/src/components/admin/document-templates/template-list.tsx b/src/components/admin/document-templates/template-list.tsx index 1bf7a2d2..820cace1 100644 --- a/src/components/admin/document-templates/template-list.tsx +++ b/src/components/admin/document-templates/template-list.tsx @@ -94,7 +94,7 @@ export function TemplateList() { header: 'Name', cell: ({ row }) => (
- + {row.original.name}
), @@ -147,7 +147,7 @@ export function TemplateList() { title="Version history" onClick={() => handleViewHistory(row.original)} > - + } title="Delete Template" @@ -189,7 +189,7 @@ export function TemplateList() { description="Manage reusable document templates with TipTap content and PDF generation" actions={ } @@ -237,7 +237,7 @@ export function TemplateList() { title="Version history" onClick={() => handleViewHistory(original)} > - + - + } title="Delete Template" diff --git a/src/components/admin/document-templates/template-preview.tsx b/src/components/admin/document-templates/template-preview.tsx index 10de7773..c406cd64 100644 --- a/src/components/admin/document-templates/template-preview.tsx +++ b/src/components/admin/document-templates/template-preview.tsx @@ -59,7 +59,7 @@ export function TemplatePreview({ content, templateName }: TemplatePreviewProps) return ( <> @@ -70,7 +70,7 @@ export function TemplatePreview({ content, templateName }: TemplatePreviewProps) Preview - {templateName} {pdfBase64 && ( )} diff --git a/src/components/admin/document-templates/template-version-history.tsx b/src/components/admin/document-templates/template-version-history.tsx index 69c697dc..2efd16bb 100644 --- a/src/components/admin/document-templates/template-version-history.tsx +++ b/src/components/admin/document-templates/template-version-history.tsx @@ -81,7 +81,7 @@ export function TemplateVersionHistory({ if (versions.length === 0) { return (
- +

No previous versions found. Versions are saved whenever you update the template content.

@@ -129,7 +129,7 @@ export function TemplateVersionHistory({ onClick={() => handleRollback(v.version)} disabled={rollingBack === v.version} > - + {rollingBack === v.version ? 'Restoring…' : 'Restore'}
diff --git a/src/components/admin/email-templates-admin.tsx b/src/components/admin/email-templates-admin.tsx index 2227a407..22e602a8 100644 --- a/src/components/admin/email-templates-admin.tsx +++ b/src/components/admin/email-templates-admin.tsx @@ -150,7 +150,7 @@ function EmailTemplatesAdminBody({ onClick={() => save(row, 'save')} disabled={savingKey === row.key || !dirty} > - Save + Save {overridden ? ( ) : null} {message?.key === row.key ? ( diff --git a/src/components/admin/forms/form-template-form.tsx b/src/components/admin/forms/form-template-form.tsx index 92ee5321..276c9844 100644 --- a/src/components/admin/forms/form-template-form.tsx +++ b/src/components/admin/forms/form-template-form.tsx @@ -139,7 +139,7 @@ function FormTemplateFormBody({ open, onOpenChange, template, onSaved }: Props)
@@ -154,7 +154,7 @@ function FormTemplateFormBody({ open, onOpenChange, template, onSaved }: Props) className="text-destructive h-7 w-7" onClick={() => removeField(i)} > - + )}
diff --git a/src/components/admin/forms/form-template-list.tsx b/src/components/admin/forms/form-template-list.tsx index 190b48f9..6c7fdb83 100644 --- a/src/components/admin/forms/form-template-list.tsx +++ b/src/components/admin/forms/form-template-list.tsx @@ -57,7 +57,7 @@ export function FormTemplateList() { setFormOpen(true); }} > - + New template } @@ -95,12 +95,12 @@ export function FormTemplateList() { setFormOpen(true); }} > - + - + } title="Delete form template" diff --git a/src/components/admin/invitations/invitations-manager.tsx b/src/components/admin/invitations/invitations-manager.tsx index 285ad5d8..b28a2543 100644 --- a/src/components/admin/invitations/invitations-manager.tsx +++ b/src/components/admin/invitations/invitations-manager.tsx @@ -89,7 +89,7 @@ export function InvitationsManager() {

@@ -98,7 +98,7 @@ export function InvitationsManager() {

Loading…

) : invites.length === 0 ? (
- +

No invitations issued yet.

) : ( @@ -142,7 +142,7 @@ export function InvitationsManager() { disabled={resendMutation.isPending || !!i.usedAt} title="Resend invite" > - + {i.status === 'pending' && ( - + } title="Revoke invitation?" @@ -230,7 +230,9 @@ export function InvitationsManager() { Cancel diff --git a/src/components/admin/ocr-settings-form.tsx b/src/components/admin/ocr-settings-form.tsx index e6835aea..53c6acae 100644 --- a/src/components/admin/ocr-settings-form.tsx +++ b/src/components/admin/ocr-settings-form.tsx @@ -138,7 +138,7 @@ function SettingsBlockBody({ {title} - Loading… + Loading… ); @@ -250,7 +250,11 @@ function SettingsBlockBody({ onClick={() => setShowKey((v) => !v)} aria-label={showKey ? 'Hide key' : 'Show key'} > - {showKey ? : } + {showKey ? ( + + ) : ( + + )}

@@ -264,7 +268,9 @@ function SettingsBlockBody({ disabled={save.isPending} data-testid={`save-${scope}`} > - {save.isPending ? : null} + {save.isPending ? ( + + ) : null} Save settings {hasKey ? ( @@ -290,13 +298,13 @@ function SettingsBlockBody({ {testStatus?.ok ? ( - + Connection OK ) : null} {testStatus && !testStatus.ok ? ( - + {testStatus.reason} ) : null} diff --git a/src/components/admin/onboarding-checklist.tsx b/src/components/admin/onboarding-checklist.tsx index b54672c7..e39a2c63 100644 --- a/src/components/admin/onboarding-checklist.tsx +++ b/src/components/admin/onboarding-checklist.tsx @@ -228,11 +228,11 @@ export function OnboardingChecklist() { } > {done ? ( - + ) : loading ? ( - + ) : ( - + )}

@@ -243,7 +243,7 @@ export function OnboardingChecklist() { className="text-sm font-medium hover:underline inline-flex items-center gap-1" > {idx + 1}. {step.label} - +

{step.description}

{auto && ( @@ -265,7 +265,7 @@ export function OnboardingChecklist() { onClick={() => toggleManual(step.id)} > {saving === step.id ? ( - + ) : manual ? ( 'Mark incomplete' ) : ( diff --git a/src/components/admin/ports/port-list.tsx b/src/components/admin/ports/port-list.tsx index e025463e..8bf85cd8 100644 --- a/src/components/admin/ports/port-list.tsx +++ b/src/components/admin/ports/port-list.tsx @@ -95,7 +95,7 @@ export function PortList() { header: '', cell: ({ row }) => ( ), @@ -111,7 +111,7 @@ export function PortList() { description="Manage marina ports and their configuration" actions={ } @@ -154,7 +154,7 @@ export function PortList() { aria-label={`Edit ${original.name}`} className="shrink-0" > - +
)} diff --git a/src/components/admin/queue-detail-table.tsx b/src/components/admin/queue-detail-table.tsx index 29a50ef4..071a8ba1 100644 --- a/src/components/admin/queue-detail-table.tsx +++ b/src/components/admin/queue-detail-table.tsx @@ -159,7 +159,7 @@ export function QueueDetailTable({ queueName }: QueueDetailTableProps) { disabled={retryMutation.isPending} onClick={() => retryMutation.mutate(job.id)} > - + )} diff --git a/src/components/admin/residential-stages-admin.tsx b/src/components/admin/residential-stages-admin.tsx index b4cacb6a..072807e2 100644 --- a/src/components/admin/residential-stages-admin.tsx +++ b/src/components/admin/residential-stages-admin.tsx @@ -128,7 +128,7 @@ export function ResidentialStagesAdmin() { if (loading) { return (
- Loading stages… + Loading stages…
); } @@ -149,7 +149,7 @@ export function ResidentialStagesAdmin() { key={`${stage.id}-${idx}`} className="flex items-center gap-3 rounded-md border p-3" > - +
))} @@ -245,9 +245,9 @@ export function ResidentialStagesAdmin() {
@@ -318,7 +318,7 @@ export function ResidentialStagesAdmin() { }} disabled={saving} > - {saving && } + {saving && } Reassign + save diff --git a/src/components/admin/roles/role-list.tsx b/src/components/admin/roles/role-list.tsx index cac036ef..cca13c30 100644 --- a/src/components/admin/roles/role-list.tsx +++ b/src/components/admin/roles/role-list.tsx @@ -87,7 +87,7 @@ export function RoleList() { {formatRole(row.original.name)} {row.original.isSystem && ( - + System )} @@ -126,7 +126,7 @@ export function RoleList() { cell: ({ row }) => (
{!row.original.isSystem && ( @@ -137,7 +137,7 @@ export function RoleList() { size="sm" className="text-destructive hover:text-destructive" > - + Delete } @@ -162,7 +162,7 @@ export function RoleList() { description="Manage roles and their permissions" actions={ } @@ -209,7 +209,7 @@ export function RoleList() { onClick={() => handleEditRole(original)} aria-label="Edit role" > - + {!original.isSystem ? ( - + } title="Delete Role" diff --git a/src/components/admin/sales-email-config-card.tsx b/src/components/admin/sales-email-config-card.tsx index fea0b7a8..0d33302b 100644 --- a/src/components/admin/sales-email-config-card.tsx +++ b/src/components/admin/sales-email-config-card.tsx @@ -174,7 +174,7 @@ export function SalesEmailConfigCard() { return ( - Loading sales email config… + Loading sales email config… ); @@ -387,7 +387,7 @@ export function SalesEmailConfigCard() {
diff --git a/src/components/admin/settings/settings-manager.tsx b/src/components/admin/settings/settings-manager.tsx index 58156eb2..528319fd 100644 --- a/src/components/admin/settings/settings-manager.tsx +++ b/src/components/admin/settings/settings-manager.tsx @@ -408,7 +408,7 @@ export function SettingsManager() { saveSetting(setting.key, values[setting.key] ?? setting.defaultValue) } > - +
@@ -454,7 +454,7 @@ export function SettingsManager() { saveSetting(setting.key, values[setting.key] ?? setting.defaultValue) } > - +
@@ -542,7 +542,7 @@ export function SettingsManager() { size="sm" className="text-destructive hover:text-destructive" > - + } title="Delete Setting" @@ -569,7 +569,7 @@ export function SettingsManager() { className="flex-1" /> diff --git a/src/components/admin/shared/settings-form-card.tsx b/src/components/admin/shared/settings-form-card.tsx index 022225d2..a7bbbda0 100644 --- a/src/components/admin/shared/settings-form-card.tsx +++ b/src/components/admin/shared/settings-form-card.tsx @@ -147,7 +147,7 @@ export function SettingsFormCard({ title, description, fields, extra }: Settings
- + Loading…
@@ -176,7 +176,7 @@ export function SettingsFormCard({ title, description, fields, extra }: Settings
{extra}
diff --git a/src/components/admin/storage-admin-panel.tsx b/src/components/admin/storage-admin-panel.tsx index 315c5a25..49918082 100644 --- a/src/components/admin/storage-admin-panel.tsx +++ b/src/components/admin/storage-admin-panel.tsx @@ -174,7 +174,7 @@ export function StorageAdminPanel() { if (status.isLoading) { return (
- Loading storage status… + Loading storage status…
); } @@ -216,18 +216,22 @@ export function StorageAdminPanel() { onClick={() => testMutation.mutate()} disabled={testMutation.isPending} > - {testMutation.isPending && } + {testMutation.isPending && ( + + )} Test S3 connection {testResult && (
{testResult.ok ? (
- Connection OK — round-trip succeeded. + Connection OK — round-trip + succeeded.
) : (
- {testResult.error ?? 'Connection failed'} + {' '} + {testResult.error ?? 'Connection failed'}
)}
@@ -248,9 +252,9 @@ export function StorageAdminPanel() { {s.backend === 's3' ? ( - + ) : ( - + )}
Active backend: {s.backend} @@ -283,7 +287,9 @@ export function StorageAdminPanel() { disabled={dryRunMutation.isPending} onClick={() => openConfirm('switch-and-migrate')} > - {dryRunMutation.isPending && } + {dryRunMutation.isPending && ( + + )} Switch + migrate existing files to {otherBackend}

@@ -337,7 +343,7 @@ export function StorageAdminPanel() { - + {confirmMode === 'switch-and-migrate' ? `Switch + migrate to ${otherBackend}?` : `Switch active backend to ${otherBackend}?`} @@ -382,7 +388,9 @@ export function StorageAdminPanel() { }) } > - {migrateMutation.isPending && } + {migrateMutation.isPending && ( + + )} {confirmMode === 'switch-and-migrate' ? 'Migrate now' : 'Switch now'} diff --git a/src/components/admin/system-monitoring-dashboard.tsx b/src/components/admin/system-monitoring-dashboard.tsx index 3748f3b2..fdb1d4a8 100644 --- a/src/components/admin/system-monitoring-dashboard.tsx +++ b/src/components/admin/system-monitoring-dashboard.tsx @@ -60,9 +60,9 @@ export function SystemMonitoringDashboard() { <>

{health.overall === 'healthy' ? ( - + ) : ( - + )} All services checked at {new Date(health.checkedAt).toLocaleTimeString()} @@ -88,7 +88,7 @@ export function SystemMonitoringDashboard() { - + Active Connections @@ -100,7 +100,7 @@ export function SystemMonitoringDashboard() { - + Total Failed Jobs @@ -114,7 +114,7 @@ export function SystemMonitoringDashboard() { - + Active Jobs diff --git a/src/components/admin/tags/tag-list.tsx b/src/components/admin/tags/tag-list.tsx index c580ade5..a65bbdaa 100644 --- a/src/components/admin/tags/tag-list.tsx +++ b/src/components/admin/tags/tag-list.tsx @@ -87,13 +87,13 @@ export function TagList() { cell: ({ row }) => (
- + Delete } @@ -117,7 +117,7 @@ export function TagList() { description="Manage tags used across clients and records" actions={ } @@ -152,7 +152,7 @@ export function TagList() { onClick={() => handleEditTag(original)} aria-label={`Edit ${original.name}`} > - + - + } title="Delete Tag" diff --git a/src/components/admin/users/user-card.tsx b/src/components/admin/users/user-card.tsx index 4f78b875..4f36035c 100644 --- a/src/components/admin/users/user-card.tsx +++ b/src/components/admin/users/user-card.tsx @@ -73,7 +73,7 @@ export function UserCard({ onClick={(e) => e.stopPropagation()} aria-label={`Actions for ${user.displayName}`} > - + @@ -83,7 +83,7 @@ export function UserCard({ onEdit(user); }} > - + Edit e.preventDefault()} disabled={isToggling}> {user.isActive ? ( <> - + Disable sign-in ) : ( <> - + Enable sign-in )} @@ -115,7 +115,7 @@ export function UserCard({ e.preventDefault()}> - + Remove } @@ -155,16 +155,18 @@ export function UserCard({ {/* Role + last login meta */}
- }> + }> {formatRole(user.role.name)} {user.lastLoginAt ? ( - }> + }> {formatDistanceToNow(new Date(user.lastLoginAt), { addSuffix: true })} ) : ( - }>Never logged in + }> + Never logged in + )}
diff --git a/src/components/admin/users/user-list.tsx b/src/components/admin/users/user-list.tsx index 19bf19c3..8585df70 100644 --- a/src/components/admin/users/user-list.tsx +++ b/src/components/admin/users/user-list.tsx @@ -130,7 +130,7 @@ export function UserList() { onClick={() => handleEditUser(row.original)} title="Edit user" > - + Edit @@ -149,9 +149,9 @@ export function UserList() { } > {row.original.isActive ? ( - + ) : ( - + )} {row.original.isActive ? 'Disable' : 'Enable'} @@ -176,7 +176,7 @@ export function UserList() { title="Remove from port" className="text-destructive hover:text-destructive" > - + Remove } @@ -201,7 +201,7 @@ export function UserList() { description="Manage users and their roles for this port" actions={ } diff --git a/src/components/admin/vocabularies/vocabularies-manager.tsx b/src/components/admin/vocabularies/vocabularies-manager.tsx index 7d1b4a78..3f277f39 100644 --- a/src/components/admin/vocabularies/vocabularies-manager.tsx +++ b/src/components/admin/vocabularies/vocabularies-manager.tsx @@ -166,7 +166,7 @@ export function VocabulariesManager() {
- Loading… + Loading…
); @@ -208,7 +208,7 @@ export function VocabulariesManager() { disabled={saving === def.key} title="Restore the shipped defaults" > - + Reset @@ -244,7 +244,7 @@ export function VocabulariesManager() { onClick={() => moveEntry(def.key, index, -1)} disabled={index === 0} > - +
removeEntry(def.key, index)} aria-label={`Remove ${entry}`} > - + ))} @@ -285,7 +285,7 @@ export function VocabulariesManager() { onClick={() => addEntry(def.key)} disabled={!v.newEntry.trim()} > - Add + Add
diff --git a/src/components/admin/website-analytics/umami-test-button.tsx b/src/components/admin/website-analytics/umami-test-button.tsx index 7638bb12..9e3d9445 100644 --- a/src/components/admin/website-analytics/umami-test-button.tsx +++ b/src/components/admin/website-analytics/umami-test-button.tsx @@ -50,17 +50,17 @@ export function UmamiTestButton() { {result && (result.ok ? ( - + Connected ({result.visitors ?? 0} active) ) : ( - + {result.error ?? 'Failed'} ))} diff --git a/src/components/berths/berth-card.tsx b/src/components/berths/berth-card.tsx index e8fba621..7052bc8b 100644 --- a/src/components/berths/berth-card.tsx +++ b/src/components/berths/berth-card.tsx @@ -107,7 +107,7 @@ export function BerthCard({ berth }: BerthCardProps) { onClick={(e) => e.stopPropagation()} aria-label={`Actions for berth ${berth.mooringNumber}`} > - + @@ -117,7 +117,7 @@ export function BerthCard({ berth }: BerthCardProps) { router.push(`/${portSlug}/berths/${berth.id}`); }} > - + View details - + Edit diff --git a/src/components/berths/berth-columns.tsx b/src/components/berths/berth-columns.tsx index 55d4ce35..992464fe 100644 --- a/src/components/berths/berth-columns.tsx +++ b/src/components/berths/berth-columns.tsx @@ -147,7 +147,7 @@ function ActionsCell({ row }: { row: { original: BerthRow } }) { className="h-8 w-8" onClick={(e) => e.stopPropagation()} > - + Open menu @@ -158,7 +158,7 @@ function ActionsCell({ row }: { row: { original: BerthRow } }) { router.push(`/${params.portSlug}/berths/${berth.id}`); }} > - + View details - + Edit diff --git a/src/components/berths/berth-deal-documents-tab.tsx b/src/components/berths/berth-deal-documents-tab.tsx index adc94f4d..67b4ef0b 100644 --- a/src/components/berths/berth-deal-documents-tab.tsx +++ b/src/components/berths/berth-deal-documents-tab.tsx @@ -65,7 +65,7 @@ export function BerthDealDocumentsTab({ berthId }: { berthId: string }) { className="flex flex-wrap items-center justify-between gap-2 py-2.5 text-sm" >
- + {doc.title} {doc.documentType}
@@ -76,7 +76,7 @@ export function BerthDealDocumentsTab({ berthId }: { berthId: string }) { href={`/${portSlug}/interests/${doc.interestId}` as any} className="inline-flex items-center gap-1 text-xs text-primary hover:underline" > - Open + Open diff --git a/src/components/berths/berth-detail-header.tsx b/src/components/berths/berth-detail-header.tsx index 6b4697e5..4b56feb3 100644 --- a/src/components/berths/berth-detail-header.tsx +++ b/src/components/berths/berth-detail-header.tsx @@ -290,11 +290,11 @@ export function BerthDetailHeader({ berth }: BerthDetailHeaderProps) {
@@ -369,7 +369,7 @@ function InterestLinkPicker({ ) : ( '— No interest —' )} - + @@ -420,7 +420,7 @@ function InterestLinkPicker({ {stageLabel(opt.pipelineStage)} {value === opt.id ? ( - + ) : null} ))} diff --git a/src/components/berths/berth-interest-pulse.tsx b/src/components/berths/berth-interest-pulse.tsx index 97df770f..d8c8bb39 100644 --- a/src/components/berths/berth-interest-pulse.tsx +++ b/src/components/berths/berth-interest-pulse.tsx @@ -84,7 +84,7 @@ export function BerthInterestPulse({ berthId }: { berthId: string }) { - + Interested parties @@ -99,7 +99,7 @@ export function BerthInterestPulse({ berthId }: { berthId: string }) { - + Interested parties {active.length} @@ -161,7 +161,10 @@ export function BerthInterestPulse({ berthId }: { berthId: string }) {

) : null}
- + ); diff --git a/src/components/berths/berth-reservations-tab.tsx b/src/components/berths/berth-reservations-tab.tsx index a5c4ae84..91c9a63f 100644 --- a/src/components/berths/berth-reservations-tab.tsx +++ b/src/components/berths/berth-reservations-tab.tsx @@ -48,7 +48,7 @@ export function BerthReservationsTab({ berthId }: BerthReservationsTabProps) {

Reservations

diff --git a/src/components/berths/berth-status-suggestion-dialog.tsx b/src/components/berths/berth-status-suggestion-dialog.tsx index 20562206..f4727d46 100644 --- a/src/components/berths/berth-status-suggestion-dialog.tsx +++ b/src/components/berths/berth-status-suggestion-dialog.tsx @@ -60,7 +60,7 @@ export function BerthStatusSuggestionDialog({ {currentStatus.replace(/_/g, ' ')} - + {suggestedStatus.replace(/_/g, ' ')} @@ -73,7 +73,9 @@ export function BerthStatusSuggestionDialog({ Dismiss diff --git a/src/components/berths/waiting-list-manager.tsx b/src/components/berths/waiting-list-manager.tsx index 0fe7e7de..5b07367c 100644 --- a/src/components/berths/waiting-list-manager.tsx +++ b/src/components/berths/waiting-list-manager.tsx @@ -68,7 +68,7 @@ function SortableEntry({ {...listeners} className="cursor-grab active:cursor-grabbing text-muted-foreground" > - + @@ -88,7 +88,7 @@ function SortableEntry({ onClick={() => onRemove(entry.id)} className="text-muted-foreground hover:text-destructive transition-colors" > - + ); @@ -189,7 +189,7 @@ export function WaitingListManager({ berthId }: WaitingListManagerProps) {
Waiting List ({entries.length})
@@ -217,7 +217,9 @@ export function WaitingListManager({ berthId }: WaitingListManagerProps) { />
)} @@ -279,18 +279,18 @@ function BulkArchiveWizardBody({ open, onOpenChange, clientIds, onSuccess }: Pro disabled={carouselIndex === 0} onClick={() => setCarouselIndex((i) => Math.max(0, i - 1))} > - Back + Back {carouselIndex < highStakes.length - 1 ? ( ) : ( )} @@ -304,7 +304,7 @@ function BulkArchiveWizardBody({ open, onOpenChange, clientIds, onSuccess }: Pro > {archiveMutation.isPending ? ( <> - Archiving… + Archiving… ) : ( `Archive ${archivable.length}` diff --git a/src/components/clients/bulk-hard-delete-dialog.tsx b/src/components/clients/bulk-hard-delete-dialog.tsx index 54e23f9a..342bf3eb 100644 --- a/src/components/clients/bulk-hard-delete-dialog.tsx +++ b/src/components/clients/bulk-hard-delete-dialog.tsx @@ -111,7 +111,7 @@ function BulkHardDeleteDialogBody({ onOpenChange, clientIds, onDeleted }: Props) <> - + Permanently delete {clientIds.length} client{clientIds.length === 1 ? '' : 's'} @@ -136,7 +136,7 @@ function BulkHardDeleteDialogBody({ onOpenChange, clientIds, onDeleted }: Props) {stage === 'confirm' && (
- +
Code sent to {maskedEmail}. Enter both fields below. @@ -214,7 +214,7 @@ function BulkHardDeleteDialogBody({ onOpenChange, clientIds, onDeleted }: Props) > {requestCode.isPending ? ( <> - Sending… + Sending… ) : ( 'Send confirmation code' @@ -229,7 +229,7 @@ function BulkHardDeleteDialogBody({ onOpenChange, clientIds, onDeleted }: Props) > {bulkDelete.isPending ? ( <> - Deleting… + Deleting… ) : ( `Permanently delete ${clientIds.length}` diff --git a/src/components/clients/client-card.tsx b/src/components/clients/client-card.tsx index 1b0cb3d8..736d868b 100644 --- a/src/components/clients/client-card.tsx +++ b/src/components/clients/client-card.tsx @@ -61,16 +61,16 @@ export function ClientCard({ client, portSlug, onEdit, onArchive }: ClientCardPr onClick={(e) => e.stopPropagation()} aria-label={`Actions for ${client.fullName}`} > - + onEdit(client)}> - + Edit onArchive(client)}> - + Archive diff --git a/src/components/clients/client-columns.tsx b/src/components/clients/client-columns.tsx index a73db953..675202ae 100644 --- a/src/components/clients/client-columns.tsx +++ b/src/components/clients/client-columns.tsx @@ -121,7 +121,7 @@ export function getClientColumns({ className="inline-flex items-center gap-1.5 text-sm text-foreground hover:text-primary hover:underline" title={`Email ${value}`} > - + {value} ); @@ -147,7 +147,7 @@ export function getClientColumns({ className="inline-flex items-center gap-1.5 text-foreground hover:text-primary hover:underline" title={`Call ${value}`} > - + {value} {waDigits && ( @@ -160,7 +160,7 @@ export function getClientColumns({ title={`WhatsApp ${value}`} aria-label={`WhatsApp ${value}`} > - + )} @@ -303,16 +303,16 @@ export function getClientColumns({ className="h-7 w-7" onClick={(e) => e.stopPropagation()} > - + onEdit(row.original)}> - + Edit onArchive(row.original)}> - + Archive diff --git a/src/components/clients/client-detail-header.tsx b/src/components/clients/client-detail-header.tsx index b910b770..8190bd18 100644 --- a/src/components/clients/client-detail-header.tsx +++ b/src/components/clients/client-detail-header.tsx @@ -167,7 +167,7 @@ export function ClientDetailHeader({ client }: ClientDetailHeaderProps) { title="Permanently delete client" className="shrink-0 rounded-md p-1.5 text-muted-foreground/70 transition-colors hover:bg-destructive/10 hover:text-destructive" > - + )} @@ -182,7 +182,11 @@ export function ClientDetailHeader({ client }: ClientDetailHeaderProps) { isArchived ? 'hover:text-emerald-600' : 'hover:text-destructive', )} > - {isArchived ? : } + {isArchived ? ( + + ) : ( + + )}
diff --git a/src/components/clients/client-form.tsx b/src/components/clients/client-form.tsx index 5e981d0a..c35b8a5b 100644 --- a/src/components/clients/client-form.tsx +++ b/src/components/clients/client-form.tsx @@ -224,7 +224,7 @@ export function ClientForm({ open, onOpenChange, client, onUseExistingClient }: size="sm" onClick={() => append({ channel: 'email', value: '', isPrimary: false })} > - + Add Contact
@@ -333,7 +333,7 @@ export function ClientForm({ open, onOpenChange, client, onUseExistingClient }: className="h-8 text-destructive hover:text-destructive" onClick={() => remove(index)} > - + Remove )} @@ -419,7 +419,7 @@ export function ClientForm({ open, onOpenChange, client, onUseExistingClient }: diff --git a/src/components/clients/client-interests-tab.tsx b/src/components/clients/client-interests-tab.tsx index f376f25e..b047d364 100644 --- a/src/components/clients/client-interests-tab.tsx +++ b/src/components/clients/client-interests-tab.tsx @@ -77,7 +77,10 @@ function InterestRowItem({

{yachtLabel}

) : null}
- +
@@ -364,9 +367,9 @@ function InterestPreviewSheet({ function InterestSkeleton() { return (
- - - + + +
); } @@ -421,7 +424,7 @@ export function ClientInterestsTab({ clientId }: ClientInterestsTabProps) {
diff --git a/src/components/clients/client-list.tsx b/src/components/clients/client-list.tsx index 28b22e1a..f9c493c6 100644 --- a/src/components/clients/client-list.tsx +++ b/src/components/clients/client-list.tsx @@ -167,7 +167,7 @@ export function ClientList() { far-right edge, which is where reps look first. */} diff --git a/src/components/clients/client-pipeline-summary.tsx b/src/components/clients/client-pipeline-summary.tsx index 11018326..3df8a95e 100644 --- a/src/components/clients/client-pipeline-summary.tsx +++ b/src/components/clients/client-pipeline-summary.tsx @@ -124,8 +124,8 @@ function HeroVariant({ clientId, portSlug }: { clientId: string; portSlug: strin if (isLoading) { return (
- - + +
); } @@ -143,7 +143,7 @@ function HeroVariant({ clientId, portSlug }: { clientId: string; portSlug: strin href={`/${portSlug}/interests/new` as Route} className="inline-flex items-center gap-1 text-xs font-medium text-primary hover:underline" > - Start interest + Start interest
); @@ -182,7 +182,10 @@ function HeroVariant({ clientId, portSlug }: { clientId: string; portSlug: strin > {STAGE_LABELS[stage]} - +
@@ -214,8 +217,8 @@ function PanelVariant({ clientId, portSlug }: { clientId: string; portSlug: stri if (isLoading) { return (
- - + +
); } @@ -233,7 +236,7 @@ function PanelVariant({ clientId, portSlug }: { clientId: string; portSlug: stri href={`/${portSlug}/interests/new` as Route} className="inline-flex items-center gap-1 text-xs font-medium text-primary hover:underline" > - Start interest + Start interest
); @@ -289,7 +292,10 @@ function PanelVariant({ clientId, portSlug }: { clientId: string; portSlug: stri - + ); diff --git a/src/components/clients/client-yachts-tab.tsx b/src/components/clients/client-yachts-tab.tsx index a3ab63ee..60965eba 100644 --- a/src/components/clients/client-yachts-tab.tsx +++ b/src/components/clients/client-yachts-tab.tsx @@ -42,7 +42,7 @@ export function ClientYachtsTab({ clientId, yachts }: ClientYachtsTabProps) {

Client-owned yachts

diff --git a/src/components/clients/contacts-editor.tsx b/src/components/clients/contacts-editor.tsx index f39b7ebb..258ab949 100644 --- a/src/components/clients/contacts-editor.tsx +++ b/src/components/clients/contacts-editor.tsx @@ -141,7 +141,7 @@ export function ContactsEditor({ clientId, contacts }: { clientId: string; conta onClick={() => setAdding(true)} className="w-full justify-center" > - + Add contact )} @@ -201,7 +201,7 @@ function ContactRow({ {/* Top / left: channel + value */}
- +
{contact.channel === 'phone' || contact.channel === 'whatsapp' ? ( @@ -282,7 +282,7 @@ function ContactRow({ title="Remove" className="rounded p-1 text-muted-foreground/50 transition-all hover:bg-background/60 hover:text-destructive sm:opacity-0 sm:group-hover:opacity-100" > - +
) : null} @@ -439,7 +439,7 @@ function NewContactForm({
@@ -154,9 +154,9 @@ export function GdprExportButton({ clientId }: { clientId: string }) { @@ -180,7 +180,7 @@ export function GdprExportButton({ clientId }: { clientId: string }) {
{r.sentTo ? (
- + Sent to {r.sentTo}
) : null} @@ -195,7 +195,7 @@ export function GdprExportButton({ clientId }: { clientId: string }) { size="sm" onClick={() => downloadById(r.id)} > - + ) : null} diff --git a/src/components/clients/hard-delete-dialog.tsx b/src/components/clients/hard-delete-dialog.tsx index 0f680d81..6db65f3c 100644 --- a/src/components/clients/hard-delete-dialog.tsx +++ b/src/components/clients/hard-delete-dialog.tsx @@ -94,7 +94,7 @@ function HardDeleteDialogBody({ onOpenChange, clientId, clientName, onDeleted }: <> - + Permanently delete {clientName} @@ -126,7 +126,7 @@ function HardDeleteDialogBody({ onOpenChange, clientId, clientName, onDeleted }: ) : (
- +
Code sent to {maskedEmail}. It expires in 10 @@ -185,7 +185,7 @@ function HardDeleteDialogBody({ onOpenChange, clientId, clientName, onDeleted }: > {requestCode.isPending ? ( <> - Sending… + Sending… ) : ( 'Send confirmation code' @@ -199,7 +199,7 @@ function HardDeleteDialogBody({ onOpenChange, clientId, clientName, onDeleted }: > {hardDelete.isPending ? ( <> - Deleting… + Deleting… ) : ( 'Permanently delete' diff --git a/src/components/clients/portal-invite-button.tsx b/src/components/clients/portal-invite-button.tsx index c24959e0..4d3efb0e 100644 --- a/src/components/clients/portal-invite-button.tsx +++ b/src/components/clients/portal-invite-button.tsx @@ -75,7 +75,7 @@ export function PortalInviteButton({ setOpen(true); }} > - + Invite to portal @@ -96,7 +96,7 @@ export function PortalInviteButton({ {success ? (
- + Activation email sent to {email}.
) : ( @@ -138,7 +138,7 @@ export function PortalInviteButton({ diff --git a/src/components/clients/smart-restore-dialog.tsx b/src/components/clients/smart-restore-dialog.tsx index f501972e..41e20812 100644 --- a/src/components/clients/smart-restore-dialog.tsx +++ b/src/components/clients/smart-restore-dialog.tsx @@ -53,10 +53,10 @@ interface Props { } function iconFor(kind: string) { - if (kind.startsWith('berth_')) return ; - if (kind.startsWith('yacht_')) return ; - if (kind.startsWith('documenso_')) return ; - return ; + if (kind.startsWith('berth_')) return ; + if (kind.startsWith('yacht_')) return ; + if (kind.startsWith('documenso_')) return ; + return ; } export function SmartRestoreDialog(props: Props) { @@ -135,7 +135,7 @@ function SmartRestoreDialogBody({ open, onOpenChange, clientId, clientName, onSu {dossierQuery.isLoading ? (
- + Loading restore dossier…
) : dossierQuery.error || !dossier ? ( @@ -153,7 +153,7 @@ function SmartRestoreDialogBody({ open, onOpenChange, clientId, clientName, onSu - Auto-reversed ( + Auto-reversed ( {dossier.autoReversible.length}) @@ -174,7 +174,7 @@ function SmartRestoreDialogBody({ open, onOpenChange, clientId, clientName, onSu - Opt-in to undo ( + Opt-in to undo ( {dossier.reversibleWithPrompt.length}) @@ -207,7 +207,8 @@ function SmartRestoreDialogBody({ open, onOpenChange, clientId, clientName, onSu - Cannot be undone ({dossier.locked.length}) + Cannot be undone ( + {dossier.locked.length}) @@ -236,7 +237,7 @@ function SmartRestoreDialogBody({ open, onOpenChange, clientId, clientName, onSu > {restoreMutation.isPending ? ( <> - Restoring… + Restoring… ) : ( 'Restore client' diff --git a/src/components/companies/add-membership-dialog.tsx b/src/components/companies/add-membership-dialog.tsx index 2ad4ca1d..dc3def88 100644 --- a/src/components/companies/add-membership-dialog.tsx +++ b/src/components/companies/add-membership-dialog.tsx @@ -208,7 +208,7 @@ export function AddMembershipDialog({ open, onOpenChange, companyId }: AddMember diff --git a/src/components/companies/company-card.tsx b/src/components/companies/company-card.tsx index 573a2bc3..cc172e98 100644 --- a/src/components/companies/company-card.tsx +++ b/src/components/companies/company-card.tsx @@ -66,22 +66,22 @@ export function CompanyCard({ company, portSlug, onEdit, onArchive }: CompanyCar onClick={(e) => e.stopPropagation()} aria-label={`Actions for ${company.name}`} > - + - + View onEdit(company)}> - + Edit onArchive(company)}> - + Archive @@ -89,7 +89,7 @@ export function CompanyCard({ company, portSlug, onEdit, onArchive }: CompanyCar } >
- } /> + } />
{/* Title row + spacer for actions button */}
@@ -108,10 +108,14 @@ export function CompanyCard({ company, portSlug, onEdit, onArchive }: CompanyCar {country || company.taxId ? (
{country ? ( - }>{country} + }> + {country} + ) : null} {company.taxId ? ( - }>{company.taxId} + }> + {company.taxId} + ) : null}
) : null} diff --git a/src/components/companies/company-columns.tsx b/src/components/companies/company-columns.tsx index cf777dde..43ab7976 100644 --- a/src/components/companies/company-columns.tsx +++ b/src/components/companies/company-columns.tsx @@ -157,7 +157,7 @@ export function getCompanyColumns({ className="h-7 w-7" onClick={(e) => e.stopPropagation()} > - + @@ -166,16 +166,16 @@ export function getCompanyColumns({ // eslint-disable-next-line @typescript-eslint/no-explicit-any href={`/${portSlug}/companies/${row.original.id}` as any} > - + View onEdit(row.original)}> - + Edit onArchive(row.original)}> - + Archive diff --git a/src/components/companies/company-detail-header.tsx b/src/components/companies/company-detail-header.tsx index e22d1f5b..4daa7f65 100644 --- a/src/components/companies/company-detail-header.tsx +++ b/src/components/companies/company-detail-header.tsx @@ -108,7 +108,7 @@ export function CompanyDetailHeader({ company }: CompanyDetailHeaderProps) {
@@ -119,7 +119,7 @@ export function CompanyDetailHeader({ company }: CompanyDetailHeaderProps) { onClick={() => setArchiveOpen(true)} disabled={isArchived} > - + Archive diff --git a/src/components/companies/company-form.tsx b/src/components/companies/company-form.tsx index dae13853..818d6373 100644 --- a/src/components/companies/company-form.tsx +++ b/src/components/companies/company-form.tsx @@ -412,7 +412,7 @@ export function CompanyForm({ open, onOpenChange, company }: CompanyFormProps) { size="sm" onClick={() => setClientFormOpen(true)} > - New client + New client
@@ -459,7 +459,7 @@ export function CompanyForm({ open, onOpenChange, company }: CompanyFormProps) { @@ -669,7 +669,7 @@ function EntityMultiPicker({ )} > {placeholder} - + diff --git a/src/components/companies/company-list.tsx b/src/components/companies/company-list.tsx index 469044f2..0ade2916 100644 --- a/src/components/companies/company-list.tsx +++ b/src/components/companies/company-list.tsx @@ -126,7 +126,7 @@ export function CompanyList() { actions={ diff --git a/src/components/companies/company-members-tab.tsx b/src/components/companies/company-members-tab.tsx index c0e1938f..ac4b3ab1 100644 --- a/src/components/companies/company-members-tab.tsx +++ b/src/components/companies/company-members-tab.tsx @@ -159,7 +159,7 @@ export function CompanyMembersTab({ companyId, portSlug }: CompanyMembersTabProp @@ -167,7 +167,7 @@ export function CompanyMembersTab({ companyId, portSlug }: CompanyMembersTabProp {isLoading ? (
- +
) : members.length === 0 ? ( @@ -235,7 +235,7 @@ export function CompanyMembersTab({ companyId, portSlug }: CompanyMembersTabProp onClick={() => setPrimaryMutation.mutate(m.id)} disabled={setPrimaryMutation.isPending} > - + Set Primary )} @@ -245,7 +245,7 @@ export function CompanyMembersTab({ companyId, portSlug }: CompanyMembersTabProp onClick={() => endMutation.mutate(m.id)} disabled={endMutation.isPending} > - + Remove from company )} diff --git a/src/components/companies/company-owned-yachts-tab.tsx b/src/components/companies/company-owned-yachts-tab.tsx index 6cd70b07..6c4d83f7 100644 --- a/src/components/companies/company-owned-yachts-tab.tsx +++ b/src/components/companies/company-owned-yachts-tab.tsx @@ -81,7 +81,7 @@ export function CompanyOwnedYachtsTab({ companyId, portSlug }: CompanyOwnedYacht if (isLoading) { return (
- +
); } diff --git a/src/components/companies/company-picker.tsx b/src/components/companies/company-picker.tsx index f6cf9e8f..c2c50d5c 100644 --- a/src/components/companies/company-picker.tsx +++ b/src/components/companies/company-picker.tsx @@ -65,7 +65,7 @@ export function CompanyPicker({ className={cn('w-full justify-between', !value && 'text-muted-foreground')} > {selectedLabel} - + diff --git a/src/components/dashboard/active-deals-tile.tsx b/src/components/dashboard/active-deals-tile.tsx index 41738f2c..18fa0b6b 100644 --- a/src/components/dashboard/active-deals-tile.tsx +++ b/src/components/dashboard/active-deals-tile.tsx @@ -46,7 +46,7 @@ export function ActiveDealsTile() { Active deals

{isLoading ? ( - + ) : (

{data?.activeInterests ?? 0} diff --git a/src/components/dashboard/berth-status-chart.tsx b/src/components/dashboard/berth-status-chart.tsx index 973978da..35d7e377 100644 --- a/src/components/dashboard/berth-status-chart.tsx +++ b/src/components/dashboard/berth-status-chart.tsx @@ -56,7 +56,7 @@ export function BerthStatusChart() { {isLoading ? ( - + ) : chartData.length === 0 ? (

No berths yet.

) : ( diff --git a/src/components/dashboard/chart-card.tsx b/src/components/dashboard/chart-card.tsx index ebcc2fb8..b7042575 100644 --- a/src/components/dashboard/chart-card.tsx +++ b/src/components/dashboard/chart-card.tsx @@ -114,18 +114,18 @@ export function ChartCard({ aria-label="Chart options" data-testid="chart-menu" > - + {toCsv ? ( - + Download CSV ) : null} - + Download PNG diff --git a/src/components/dashboard/customize-widgets-menu.tsx b/src/components/dashboard/customize-widgets-menu.tsx index bada2462..7f01045e 100644 --- a/src/components/dashboard/customize-widgets-menu.tsx +++ b/src/components/dashboard/customize-widgets-menu.tsx @@ -41,7 +41,7 @@ export function CustomizeWidgetsMenu() { diff --git a/src/components/dashboard/hot-deals-card.tsx b/src/components/dashboard/hot-deals-card.tsx index b292d571..17120772 100644 --- a/src/components/dashboard/hot-deals-card.tsx +++ b/src/components/dashboard/hot-deals-card.tsx @@ -69,9 +69,9 @@ export function HotDealsCard() { {isLoading ? (
- - - + + +
) : deals.length === 0 ? (

diff --git a/src/components/dashboard/kpi-cards.tsx b/src/components/dashboard/kpi-cards.tsx index 7b6a5f57..b44cf145 100644 --- a/src/components/dashboard/kpi-cards.tsx +++ b/src/components/dashboard/kpi-cards.tsx @@ -26,8 +26,8 @@ function KpiTileSkeleton() { return (

- - + +
); } diff --git a/src/components/dashboard/my-reminders-rail.tsx b/src/components/dashboard/my-reminders-rail.tsx index 97ebf544..8c885f79 100644 --- a/src/components/dashboard/my-reminders-rail.tsx +++ b/src/components/dashboard/my-reminders-rail.tsx @@ -82,7 +82,7 @@ export function MyRemindersRail() {
- + Reminders {overdueCount > 0 ? ( @@ -150,7 +150,10 @@ export function MyRemindersRail() { ? 'in ' + formatDistanceToNowStrict(due) : 'now'} - + ); diff --git a/src/components/dashboard/pipeline-value-tile.tsx b/src/components/dashboard/pipeline-value-tile.tsx index f9b8861e..5f7c250f 100644 --- a/src/components/dashboard/pipeline-value-tile.tsx +++ b/src/components/dashboard/pipeline-value-tile.tsx @@ -38,7 +38,7 @@ export function PipelineValueTile() { Pipeline value

{isLoading ? ( - + ) : (

{isLoading ? (

- - - + + +
) : rows.length === 0 ? (

diff --git a/src/components/dashboard/timezone-drift-banner.tsx b/src/components/dashboard/timezone-drift-banner.tsx index 53976565..b5ee8306 100644 --- a/src/components/dashboard/timezone-drift-banner.tsx +++ b/src/components/dashboard/timezone-drift-banner.tsx @@ -103,7 +103,7 @@ export function TimezoneDriftBanner() { return (

- +

You appear to be in{' '} diff --git a/src/components/dashboard/website-glance-tile.tsx b/src/components/dashboard/website-glance-tile.tsx index 893a9115..2139b21c 100644 --- a/src/components/dashboard/website-glance-tile.tsx +++ b/src/components/dashboard/website-glance-tile.tsx @@ -52,7 +52,7 @@ export function WebsiteGlanceTile() { Website today

{loading ? ( - + ) : (
{today.toLocaleString()} diff --git a/src/components/documents/aggregated-section.tsx b/src/components/documents/aggregated-section.tsx index 21de9582..21175f0f 100644 --- a/src/components/documents/aggregated-section.tsx +++ b/src/components/documents/aggregated-section.tsx @@ -56,7 +56,7 @@ export function AggregatedSection({

{icon} {title} - +

); @@ -108,7 +108,7 @@ function GroupBlock({ // The server always sets exactly one of `files` / `workflows` per group; // unify them into a single list for rendering. The discriminated-union // generic on `AggregatedSection` keeps the row type correct upstream. - const items = ((group.files ?? group.workflows ?? []) as unknown) as ItemOfKind[]; + const items = (group.files ?? group.workflows ?? []) as unknown as ItemOfKind[]; return (
diff --git a/src/components/documents/create-document-wizard.tsx b/src/components/documents/create-document-wizard.tsx index 9fa8860b..2faf68d1 100644 --- a/src/components/documents/create-document-wizard.tsx +++ b/src/components/documents/create-document-wizard.tsx @@ -192,7 +192,7 @@ export function CreateDocumentWizard({ portSlug }: CreateDocumentWizardProps) { actions={ } @@ -360,7 +360,7 @@ export function CreateDocumentWizard({ portSlug }: CreateDocumentWizardProps) { Signers
    @@ -405,7 +405,7 @@ export function CreateDocumentWizard({ portSlug }: CreateDocumentWizardProps) { onClick={() => removeSigner(idx)} className="text-muted-foreground hover:text-destructive" > - + ))} diff --git a/src/components/documents/document-detail.tsx b/src/components/documents/document-detail.tsx index 50b49a24..e0c68a4f 100644 --- a/src/components/documents/document-detail.tsx +++ b/src/components/documents/document-detail.tsx @@ -133,7 +133,7 @@ export function DocumentDetail({ documentId, portSlug }: DocumentDetailProps) { actions={ @@ -225,18 +225,18 @@ export function DocumentDetail({ documentId, portSlug }: DocumentDetailProps) {
    {isComplete && doc.signedFileId ? ( <> ) : null} @@ -299,7 +299,7 @@ export function DocumentDetail({ documentId, portSlug }: DocumentDetailProps) { variant="outline" onClick={() => handleRemind(signer.id)} > - Remind + Remind {signer.signingUrl ? ( ))} diff --git a/src/components/documents/document-list.tsx b/src/components/documents/document-list.tsx index 9f99fd06..ac01e69b 100644 --- a/src/components/documents/document-list.tsx +++ b/src/components/documents/document-list.tsx @@ -95,7 +95,7 @@ function DocRow({ doc, onDelete, onSend }: DocRowProps) { )} setMoveOpen(true)}> - + Move to folder… diff --git a/src/components/documents/document-template-picker.tsx b/src/components/documents/document-template-picker.tsx index 3415633d..ef1b5b6b 100644 --- a/src/components/documents/document-template-picker.tsx +++ b/src/components/documents/document-template-picker.tsx @@ -79,7 +79,7 @@ export function DocumentTemplatePicker({ className={cn('w-full justify-between', !value && 'text-muted-foreground')} > {selectedLabel} - + diff --git a/src/components/documents/documents-hub.tsx b/src/components/documents/documents-hub.tsx index 4b6a89ec..daffd38a 100644 --- a/src/components/documents/documents-hub.tsx +++ b/src/components/documents/documents-hub.tsx @@ -311,7 +311,11 @@ function FlatFolderListing({ portSlug, folderId }: FlatFolderListingProps) { onClick={() => setExpandedDocId(expanded ? null : doc.id)} className="flex min-h-[44px] min-w-[44px] items-center justify-center text-muted-foreground transition-transform" > - {expanded ? : } + {expanded ? ( + + ) : ( + + )} ) : documents.length === 0 ? ( } + icon={} title="No documents in this folder" body="Upload a file, generate a signing flow, or move existing documents here." actions={ <> @@ -560,7 +564,7 @@ function FolderDropZone({ folderId, entityType, entityId, children }: FolderDrop {(dragActive || uploading) && (
    - + {uploading ? 'Uploading…' : 'Drop to upload to this folder'}
    diff --git a/src/components/documents/entity-folder-view.tsx b/src/components/documents/entity-folder-view.tsx index ee14efda..06ceea24 100644 --- a/src/components/documents/entity-folder-view.tsx +++ b/src/components/documents/entity-folder-view.tsx @@ -50,7 +50,7 @@ export function EntityFolderView({ portSlug, entityType, entityId }: Props) {
    title="Signing in progress" - icon={} + icon={} groups={workflowGroups} loading={workflowsLoading} emptyMessage="No workflows in flight for this entity." @@ -68,7 +68,7 @@ export function EntityFolderView({ portSlug, entityType, entityId }: Props) { title="Files" - icon={} + icon={} groups={fileGroups} loading={filesLoading} emptyMessage="No files for this entity yet." @@ -86,7 +86,7 @@ export function EntityFolderView({ portSlug, entityType, entityId }: Props) { className="min-h-[44px] gap-1 px-2 text-xs text-brand" onClick={() => setDetailsId(signedFromDocumentId)} > - + View signing details ) : null} diff --git a/src/components/documents/eoi-generate-dialog.tsx b/src/components/documents/eoi-generate-dialog.tsx index d0b3ab12..9f4391a7 100644 --- a/src/components/documents/eoi-generate-dialog.tsx +++ b/src/components/documents/eoi-generate-dialog.tsx @@ -259,7 +259,7 @@ export function EoiGenerateDialog({ - + Generate Expression of Interest @@ -290,9 +290,9 @@ export function EoiGenerateDialog({ {ctxLoading ? (
    - - - + + +
    ) : ctx ? (
    @@ -339,9 +339,9 @@ export function EoiGenerateDialog({ className="inline-flex items-center gap-1 text-xs text-primary hover:underline" onClick={() => onOpenChange(false)} > - + Edit client details - + onOpenChange(false)} > - + Manage linked berths - +
    @@ -365,7 +365,7 @@ export function EoiGenerateDialog({ {!ctxLoading && ctx && !requiredMet && (

    - + Add the missing required details on the client's record before generating the EOI.

    @@ -481,7 +481,7 @@ function PreviewRow({ className="ml-1 inline-flex items-center rounded p-0.5 text-muted-foreground hover:bg-muted/60 hover:text-foreground" aria-label={`Edit ${label}`} > - + ) : null} diff --git a/src/components/documents/folder-actions-menu.tsx b/src/components/documents/folder-actions-menu.tsx index a4357523..bad32a67 100644 --- a/src/components/documents/folder-actions-menu.tsx +++ b/src/components/documents/folder-actions-menu.tsx @@ -87,14 +87,14 @@ export function FolderActionsMenu({ selectedFolderId, onAfterDelete }: FolderAct setCreateOpen(true); }} > - + New folder {isFolderSelected ? 'inside this' : 'at root'} {isFolderSelected ? ( @@ -111,7 +111,7 @@ export function FolderActionsMenu({ selectedFolderId, onAfterDelete }: FolderAct setRenameOpen(true); }} > - + Rename @@ -130,7 +130,7 @@ export function FolderActionsMenu({ selectedFolderId, onAfterDelete }: FolderAct onSelect={(e) => e.preventDefault()} className="text-destructive" > - + Delete } diff --git a/src/components/documents/folder-breadcrumb.tsx b/src/components/documents/folder-breadcrumb.tsx index 0fa24b80..185b5ef0 100644 --- a/src/components/documents/folder-breadcrumb.tsx +++ b/src/components/documents/folder-breadcrumb.tsx @@ -42,7 +42,7 @@ export function FolderBreadcrumb({ selectedFolderId, onSelect }: FolderBreadcrum onClick={() => onSelect(undefined)} className="flex min-h-[44px] items-center gap-1 py-2 hover:text-foreground" > - + All {path.length === 0 && selectedFolderId === null ? ( diff --git a/src/components/documents/folder-tree-sidebar.tsx b/src/components/documents/folder-tree-sidebar.tsx index f2bc1015..a808bcf0 100644 --- a/src/components/documents/folder-tree-sidebar.tsx +++ b/src/components/documents/folder-tree-sidebar.tsx @@ -37,7 +37,7 @@ export function FolderTreeSidebar({ selectedFolderId, onSelect, footer }: Folder @@ -130,7 +130,7 @@ function PseudoRow({ )} onClick={onClick} > - + {label} ); @@ -183,9 +183,9 @@ function FolderRow({ )} > {open && hasChildren ? ( - + ) : ( - + )} {node.name} diff --git a/src/components/documents/hub-root-view.tsx b/src/components/documents/hub-root-view.tsx index fb1ca963..9bb3c473 100644 --- a/src/components/documents/hub-root-view.tsx +++ b/src/components/documents/hub-root-view.tsx @@ -51,7 +51,7 @@ export function HubRootView({ portSlug }: Props) {

    - + Signing in progress

    {workflowsLoading ? ( @@ -76,7 +76,7 @@ export function HubRootView({ portSlug }: Props) {

    - + Recent files

    {filesLoading ? ( diff --git a/src/components/documents/move-to-folder-dialog.tsx b/src/components/documents/move-to-folder-dialog.tsx index 678c6d01..c1e89f5e 100644 --- a/src/components/documents/move-to-folder-dialog.tsx +++ b/src/components/documents/move-to-folder-dialog.tsx @@ -119,7 +119,7 @@ function DialogBody({ } }} > - + Move diff --git a/src/components/documents/new-document-menu.tsx b/src/components/documents/new-document-menu.tsx index 88472b09..7c9a1ff6 100644 --- a/src/components/documents/new-document-menu.tsx +++ b/src/components/documents/new-document-menu.tsx @@ -62,14 +62,14 @@ export function NewDocumentMenu({ setUploadOpen(true)} className="gap-2 py-2.5"> - +
    Upload file @@ -79,7 +79,7 @@ export function NewDocumentMenu({ - +
    Generate document for signing diff --git a/src/components/documents/signing-details-dialog.tsx b/src/components/documents/signing-details-dialog.tsx index b6b6d35e..5078196e 100644 --- a/src/components/documents/signing-details-dialog.tsx +++ b/src/components/documents/signing-details-dialog.tsx @@ -64,7 +64,7 @@ export function SigningDetailsDialog({ documentId, open, onOpenChange }: Props) {isLoading || !data ? (
    - + Loading...
    ) : ( diff --git a/src/components/email/email-accounts-list.tsx b/src/components/email/email-accounts-list.tsx index 8ad9967d..42d117c2 100644 --- a/src/components/email/email-accounts-list.tsx +++ b/src/components/email/email-accounts-list.tsx @@ -117,7 +117,7 @@ export function EmailAccountsList() {

    @@ -126,14 +126,14 @@ export function EmailAccountsList() {

    Loading…

    ) : accounts.length === 0 ? (
    - +

    No email accounts connected.

    ) : (
    {accounts.map((a) => (
    - +
    {a.emailAddress}
    @@ -152,12 +152,12 @@ export function EmailAccountsList() { disabled={syncMutation.isPending} title="Sync now" > - + - + } title="Remove account" diff --git a/src/components/email/email-draft-button.tsx b/src/components/email/email-draft-button.tsx index 6900499d..b1c2f6ed 100644 --- a/src/components/email/email-draft-button.tsx +++ b/src/components/email/email-draft-button.tsx @@ -101,12 +101,12 @@ export function EmailDraftButton({
    diff --git a/src/components/expenses/expense-card.tsx b/src/components/expenses/expense-card.tsx index bb8978eb..77999f2e 100644 --- a/src/components/expenses/expense-card.tsx +++ b/src/components/expenses/expense-card.tsx @@ -108,22 +108,22 @@ export function ExpenseCard({ expense, portSlug, onEdit, onArchive }: ExpenseCar onClick={(e) => e.stopPropagation()} aria-label={`Actions for expense: ${title}`} > - + - + View onEdit(expense)}> - + Edit onArchive(expense)}> - + Archive @@ -131,7 +131,7 @@ export function ExpenseCard({ expense, portSlug, onEdit, onArchive }: ExpenseCar } >
    - } /> + } />
    {/* Title row + spacer for actions button */}
    @@ -159,7 +159,9 @@ export function ExpenseCard({ expense, portSlug, onEdit, onArchive }: ExpenseCar {/* Date meta */} {dateFormatted ? (
    - }>{dateFormatted} + }> + {dateFormatted} +
    ) : null} diff --git a/src/components/expenses/expense-columns.tsx b/src/components/expenses/expense-columns.tsx index 089d39f6..d909200c 100644 --- a/src/components/expenses/expense-columns.tsx +++ b/src/components/expenses/expense-columns.tsx @@ -166,22 +166,22 @@ export function getExpenseColumns({ className="h-7 w-7" onClick={(e) => e.stopPropagation()} > - + - + View onEdit(row.original)}> - + Edit onArchive(row.original)}> - + Archive diff --git a/src/components/expenses/expense-detail.tsx b/src/components/expenses/expense-detail.tsx index 125e198d..73fc1dec 100644 --- a/src/components/expenses/expense-detail.tsx +++ b/src/components/expenses/expense-detail.tsx @@ -48,7 +48,7 @@ function ReceiptThumbnail({ fileId }: { fileId: string }) { if (isLoading) { return (
    - Loading preview… + Loading preview…
    ); } @@ -69,7 +69,7 @@ function ReceiptThumbnail({ fileId }: { fileId: string }) { ) : (
    - +
    )}
    @@ -78,7 +78,7 @@ function ReceiptThumbnail({ fileId }: { fileId: string }) { href={`/api/v1/files/${fileId}/download`} className="inline-flex items-center gap-1 text-primary hover:underline" > - Download + Download
    @@ -131,7 +131,7 @@ export function ExpenseDetail({ expenseId, onEdit, onArchived }: ExpenseDetailPr if (isLoading) { return (
    - +
    ); } @@ -162,7 +162,7 @@ export function ExpenseDetail({ expenseId, onEdit, onArchived }: ExpenseDetailPr {onEdit && ( @@ -174,7 +174,7 @@ export function ExpenseDetail({ expenseId, onEdit, onArchived }: ExpenseDetailPr className="text-destructive" onClick={() => setArchiveOpen(true)} > - + Archive @@ -259,7 +259,7 @@ export function ExpenseDetail({ expenseId, onEdit, onArchived }: ExpenseDetailPr - + Receipts ({expense.receiptFileIds.length}) diff --git a/src/components/expenses/expense-duplicate-banner.tsx b/src/components/expenses/expense-duplicate-banner.tsx index f4402145..8790748a 100644 --- a/src/components/expenses/expense-duplicate-banner.tsx +++ b/src/components/expenses/expense-duplicate-banner.tsx @@ -75,7 +75,7 @@ export function ExpenseDuplicateBanner({ expense }: Props) { )} >
    - +

    Looks like a duplicate

    diff --git a/src/components/expenses/expense-form-dialog.tsx b/src/components/expenses/expense-form-dialog.tsx index 3480a4cd..b4c636ef 100644 --- a/src/components/expenses/expense-form-dialog.tsx +++ b/src/components/expenses/expense-form-dialog.tsx @@ -363,7 +363,7 @@ export function ExpenseFormDialog({ open, onOpenChange, expense }: ExpenseFormDi disabled={noReceipt} onClick={() => fileInputRef.current?.click()} > - + Upload receipt image or PDF )} @@ -393,7 +393,7 @@ export function ExpenseFormDialog({ open, onOpenChange, expense }: ExpenseFormDi {noReceipt && (

    - + Expenses without a receipt may not be reimbursed by the parent company. The PDF export will flag this expense. @@ -416,7 +416,7 @@ export function ExpenseFormDialog({ open, onOpenChange, expense }: ExpenseFormDi disabled={isSubmitting || mutation.isPending || isUploading || !canSubmit} > {(isSubmitting || mutation.isPending) && ( - + )} {isEdit ? 'Save changes' : 'Create Expense'} diff --git a/src/components/expenses/trip-label-combobox.tsx b/src/components/expenses/trip-label-combobox.tsx index 7508ab9b..9bc1858f 100644 --- a/src/components/expenses/trip-label-combobox.tsx +++ b/src/components/expenses/trip-label-combobox.tsx @@ -73,7 +73,7 @@ export function TripLabelCombobox({ className={cn('w-full justify-between font-normal', !value && 'text-muted-foreground')} > {value || placeholder} - + @@ -102,7 +102,7 @@ export function TripLabelCombobox({ {showCreate ? ( commit(trimmed)}> - + Create “{trimmed}” diff --git a/src/components/interests/add-berth-to-interest-dialog.tsx b/src/components/interests/add-berth-to-interest-dialog.tsx index bdc690cb..9f15549f 100644 --- a/src/components/interests/add-berth-to-interest-dialog.tsx +++ b/src/components/interests/add-berth-to-interest-dialog.tsx @@ -81,7 +81,7 @@ export function AddBerthToInterestDialog({ title="Pitching specifically" description="The client is pitched on this exact berth." consequence="This berth will appear as under interest on the public map." - icon={} + icon={} /> } + icon={} /> @@ -109,7 +109,9 @@ export function AddBerthToInterestDialog({ Cancel diff --git a/src/components/interests/berth-recommender-panel.tsx b/src/components/interests/berth-recommender-panel.tsx index de4c5903..490c109d 100644 --- a/src/components/interests/berth-recommender-panel.tsx +++ b/src/components/interests/berth-recommender-panel.tsx @@ -156,7 +156,7 @@ function RecommendationCard({ rec, portSlug, onAdd }: RecommendationCardProps) { {showHeat ? ( - + Heat {Math.round(rec.heat!.total)} ) : null} @@ -174,9 +174,9 @@ function RecommendationCard({ rec, portSlug, onAdd }: RecommendationCardProps) {
    {expanded ? ( - + ) : ( - + )} @@ -213,7 +213,7 @@ function RecommendationCard({ rec, portSlug, onAdd }: RecommendationCardProps) { onAdd(rec); }} > - + Add to interest diff --git a/src/components/interests/inline-stage-picker.tsx b/src/components/interests/inline-stage-picker.tsx index 74eded5d..ebe1dd7e 100644 --- a/src/components/interests/inline-stage-picker.tsx +++ b/src/components/interests/inline-stage-picker.tsx @@ -217,9 +217,9 @@ export function InlineStagePicker({ > {STAGE_LABELS[stage]} {mutation.isPending ? ( - + ) : showChevron ? ( - + ) : null} @@ -234,7 +234,7 @@ export function InlineStagePicker({ // strongly nudged for the audit log.
    - +

    Override transition

    @@ -270,7 +270,7 @@ export function InlineStagePicker({ disabled={mutation.isPending} className="gap-1" > - + Back

    @@ -324,9 +326,12 @@ export function InlineStagePicker({ /> {STAGE_LABELS[s]} {isPending ? ( - + ) : isCurrent ? ( - + ) : isOverride && canOverride ? ( - {unlinking && } + {unlinking && } Unlink {linkedBerthCount} {linkedBerthCount === 1 ? 'berth' : 'berths'} & reset diff --git a/src/components/interests/interest-card.tsx b/src/components/interests/interest-card.tsx index 9c4a8c3e..ce830b77 100644 --- a/src/components/interests/interest-card.tsx +++ b/src/components/interests/interest-card.tsx @@ -73,16 +73,16 @@ export function InterestCard({ interest, portSlug, onEdit, onArchive }: Interest onClick={(e) => e.stopPropagation()} aria-label={`Actions for ${clientName}'s interest`} > - + onEdit(interest)}> - + Edit onArchive(interest)}> - + Archive @@ -104,7 +104,7 @@ export function InterestCard({ interest, portSlug, onEdit, onArchive }: Interest aria-label={`${notesCount} note${notesCount === 1 ? '' : 's'}`} className="inline-flex shrink-0 items-center text-muted-foreground" > - + ) : null}
    diff --git a/src/components/interests/interest-columns.tsx b/src/components/interests/interest-columns.tsx index 298df995..69599779 100644 --- a/src/components/interests/interest-columns.tsx +++ b/src/components/interests/interest-columns.tsx @@ -134,7 +134,7 @@ export function getInterestColumns({ aria-label={`${notesCount} note${notesCount === 1 ? '' : 's'}`} className="inline-flex items-center text-muted-foreground" > - + ) : null}
    @@ -294,16 +294,16 @@ export function getInterestColumns({ className="h-7 w-7" onClick={(e) => e.stopPropagation()} > - + onEdit(row.original)}> - + Edit onArchive(row.original)}> - + Archive diff --git a/src/components/interests/interest-contact-log-tab.tsx b/src/components/interests/interest-contact-log-tab.tsx index 4fa5acc9..de6e3fdb 100644 --- a/src/components/interests/interest-contact-log-tab.tsx +++ b/src/components/interests/interest-contact-log-tab.tsx @@ -114,15 +114,15 @@ export function InterestContactLogTab({ interestId }: InterestContactLogTabProps

    {isLoading ? (
    - - + +
    ) : entries.length === 0 ? ( setComposeOpen(true)} /> @@ -183,7 +183,7 @@ function ContactLogRow({ channelMeta.tone, )} > - +
    @@ -201,7 +201,7 @@ function ContactLogRow({

    {entry.summary}

    {entry.followUpAt && (

    - + Follow up {format(new Date(entry.followUpAt), 'MMM d, yyyy')} (reminder created)

    )} @@ -209,12 +209,12 @@ function ContactLogRow({ onEdit(entry)}> - + Edit - + Delete @@ -246,7 +246,7 @@ function EmptyState({ onAdd }: { onAdd: () => void }) { return (
    - +

    No contact logged yet

    @@ -254,7 +254,7 @@ function EmptyState({ onAdd }: { onAdd: () => void }) { picks up the deal.

    diff --git a/src/components/interests/interest-contract-tab.tsx b/src/components/interests/interest-contract-tab.tsx index 98da4ddc..25354433 100644 --- a/src/components/interests/interest-contract-tab.tsx +++ b/src/components/interests/interest-contract-tab.tsx @@ -106,7 +106,7 @@ export function InterestContractTab({ interestId, clientId: _clientId }: Interes return (
    {docsLoading ? ( - + ) : activeDoc ? ( Open - + )} @@ -232,7 +232,7 @@ function ActiveContractCard({
    - +

    {doc.title}

    @@ -261,7 +261,11 @@ function ActiveContractCard({ onClick={() => remindAllMutation.mutate()} className="gap-1.5 [&_svg]:size-3.5" > - {remindAllMutation.isPending ? : } + {remindAllMutation.isPending ? ( + + ) : ( + + )} Remind all )} @@ -274,7 +278,7 @@ function ActiveContractCard({ {signersLoading ? (
    - Loading signers… + Loading signers…
    ) : signers.length === 0 ? (

    @@ -287,7 +291,7 @@ function ActiveContractCard({

    - + Reminders are rate-limited (max once per 7 days per signer).

    @@ -338,7 +342,7 @@ function EmptyContractState({ return (
    - +

    No contract in flight for this interest @@ -349,11 +353,11 @@ function EmptyContractState({

    @@ -372,7 +376,7 @@ function StatusBadge({ status }: { status: DocumentRow['status'] }) { STATUS_TONES[status], )} > - {status === 'completed' && } + {status === 'completed' && } {STATUS_LABELS[status]} ); diff --git a/src/components/interests/interest-detail-header.tsx b/src/components/interests/interest-detail-header.tsx index f3c0439e..88825eca 100644 --- a/src/components/interests/interest-detail-header.tsx +++ b/src/components/interests/interest-detail-header.tsx @@ -231,7 +231,7 @@ export function InterestDetailHeader({ portSlug, interest }: InterestDetailHeade interest.activeReminderCount === 1 ? '' : 's' }`} > - + {interest.activeReminderCount} ) : null} @@ -336,7 +336,7 @@ export function InterestDetailHeader({ portSlug, interest }: InterestDetailHeade 'hover:bg-foreground/5 disabled:opacity-50', )} > - + Reopen ) : ( @@ -358,7 +358,7 @@ export function InterestDetailHeader({ portSlug, interest }: InterestDetailHeade 'hover:bg-emerald-100', )} > - + Mark won @@ -395,7 +395,7 @@ export function InterestDetailHeader({ portSlug, interest }: InterestDetailHeade 'hover:bg-foreground/5 hover:text-foreground', )} > - + @@ -410,7 +410,11 @@ export function InterestDetailHeader({ portSlug, interest }: InterestDetailHeade isArchived ? 'hover:text-foreground' : 'hover:text-destructive', )} > - {isArchived ? : } + {isArchived ? ( + + ) : ( + + )}

    diff --git a/src/components/interests/interest-documents-tab.tsx b/src/components/interests/interest-documents-tab.tsx index c04ed4f4..075a052a 100644 --- a/src/components/interests/interest-documents-tab.tsx +++ b/src/components/interests/interest-documents-tab.tsx @@ -110,7 +110,7 @@ export function InterestDocumentsTab({ interestId }: InterestDocumentsTabProps) emptyState={
    - +

    No documents yet

    diff --git a/src/components/interests/interest-eoi-tab.tsx b/src/components/interests/interest-eoi-tab.tsx index 317b6d4e..f6793b20 100644 --- a/src/components/interests/interest-eoi-tab.tsx +++ b/src/components/interests/interest-eoi-tab.tsx @@ -106,7 +106,7 @@ export function InterestEoiTab({ interestId, clientId }: InterestEoiTabProps) { return (
    {docsLoading ? ( - + ) : activeDoc ? ( Open - + )} @@ -221,7 +221,7 @@ function ActiveEoiCard({
    - +

    {doc.title}

    @@ -250,7 +250,11 @@ function ActiveEoiCard({ onClick={() => remindAllMutation.mutate()} className="gap-1.5 [&_svg]:size-3.5" > - {remindAllMutation.isPending ? : } + {remindAllMutation.isPending ? ( + + ) : ( + + )} Remind all )} @@ -263,7 +267,7 @@ function ActiveEoiCard({ {signersLoading ? (
    - Loading signers… + Loading signers…
    ) : signers.length === 0 ? (

    @@ -276,7 +280,7 @@ function ActiveEoiCard({

    - + Reminders are rate-limited (max once per 7 days per signer).

    @@ -327,7 +331,7 @@ function EmptyEoiState({ return (
    - +

    No EOI in flight for this interest @@ -338,11 +342,11 @@ function EmptyEoiState({

    @@ -359,7 +363,7 @@ function StatusBadge({ status }: { status: DocumentRow['status'] }) { STATUS_TONES[status], )} > - {status === 'completed' && } + {status === 'completed' && } {STATUS_LABELS[status]} ); diff --git a/src/components/interests/interest-form.tsx b/src/components/interests/interest-form.tsx index 389a6c33..84dfbe24 100644 --- a/src/components/interests/interest-form.tsx +++ b/src/components/interests/interest-form.tsx @@ -278,7 +278,7 @@ export function InterestForm({ open, onOpenChange, defaultClientId, interest }: disabled={isEdit} > {selectedClient?.label ?? interest?.clientName ?? 'Select client...'} - + @@ -336,7 +336,7 @@ export function InterestForm({ open, onOpenChange, defaultClientId, interest }: )} > {selectedBerth?.label ?? interest?.berthMooringNumber ?? 'Select berth...'} - + @@ -398,7 +398,7 @@ export function InterestForm({ open, onOpenChange, defaultClientId, interest }: className="h-7 text-xs" onClick={() => setCreateYachtOpen(true)} > - + Add new )} @@ -581,7 +581,7 @@ export function InterestForm({ open, onOpenChange, defaultClientId, interest }: diff --git a/src/components/interests/interest-list.tsx b/src/components/interests/interest-list.tsx index f65a0f60..b2609487 100644 --- a/src/components/interests/interest-list.tsx +++ b/src/components/interests/interest-list.tsx @@ -179,7 +179,7 @@ export function InterestList() { className="rounded-none" onClick={() => setViewMode('table')} > - +

    @@ -350,7 +350,7 @@ export function InterestList() { aria-label="New interest" className="fixed bottom-[calc(env(safe-area-inset-bottom)+86px)] right-4 z-40 inline-flex h-12 w-12 items-center justify-center rounded-full bg-primary text-primary-foreground shadow-lg transition-transform hover:scale-105 active:scale-95 lg:hidden" > - + diff --git a/src/components/interests/interest-outcome-dialog.tsx b/src/components/interests/interest-outcome-dialog.tsx index daaea08f..6a198735 100644 --- a/src/components/interests/interest-outcome-dialog.tsx +++ b/src/components/interests/interest-outcome-dialog.tsx @@ -83,9 +83,9 @@ export function InterestOutcomeDialog({ interestId, open, onOpenChange, mode }: {mode === 'won' ? ( - + ) : ( - + )} {mode === 'won' ? 'Mark interest as won' : 'Close interest as lost'} @@ -148,7 +148,7 @@ export function InterestOutcomeDialog({ interestId, open, onOpenChange, mode }: : 'bg-rose-600 hover:bg-rose-700' } > - {mutation.isPending && } + {mutation.isPending && } {mode === 'won' ? 'Mark as won' : 'Close as lost'} diff --git a/src/components/interests/interest-picker.tsx b/src/components/interests/interest-picker.tsx index 4ba8ff55..4ca10047 100644 --- a/src/components/interests/interest-picker.tsx +++ b/src/components/interests/interest-picker.tsx @@ -73,7 +73,7 @@ export function InterestPicker({ className={cn('w-full justify-between', !value && 'text-muted-foreground')} > {selectedLabel} - + diff --git a/src/components/interests/interest-reservation-tab.tsx b/src/components/interests/interest-reservation-tab.tsx index 22757ae6..654f5df6 100644 --- a/src/components/interests/interest-reservation-tab.tsx +++ b/src/components/interests/interest-reservation-tab.tsx @@ -109,7 +109,7 @@ export function InterestReservationTab({ return (
    {docsLoading ? ( - + ) : activeDoc ? ( Open - + )} @@ -235,7 +235,7 @@ function ActiveReservationCard({
    - +

    {doc.title}

    @@ -264,7 +264,11 @@ function ActiveReservationCard({ onClick={() => remindAllMutation.mutate()} className="gap-1.5 [&_svg]:size-3.5" > - {remindAllMutation.isPending ? : } + {remindAllMutation.isPending ? ( + + ) : ( + + )} Remind all )} @@ -277,7 +281,7 @@ function ActiveReservationCard({ {signersLoading ? (
    - Loading signers… + Loading signers…
    ) : signers.length === 0 ? (

    @@ -290,7 +294,7 @@ function ActiveReservationCard({

    - + Reminders are rate-limited (max once per 7 days per signer).

    @@ -341,7 +345,7 @@ function EmptyReservationState({ return (
    - +

    No reservation in flight for this interest @@ -352,11 +356,11 @@ function EmptyReservationState({

    @@ -375,7 +379,7 @@ function StatusBadge({ status }: { status: DocumentRow['status'] }) { STATUS_TONES[status], )} > - {status === 'completed' && } + {status === 'completed' && } {STATUS_LABELS[status]} ); diff --git a/src/components/interests/interest-stage-picker.tsx b/src/components/interests/interest-stage-picker.tsx index 4c71b4ef..61dab782 100644 --- a/src/components/interests/interest-stage-picker.tsx +++ b/src/components/interests/interest-stage-picker.tsx @@ -115,7 +115,7 @@ export function InterestStagePicker({ : 'border-red-300 bg-red-50 text-red-900' }`} > - + {canOverride ? ( This is not a normal forward transition. Override is enabled — supply a reason @@ -175,7 +175,7 @@ export function InterestStagePicker({ !reasonValid } > - {mutation.isPending && } + {mutation.isPending && } {overrideEffective ? 'Override stage' : 'Confirm'} diff --git a/src/components/interests/interest-tabs.tsx b/src/components/interests/interest-tabs.tsx index 468d5890..73b8be0b 100644 --- a/src/components/interests/interest-tabs.tsx +++ b/src/components/interests/interest-tabs.tsx @@ -340,7 +340,7 @@ function MilestoneSection({ return (
  • {done ? ( - + ) : ( @@ -710,7 +710,7 @@ function OverviewTab({ Past {pastMilestones.map((m) => ( - + {m.title} · {m.pastSummary} diff --git a/src/components/interests/interest-timeline.tsx b/src/components/interests/interest-timeline.tsx index 17a4ddaf..c68466b4 100644 --- a/src/components/interests/interest-timeline.tsx +++ b/src/components/interests/interest-timeline.tsx @@ -46,17 +46,23 @@ function eventIcon(event: TimelineEvent) { if (type === 'outcome_set') { const outcome = (event.metadata as Record).outcome as string | undefined; - if (outcome === 'won') return ; - if (outcome && LOST_OUTCOMES.has(outcome)) return ; - return ; + if (outcome === 'won') return ; + if (outcome && LOST_OUTCOMES.has(outcome)) + return ; + return ; } - if (type === 'outcome_cleared') return ; - if (event.type === 'document_event') return ; - if (event.action === 'create') return ; - if (event.action === 'archive') return ; - if (event.action === 'restore') return ; - if (type === 'stage_change') return ; - return ; + if (type === 'outcome_cleared') + return ; + if (event.type === 'document_event') + return ; + if (event.action === 'create') + return ; + if (event.action === 'archive') + return ; + if (event.action === 'restore') + return ; + if (type === 'stage_change') return ; + return ; } function actorLabel(event: TimelineEvent): string | null { @@ -121,7 +127,7 @@ export function InterestTimeline({ interestId }: InterestTimelineProps) { {event.description} {isAuto ? ( - + Auto ) : null} diff --git a/src/components/interests/linked-berths-list.tsx b/src/components/interests/linked-berths-list.tsx index 6776c9bf..fad6fade 100644 --- a/src/components/interests/linked-berths-list.tsx +++ b/src/components/interests/linked-berths-list.tsx @@ -220,7 +220,7 @@ function BypassDialog({ row, open, onOpenChange, onSubmit, isPending }: BypassDi onClick={() => onSubmit(reason.trim().length > 0 ? reason.trim() : null)} disabled={isPending || reason.trim().length === 0} > - {isPending ? : null} + {isPending ? : null} Save bypass @@ -266,7 +266,7 @@ function LinkedBerthRowItem({ row, portSlug, eoiStatus, onUpdate, onRemove, isPe {formatStatus(row.status)} {row.isPrimary ? ( - + Primary ) : null} @@ -287,7 +287,7 @@ function LinkedBerthRowItem({ row, portSlug, eoiStatus, onUpdate, onRemove, isPe onClick={() => onUpdate(row.berthId, { isPrimary: true })} disabled={isPending} > - + Set as primary ) : null} @@ -300,7 +300,7 @@ function LinkedBerthRowItem({ row, portSlug, eoiStatus, onUpdate, onRemove, isPe className="text-destructive hover:text-destructive" aria-label={`Remove berth ${row.mooringNumber ?? row.berthId}`} > - +
  • @@ -334,7 +334,7 @@ function LinkedBerthRowItem({ row, portSlug, eoiStatus, onUpdate, onRemove, isPe className="inline-flex h-5 w-5 items-center justify-center rounded-full text-muted-foreground hover:bg-muted/60 hover:text-foreground" aria-label="What does Specifically pitching do?" > - + @@ -369,7 +369,7 @@ function LinkedBerthRowItem({ row, portSlug, eoiStatus, onUpdate, onRemove, isPe className="inline-flex h-5 w-5 items-center justify-center rounded-full text-muted-foreground hover:bg-muted/60 hover:text-foreground" aria-label="What does Mark in EOI bundle do?" > - + @@ -484,7 +484,7 @@ export function LinkedBerthsList({ interestId }: LinkedBerthsListProps) { - + Linked berths{rows.length > 0 ? ` (${rows.length})` : ''} diff --git a/src/components/interests/recommendation-list.tsx b/src/components/interests/recommendation-list.tsx index 9a7d5971..c5af8a85 100644 --- a/src/components/interests/recommendation-list.tsx +++ b/src/components/interests/recommendation-list.tsx @@ -58,9 +58,9 @@ export function RecommendationList({ interestId }: RecommendationListProps) { disabled={generateMutation.isPending} > {generateMutation.isPending ? ( - + ) : ( - + )} Generate Recommendations diff --git a/src/components/interests/send-from-interest-button.tsx b/src/components/interests/send-from-interest-button.tsx index b3cc0c20..3ef77d3d 100644 --- a/src/components/interests/send-from-interest-button.tsx +++ b/src/components/interests/send-from-interest-button.tsx @@ -28,7 +28,7 @@ export function SendFromInterestButton({ return ( <> - + Legend diff --git a/src/components/layout/breadcrumbs.tsx b/src/components/layout/breadcrumbs.tsx index c1dc7478..668f3163 100644 --- a/src/components/layout/breadcrumbs.tsx +++ b/src/components/layout/breadcrumbs.tsx @@ -123,7 +123,7 @@ export function Breadcrumbs() { {!crumb.isLast && ( - + )} diff --git a/src/components/layout/inbox.tsx b/src/components/layout/inbox.tsx index f6c5afac..fa275914 100644 --- a/src/components/layout/inbox.tsx +++ b/src/components/layout/inbox.tsx @@ -123,7 +123,7 @@ export function Inbox() { aria-label={`Inbox${combined > 0 ? ` (${combined} unread)` : ''}`} data-testid="inbox-bell" > - + {combined > 0 ? ( - + ) : (
    {collapsed ? ( - + ) : ( - + )} )} @@ -334,9 +334,9 @@ function SidebarContent({ className="text-slate-400 hover:text-slate-700 transition-colors" > {adminExpanded ? ( - + ) : ( - + )} )} @@ -355,7 +355,7 @@ function SidebarContent({ ))}
)} - +
); })} diff --git a/src/components/layout/topbar.tsx b/src/components/layout/topbar.tsx index 63687517..9ca5066a 100644 --- a/src/components/layout/topbar.tsx +++ b/src/components/layout/topbar.tsx @@ -68,7 +68,7 @@ export function Topbar({ ports, user }: TopbarProps) { 'text-muted-foreground hover:text-foreground hover:bg-accent transition-colors', )} > - + )} @@ -92,7 +92,7 @@ export function Topbar({ ports, user }: TopbarProps) { size="sm" className="bg-gradient-brand hover:opacity-90 text-white gap-1.5 shadow-sm transition-all duration-base ease-smooth hover:scale-[1.02]" > - + New diff --git a/src/components/layout/user-menu.tsx b/src/components/layout/user-menu.tsx index 39130c9e..bddd1d2a 100644 --- a/src/components/layout/user-menu.tsx +++ b/src/components/layout/user-menu.tsx @@ -91,7 +91,7 @@ export function UserMenu({ trigger, align = 'end', user, ports }: UserMenuProps) regardless of how many ports the operator has access to. */} - + Switch port @@ -116,31 +116,31 @@ export function UserMenu({ trigger, align = 'end', user, ports }: UserMenuProps) {/* eslint-disable-next-line @typescript-eslint/no-explicit-any */} router.push(`${base}/settings/profile` as any)}> - + Profile {/* eslint-disable-next-line @typescript-eslint/no-explicit-any */} router.push(`${base}/settings` as any)}> - + Settings router.push(`${base}/settings#notifications` as any)} > - + Notification preferences {darkMode ? ( <> - + Light Mode ) : ( <> - + Dark Mode )} @@ -150,7 +150,7 @@ export function UserMenu({ trigger, align = 'end', user, ports }: UserMenuProps) className="text-destructive focus:text-destructive" onClick={() => router.push('/api/auth/sign-out')} > - + Sign Out diff --git a/src/components/reminders/reminder-card.tsx b/src/components/reminders/reminder-card.tsx index 496f45e9..6f121f70 100644 --- a/src/components/reminders/reminder-card.tsx +++ b/src/components/reminders/reminder-card.tsx @@ -136,7 +136,7 @@ export function ReminderCard({ onClick={(e) => e.stopPropagation()} aria-label={`Actions for reminder: ${reminder.title}`} > - + @@ -146,7 +146,7 @@ export function ReminderCard({ onComplete(reminder.id); }} > - + Complete - + Snooze - + Edit - + Dismiss @@ -183,7 +183,7 @@ export function ReminderCard({ } >
- } /> + } />
{/* Title row + spacer for actions button */}
diff --git a/src/components/reminders/reminder-list.tsx b/src/components/reminders/reminder-list.tsx index a6624a08..e87e8aba 100644 --- a/src/components/reminders/reminder-list.tsx +++ b/src/components/reminders/reminder-list.tsx @@ -153,7 +153,7 @@ export function ReminderList({ embedded = false }: ReminderListProps = {}) { Auto )} - {overdue && } + {overdue && }
{row.original.client && ( @@ -193,7 +193,7 @@ export function ReminderList({ embedded = false }: ReminderListProps = {}) { const Icon = config.icon; return (
- + {config.label}
); @@ -218,7 +218,7 @@ export function ReminderList({ embedded = false }: ReminderListProps = {}) { className="text-green-600 hover:text-green-700" onClick={() => handleComplete(row.original.id)} > - + Mark complete @@ -231,7 +231,7 @@ export function ReminderList({ embedded = false }: ReminderListProps = {}) { aria-label="Snooze" onClick={() => setSnoozingId(row.original.id)} > - + Snooze @@ -248,7 +248,7 @@ export function ReminderList({ embedded = false }: ReminderListProps = {}) { setFormOpen(true); }} > - + Edit @@ -262,7 +262,7 @@ export function ReminderList({ embedded = false }: ReminderListProps = {}) { className="text-muted-foreground hover:text-foreground" onClick={() => handleDismiss(row.original.id)} > - + Dismiss @@ -289,7 +289,7 @@ export function ReminderList({ embedded = false }: ReminderListProps = {}) { setFormOpen(true); }} > - + New Reminder } @@ -303,7 +303,7 @@ export function ReminderList({ embedded = false }: ReminderListProps = {}) { setFormOpen(true); }} > - + New Reminder
@@ -371,7 +371,7 @@ export function ReminderList({ embedded = false }: ReminderListProps = {}) { )} emptyState={
- +

No reminders.

diff --git a/src/components/reservations/reservation-detail.tsx b/src/components/reservations/reservation-detail.tsx index 32e2b464..06bb0f3c 100644 --- a/src/components/reservations/reservation-detail.tsx +++ b/src/components/reservations/reservation-detail.tsx @@ -165,7 +165,7 @@ export function ReservationDetail({ reservationId, portSlug }: ReservationDetail actions={ } @@ -195,13 +195,13 @@ export function ReservationDetail({ reservationId, portSlug }: ReservationDetail {completedAgreement.signedFileId ? ( ) : null}
@@ -233,7 +233,7 @@ export function ReservationDetail({ reservationId, portSlug }: ReservationDetail
@@ -259,7 +259,7 @@ export function ReservationDetail({ reservationId, portSlug }: ReservationDetail return ( } + icon={} title="No reservation agreement yet" body="Generate an agreement for the parties to sign before activation." actions={ @@ -295,13 +295,13 @@ export function ReservationDetail({ reservationId, portSlug }: ReservationDetail
{res.status === 'active' && ( )}
diff --git a/src/components/residential/residential-client-detail-header.tsx b/src/components/residential/residential-client-detail-header.tsx index 35ae990b..24fa4b39 100644 --- a/src/components/residential/residential-client-detail-header.tsx +++ b/src/components/residential/residential-client-detail-header.tsx @@ -33,7 +33,7 @@ export function ResidentialClientDetailHeader({ client, onSaveName }: Props) {
- Residential client + Residential client

diff --git a/src/components/residential/residential-client-tabs.tsx b/src/components/residential/residential-client-tabs.tsx index 21c3f021..8ba5fc72 100644 --- a/src/components/residential/residential-client-tabs.tsx +++ b/src/components/residential/residential-client-tabs.tsx @@ -263,7 +263,7 @@ function InterestsTab({

Interests

diff --git a/src/components/residential/residential-clients-list.tsx b/src/components/residential/residential-clients-list.tsx index 81abd59e..122df1e1 100644 --- a/src/components/residential/residential-clients-list.tsx +++ b/src/components/residential/residential-clients-list.tsx @@ -72,7 +72,7 @@ export function ResidentialClientsList() { description="Inquiries and clients for the residential side" actions={ } diff --git a/src/components/shared/addresses-editor.tsx b/src/components/shared/addresses-editor.tsx index 3f4a41d0..f51174ae 100644 --- a/src/components/shared/addresses-editor.tsx +++ b/src/components/shared/addresses-editor.tsx @@ -105,7 +105,7 @@ export function AddressesEditor({ endpoint, invalidateKey, addresses }: Addresse className="w-full justify-center" data-testid="add-address-button" > - + Add address )} @@ -135,7 +135,7 @@ function AddressCard({ return (
- +
- +
@@ -441,7 +441,7 @@ function NewAddressForm({ Cancel
diff --git a/src/components/shared/archive-confirm-dialog.tsx b/src/components/shared/archive-confirm-dialog.tsx index 785388ee..0d8d262c 100644 --- a/src/components/shared/archive-confirm-dialog.tsx +++ b/src/components/shared/archive-confirm-dialog.tsx @@ -58,7 +58,7 @@ export function ArchiveConfirmDialog({ isArchived ? '' : 'bg-destructive text-destructive-foreground hover:bg-destructive/90' } > - {isLoading && } + {isLoading && } {action} diff --git a/src/components/shared/berth-picker.tsx b/src/components/shared/berth-picker.tsx index ed2ab963..c25f3e41 100644 --- a/src/components/shared/berth-picker.tsx +++ b/src/components/shared/berth-picker.tsx @@ -136,7 +136,7 @@ export function BerthPicker({ className={cn('w-full justify-between', !value && 'text-muted-foreground')} > {selectedLabel} - + diff --git a/src/components/shared/client-picker.tsx b/src/components/shared/client-picker.tsx index 3e6d6e7f..252ff51b 100644 --- a/src/components/shared/client-picker.tsx +++ b/src/components/shared/client-picker.tsx @@ -70,7 +70,7 @@ export function ClientPicker({ className={cn('w-full justify-between', !value && 'text-muted-foreground')} > {selectedLabel} - + diff --git a/src/components/shared/column-picker.tsx b/src/components/shared/column-picker.tsx index cc4f4673..be02ed43 100644 --- a/src/components/shared/column-picker.tsx +++ b/src/components/shared/column-picker.tsx @@ -72,7 +72,7 @@ export function ColumnPicker({ cards (no columns to pick). The desktop table view shows this trigger from the `sm:` breakpoint up. */} @@ -102,7 +102,7 @@ export function ColumnPicker({ isVisible ? 'bg-primary border-primary text-primary-foreground' : 'border-border' }`} > - {isVisible && } + {isVisible && } {col.label} {col.alwaysVisible && ( @@ -125,7 +125,7 @@ export function ColumnPicker({ <> - + Save current view diff --git a/src/components/shared/country-combobox.tsx b/src/components/shared/country-combobox.tsx index 01135d7e..90a09487 100644 --- a/src/components/shared/country-combobox.tsx +++ b/src/components/shared/country-combobox.tsx @@ -119,7 +119,7 @@ export function CountryCombobox({ ) : ( {placeholder} )} - + diff --git a/src/components/shared/custom-fields-section.tsx b/src/components/shared/custom-fields-section.tsx index 1ab8b7e0..6d4c1e8f 100644 --- a/src/components/shared/custom-fields-section.tsx +++ b/src/components/shared/custom-fields-section.tsx @@ -108,9 +108,9 @@ export function CustomFieldsSection({ entityType, entityId }: CustomFieldsSectio
Custom Fields {collapsed ? ( - + ) : ( - + )}
diff --git a/src/components/shared/data-table.tsx b/src/components/shared/data-table.tsx index b6f86402..ad5431fa 100644 --- a/src/components/shared/data-table.tsx +++ b/src/components/shared/data-table.tsx @@ -206,11 +206,11 @@ export function DataTable({ } function getSortIcon(columnId: string) { - if (sort?.field !== columnId) return ; + if (sort?.field !== columnId) return ; return sort.direction === 'asc' ? ( - + ) : ( - + ); } @@ -279,7 +279,7 @@ export function DataTable({
- + Loading...
@@ -350,7 +350,7 @@ export function DataTable({
    {isLoading ? (
  • - +
  • ) : rows.length === 0 ? (
  • diff --git a/src/components/shared/detail-layout.tsx b/src/components/shared/detail-layout.tsx index 6eafc136..1d00d855 100644 --- a/src/components/shared/detail-layout.tsx +++ b/src/components/shared/detail-layout.tsx @@ -32,7 +32,7 @@ export function DetailLayout({ header, tabs, defaultTab, isLoading, actions }: D if (isLoading) { return (
    - +
    ); } diff --git a/src/components/shared/empty-state.tsx b/src/components/shared/empty-state.tsx index acdc5398..e29415b3 100644 --- a/src/components/shared/empty-state.tsx +++ b/src/components/shared/empty-state.tsx @@ -24,7 +24,7 @@ export function EmptyState({ icon: Icon, title, description, action, className } > {Icon && (
    - +
    )}

    {title}

    diff --git a/src/components/shared/filter-bar.tsx b/src/components/shared/filter-bar.tsx index cc6cc29c..45dd0d6c 100644 --- a/src/components/shared/filter-bar.tsx +++ b/src/components/shared/filter-bar.tsx @@ -98,14 +98,14 @@ export function FilterBar({ filters, values, onChange, onClear }: FilterBarProps diff --git a/src/components/shared/image-cropper-dialog.tsx b/src/components/shared/image-cropper-dialog.tsx index 3ed292f0..78eb9797 100644 --- a/src/components/shared/image-cropper-dialog.tsx +++ b/src/components/shared/image-cropper-dialog.tsx @@ -131,7 +131,7 @@ export function ImageCropperDialog({

); } @@ -98,7 +98,10 @@ export function InlineCountryField({ {display ?? emptyText} {!disabled && ( - + )} ); diff --git a/src/components/shared/inline-editable-field.tsx b/src/components/shared/inline-editable-field.tsx index 1a3b9598..582a5806 100644 --- a/src/components/shared/inline-editable-field.tsx +++ b/src/components/shared/inline-editable-field.tsx @@ -145,7 +145,7 @@ function InlineEditableFieldBody(props: InlineEditableFieldProps) { ))} - {saving && } + {saving && }
); } @@ -175,7 +175,7 @@ function InlineEditableFieldBody(props: InlineEditableFieldProps) { disabled={saving || disabled} className="h-8 text-sm w-auto" /> - {saving && } + {saving && }
); } @@ -219,7 +219,7 @@ function InlineEditableFieldBody(props: InlineEditableFieldProps) { rows={props.rows ?? 4} className="text-sm" /> - {saving && } + {saving && }
); } @@ -260,7 +260,7 @@ function InlineEditableFieldBody(props: InlineEditableFieldProps) { disabled={saving} className="h-7 text-sm" /> - {saving && } + {saving && }
); } diff --git a/src/components/shared/inline-phone-field.tsx b/src/components/shared/inline-phone-field.tsx index 5818c1cd..d7655fa5 100644 --- a/src/components/shared/inline-phone-field.tsx +++ b/src/components/shared/inline-phone-field.tsx @@ -115,7 +115,7 @@ export function InlinePhoneField({ 'transition-colors hover:bg-primary/90 disabled:opacity-50', )} > - {saving ? : 'Save'} + {saving ? : 'Save'}
@@ -146,7 +146,10 @@ export function InlinePhoneField({ {display ?? emptyText} {!disabled && ( - + )} ); diff --git a/src/components/shared/inline-tag-editor.tsx b/src/components/shared/inline-tag-editor.tsx index a0a5f5b2..65ceb1ee 100644 --- a/src/components/shared/inline-tag-editor.tsx +++ b/src/components/shared/inline-tag-editor.tsx @@ -91,7 +91,7 @@ export function InlineTagEditor({ variant="ghost" className="h-6 px-2 text-xs text-muted-foreground hover:text-foreground" > - + {currentTags.length === 0 ? 'Add tag' : 'Add'} @@ -119,7 +119,7 @@ export function InlineTagEditor({ style={{ backgroundColor: t.color }} /> {t.name} - {checked && } + {checked && } ); })} diff --git a/src/components/shared/inline-timezone-field.tsx b/src/components/shared/inline-timezone-field.tsx index 9043479b..ec1fad90 100644 --- a/src/components/shared/inline-timezone-field.tsx +++ b/src/components/shared/inline-timezone-field.tsx @@ -71,7 +71,7 @@ export function InlineTimezoneField({ if (open) pickedRef.current = false; }} /> - {saving && } + {saving && }
); } @@ -95,7 +95,10 @@ export function InlineTimezoneField({ {display ?? emptyText} {!disabled && ( - + )} ); diff --git a/src/components/shared/interest-picker.tsx b/src/components/shared/interest-picker.tsx index 19ab635c..ad3c0989 100644 --- a/src/components/shared/interest-picker.tsx +++ b/src/components/shared/interest-picker.tsx @@ -95,7 +95,7 @@ export function InterestPicker({ className={cn('w-full justify-between', !value && 'text-muted-foreground')} > {selectedLabel} - + diff --git a/src/components/shared/loading-skeleton.tsx b/src/components/shared/loading-skeleton.tsx index 69c4d1b5..0db802dc 100644 --- a/src/components/shared/loading-skeleton.tsx +++ b/src/components/shared/loading-skeleton.tsx @@ -42,14 +42,14 @@ export function CardSkeleton({ className }: LoadingSkeletonProps) { return (
- - + +
- - + +
- - + +
); @@ -63,13 +63,13 @@ export function FormSkeleton({ fields = 4 }: { fields?: number }) {
{Array.from({ length: fields }).map((_, i) => (
- - + +
))}
- - + +
); @@ -97,10 +97,10 @@ export function PageSkeleton() { {/* Page header */}
- - + +
- +
{/* Content */} diff --git a/src/components/shared/notes-list.tsx b/src/components/shared/notes-list.tsx index 2bb4aa17..ebfe65fa 100644 --- a/src/components/shared/notes-list.tsx +++ b/src/components/shared/notes-list.tsx @@ -217,9 +217,9 @@ export function NotesList({ entityType, entityId, currentUserId, aggregate }: No onClick={() => createMutation.mutate(newNote.trim())} > {createMutation.isPending ? ( - + ) : ( - + )} Add Note @@ -280,7 +280,7 @@ export function NotesList({ entityType, entityId, currentUserId, aggregate }: No {SOURCE_LABEL[note.source]} · {note.sourceLabel} )} - {note.isLocked && } + {note.isLocked && } {canEdit(note) && ( {getTimeRemaining(note)} )} @@ -322,7 +322,7 @@ export function NotesList({ entityType, entityId, currentUserId, aggregate }: No setEditContent(note.content); }} > - +
)} diff --git a/src/components/shared/owner-picker.tsx b/src/components/shared/owner-picker.tsx index cdb361fa..2a697ffb 100644 --- a/src/components/shared/owner-picker.tsx +++ b/src/components/shared/owner-picker.tsx @@ -121,7 +121,7 @@ export function OwnerPicker({ )} {selectedLabel} - + diff --git a/src/components/shared/saved-views-dropdown.tsx b/src/components/shared/saved-views-dropdown.tsx index b00776f2..8bcf63d7 100644 --- a/src/components/shared/saved-views-dropdown.tsx +++ b/src/components/shared/saved-views-dropdown.tsx @@ -35,7 +35,7 @@ export function SavedViewsDropdown({ entityType, onApplyView }: SavedViewsDropdo @@ -54,7 +54,9 @@ export function SavedViewsDropdown({ entityType, onApplyView }: SavedViewsDropdo > {view.name}
- {activeViewId === view.id && } + {activeViewId === view.id && ( + + )}
diff --git a/src/components/shared/send-document-dialog.tsx b/src/components/shared/send-document-dialog.tsx index f28251a4..e689e1c0 100644 --- a/src/components/shared/send-document-dialog.tsx +++ b/src/components/shared/send-document-dialog.tsx @@ -241,7 +241,7 @@ function SendDocumentDialogInner({ )} {previewQuery.isLoading && canPreview && (
- Rendering preview… + Rendering preview…
)}
@@ -284,7 +284,9 @@ function SendDocumentDialogInner({ Back diff --git a/src/components/shared/subdivision-combobox.tsx b/src/components/shared/subdivision-combobox.tsx index 9b676dd5..ffe8d661 100644 --- a/src/components/shared/subdivision-combobox.tsx +++ b/src/components/shared/subdivision-combobox.tsx @@ -87,7 +87,7 @@ export function SubdivisionCombobox({ data-testid={testId} > {triggerLabel} - + diff --git a/src/components/shared/tag-picker.tsx b/src/components/shared/tag-picker.tsx index 80864121..59ef9939 100644 --- a/src/components/shared/tag-picker.tsx +++ b/src/components/shared/tag-picker.tsx @@ -74,7 +74,7 @@ export function TagPicker({ ? `${selectedIds.length} tag${selectedIds.length > 1 ? 's' : ''} selected` : placeholder} - + diff --git a/src/components/shared/timezone-combobox.tsx b/src/components/shared/timezone-combobox.tsx index 3c682e45..36c29485 100644 --- a/src/components/shared/timezone-combobox.tsx +++ b/src/components/shared/timezone-combobox.tsx @@ -94,7 +94,7 @@ export function TimezoneCombobox({ data-testid={testId} > {selectedLabel} - + diff --git a/src/components/yachts/yacht-card.tsx b/src/components/yachts/yacht-card.tsx index 6f03c863..ea81e19f 100644 --- a/src/components/yachts/yacht-card.tsx +++ b/src/components/yachts/yacht-card.tsx @@ -69,22 +69,22 @@ export function YachtCard({ yacht, portSlug, onEdit, onArchive }: YachtCardProps onClick={(e) => e.stopPropagation()} aria-label={`Actions for ${yacht.name}`} > - + - + View onEdit(yacht)}> - + Edit onArchive(yacht)}> - + Archive @@ -92,7 +92,7 @@ export function YachtCard({ yacht, portSlug, onEdit, onArchive }: YachtCardProps } >
- } /> + } />
{/* Title row + spacer for actions button */}
diff --git a/src/components/yachts/yacht-columns.tsx b/src/components/yachts/yacht-columns.tsx index fe3240d2..16d5d709 100644 --- a/src/components/yachts/yacht-columns.tsx +++ b/src/components/yachts/yacht-columns.tsx @@ -149,7 +149,7 @@ export function getYachtColumns({ className="h-7 w-7" onClick={(e) => e.stopPropagation()} > - + @@ -158,16 +158,16 @@ export function getYachtColumns({ // eslint-disable-next-line @typescript-eslint/no-explicit-any href={`/${portSlug}/yachts/${row.original.id}` as any} > - + View onEdit(row.original)}> - + Edit onArchive(row.original)}> - + Archive diff --git a/src/components/yachts/yacht-detail-header.tsx b/src/components/yachts/yacht-detail-header.tsx index 161fc984..b365c1f9 100644 --- a/src/components/yachts/yacht-detail-header.tsx +++ b/src/components/yachts/yacht-detail-header.tsx @@ -171,7 +171,7 @@ export function YachtDetailHeader({ yacht }: YachtDetailHeaderProps) { {/* Actions */}
@@ -181,7 +181,7 @@ export function YachtDetailHeader({ yacht }: YachtDetailHeaderProps) { onClick={() => setTransferOpen(true)} disabled={isArchived} > - + Transfer @@ -191,7 +191,7 @@ export function YachtDetailHeader({ yacht }: YachtDetailHeaderProps) { onClick={() => setArchiveOpen(true)} disabled={isArchived} > - + Archive
diff --git a/src/components/yachts/yacht-form.tsx b/src/components/yachts/yacht-form.tsx index 55d299b9..ba924c0f 100644 --- a/src/components/yachts/yacht-form.tsx +++ b/src/components/yachts/yacht-form.tsx @@ -359,7 +359,7 @@ export function YachtForm({ open, onOpenChange, yacht, initialOwner }: YachtForm diff --git a/src/components/yachts/yacht-list.tsx b/src/components/yachts/yacht-list.tsx index 863386cd..3457039e 100644 --- a/src/components/yachts/yacht-list.tsx +++ b/src/components/yachts/yacht-list.tsx @@ -116,7 +116,7 @@ export function YachtList() { actions={ diff --git a/src/components/yachts/yacht-ownership-history.tsx b/src/components/yachts/yacht-ownership-history.tsx index c64fd7a3..076ef50e 100644 --- a/src/components/yachts/yacht-ownership-history.tsx +++ b/src/components/yachts/yacht-ownership-history.tsx @@ -64,7 +64,7 @@ export function YachtOwnershipHistory({ yachtId }: YachtOwnershipHistoryProps) { if (isLoading) { return (
- +
); } diff --git a/src/components/yachts/yacht-picker.tsx b/src/components/yachts/yacht-picker.tsx index fb8a076b..2bddc9e0 100644 --- a/src/components/yachts/yacht-picker.tsx +++ b/src/components/yachts/yacht-picker.tsx @@ -88,7 +88,7 @@ export function YachtPicker({ className={cn('w-full justify-between', !value && 'text-muted-foreground')} > {selectedLabel} - + diff --git a/src/components/yachts/yacht-transfer-dialog.tsx b/src/components/yachts/yacht-transfer-dialog.tsx index e89ec26b..3234d12b 100644 --- a/src/components/yachts/yacht-transfer-dialog.tsx +++ b/src/components/yachts/yacht-transfer-dialog.tsx @@ -190,7 +190,7 @@ export function YachtTransferDialog({