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:
@@ -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."
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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 ? (
|
||||
|
||||
Reference in New Issue
Block a user