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

@@ -104,11 +104,11 @@ export function WebsiteAnalyticsShell() {
<NotConfiguredEmptyState portSlug={portSlug} />
) : (
<>
{/* Realtime panel collapsible "what's happening RIGHT NOW"
{/* Realtime panel - collapsible "what's happening RIGHT NOW"
strip at the very top. Polling only fires while expanded. */}
<RealtimePanel />
{/* Live indicator + KPI tiles mirrors Umami's overview row. */}
{/* Live indicator + KPI tiles - mirrors Umami's overview row. */}
<div className="grid gap-3 grid-cols-2 sm:gap-4 md:grid-cols-3 lg:grid-cols-6">
<ActiveVisitorsBadge value={active.data?.data?.visitors} loading={active.isLoading} />
<KpiPair
@@ -117,7 +117,7 @@ export function WebsiteAnalyticsShell() {
value={stats.data?.data?.visitors}
prev={stats.data?.data?.comparison?.visitors}
accent="teal"
tooltip="Unique people who visited the site at least once. Counted by anonymous device fingerprint one person across two devices counts as two."
tooltip="Unique people who visited the site at least once. Counted by anonymous device fingerprint - one person across two devices counts as two."
/>
<KpiPair
label="Visits"
@@ -175,7 +175,7 @@ export function WebsiteAnalyticsShell() {
browsing five pages in one sitting still counts as 1 session.
</p>
<p className="mt-2 text-muted-foreground">
Pages-per-session (pageviews ÷ sessions) is a rough engagement signal higher
Pages-per-session (pageviews ÷ sessions) is a rough engagement signal - higher
means people are exploring deeper.
</p>
</PopoverContent>
@@ -257,14 +257,14 @@ export function WebsiteAnalyticsShell() {
/>
</div>
{/* Engagement heatmap full-width so the 7×24 grid has room
{/* Engagement heatmap - full-width so the 7×24 grid has room
to breathe and cells are large enough to hover comfortably. */}
<WeeklyHeatmap range={range} />
{/* Recent sessions */}
<SessionsList range={range} />
{/* World heatmap visitor counts per country (full-width, bottom of page) */}
{/* World heatmap - visitor counts per country (full-width, bottom of page) */}
<VisitorWorldMap
rows={allCountries.data?.data ?? null}
loading={allCountries.isLoading}
@@ -405,7 +405,7 @@ function BounceRateTile({
delta={delta}
deltaSuffix="%"
lowerIsBetter
tooltip="Share of visits that ended without a second pageview i.e. someone landed, didn't click anything, and left. Lower is generally better."
tooltip="Share of visits that ended without a second pageview - i.e. someone landed, didn't click anything, and left. Lower is generally better."
/>
);
}

View File

@@ -59,7 +59,7 @@ export function WeeklyHeatmap({ range }: Props) {
<PopoverContent align="start" className="w-80 text-xs leading-relaxed">
<p className="font-semibold text-foreground">When is your audience active?</p>
<p className="mt-2 text-muted-foreground">
Each cell is one hour of one day the columns are{' '}
Each cell is one hour of one day - the columns are{' '}
<strong>hours of the day in UTC</strong> (0 = midnight, 23 = 11 PM) and the rows are
days of the week. Darker blue means more sessions started during that hour across
the whole selected period. Hover any cell for the exact session count.
@@ -126,7 +126,7 @@ export function WeeklyHeatmap({ range }: Props) {
{/* Legend + floating value indicator */}
<div className="mt-4 flex items-center justify-between gap-4 text-[11px] text-muted-foreground">
<span>
Hour of day (UTC) colour intensity scaled to peak ({max.toLocaleString()}{' '}
Hour of day (UTC) - colour intensity scaled to peak ({max.toLocaleString()}{' '}
sessions)
</span>
<div className="flex items-center gap-1">
@@ -147,7 +147,7 @@ export function WeeklyHeatmap({ range }: Props) {
</div>
</div>
{/* Hover tooltip single element re-positioned via the
{/* Hover tooltip - single element re-positioned via the
hovered cell's data, much cheaper than mounting 168
Radix Tooltips. */}
{hover ? (