chore(copy): em-dash sweep across user-facing JSX text + bump lint to error

Replaced 174 em-dashes (—) with " - " (space-hyphen-space) across 49
files in src/components + src/app. The em-dash reads as a tell-tale
"AI-generated" marker per the user's design feedback; hyphens with
spaces preserve the connector semantics without the AI tint.

Touched only lines outside pure-comment context (// /* * */). Code
comments, JSDoc, audit-log strings, structured logging strings, and
templates outside the lint scope retain their em-dashes for now —
they're not user-visible.

Also captured two remaining cases that used the `—` HTML entity
instead of the literal character (system-monitoring-dashboard,
interest-stage-picker) — replaced with a plain hyphen.

Bumped the existing `no-restricted-syntax` rule from `warn` → `error`
in eslint.config.mjs scoped to src/components/**/*.tsx +
src/app/**/*.tsx. New code reintroducing em-dashes in JSX text now
fails the lint gate.

Verified: tsc clean, vitest 1448/1448, eslint 0 em-dash warnings.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-21 20:02:58 +02:00
parent 292a8b5e4a
commit f0dbefcac2
59 changed files with 213 additions and 205 deletions

View File

@@ -94,7 +94,7 @@ const KNOWN_SETTINGS: Array<{
key: 'default_new_interest_owner',
label: 'Default New-Interest Owner',
description:
'User ID to auto-assign as the deal owner when a new interest is created. Stored as { "userId": "..." }. Leave blank to have new interests unassigned by default the rep can pick an owner from the interest detail header.',
'User ID to auto-assign as the deal owner when a new interest is created. Stored as { "userId": "..." }. Leave blank to have new interests unassigned by default - the rep can pick an owner from the interest detail header.',
type: 'json',
defaultValue: { userId: null },
},
@@ -136,7 +136,7 @@ const KNOWN_SETTINGS: Array<{
// ─── Berth recommender (src/lib/services/berth-recommender.service.ts) ──────
{
key: 'recommender_max_oversize_pct',
label: 'Recommender max oversize %',
label: 'Recommender - max oversize %',
description:
'Cap on how much larger a berth can be than the desired length/width/draft before it stops being suggested. Default 30.',
type: 'number',
@@ -144,35 +144,35 @@ const KNOWN_SETTINGS: Array<{
},
{
key: 'recommender_top_n_default',
label: 'Recommender default result count',
label: 'Recommender - default result count',
description: 'Default number of berth recommendations returned per request. Default 8.',
type: 'number',
defaultValue: 8,
},
{
key: 'fallthrough_policy',
label: 'Recommender fall-through policy',
label: 'Recommender - fall-through policy',
description: 'How berths re-enter the recommender after a lost deal.',
type: 'select',
defaultValue: 'immediate_with_heat',
options: [
{
value: 'immediate_with_heat',
label: 'Immediate (with heat boost) surface again right away',
label: 'Immediate (with heat boost) - surface again right away',
},
{
value: 'cooldown',
label: 'Cooldown wait N days (see below)',
label: 'Cooldown - wait N days (see below)',
},
{
value: 'never_auto_recommend',
label: 'Never only re-surface via manual rep search',
label: 'Never - only re-surface via manual rep search',
},
],
},
{
key: 'fallthrough_cooldown_days',
label: 'Recommender fall-through cooldown (days)',
label: 'Recommender - fall-through cooldown (days)',
description:
'Days a berth stays out of the recommender after a lost deal when the policy is `cooldown`. Default 30.',
type: 'number',
@@ -180,14 +180,14 @@ const KNOWN_SETTINGS: Array<{
},
{
key: 'heat_weight_recency',
label: 'Heat weight recency',
label: 'Heat weight - recency',
description: 'Weight given to how recently the prior interest fell through. Default 30.',
type: 'number',
defaultValue: 30,
},
{
key: 'heat_weight_furthest_stage',
label: 'Heat weight furthest stage',
label: 'Heat weight - furthest stage',
description:
'Weight given to how close the prior interest got to closing before falling through. Default 40.',
type: 'number',
@@ -195,7 +195,7 @@ const KNOWN_SETTINGS: Array<{
},
{
key: 'heat_weight_interest_count',
label: 'Heat weight historical interest count',
label: 'Heat weight - historical interest count',
description:
'Weight given to how often this berth has attracted interest historically. Default 15.',
type: 'number',
@@ -203,7 +203,7 @@ const KNOWN_SETTINGS: Array<{
},
{
key: 'heat_weight_eoi_count',
label: 'Heat weight historical EOI count',
label: 'Heat weight - historical EOI count',
description:
'Weight given to how often interest in this berth has reached EOI signing. Default 15.',
type: 'number',
@@ -211,7 +211,7 @@ const KNOWN_SETTINGS: Array<{
},
{
key: 'tier_ladder_hide_late_stage',
label: 'Recommender hide late-stage tier',
label: 'Recommender - hide late-stage tier',
description:
'Hide berths whose only active interests are late-stage (close to closing) from recommendations.',
type: 'boolean',
@@ -219,7 +219,7 @@ const KNOWN_SETTINGS: Array<{
},
{
key: 'documents_show_expired_tab',
label: 'Documents show Expired tab',
label: 'Documents - show Expired tab',
description:
'When off, the Expired tab on the documents hub is hidden. Use this when expired EOIs are noise that distracts reps from active deals.',
type: 'boolean',
@@ -227,12 +227,15 @@ const KNOWN_SETTINGS: Array<{
},
{
key: 'berths_default_currency',
label: 'Berths default currency',
label: 'Berths - default currency',
description:
'Currency applied to newly-created berths when none is specified on the form. Existing berths keep their per-row currency. Defaults to USD.',
type: 'select',
defaultValue: 'USD',
options: SUPPORTED_CURRENCIES.map((c) => ({ value: c.code, label: `${c.code}${c.label}` })),
options: SUPPORTED_CURRENCIES.map((c) => ({
value: c.code,
label: `${c.code} - ${c.label}`,
})),
},
];
@@ -350,7 +353,7 @@ export function SettingsManager() {
</CardContent>
</Card>
{/* String + Select Settings both render in the same card.
{/* String + Select Settings - both render in the same card.
'select' settings get a Select dropdown bound to setting.options;
'string' settings get a free-text Input. */}
{KNOWN_SETTINGS.some((s) => s.type === 'string' || s.type === 'select') && (
@@ -526,7 +529,7 @@ export function SettingsManager() {
this for one-off feature flags, integration secrets, or experimental tunables that the
platform reads at runtime via{' '}
<code className="text-xs">getSystemSetting(portId, key)</code>. Values can be JSON
objects, plain strings, numbers, or booleans. Most reps will never need this section
objects, plain strings, numbers, or booleans. Most reps will never need this section -
touch only if you know which key affects what.
</CardDescription>
</CardHeader>