diff --git a/src/app/(dashboard)/[portSlug]/admin/email/page.tsx b/src/app/(dashboard)/[portSlug]/admin/email/page.tsx
index 4017ee4..4477d4b 100644
--- a/src/app/(dashboard)/[portSlug]/admin/email/page.tsx
+++ b/src/app/(dashboard)/[portSlug]/admin/email/page.tsx
@@ -34,7 +34,7 @@ const FIELDS: SettingFieldDef[] = [
label: 'Default signature (HTML)',
description: 'Appended to the bottom of system-generated emails.',
type: 'html',
- placeholder: '
— The Port Nimara team
',
+ placeholder: '
- The Port Nimara team
',
defaultValue: '',
},
{
@@ -71,7 +71,7 @@ const FIELDS: SettingFieldDef[] = [
{
key: 'smtp_pass_override',
label: 'SMTP password override',
- description: 'Optional. Stored in plain text — only set when overriding env credentials.',
+ description: 'Optional. Stored in plain text - only set when overriding env credentials.',
type: 'password',
defaultValue: '',
},
diff --git a/src/app/(dashboard)/[portSlug]/clients/[clientId]/loading.tsx b/src/app/(dashboard)/[portSlug]/clients/[clientId]/loading.tsx
index 326d916..d2e7a04 100644
--- a/src/app/(dashboard)/[portSlug]/clients/[clientId]/loading.tsx
+++ b/src/app/(dashboard)/[portSlug]/clients/[clientId]/loading.tsx
@@ -4,13 +4,13 @@ import { CardSkeleton } from '@/components/shared/loading-skeleton';
/**
* Route-level loading UI for the client detail page. Renders while the
* server component resolves the session and the client component bootstraps
- * its initial query — replaces the previous empty-header flash on direct
+ * its initial query - replaces the previous empty-header flash on direct
* URL visits.
*/
export default function Loading() {
return (
diff --git a/src/app/(dashboard)/[portSlug]/invoices/new/page.tsx b/src/app/(dashboard)/[portSlug]/invoices/new/page.tsx
index a31ade2..0e7f9b3 100644
--- a/src/app/(dashboard)/[portSlug]/invoices/new/page.tsx
+++ b/src/app/(dashboard)/[portSlug]/invoices/new/page.tsx
@@ -59,7 +59,7 @@ export default function NewInvoicePage() {
}, [setChrome]);
// When the form is launched from an interest detail with `?interestId=…&kind=deposit`,
- // fetch enough of the interest to display "Deposit for {client} — Berth {n}" in
+ // fetch enough of the interest to display "Deposit for {client} - Berth {n}" in
// the review step. Doubles as the source of truth for the billing entity prefill.
const { data: prefilledInterest } = useQuery<{
data: {
@@ -184,7 +184,7 @@ export default function NewInvoicePage() {
return (
- {/* Header — desktop only; mobile gets the title from the topbar */}
+ {/* Header - desktop only; mobile gets the title from the topbar */}
diff --git a/src/app/(scanner)/[portSlug]/scan/manifest.webmanifest/route.ts b/src/app/(scanner)/[portSlug]/scan/manifest.webmanifest/route.ts
index f1f0dd0..2014311 100644
--- a/src/app/(scanner)/[portSlug]/scan/manifest.webmanifest/route.ts
+++ b/src/app/(scanner)/[portSlug]/scan/manifest.webmanifest/route.ts
@@ -15,7 +15,7 @@ export async function GET(_req: Request, { params }: { params: Promise<{ portSlu
const portName = port?.name ?? 'Port Nimara';
const manifest = {
- name: `${portName} — Scanner`,
+ name: `${portName} - Scanner`,
short_name: 'Scanner',
description: `Capture and submit expense receipts for ${portName}.`,
start_url: `/${portSlug}/scan`,
diff --git a/src/app/(scanner)/[portSlug]/scan/page.tsx b/src/app/(scanner)/[portSlug]/scan/page.tsx
index 4bb6ac7..c3750e6 100644
--- a/src/app/(scanner)/[portSlug]/scan/page.tsx
+++ b/src/app/(scanner)/[portSlug]/scan/page.tsx
@@ -3,7 +3,7 @@ import type { Metadata } from 'next';
import { ScanShell } from '@/components/scan/scan-shell';
export const metadata: Metadata = {
- title: 'Scan receipt — Port Nimara',
+ title: 'Scan receipt - Port Nimara',
};
export default function ScanPage() {
diff --git a/src/app/api/health/route.ts b/src/app/api/health/route.ts
index d3cb8dd..57bdf0e 100644
--- a/src/app/api/health/route.ts
+++ b/src/app/api/health/route.ts
@@ -1,11 +1,11 @@
import { NextResponse } from 'next/server';
/**
- * Liveness probe — confirms the Next.js process is responding.
+ * Liveness probe - confirms the Next.js process is responding.
*
* Returns 200 unconditionally; if the process is wedged or has crashed
* the request never lands here at all. Do NOT include database/Redis/MinIO
- * checks in this endpoint — a transient downstream blip should drop the
+ * checks in this endpoint - a transient downstream blip should drop the
* pod from the load balancer (readiness), not restart the pod (liveness).
*
* For deep dependency checks, hit `/api/ready` instead.
diff --git a/src/app/api/public/interests/route.ts b/src/app/api/public/interests/route.ts
index 2935254..4d80889 100644
--- a/src/app/api/public/interests/route.ts
+++ b/src/app/api/public/interests/route.ts
@@ -36,7 +36,7 @@ type PublicInterestData = z.infer;
// Keep the helper aligned with that.
type Tx = typeof db;
-// POST /api/public/interests — unauthenticated public interest registration.
+// POST /api/public/interests - unauthenticated public interest registration.
// Creates the trio (client + yacht + interest) plus an optional company +
// membership, all inside a single transaction.
export async function POST(req: NextRequest) {
@@ -70,7 +70,7 @@ export async function POST(req: NextRequest) {
const firstName = data.firstName ?? fullName.split(/\s+/)[0] ?? 'Valued Guest';
- // Resolve berth by mooring number (if provided). Read-only lookup — safe
+ // Resolve berth by mooring number (if provided). Read-only lookup - safe
// to do outside the transaction.
let berthId: string | null = null;
let resolvedMooringNumber: string | null = data.mooringNumber ?? null;
diff --git a/src/app/api/public/residential-inquiries/route.ts b/src/app/api/public/residential-inquiries/route.ts
index 9b97f84..ee75126 100644
--- a/src/app/api/public/residential-inquiries/route.ts
+++ b/src/app/api/public/residential-inquiries/route.ts
@@ -34,7 +34,7 @@ async function gateRateLimit(ip: string): Promise {
}
/**
- * POST /api/public/residential-inquiries — unauthenticated entry point for
+ * POST /api/public/residential-inquiries - unauthenticated entry point for
* the public website's residential interest form. Creates a
* `residential_clients` row and an opening `residential_interests` row in a
* single transaction.
@@ -110,7 +110,7 @@ export async function POST(req: NextRequest) {
emitToRoom(`port:${portId}`, 'residential_client:created', { id: result.clientId });
emitToRoom(`port:${portId}`, 'residential_interest:created', { id: result.interestId });
- // Send notification emails (non-blocking — failures shouldn't 500 the
+ // Send notification emails (non-blocking - failures shouldn't 500 the
// public form).
void sendResidentialNotifications({
portId,
@@ -147,7 +147,7 @@ async function sendResidentialNotifications(args: {
});
await sendEmail(data.email, confirmation.subject, confirmation.html);
- // Sales-team alert — pull recipients from system_settings if configured;
+ // Sales-team alert - pull recipients from system_settings if configured;
// fall back to the inquiry_contact_email if available.
const recipientsRow = await db.query.systemSettings.findFirst({
where: and(
diff --git a/src/app/api/ready/route.ts b/src/app/api/ready/route.ts
index 569b65e..f193d62 100644
--- a/src/app/api/ready/route.ts
+++ b/src/app/api/ready/route.ts
@@ -21,7 +21,7 @@ interface ReadyResponse {
}
/**
- * Readiness probe — verifies that every backing service this process
+ * Readiness probe - verifies that every backing service this process
* needs to serve traffic is reachable. A 503 should drop the pod from the
* load balancer until the next probe succeeds; it should not trigger a
* pod restart (that's what `/api/health` is for).
diff --git a/src/app/api/v1/admin/alerts/run-engine/route.ts b/src/app/api/v1/admin/alerts/run-engine/route.ts
index 3fef6d1..169e90c 100644
--- a/src/app/api/v1/admin/alerts/run-engine/route.ts
+++ b/src/app/api/v1/admin/alerts/run-engine/route.ts
@@ -10,7 +10,7 @@ import { runAlertEngineForPorts } from '@/lib/services/alert-engine';
* exercised by the realapi socket fanout test.
*
* Requires super_admin or per-port admin permissions; the engine itself
- * is idempotent — duplicate runs only re-evaluate, never duplicate rows.
+ * is idempotent - duplicate runs only re-evaluate, never duplicate rows.
*/
export const POST = withAuth(async (_req, ctx) => {
try {
diff --git a/src/app/api/v1/admin/documenso/health/route.ts b/src/app/api/v1/admin/documenso/health/route.ts
index f9f7218..66d25ed 100644
--- a/src/app/api/v1/admin/documenso/health/route.ts
+++ b/src/app/api/v1/admin/documenso/health/route.ts
@@ -5,7 +5,7 @@ import { errorResponse } from '@/lib/errors';
import { checkDocumensoHealth } from '@/lib/services/documenso-client';
/**
- * Admin probe — calls Documenso /api/v1/health using the port's effective
+ * Admin probe - calls Documenso /api/v1/health using the port's effective
* config. Used by the "Test connection" button on /admin/documenso.
*/
export const POST = withAuth(
diff --git a/src/app/api/v1/admin/duplicates/handlers.ts b/src/app/api/v1/admin/duplicates/handlers.ts
index 5a85564..59182be 100644
--- a/src/app/api/v1/admin/duplicates/handlers.ts
+++ b/src/app/api/v1/admin/duplicates/handlers.ts
@@ -40,7 +40,7 @@ export async function listHandler(_req: Request, ctx: AuthContext): Promise {
const a = clientById.get(p.clientAId);
const b = clientById.get(p.clientBId);
- if (!a || !b) return null; // FK orphan — shouldn't happen, but be defensive
+ if (!a || !b) return null; // FK orphan - shouldn't happen, but be defensive
// Skip pairs where one side has already been merged or archived.
if (a.mergedIntoClientId || b.mergedIntoClientId) return null;
return {
diff --git a/src/app/api/v1/admin/invitations/route.ts b/src/app/api/v1/admin/invitations/route.ts
index acfbbfb..ad2b624 100644
--- a/src/app/api/v1/admin/invitations/route.ts
+++ b/src/app/api/v1/admin/invitations/route.ts
@@ -9,7 +9,7 @@ import { createCrmInvite, listCrmInvites } from '@/lib/services/crm-invite.servi
export const GET = withAuth(
withPermission('admin', 'manage_users', async (_req, ctx) => {
try {
- // crm_user_invites is a global table (no per-port column) — invites
+ // crm_user_invites is a global table (no per-port column) - invites
// mint better-auth users that may later be assigned roles in any
// port. Listing it cross-tenant would let a port-A director
// enumerate pending invitee emails, names, and isSuperAdmin flags
diff --git a/src/app/api/v1/admin/ocr-settings/test/route.ts b/src/app/api/v1/admin/ocr-settings/test/route.ts
index 9d4d520..03bf3da 100644
--- a/src/app/api/v1/admin/ocr-settings/test/route.ts
+++ b/src/app/api/v1/admin/ocr-settings/test/route.ts
@@ -13,7 +13,7 @@ const schema = z.object({
apiKey: z.string().min(1),
});
-// `manage_settings`-gated for parity with the parent OCR settings route —
+// `manage_settings`-gated for parity with the parent OCR settings route -
// triggers outbound AI provider auth requests using a caller-supplied key.
export const POST = withAuth(
withPermission('admin', 'manage_settings', async (req) => {
diff --git a/src/app/api/v1/admin/templates/preview/route.ts b/src/app/api/v1/admin/templates/preview/route.ts
index a1fd851..0cb5985 100644
--- a/src/app/api/v1/admin/templates/preview/route.ts
+++ b/src/app/api/v1/admin/templates/preview/route.ts
@@ -17,12 +17,12 @@ import { previewAdminTemplateSchema } from '@/lib/validators/document-templates'
* POST /api/v1/admin/templates/preview
*
* Generates a preview PDF from a TipTap JSON content block.
- * Returns { data: { pdfBase64: string } } — the client can render this
+ * Returns { data: { pdfBase64: string } } - the client can render this
* in an