From 71778fc9f30061ccdcf561359f008b1d2de01af8 Mon Sep 17 00:00:00 2001 From: Makisuo Date: Wed, 7 Oct 2026 00:26:06 +0200 Subject: [PATCH 1/5] refactor(ui): text-2xs/3xs/4xs type tokens replace arbitrary px font sizes Adds three dense sizes below text-xs to the shared theme and sweeps the ~840 text-[9-11.5px] values in web and @maple/ui onto them. rounded-[2px] becomes rounded-xs. No line-height on the tokens, so rendering is unchanged. --- .../session-detail/payload-view.tsx | 2 +- .../session-detail/session-flow.tsx | 4 +- .../session-detail/session-overview.tsx | 10 ++-- .../session-detail/session-transcript.tsx | 16 ++--- .../session-detail/session-waterfall.tsx | 4 +- .../session-detail/span-expansion.tsx | 12 ++-- .../agent-sessions/session-detail/tool-io.tsx | 6 +- .../tools/agent-sessions-tabs.tsx | 2 +- .../tools/tool-breakdown-tables.tsx | 10 ++-- .../tools/tool-detail-charts.tsx | 4 +- .../tools/tool-detail-sessions.tsx | 4 +- .../agent-sessions/tools/tool-error-modal.tsx | 58 +++++++++---------- .../agent-sessions/tools/tool-error-parts.tsx | 4 +- .../tools/tool-errors-table.tsx | 14 ++--- .../tools/tool-filter-toolbar.tsx | 2 +- .../tools/tool-metric-strip.tsx | 2 +- .../agent-sessions/tools/tool-scope-row.tsx | 14 ++--- .../tools/tool-series-chart.tsx | 6 +- .../ai-elements/inline/inline-card.tsx | 4 +- .../ai-elements/inline/inline-log.tsx | 4 +- .../ai-elements/inline/inline-trace.tsx | 2 +- .../components/ai-elements/markdown-chart.tsx | 2 +- .../renderers/components/data-table.tsx | 2 +- .../renderers/components/error-list.tsx | 6 +- .../renderers/components/log-list.tsx | 6 +- .../renderers/components/metrics-list.tsx | 2 +- .../renderers/components/query-chart.tsx | 4 +- .../renderers/components/span-tree.tsx | 4 +- .../renderers/components/stat-cards.tsx | 2 +- .../renderers/components/trace-list.tsx | 8 +-- apps/web/src/components/ai-elements/tool.tsx | 4 +- .../components/alerts/alert-rule-chart.tsx | 14 ++--- .../src/components/alerts/alert-stat-card.tsx | 2 +- .../components/alerts/destination-card.tsx | 2 +- .../components/alerts/destination-dialog.tsx | 50 ++++++++-------- .../src/components/alerts/details-section.tsx | 2 +- .../alerts/incident-timeline-strip.tsx | 4 +- .../alerts/notifications-section.tsx | 4 +- .../alerts/overview/alerts-empty-state.tsx | 2 +- .../alerts/overview/rules-overview-table.tsx | 2 +- .../alerts/overview/settings-tab.tsx | 2 +- .../alerts/rule-templates-overlay.tsx | 2 +- .../alerts/signal-and-threshold-section.tsx | 2 +- .../components/analytics/ai/ai-sections.tsx | 36 ++++++------ .../analytics/ai/analytics-ai-tab.tsx | 2 +- .../analytics/analytics-breakdown-panel.tsx | 14 ++--- .../analytics/analytics-traffic-chart.tsx | 2 +- .../components/anomalies/anomaly-format.ts | 2 +- .../components/anomalies/anomaly-group.tsx | 2 +- .../anomalies/anomaly-linked-issue-card.tsx | 2 +- .../anomalies/anomaly-timeseries-chart.tsx | 2 +- .../web/src/components/app-error-boundary.tsx | 2 +- .../web/src/components/chat/approval-card.tsx | 4 +- .../chat/approval-renderers/dashboard.tsx | 14 ++--- .../chat/approval-renderers/index.tsx | 2 +- .../components/chat/diagnosis-report-card.tsx | 4 +- .../chat/investigation-attachment-card.tsx | 2 +- .../src/components/chat/message-actions.tsx | 2 +- apps/web/src/components/chat/task-card.tsx | 6 +- .../chat/widget-fix-attachment-card.tsx | 4 +- .../components/code-review/author-avatar.tsx | 2 +- apps/web/src/components/common/data-table.tsx | 4 +- .../src/components/common/image-dropzone.tsx | 2 +- .../src/components/common/series-legend.tsx | 6 +- .../src/components/common/service-pills.tsx | 4 +- apps/web/src/components/common/stat-rail.tsx | 6 +- .../blank-dashboard-empty.tsx | 2 +- .../dashboard-builder/config/chart-picker.tsx | 2 +- .../config/funnel-query-panel.tsx | 18 +++--- .../config/list-config-panel.tsx | 6 +- .../config/markdown-editor-panel.tsx | 2 +- .../config/paths-query-panel.tsx | 26 ++++----- .../config/query-panel-shell.tsx | 4 +- .../dashboard-builder/config/query-panel.tsx | 10 ++-- .../config/raw-sql-editor-panel.tsx | 16 ++--- .../config/settings-fields.tsx | 2 +- .../config/variables-manager-dialog.tsx | 8 +-- .../config/widget-query-builder-page.tsx | 6 +- .../history/dashboard-history-panel.tsx | 4 +- .../history/preview-banner.tsx | 2 +- .../history/version-list-item.tsx | 6 +- .../dashboard-builder/list-section-header.tsx | 4 +- .../dashboard-builder/list/dashboard-list.tsx | 20 +++---- .../dashboard-builder/tag-editor.tsx | 6 +- .../templates/template-detail-panel.tsx | 14 ++--- .../templates/template-list.tsx | 10 ++-- .../toolbar/embed-widget-dialog.tsx | 2 +- .../toolbar/variable-selects.tsx | 2 +- .../widgets/types/markdown.tsx | 2 +- .../widgets/types/preset-preview.tsx | 6 +- .../widgets/widget-shell.tsx | 22 +++---- .../src/components/dashboard/app-sidebar.tsx | 4 +- .../dashboard/service-health-section.tsx | 4 +- .../src/components/dashboard/user-avatar.tsx | 2 +- apps/web/src/components/errors/actor-chip.tsx | 4 +- .../errors/attach-pull-request-dialog.tsx | 2 +- .../components/errors/error-signal-row.tsx | 6 +- .../errors/issue-occurrences-table.tsx | 2 +- .../src/components/errors/issue-pickers.tsx | 2 +- .../src/components/errors/issue-sidebar.tsx | 4 +- .../src/components/errors/issue-timeline.tsx | 8 +-- .../src/components/errors/quick-pick-menu.tsx | 4 +- .../components/errors/signal-state-chip.tsx | 6 +- .../filters/pinned-namespace-notice.tsx | 2 +- .../funnels/funnel-step-builder.tsx | 6 +- .../header/onboarding-checklist-button.tsx | 6 +- .../cloudflare/cloudflare-breakdown-panel.tsx | 14 ++--- .../cloudflare/cloudflare-edge-share-band.tsx | 16 ++--- .../cloudflare-zone-detail-charts.tsx | 8 +-- .../infra/cloudflare/compact-filter-input.tsx | 2 +- .../src/components/infra/container-table.tsx | 2 +- .../components/infra/host-detail-chart.tsx | 2 +- .../components/infra/host-detail-header.tsx | 2 +- .../components/infra/host-metadata-panel.tsx | 2 +- apps/web/src/components/infra/host-table.tsx | 2 +- .../infra/infra-correlation-panel.tsx | 4 +- .../infra/kubernetes/pod-peek-sheet.tsx | 6 +- apps/web/src/components/infra/node-table.tsx | 2 +- .../infra/overview/infra-overview.tsx | 2 +- .../planetscale/planetscale-activity-feed.tsx | 6 +- .../planetscale/planetscale-alert-menu.tsx | 2 +- .../planetscale-branch-breakdown-panel.tsx | 2 +- .../planetscale/planetscale-top-queries.tsx | 10 ++-- apps/web/src/components/infra/pod-table.tsx | 2 +- .../components/infra/primitives/avg-peak.tsx | 2 +- .../infra/primitives/filter-chips.tsx | 2 +- .../infra/primitives/fleet-band.tsx | 8 +-- .../components/infra/primitives/meta-line.tsx | 2 +- .../infra/primitives/meter-rows.tsx | 4 +- .../infra/primitives/mono-link-button.tsx | 2 +- .../infra/primitives/segment-pivot.tsx | 2 +- .../infra/railway/railway-service-table.tsx | 2 +- .../infra/service-lens/correlation-strips.tsx | 2 +- .../infra/service-lens/service-lens-rail.tsx | 10 ++-- .../web/src/components/infra/status-badge.tsx | 2 +- .../src/components/infra/workload-table.tsx | 2 +- .../components/ingest/connection-status.tsx | 4 +- .../src/components/ingest/guided-setup.tsx | 2 +- .../integrations/chat-integration-card.tsx | 8 +-- .../integrations/cloudflare-account-card.tsx | 4 +- .../integrations/cloudflare-stat-cards.tsx | 2 +- .../integrations/cloudflare-zone-board.tsx | 12 ++-- .../integrations/hazel-integration-card.tsx | 2 +- .../planetscale-integration-card.tsx | 2 +- .../planetscale-setup-checklist.tsx | 4 +- .../investigations/action-detail-sheet.tsx | 6 +- .../investigations/flow/flow-edge.tsx | 2 +- .../investigations/flow/flow-nodes.tsx | 18 +++--- .../investigations/investigation-meta.tsx | 2 +- .../src/components/logs/highlighted-text.tsx | 2 +- .../src/components/logs/log-meta-strip.tsx | 4 +- .../web/src/components/logs/log-raw-panel.tsx | 4 +- .../src/components/logs/log-row-expanded.tsx | 2 +- .../src/components/logs/log-search-help.tsx | 10 ++-- .../components/logs/log-search-mode-badge.tsx | 2 +- .../src/components/logs/log-text-button.tsx | 2 +- .../components/logs/log-trace-timeline.tsx | 8 +-- apps/web/src/components/logs/logs-table.tsx | 2 +- .../src/components/logs/logs-volume-chart.tsx | 8 +-- .../metrics/metric-preview-card.tsx | 6 +- .../src/components/metrics/metrics-table.tsx | 2 +- .../onboarding/onboarding-header-actions.tsx | 2 +- .../src/components/onboarding/step-region.tsx | 2 +- .../query-builder/where-clause-editor.tsx | 2 +- .../components/releases/release-changeset.tsx | 8 +-- .../releases/release-deploy-overview.tsx | 6 +- .../releases/release-detail-panels.tsx | 8 +-- .../releases/release-issues-panel.tsx | 8 +-- .../components/releases/releases-live-now.tsx | 12 ++-- .../components/releases/releases-table.tsx | 6 +- .../components/releases/releases-timeline.tsx | 10 ++-- .../src/components/replays/marker-legend.tsx | 2 +- .../replays/replay-editor-timeline.tsx | 14 ++--- .../src/components/replays/replay-player.tsx | 2 +- .../replays/session-detail-parts.tsx | 2 +- .../replays/session-events-panel.tsx | 42 +++++++------- .../src/components/replays/sessions-list.tsx | 2 +- apps/web/src/components/route-error.tsx | 2 +- .../service-map/service-map-view.tsx | 56 +++++++++--------- .../components/service-map/three/viewport.tsx | 14 ++--- .../components/services/dependency-table.tsx | 4 +- .../components/services/service-api-tab.tsx | 12 ++-- .../services/service-dependencies-tab.tsx | 2 +- .../services/service-errors-panel.tsx | 2 +- .../services/service-recent-deploys.tsx | 4 +- .../services/service-table-cells.tsx | 2 +- .../services/service-top-operations-panel.tsx | 2 +- .../services/service-usage-panel.tsx | 4 +- .../services/service-workloads-panel.tsx | 6 +- .../components/services/services-table.tsx | 10 ++-- .../components/settings/api-keys-section.tsx | 20 +++---- .../components/settings/audit-log-section.tsx | 16 ++--- .../settings/billing-controls-card.tsx | 2 +- .../settings/billing-details-dialog.tsx | 2 +- .../settings/billing-details-section.tsx | 2 +- .../components/settings/cost-breakdown.tsx | 4 +- .../settings/create-api-key-dialog.tsx | 2 +- .../settings/escalation-policy-section.tsx | 2 +- .../settings/feature-usage-cards.tsx | 4 +- .../components/settings/ingestion-section.tsx | 4 +- .../src/components/settings/plan-offer.tsx | 20 +++---- .../src/components/settings/pricing-cards.tsx | 4 +- .../settings/setup-audit-section.tsx | 12 ++-- .../src/components/settings/spend-chart.tsx | 8 +-- .../time-range-picker/quick-select-grid.tsx | 2 +- .../time-range-picker/refresh-controls.tsx | 2 +- .../time-range-picker/shorthand-input.tsx | 4 +- .../time-range-picker/timezone-select.tsx | 8 +-- .../components/traces/span-detail-panel.tsx | 12 ++-- .../components/traces/trace-anatomy-strip.tsx | 2 +- .../components/traces/trace-peek-sheet.tsx | 2 +- .../src/components/traces/traces-table.tsx | 2 +- .../commit-markers/commit-markers-layer.tsx | 4 +- .../components/vcs/commit-sha-hover-card.tsx | 14 ++--- apps/web/src/lab/agent-tools-lab.tsx | 2 +- apps/web/src/lab/charts/heatmap-spike.tsx | 6 +- apps/web/src/lab/charts/histogram-spike.tsx | 4 +- apps/web/src/lab/charts/pie-spike.tsx | 2 +- apps/web/src/lab/charts/sankey-spike.tsx | 4 +- apps/web/src/lab/charts/stacked-bar-spike.tsx | 6 +- .../src/lab/charts/trace-scatter-spike.tsx | 2 +- apps/web/src/lab/charts/treemap-spike.tsx | 2 +- apps/web/src/lab/lab-index.tsx | 4 +- apps/web/src/lab/query-builder-lab.tsx | 32 +++++----- apps/web/src/lab/service-map-3d/index.tsx | 16 ++--- apps/web/src/lab/widget-lab/widget-lab.tsx | 2 +- apps/web/src/routes/alerts/$ruleId.tsx | 4 +- apps/web/src/routes/analytics/index.tsx | 2 +- apps/web/src/routes/dashboards/index.tsx | 2 +- .../web/src/routes/infra/cloudflare/index.tsx | 4 +- .../kubernetes/services/$serviceName.tsx | 10 ++-- .../workloads/$kind/$workloadName.tsx | 2 +- .../src/routes/infra/planetscale/$dbName.tsx | 4 +- apps/web/src/routes/lab/bench/service-map.tsx | 2 +- apps/web/src/routes/releases/$commitSha.tsx | 2 +- apps/web/src/routes/releases/index.tsx | 2 +- apps/web/src/routes/select-plan.tsx | 2 +- .../attributes/attributes-table.tsx | 12 ++-- .../components/attributes/gen-ai-section.tsx | 2 +- .../charts/_shared/chart-skeleton.tsx | 18 +++--- .../components/charts/_shared/chart-state.tsx | 6 +- .../charts/_shared/query-builder-legend.tsx | 4 +- .../charts/funnel/funnel-dropoff-chart.tsx | 22 +++---- .../funnel/query-builder-funnel-chart.tsx | 16 ++--- .../charts/hbar/query-builder-hbar-chart.tsx | 6 +- .../heatmap/query-builder-heatmap-chart.tsx | 8 +-- .../query-builder-histogram-chart.tsx | 4 +- .../components/charts/paths/paths-chart.tsx | 18 +++--- .../charts/pie/query-builder-pie-chart.tsx | 6 +- packages/ui/src/components/detail-rail.tsx | 12 ++-- packages/ui/src/components/error-section.tsx | 10 ++-- .../src/components/filters/filter-section.tsx | 6 +- .../src/components/filters/filter-styles.ts | 2 +- .../filters/range-filter-section.tsx | 10 ++-- .../ui/src/components/http-status-code.tsx | 2 +- .../components/logs/log-attribute-chip.tsx | 6 +- .../ui/src/components/logs/severity-badge.tsx | 2 +- .../ui/src/components/plot/fixed-metrics.tsx | 2 +- .../ui/src/components/plot/plot-legend.tsx | 2 +- .../ui/src/components/plot/plot-tooltip.tsx | 4 +- .../service-map/service-map-canvas.tsx | 16 ++--- .../service-map/service-map-edge.tsx | 2 +- .../service-map-namespace-group.tsx | 2 +- .../service-map/service-map-node.tsx | 16 ++--- .../src/components/traces/color-by-picker.tsx | 2 +- .../components/traces/flamegraph-minimap.tsx | 2 +- .../ui/src/components/traces/flamegraph.tsx | 14 ++--- .../ui/src/components/traces/flow-edge.tsx | 2 +- .../ui/src/components/traces/flow-node.tsx | 12 ++-- .../ui/src/components/traces/flow-view.tsx | 2 +- .../src/components/traces/http-span-label.tsx | 2 +- .../src/components/traces/span-hierarchy.tsx | 2 +- .../ui/src/components/traces/span-row.tsx | 18 +++--- .../ui/src/components/traces/span-tooltip.tsx | 10 ++-- .../traces/trace-timeline-minimap.tsx | 2 +- .../components/traces/trace-timeline-row.tsx | 18 +++--- .../traces/trace-timeline-search.tsx | 2 +- .../traces/trace-timeline-time-axis.tsx | 2 +- .../src/components/traces/trace-timeline.tsx | 18 +++--- packages/ui/src/components/ui/badge.tsx | 2 +- packages/ui/src/components/ui/eyebrow.tsx | 6 +- packages/ui/src/components/ui/panel.tsx | 2 +- packages/ui/src/components/ui/sidebar.tsx | 2 +- packages/ui/src/components/ui/table.tsx | 4 +- packages/ui/src/styles/tokens.css | 4 ++ 285 files changed, 908 insertions(+), 904 deletions(-) diff --git a/apps/web/src/components/agent-sessions/session-detail/payload-view.tsx b/apps/web/src/components/agent-sessions/session-detail/payload-view.tsx index c8c79011c5..346af2b27b 100644 --- a/apps/web/src/components/agent-sessions/session-detail/payload-view.tsx +++ b/apps/web/src/components/agent-sessions/session-detail/payload-view.tsx @@ -79,7 +79,7 @@ export function ViewSwitch({ ) } -const SEGMENT_CLASS = "font-mono text-[10px] uppercase tracking-[0.08em] sm:text-[10px]" +const SEGMENT_CLASS = "font-mono text-3xs uppercase tracking-[0.08em] sm:text-3xs" // The switch sits inside clickable rows; a segment click must not toggle the row. const stopPropagation = (event: { stopPropagation: () => void }) => event.stopPropagation() diff --git a/apps/web/src/components/agent-sessions/session-detail/session-flow.tsx b/apps/web/src/components/agent-sessions/session-detail/session-flow.tsx index 6667fcf461..51383c1f2c 100644 --- a/apps/web/src/components/agent-sessions/session-detail/session-flow.tsx +++ b/apps/web/src/components/agent-sessions/session-detail/session-flow.tsx @@ -493,14 +493,14 @@ const StepNode = memo(function StepNode({ data }: NodeProps & { data: StepData } {shortTarget(node.title)} {node.count > 1 && ( - + ×{node.count} )} diff --git a/apps/web/src/components/agent-sessions/session-detail/session-overview.tsx b/apps/web/src/components/agent-sessions/session-detail/session-overview.tsx index ea3ca5c0ce..a79390f29a 100644 --- a/apps/web/src/components/agent-sessions/session-detail/session-overview.tsx +++ b/apps/web/src/components/agent-sessions/session-detail/session-overview.tsx @@ -266,7 +266,7 @@ function Rail({ summary }: { summary: SessionSummary }) { {/* Cost is only ever what an instrumentation stamped on a span — Maple prices nothing itself, and saying so is the difference between a figure and a bill. */} -

+

{summary.cost === undefined ? "No span reported a cost. Maple does not price tokens itself." : "As reported by the instrumentation. Not a bill."} @@ -304,7 +304,7 @@ function Rail({ summary }: { summary: SessionSummary }) { ))} {summary.tokenReporting === "session-level" && ( -

+

Reported once for the whole session

)} @@ -328,7 +328,7 @@ function Rail({ summary }: { summary: SessionSummary }) { )} {failed} - failed + failed
)} @@ -470,7 +470,7 @@ function ToolLedgerColumns({ axis }: { axis: SessionAxis }) { // The last tick anchors to the axis end rather than centring on // it: a centred one would hang off the column. className={cn( - "absolute top-0 whitespace-nowrap font-mono font-normal text-[10px] normal-case tracking-normal", + "absolute top-0 whitespace-nowrap font-mono font-normal text-3xs normal-case tracking-normal", tick.fraction < 0.92 && "-translate-x-1/2", )} style={ diff --git a/apps/web/src/components/agent-sessions/session-detail/session-transcript.tsx b/apps/web/src/components/agent-sessions/session-detail/session-transcript.tsx index f2fa3346b8..05e7251f54 100644 --- a/apps/web/src/components/agent-sessions/session-detail/session-transcript.tsx +++ b/apps/web/src/components/agent-sessions/session-detail/session-transcript.tsx @@ -68,11 +68,11 @@ const BODY = "min-w-0 max-w-[900px] grow pl-3" /** Who is speaking — a name, set as one, not a category label. */ const SPEAKER = "shrink-0 font-semibold text-[13px] text-foreground" /** The clock beside a speaker's name, where a chat puts it. */ -const CLOCK = "shrink-0 font-mono text-[11px] text-muted-foreground tabular-nums" +const CLOCK = "shrink-0 font-mono text-2xs text-muted-foreground tabular-nums" /** Secondary facts and controls: there for the reader who points at the row. */ const ON_HOVER = "opacity-0 transition-opacity group-hover/row:opacity-100 group-focus-within/row:opacity-100" const LABEL = "shrink-0 font-medium text-xs" -const META = "min-w-0 truncate font-mono text-[11px] text-muted-foreground" +const META = "min-w-0 truncate font-mono text-2xs text-muted-foreground" /** One lane of nesting; the hairline is what makes a lane's extent visible. */ const INDENT = "flex w-6 shrink-0 justify-center" /** Past this the prose column is narrower than the gutters framing it, and a @@ -521,7 +521,7 @@ function UserBlock({ aria-expanded={showHistory} title={`${row.earlierCount} earlier message${row.earlierCount === 1 ? "" : "s"} re-sent with this one, shown once`} className={cn( - "shrink-0 cursor-pointer text-[11px] text-muted-foreground hover:text-foreground", + "shrink-0 cursor-pointer text-2xs text-muted-foreground hover:text-foreground", !showHistory && ON_HOVER, )} > @@ -555,7 +555,7 @@ function UserBlock({ {/* The history verbatim, not a diff: dropped and truncated messages make a suffix diff unreliable, so what the model was actually sent is shown whole instead of guessed at. */} -

+

The whole history this call re-sent, as captured.

{row.history.map((message, index) => { @@ -711,7 +711,7 @@ function AssistantBlock({ {row.failed && } {clockOf(row.startMs, timeZone)} {row.span.genAi.errorType !== undefined && ( - + {row.span.genAi.errorType} )} @@ -932,7 +932,7 @@ function ToolBlock({ {formatDuration(row.span.durationMs)} )} {row.failed && row.span.genAi.errorType !== undefined && ( - + {row.span.genAi.errorType} )} @@ -1002,7 +1002,7 @@ function PayloadSection({
{label} - + {[ meta, formatBytes(payload.byteLength), @@ -1048,7 +1048,7 @@ function PayloadSection({ /> )} {payload.truncatedByEmitter && ( -

+

Cut off here by the instrumentation, not by Maple — the tail was never recorded.

)} diff --git a/apps/web/src/components/agent-sessions/session-detail/session-waterfall.tsx b/apps/web/src/components/agent-sessions/session-detail/session-waterfall.tsx index f9a17ab399..41f58e2710 100644 --- a/apps/web/src/components/agent-sessions/session-detail/session-waterfall.tsx +++ b/apps/web/src/components/agent-sessions/session-detail/session-waterfall.tsx @@ -276,7 +276,7 @@ export function SessionWaterfall({ {axis.removedGapCount > 0 && ( -

+

Axis shows active time. {formatSessionDuration(axis.removedMs)} of idle removed across{" "} {axis.removedGapCount} gap{axis.removedGapCount === 1 ? "" : "s"}.

@@ -722,7 +722,7 @@ function SpanBar({ function GapRow({ gap }: { gap: IdleGap }) { return ( -
+
idle {formatSessionDuration(gap.durationMs)}
diff --git a/apps/web/src/components/agent-sessions/session-detail/span-expansion.tsx b/apps/web/src/components/agent-sessions/session-detail/span-expansion.tsx index e1feda3112..12a7f4dd93 100644 --- a/apps/web/src/components/agent-sessions/session-detail/span-expansion.tsx +++ b/apps/web/src/components/agent-sessions/session-detail/span-expansion.tsx @@ -147,7 +147,7 @@ export function SpanExpansion({ function TabCount({ count }: { count: number }) { if (count === 0) return null - return {count} + return {count} } function CopySpanJsonButton({ span }: { span: AiSessionSpan }) { @@ -219,12 +219,12 @@ function MetaStrip({ span }: { span: AiSessionSpan }) { {pairs.map(([label, value]) => value === undefined ? null : ( - {label} + {label} {value} ), )} - + span {span.spanId} @@ -347,7 +347,7 @@ function MessageBlock({ message, span }: { message: SpanMessage; span: AiSession {/* Output messages are what this call produced, so the call's own response facts belong on them and on nothing else. */} {message.origin === "output" && ( - + {callMetaLine(span)} )} @@ -482,7 +482,7 @@ function ToolCallCard({ )} {call.id !== undefined && ( {call.id} @@ -530,7 +530,7 @@ function PayloadCard({ {name} )} {meta !== undefined && ( - + {meta} )} diff --git a/apps/web/src/components/agent-sessions/session-detail/tool-io.tsx b/apps/web/src/components/agent-sessions/session-detail/tool-io.tsx index 1e54e4ab38..f84f50a50a 100644 --- a/apps/web/src/components/agent-sessions/session-detail/tool-io.tsx +++ b/apps/web/src/components/agent-sessions/session-detail/tool-io.tsx @@ -39,7 +39,7 @@ export interface ToolIoPayload { const IN_CLAMP: ClampLines = 8 const OUT_CLAMP: ClampLines = 14 -const META = "font-mono text-[10px] text-muted-foreground" +const META = "font-mono text-3xs text-muted-foreground" /** Fixed, so the two markers and every body below them share one lane. */ const GUTTER = "flex w-8 shrink-0 flex-col items-center gap-1.5 pt-2.5" @@ -131,7 +131,7 @@ export function ToolIoSummary({ result: ToolIoPayload | undefined }) { return ( - + {args === undefined ? "not captured" : formatBytes(args.byteLength)} @@ -232,7 +232,7 @@ function IoHalf({ /> )} {payload.truncatedByEmitter && ( -

+

Cut off here by the instrumentation, not by Maple — the tail was never recorded.

)} diff --git a/apps/web/src/components/agent-sessions/tools/agent-sessions-tabs.tsx b/apps/web/src/components/agent-sessions/tools/agent-sessions-tabs.tsx index d744f1e66f..b1b480dbcb 100644 --- a/apps/web/src/components/agent-sessions/tools/agent-sessions-tabs.tsx +++ b/apps/web/src/components/agent-sessions/tools/agent-sessions-tabs.tsx @@ -91,7 +91,7 @@ function TabLink({ {count === undefined ? null : ( diff --git a/apps/web/src/components/agent-sessions/tools/tool-breakdown-tables.tsx b/apps/web/src/components/agent-sessions/tools/tool-breakdown-tables.tsx index 1bf6344a7c..7f104ad00e 100644 --- a/apps/web/src/components/agent-sessions/tools/tool-breakdown-tables.tsx +++ b/apps/web/src/components/agent-sessions/tools/tool-breakdown-tables.tsx @@ -86,7 +86,7 @@ export function Th({ hidden?: string }) { const active = sortKey !== undefined && currentKey === sortKey - const text = "font-mono text-[10.5px] uppercase leading-3.5 tracking-[0.07em] transition-colors" + const text = "font-mono text-2xs uppercase leading-3.5 tracking-[0.07em] transition-colors" return (
{sortKey !== undefined ? ( @@ -198,7 +198,7 @@ export function ShareCell({ max={max} minVisible={3} fillClassName={tone.bar} - className="hidden w-[60px] shrink-0 rounded-[2px] bg-muted @min-[560px]/panel:block" + className="hidden w-[60px] shrink-0 rounded-xs bg-muted @min-[560px]/panel:block" /> {label} @@ -304,7 +304,7 @@ export function ToolsTable({
Tools - + {formatToolCount(rows.length)}
@@ -415,7 +415,7 @@ export function ToolsTable({ {formatToolCount(row.sessions)} - + {formatRelativeTimeOrDate(row.lastSeen, undefined, effectiveTimezone)} diff --git a/apps/web/src/components/agent-sessions/tools/tool-detail-charts.tsx b/apps/web/src/components/agent-sessions/tools/tool-detail-charts.tsx index ae5f275187..210d208e53 100644 --- a/apps/web/src/components/agent-sessions/tools/tool-detail-charts.tsx +++ b/apps/web/src/components/agent-sessions/tools/tool-detail-charts.tsx @@ -201,12 +201,12 @@ function Cell({ {series.length > 1 ? ( - + {series.map((entry) => ( {entry.label} diff --git a/apps/web/src/components/agent-sessions/tools/tool-detail-sessions.tsx b/apps/web/src/components/agent-sessions/tools/tool-detail-sessions.tsx index e3b5007cf7..e89f3f28ca 100644 --- a/apps/web/src/components/agent-sessions/tools/tool-detail-sessions.tsx +++ b/apps/web/src/components/agent-sessions/tools/tool-detail-sessions.tsx @@ -56,7 +56,7 @@ export function ToolDetailSessions({
Sessions running {tool} - + {plural(rows.length, "session")}
@@ -64,7 +64,7 @@ export function ToolDetailSessions({ to="/agent-sessions" // The sessions list's own param is `tools`, not `toolNames`. search={{ tools: [tool] }} - className="inline-flex h-7 shrink-0 items-center gap-2 rounded-md border border-border bg-card px-2.5 font-mono text-[11.5px] text-foreground transition-colors hover:bg-muted/50" + className="inline-flex h-7 shrink-0 items-center gap-2 rounded-md border border-border bg-card px-2.5 font-mono text-2xs text-foreground transition-colors hover:bg-muted/50" > Open in Sessions diff --git a/apps/web/src/components/agent-sessions/tools/tool-error-modal.tsx b/apps/web/src/components/agent-sessions/tools/tool-error-modal.tsx index 8726bf71cc..7db3c8f65e 100644 --- a/apps/web/src/components/agent-sessions/tools/tool-error-modal.tsx +++ b/apps/web/src/components/agent-sessions/tools/tool-error-modal.tsx @@ -202,7 +202,7 @@ export function ToolErrorModal({
-
+
{tool} / errors @@ -211,7 +211,7 @@ export function ToolErrorModal({ {position.index + 1} of {position.total} {group.errorType === "" ? null : ( - + error.type {group.errorType} )} @@ -234,7 +234,7 @@ export function ToolErrorModal({ ) : ( )} -
+
@@ -292,7 +292,7 @@ export function ToolErrorModal({ // The sessions list reads `tools`, not `toolNames` — see its // own search schema. search={{ tools: [tool], hasErrors: true }} - className="inline-flex h-[30px] items-center gap-2 rounded-md border border-border bg-card px-2.5 font-mono text-[11.5px] text-foreground transition-colors hover:bg-muted/50" + className="inline-flex h-[30px] items-center gap-2 rounded-md border border-border bg-card px-2.5 font-mono text-2xs text-foreground transition-colors hover:bg-muted/50" > Open in Sessions Failed calls / {bucket.unit} - + max {formatToolCount(Math.max(0, ...group.spark))}
-
+
{windowRangeLabel(range.startMs, range.startMs, effectiveTimezone)} @@ -453,7 +453,7 @@ function VariantsSection({
Variants - + {formatToolCount(total)} raw messages
@@ -491,7 +491,7 @@ function VariantsSection({ )} - + ) })} -

+

{onlyIndex ? "Grouped because only the array index differs." : "Grouped because only masked values differ."}{" "} @@ -571,7 +571,7 @@ function Breakdown({ > {key === "" ? blank : key} - +

Sessions - + {formatToolCount(total)}
@@ -688,7 +688,7 @@ function SessionsSection({ {formatToolCount(calls)} - + {relative(lastSeen)} @@ -717,7 +717,7 @@ function SessionsSection({ sessionId={row.sessionId} className="max-w-full font-mono text-xs" /> - + {row.service === "" ? row.agentName === "" ? row.vendorId @@ -728,7 +728,7 @@ function SessionsSection({ {formatToolCount(row.hits)} - + {relative(row.lastSeen)}
@@ -790,12 +790,12 @@ function SamplesPane({
Samples - + {formatToolCount(total)} failed call{total === 1 ? "" : "s"} · newest first
- j / k + j / k @@ -1116,7 +1116,7 @@ function ArgumentsBlock({ ))}
)} -
+
{truncatedByRead ? `The first ${formatToolCount(row.arguments.length)} characters of ${formatToolCount(row.argumentsBytes)} B` @@ -1149,7 +1149,7 @@ function PayloadLineView({ line }: { line: PayloadLine }) { style={{ paddingLeft: 14 + line.depth * 16 - (line.highlight ? 2 : 0) }} > {line.missingKey !== undefined ? ( - + "{line.missingKey}"missing, required ) : ( @@ -1167,15 +1167,15 @@ function PayloadLineView({ line }: { line: PayloadLine }) { )} {line.folded === undefined ? null : ( - + {line.folded} )} {line.note === undefined ? null : ( -
+
↑ {line.note.text} {line.note.hiddenBytes > 0 ? ( - + +{formatToolCount(line.note.hiddenBytes)} B not shown ) : null} @@ -1199,7 +1199,7 @@ function ResultBlock({ row }: { row: ToolErrorOccurrenceRow }) { )} {source === undefined ? null : ( - + Error message read from {source} )} diff --git a/apps/web/src/components/agent-sessions/tools/tool-error-parts.tsx b/apps/web/src/components/agent-sessions/tools/tool-error-parts.tsx index 2f8a9428d2..db237137a9 100644 --- a/apps/web/src/components/agent-sessions/tools/tool-error-parts.tsx +++ b/apps/web/src/components/agent-sessions/tools/tool-error-parts.tsx @@ -19,7 +19,7 @@ export function MaskChip({ label, raw, className }: { label: string; raw: string @@ -320,7 +320,7 @@ export function FailureStatusLine({ : `· failed in ${activeBuckets.active} of ${activeBuckets.total} ${activeBuckets.unit === "day" ? "days" : `${activeBuckets.unit} buckets`}`, ] return ( - + {lead} {detail === undefined ? null : {detail}} diff --git a/apps/web/src/components/agent-sessions/tools/tool-errors-table.tsx b/apps/web/src/components/agent-sessions/tools/tool-errors-table.tsx index 2b19942545..340a3ebc99 100644 --- a/apps/web/src/components/agent-sessions/tools/tool-errors-table.tsx +++ b/apps/web/src/components/agent-sessions/tools/tool-errors-table.tsx @@ -214,7 +214,7 @@ export function ToolErrorsTable({ {loading ? ( ) : ( - + {formatToolCount(failures)} failed call{failures === 1 ? "" : "s"} {rows.length > 0 ? ` · ${formatToolCount(rows.length)} error${rows.length === 1 ? "" : "s"}` @@ -250,7 +250,7 @@ export function ToolErrorsTable({ ) : ( -
+
Error {headHint === "" ? null : ( @@ -320,7 +320,7 @@ export function ToolErrorsTable({ {prepared.errorType === undefined && row.errorType !== "" ? ( @@ -328,7 +328,7 @@ export function ToolErrorsTable({ ) : null} {row.variants > 1 ? ( - + {row.variants} variants ) : null} @@ -351,7 +351,7 @@ export function ToolErrorsTable({ {formatToolCount(row.sessions)} - + {formatRelativeTimeOrDate( row.lastSeen, undefined, @@ -397,11 +397,11 @@ export function ToolErrorsTable({ {masks.length > 0 && !loading ? ( -
+
Calls with the same message are grouped; changing values are masked: {masks.map((label) => ( - + {MASK_MEANINGS.get(label)} ))} diff --git a/apps/web/src/components/agent-sessions/tools/tool-filter-toolbar.tsx b/apps/web/src/components/agent-sessions/tools/tool-filter-toolbar.tsx index 8f7f55cf11..336e67d3bd 100644 --- a/apps/web/src/components/agent-sessions/tools/tool-filter-toolbar.tsx +++ b/apps/web/src/components/agent-sessions/tools/tool-filter-toolbar.tsx @@ -149,7 +149,7 @@ function FacetSelect({ {/* The sentinel is a Base UI implementation detail; rendered children are what keeps it off the trigger. */} - + {label} {" "} {value ?? "All"} diff --git a/apps/web/src/components/agent-sessions/tools/tool-metric-strip.tsx b/apps/web/src/components/agent-sessions/tools/tool-metric-strip.tsx index a860ab5d5b..e97beee3af 100644 --- a/apps/web/src/components/agent-sessions/tools/tool-metric-strip.tsx +++ b/apps/web/src/components/agent-sessions/tools/tool-metric-strip.tsx @@ -182,7 +182,7 @@ function DurationTile({ {candidate} diff --git a/apps/web/src/components/agent-sessions/tools/tool-scope-row.tsx b/apps/web/src/components/agent-sessions/tools/tool-scope-row.tsx index 08c5f243b0..a25c5b0964 100644 --- a/apps/web/src/components/agent-sessions/tools/tool-scope-row.tsx +++ b/apps/web/src/components/agent-sessions/tools/tool-scope-row.tsx @@ -46,9 +46,9 @@ export function ToolScopeRow({ )} >
- SCOPE + SCOPE {chips.length === 0 ? ( - all tools · all models + all tools · all models ) : ( <> {chips.map((chip) => ( @@ -59,9 +59,9 @@ export function ToolScopeRow({ title={`Remove ${chip.kind} ${chip.value}`} className="inline-flex h-[22px] max-w-64 items-center gap-[5px] rounded-sm border border-primary/35 bg-primary/10 px-2 transition-colors hover:bg-primary/20" > - {chip.kind} - {chip.value} - + {chip.kind} + {chip.value} + ✕ @@ -69,14 +69,14 @@ export function ToolScopeRow({ )}
- + {count} {rest.join(" ")} diff --git a/apps/web/src/components/agent-sessions/tools/tool-series-chart.tsx b/apps/web/src/components/agent-sessions/tools/tool-series-chart.tsx index 987e66fd71..a9eb799f5d 100644 --- a/apps/web/src/components/agent-sessions/tools/tool-series-chart.tsx +++ b/apps/web/src/components/agent-sessions/tools/tool-series-chart.tsx @@ -217,7 +217,7 @@ export function ToolSeriesChart({ ))} - + {bucketMs === null ? null : `${bucketLabel(bucketMs)} buckets`}
@@ -225,12 +225,12 @@ export function ToolSeriesChart({ {/* Only where there is more than one series to tell apart — a single series is already named by the head. */} {plotted.length > 1 ? ( -
+
{plotted.map((entry) => ( {entry.label} diff --git a/apps/web/src/components/ai-elements/inline/inline-card.tsx b/apps/web/src/components/ai-elements/inline/inline-card.tsx index dee65f5eb6..d546118e7a 100644 --- a/apps/web/src/components/ai-elements/inline/inline-card.tsx +++ b/apps/web/src/components/ai-elements/inline/inline-card.tsx @@ -98,14 +98,14 @@ export function InlineServiceChips({ services }: { services: readonly string[] } {shown.map((service) => ( {service} ))} {services.length > shown.length ? ( - + +{services.length - shown.length} ) : null} diff --git a/apps/web/src/components/ai-elements/inline/inline-log.tsx b/apps/web/src/components/ai-elements/inline/inline-log.tsx index 19674525b3..80d45165e7 100644 --- a/apps/web/src/components/ai-elements/inline/inline-log.tsx +++ b/apps/web/src/components/ai-elements/inline/inline-log.tsx @@ -24,7 +24,7 @@ export function InlineLog({ data }: { data: InlineLogData }) { {data.body} {data.timestamp && ( - + {new Date(normalizeTimestampInput(data.timestamp)).toLocaleTimeString()} )} @@ -35,7 +35,7 @@ export function InlineLog({ data }: { data: InlineLogData }) { search={data.timestamp ? { t: data.timestamp } : undefined} target="_blank" rel="noreferrer" - className="shrink-0 rounded-sm bg-muted px-1.5 py-0.5 text-[11px] text-muted-foreground transition-colors hover:bg-muted hover:text-foreground" + className="shrink-0 rounded-sm bg-muted px-1.5 py-0.5 text-2xs text-muted-foreground transition-colors hover:bg-muted hover:text-foreground" title={data.traceId} > trace diff --git a/apps/web/src/components/ai-elements/inline/inline-trace.tsx b/apps/web/src/components/ai-elements/inline/inline-trace.tsx index 6f1a7e512b..de7e205f4f 100644 --- a/apps/web/src/components/ai-elements/inline/inline-trace.tsx +++ b/apps/web/src/components/ai-elements/inline/inline-trace.tsx @@ -58,7 +58,7 @@ export function InlineTrace({ data }: { data: InlineTraceData }) { value={data.id} kind="trace" length={12} - className="shrink-0 text-[11px] text-muted-foreground/70" + className="shrink-0 text-2xs text-muted-foreground/70" />
diff --git a/apps/web/src/components/ai-elements/markdown-chart.tsx b/apps/web/src/components/ai-elements/markdown-chart.tsx index 84296409ea..274aa29625 100644 --- a/apps/web/src/components/ai-elements/markdown-chart.tsx +++ b/apps/web/src/components/ai-elements/markdown-chart.tsx @@ -69,7 +69,7 @@ function ChartFrame({ title, children }: { title: string | null; children: React return (
{title ? ( -
{title}
+
{title}
) : null} {children}
diff --git a/apps/web/src/components/ai-elements/renderers/components/data-table.tsx b/apps/web/src/components/ai-elements/renderers/components/data-table.tsx index 24a0ed95cf..5509482ddb 100644 --- a/apps/web/src/components/ai-elements/renderers/components/data-table.tsx +++ b/apps/web/src/components/ai-elements/renderers/components/data-table.tsx @@ -21,7 +21,7 @@ export function DataTable({ props }: RendererComponentProps) { return (
- {title &&

{title}

} + {title &&

{title}

}
diff --git a/apps/web/src/components/ai-elements/renderers/components/error-list.tsx b/apps/web/src/components/ai-elements/renderers/components/error-list.tsx index 7b8dd3082f..0d25a99bb1 100644 --- a/apps/web/src/components/ai-elements/renderers/components/error-list.tsx +++ b/apps/web/src/components/ai-elements/renderers/components/error-list.tsx @@ -23,7 +23,7 @@ export function ErrorList({ props }: RendererComponentProps) { return (
{err.errorType} @@ -36,12 +36,12 @@ export function ErrorList({ props }: RendererComponentProps) { ))} {err.affectedServices.length > 2 && ( - + +{err.affectedServices.length - 2} )}
- {timeAgo} + {timeAgo} ) })} diff --git a/apps/web/src/components/ai-elements/renderers/components/log-list.tsx b/apps/web/src/components/ai-elements/renderers/components/log-list.tsx index da15582677..152cc90079 100644 --- a/apps/web/src/components/ai-elements/renderers/components/log-list.tsx +++ b/apps/web/src/components/ai-elements/renderers/components/log-list.tsx @@ -20,7 +20,7 @@ export function LogList({ props }: RendererComponentProps) { return (
{totalCount != null && ( -

+

{totalCount.toLocaleString()} total logs {totalCount > logs.length && ` (showing ${logs.length})`}

@@ -31,9 +31,9 @@ export function LogList({ props }: RendererComponentProps) { return (
- + {time} diff --git a/apps/web/src/components/ai-elements/renderers/components/metrics-list.tsx b/apps/web/src/components/ai-elements/renderers/components/metrics-list.tsx index db2a274a3f..99fbb86930 100644 --- a/apps/web/src/components/ai-elements/renderers/components/metrics-list.tsx +++ b/apps/web/src/components/ai-elements/renderers/components/metrics-list.tsx @@ -26,7 +26,7 @@ export function MetricsList({ props }: RendererComponentProps) {summary.length > 0 && (
{summary.map((s) => ( -
+
{s.metricType} diff --git a/apps/web/src/components/ai-elements/renderers/components/query-chart.tsx b/apps/web/src/components/ai-elements/renderers/components/query-chart.tsx index d1bd1e4efc..d8d414e978 100644 --- a/apps/web/src/components/ai-elements/renderers/components/query-chart.tsx +++ b/apps/web/src/components/ai-elements/renderers/components/query-chart.tsx @@ -34,7 +34,7 @@ export function QueryChart({ props }: RendererComponentProps) { if (rows.length === 0) { return ( -
+
No data points
) @@ -42,7 +42,7 @@ export function QueryChart({ props }: RendererComponentProps) { return (
-

{metric}

+

{metric}

{/* * `legend="hidden"`: the Recharts original drew no ``. Nothing * opens a legend slot around an agent message either, so the series are diff --git a/apps/web/src/components/ai-elements/renderers/components/span-tree.tsx b/apps/web/src/components/ai-elements/renderers/components/span-tree.tsx index 57c41b5fba..1a0b0fa4c6 100644 --- a/apps/web/src/components/ai-elements/renderers/components/span-tree.tsx +++ b/apps/web/src/components/ai-elements/renderers/components/span-tree.tsx @@ -25,7 +25,7 @@ function SpanNode({ span, isLast, depth }: { span: SpanNode; isLast: boolean; de return (
-
+
) { return (
-
+
Trace{" "} ) {
{cards.map((card) => (
-

{card.label}

+

{card.label}

{formatValue(card.value, card.format)}

))} diff --git a/apps/web/src/components/ai-elements/renderers/components/trace-list.tsx b/apps/web/src/components/ai-elements/renderers/components/trace-list.tsx index b36dd2f093..9096659510 100644 --- a/apps/web/src/components/ai-elements/renderers/components/trace-list.tsx +++ b/apps/web/src/components/ai-elements/renderers/components/trace-list.tsx @@ -33,12 +33,12 @@ export function TraceList({ props }: RendererComponentProps) { return (
{stats && ( -
+
- P50: + P50: - P95: + P95: Min: {formatDuration(stats.minMs)} Max: {formatDuration(stats.maxMs)} @@ -92,7 +92,7 @@ export function TraceList({ props }: RendererComponentProps) { ))} {trace.services.length > 3 && ( - + +{trace.services.length - 3} )} diff --git a/apps/web/src/components/ai-elements/tool.tsx b/apps/web/src/components/ai-elements/tool.tsx index cdd4e1f661..086b037193 100644 --- a/apps/web/src/components/ai-elements/tool.tsx +++ b/apps/web/src/components/ai-elements/tool.tsx @@ -282,7 +282,7 @@ export const ToolRow = memo(function ToolRow(props: ToolProps) { {label} {summary ? ( - + {summary} ) : ( @@ -353,7 +353,7 @@ export const ToolRow = memo(function ToolRow(props: ToolProps) { export function RunningClock() { const elapsed = formatElapsed(useElapsedSeconds()) if (!elapsed) return null - return {elapsed} + return {elapsed} } /** A tool call standing on its own — same line, no shell around it. */ diff --git a/apps/web/src/components/alerts/alert-rule-chart.tsx b/apps/web/src/components/alerts/alert-rule-chart.tsx index 9d9460f9a3..f2711c8b69 100644 --- a/apps/web/src/components/alerts/alert-rule-chart.tsx +++ b/apps/web/src/components/alerts/alert-rule-chart.tsx @@ -704,7 +704,7 @@ export const AlertRuleChart = React.memo(function AlertRuleChart({ {chartArea} {hasSignal && ( -
+
{error != null && ( -

{error}

+

{error}

)}
)} {hasSignal && hasGhost && ( -
+
0 && ( -

+

Shaded: rule would have fired (approximate — the live scheduler evaluates every minute).

)} {hasSignal && source === "preview" && noDataBands.length > 0 && ( -

+

Hatched: no data received in these windows.

)} {preview?.truncatedToStart != null && ( -

+

{clampedToPreview ? "Axis starts at " : "Query series starts at "} {formatTime(Date.parse(preview.truncatedToStart), "tooltip")} — the selected range needs more evaluation windows than one preview replays. Widen the rule's window or shorten the @@ -833,7 +833,7 @@ export const AlertRuleChart = React.memo(function AlertRuleChart({

diff --git a/apps/web/src/components/alerts/alert-stat-card.tsx b/apps/web/src/components/alerts/alert-stat-card.tsx index 52ade545a7..4b57b5f107 100644 --- a/apps/web/src/components/alerts/alert-stat-card.tsx +++ b/apps/web/src/components/alerts/alert-stat-card.tsx @@ -160,7 +160,7 @@ export function AlertFiringHero({
- + Firing now diff --git a/apps/web/src/components/alerts/destination-card.tsx b/apps/web/src/components/alerts/destination-card.tsx index 4df4f4139e..44cd7fa3f9 100644 --- a/apps/web/src/components/alerts/destination-card.tsx +++ b/apps/web/src/components/alerts/destination-card.tsx @@ -61,7 +61,7 @@ export function DestinationCard({ {destination.name} {label ?? provider.label} {busy ? : null}
-

+

{description ?? provider.description}

@@ -265,11 +265,11 @@ function EmailMemberPicker({ placeholder={form.memberUserIds.length === 0 ? "Select members…" : "Add member..."} value={form.memberUserIds} /> - + Alert emails go to the selected workspace members (up to {MAX_EMAIL_MEMBER_RECIPIENTS}). {form.memberUserIds.length > MAX_EMAIL_MEMBER_RECIPIENTS && ( -

+

Select at most {MAX_EMAIL_MEMBER_RECIPIENTS} members.

)} @@ -526,11 +526,11 @@ function HazelOAuthFields({ {organizationsFailed ? ( -

+

Couldn't load your Hazel organizations. Try reconnecting or refreshing.

) : organizations.length === 0 ? ( -

+

No organizations returned. Make sure your Hazel account is a member of at least one organization.

@@ -577,11 +577,11 @@ function HazelOAuthFields({ {orgIdForChannels.length > 0 && !channelsLoading && channelsFailed ? ( -

+

Couldn't load channels for this organization. Try reselecting the organization.

) : orgIdForChannels.length > 0 && !channelsLoading && channels.length === 0 ? ( -

+

No channels. Make sure your account is in at least one channel of this organization.

) : null} @@ -752,7 +752,7 @@ function ChatDestinationFields({
{storedChannelName ? ( - + Currently{" "} #{storedChannelName} @@ -761,7 +761,7 @@ function ChatDestinationFields({ type="button" size="xs" variant="ghost" - className="-my-1 h-6 gap-1 px-1.5 text-[11px] text-muted-foreground" + className="-my-1 h-6 gap-1 px-1.5 text-2xs text-muted-foreground" onClick={refreshChannels} loading={channelsLoading} title={`Re-fetch the channel list from ${connectorName}`} @@ -808,7 +808,7 @@ function ChatDestinationFields({ #{channel.name} {channel.is_private ? ( - private + private ) : null} @@ -825,7 +825,7 @@ function ChatDestinationFields({ {needsReinstall ? (
-

{failure?.message}

+

{failure?.message}

- {error !== null ?

{error}

: null} + {error !== null ?

{error}

: null} {chats !== null && chats.length === 0 ? ( -

+

No recent chats. Add the bot to the group or channel (or send it a message), then detect again. Telegram only keeps the last 24 hours.

@@ -966,7 +966,7 @@ function TelegramChatPicker({ className="flex w-full items-center justify-between gap-2 rounded px-2 py-1.5 text-left text-xs hover:bg-muted" > {chat.title} - + {TELEGRAM_CHAT_TYPE_LABELS[chat.type]} @@ -1089,13 +1089,13 @@ export function DestinationDialog({ /> {form.integrationKey.trim().length > 0 && !isValidPagerDutyKey(form.integrationKey) && ( -

+

That isn't a routing key (must be 32 characters). A ~20-character REST API token won't work — copy the Events API v2 integration key.

)} - + In PagerDuty: open the service → Integrations → add or select an{" "}
- + In Discord: Channel settings → Integrations → Webhooks → New Webhook, then copy the URL. @@ -1163,7 +1163,7 @@ export function DestinationDialog({ } className="font-mono text-xs" /> - + In Telegram: message @BotFather, send{" "} /newbot, then copy the token it replies with. @@ -1191,7 +1191,7 @@ export function DestinationDialog({ placeholder="-1001234567890 or @mychannel" className="font-mono text-xs" /> -

+

Add the bot to the chat, then hit Detect chats — or enter the id by hand. Maple checks the bot can reach it when you save. @@ -1251,7 +1251,7 @@ export function DestinationDialog({ (isClerkAuthEnabled ? ( ) : ( -

+

Email destinations target workspace members and require Clerk authentication, which is not enabled in this deployment.

diff --git a/apps/web/src/components/alerts/details-section.tsx b/apps/web/src/components/alerts/details-section.tsx index f0957c5aff..04b9bdb48b 100644 --- a/apps/web/src/components/alerts/details-section.tsx +++ b/apps/web/src/components/alerts/details-section.tsx @@ -43,7 +43,7 @@ export function DetailsSection({ form, onChange, suggestedName, tagSuggestions } variant="ghost" size="sm" onClick={() => onChange((c) => ({ ...c, name: suggestedName! }))} - className="h-6 px-1.5 text-[11px]" + className="h-6 px-1.5 text-2xs" > Suggest: {suggestedName} diff --git a/apps/web/src/components/alerts/incident-timeline-strip.tsx b/apps/web/src/components/alerts/incident-timeline-strip.tsx index 8e1cc2e91f..c6102a0b08 100644 --- a/apps/web/src/components/alerts/incident-timeline-strip.tsx +++ b/apps/web/src/components/alerts/incident-timeline-strip.tsx @@ -67,7 +67,7 @@ export function IncidentTimelineStrip({ // biome-ignore lint/suspicious/noArrayIndexKey: fixed-length positional strip key={i} className={cn( - "flex-1 rounded-[2px]", + "flex-1 rounded-xs", compact ? "h-2" : "h-3", hit ? held @@ -82,7 +82,7 @@ export function IncidentTimelineStrip({ })}
{showAxisLabels && !compact && ( -
+
{formatEdge(range.min, effectiveTimezone)} {formatEdge(range.max, effectiveTimezone)}
diff --git a/apps/web/src/components/alerts/notifications-section.tsx b/apps/web/src/components/alerts/notifications-section.tsx index 21d6718428..158200295c 100644 --- a/apps/web/src/components/alerts/notifications-section.tsx +++ b/apps/web/src/components/alerts/notifications-section.tsx @@ -430,7 +430,7 @@ function MessageTemplate({ Message template {hasTemplate && !open && ( - + Customized )} @@ -474,7 +474,7 @@ function MessageTemplate({ type="button" title={variable.description} onClick={() => appendToBody(`{{ ${variable.key} }}`)} - className="rounded border border-border/60 bg-muted/40 px-1.5 py-0.5 font-mono text-[10px] text-muted-foreground hover:border-border hover:text-foreground" + className="rounded border border-border/60 bg-muted/40 px-1.5 py-0.5 font-mono text-3xs text-muted-foreground hover:border-border hover:text-foreground" > {variable.key} diff --git a/apps/web/src/components/alerts/overview/alerts-empty-state.tsx b/apps/web/src/components/alerts/overview/alerts-empty-state.tsx index c55d106602..e60e9f9f89 100644 --- a/apps/web/src/components/alerts/overview/alerts-empty-state.tsx +++ b/apps/web/src/components/alerts/overview/alerts-empty-state.tsx @@ -150,7 +150,7 @@ function TemplateTile({ template, serviceName }: { template: AlertTemplate; serv {template.title}
- + {template.summary} diff --git a/apps/web/src/components/alerts/overview/rules-overview-table.tsx b/apps/web/src/components/alerts/overview/rules-overview-table.tsx index 990716e503..e893e972d7 100644 --- a/apps/web/src/components/alerts/overview/rules-overview-table.tsx +++ b/apps/web/src/components/alerts/overview/rules-overview-table.tsx @@ -118,7 +118,7 @@ export function RulesOverviewTable({ + } onClick={(e) => e.stopPropagation()} > diff --git a/apps/web/src/components/alerts/overview/settings-tab.tsx b/apps/web/src/components/alerts/overview/settings-tab.tsx index c9141484be..36fd937c5e 100644 --- a/apps/web/src/components/alerts/overview/settings-tab.tsx +++ b/apps/web/src/components/alerts/overview/settings-tab.tsx @@ -389,7 +389,7 @@ export function AlertsSettingsTab({ manager, isAdmin }: { manager: DestinationMa {event.attemptNumber > 1 && ( ↻{event.attemptNumber} diff --git a/apps/web/src/components/alerts/rule-templates-overlay.tsx b/apps/web/src/components/alerts/rule-templates-overlay.tsx index 5befe7132b..fae278dd05 100644 --- a/apps/web/src/components/alerts/rule-templates-overlay.tsx +++ b/apps/web/src/components/alerts/rule-templates-overlay.tsx @@ -90,7 +90,7 @@ function TemplateTile({ onPick(template)}> } title={template.title} subtitle={template.description} />
- {template.summary} + {template.summary} -

+

Built-in signals measure entry-point (root) spans only. A service that records failures on child spans and returns success from its entry point — cron jobs and workers typically do — stays healthy here at any threshold. Use Raw SQL for those, or rely on error notifications. diff --git a/apps/web/src/components/analytics/ai/ai-sections.tsx b/apps/web/src/components/analytics/ai/ai-sections.tsx index b6237fa561..d63c5df167 100644 --- a/apps/web/src/components/analytics/ai/ai-sections.tsx +++ b/apps/web/src/components/analytics/ai/ai-sections.tsx @@ -76,13 +76,13 @@ export function AiPanel({ className="items-start pt-3 pb-2.5" action={ aside ? ( -

{aside}
+
{aside}
) : undefined } >
{title} - {hint ?
{hint}
: null} + {hint ?
{hint}
: null}
{children} @@ -92,7 +92,7 @@ export function AiPanel({
{visits > 0 && served > 0 ? ( {formatRatio(served / visits)} fetches / visit @@ -188,7 +188,7 @@ export function AiProductCard({ {formatNumber(visits)} - + {visits === 1 ? "visit sent" : "visits sent"}
@@ -197,7 +197,7 @@ export function AiProductCard({ color={SPARK_COLOR.neutral} className={cn("mt-3 h-8 w-full", visits === 0 && "opacity-40")} /> -
+
{line.text}
@@ -251,7 +251,7 @@ export function AiReferralRanking({ ranks }: { ranks: ReadonlyArray - + {index + 1} @@ -260,13 +260,13 @@ export function AiReferralRanking({ ranks }: { ranks: ReadonlyArray - + {formatNumber(rank.visits)} - + {formatPercent(rank.share)} - +
@@ -378,14 +378,14 @@ export function AiCrawlerTable({ {formatNumber(row.pages)} 0 ? `${plural(row.failedRequests, "fetch", "fetches")} got an error response` @@ -394,7 +394,7 @@ export function AiCrawlerTable({ > {formatNumber(row.requests)} - + {formatRelativeTime(row.lastSeen)}
@@ -420,7 +420,7 @@ function PurposeBadge({ purpose }: { purpose: AiCrawlPurpose }) { {purpose} @@ -452,7 +452,7 @@ export function AiContentFormats({ formats }: { formats: ReadonlyArray {other && other.requests > 0 ? ( -
+
{plural(other.requests, "other fetch", "other fetches")} (images, scripts, feeds and other files) @@ -484,18 +484,18 @@ function FormatCard({
{label}
-
{description}
+
{description}
{formatNumber(requests)} - + {requests === 1 ? "fetch" : "fetches"}
-
+
{requests === 0 ? ( "Not fetched yet" ) : pages === 0 ? ( diff --git a/apps/web/src/components/analytics/ai/analytics-ai-tab.tsx b/apps/web/src/components/analytics/ai/analytics-ai-tab.tsx index 60e86f71b5..d779bd7180 100644 --- a/apps/web/src/components/analytics/ai/analytics-ai-tab.tsx +++ b/apps/web/src/components/analytics/ai/analytics-ai-tab.tsx @@ -167,7 +167,7 @@ export function AnalyticsAiTab({

What AI crawlers read

{visitorFiltered ? ( - + Crawls follow the site and page filters only ) : null} diff --git a/apps/web/src/components/analytics/analytics-breakdown-panel.tsx b/apps/web/src/components/analytics/analytics-breakdown-panel.tsx index a9cbaa5aee..f21d3230e1 100644 --- a/apps/web/src/components/analytics/analytics-breakdown-panel.tsx +++ b/apps/web/src/components/analytics/analytics-breakdown-panel.tsx @@ -245,7 +245,7 @@ export function AnalyticsBreakdownPanel({ {showRaw ? ( -
+					
 						{safeStringify(input)}
 					
) : null} diff --git a/apps/web/src/components/chat/approval-renderers/dashboard.tsx b/apps/web/src/components/chat/approval-renderers/dashboard.tsx index fa49e3f498..16831b993a 100644 --- a/apps/web/src/components/chat/approval-renderers/dashboard.tsx +++ b/apps/web/src/components/chat/approval-renderers/dashboard.tsx @@ -56,7 +56,7 @@ function WidgetRow({ widget }: { widget: NormalizedWidget }) { {widget.title} {widget.source ? ( - {widget.source} + {widget.source} ) : null} {widget.groupBy ? ( @@ -77,7 +77,7 @@ function WidgetList({ widgets, max = 8 }: { widgets: NormalizedWidget[]; max?: n ))} {overflow > 0 ? ( -
+ {overflow} more
+
+ {overflow} more
) : null}
) @@ -141,7 +141,7 @@ export function CreateDashboardSummary({ input }: ApprovalRendererProps) {
{name}
{dashboardJsonName && dashboardJsonName !== name ? ( -
+
Inner title: {dashboardJsonName}
) : null} @@ -161,7 +161,7 @@ export function CreateDashboardSummary({ input }: ApprovalRendererProps) { ) : !isCustom ? ( -
+
Template will generate widgets automatically.
) : null} @@ -284,7 +284,7 @@ export function AddDashboardWidgetSummary({ input }: ApprovalRendererProps) {
{title}
{endpoint ? ( -
{endpoint}
+
{endpoint}
) : null}
@@ -406,12 +406,12 @@ export function ReorderDashboardWidgetsSummary({ input }: ApprovalRendererProps) {previewIds.length > 0 ? (
{previewIds.map((id) => ( - + {id} ))} {overflow > 0 ? ( - + {overflow} more + + {overflow} more ) : null}
) : null} diff --git a/apps/web/src/components/chat/approval-renderers/index.tsx b/apps/web/src/components/chat/approval-renderers/index.tsx index 12e1fb7bd4..2cd7937837 100644 --- a/apps/web/src/components/chat/approval-renderers/index.tsx +++ b/apps/web/src/components/chat/approval-renderers/index.tsx @@ -51,7 +51,7 @@ function KeyValueFallback({ input }: { input: unknown }) { const obj = asRecord(input) if (!obj) { return ( -
+			
 				{safeStringify(input)}
 			
) diff --git a/apps/web/src/components/chat/diagnosis-report-card.tsx b/apps/web/src/components/chat/diagnosis-report-card.tsx index 9ed7dca5b8..02de7afdde 100644 --- a/apps/web/src/components/chat/diagnosis-report-card.tsx +++ b/apps/web/src/components/chat/diagnosis-report-card.tsx @@ -43,7 +43,7 @@ export function DiagnosisReportCard({ report }: { report: AiTriageResult }) { AI Diagnosis · {report.confidence} confidence @@ -96,7 +96,7 @@ export function DiagnosisReportCard({ report }: { report: AiTriageResult }) { onClick={() => setOpenIndex(action.index)} className="-mx-2 flex w-[calc(100%+1rem)] items-start gap-2.5 rounded-md px-2 py-1.5 text-left transition-colors hover:bg-muted/50" > - + {action.index + 1} (
  • {fact.label} - + {fact.value}
  • diff --git a/apps/web/src/components/chat/message-actions.tsx b/apps/web/src/components/chat/message-actions.tsx index 0936452cd4..69cf539436 100644 --- a/apps/web/src/components/chat/message-actions.tsx +++ b/apps/web/src/components/chat/message-actions.tsx @@ -75,7 +75,7 @@ export function MessageActions({ message, permalink }: MessageActionsProps) { diff --git a/apps/web/src/components/chat/task-card.tsx b/apps/web/src/components/chat/task-card.tsx index c3c8630c28..ebfd66406e 100644 --- a/apps/web/src/components/chat/task-card.tsx +++ b/apps/web/src/components/chat/task-card.tsx @@ -93,14 +93,14 @@ export function TaskCard({ > {running ? `${activity}…` : label}
    - + · {prompt} {status === "error" ? ( - failed + failed ) : budgetExhausted === true ? ( - partial + partial ) : null} {running ? : null} diff --git a/apps/web/src/components/chat/widget-fix-attachment-card.tsx b/apps/web/src/components/chat/widget-fix-attachment-card.tsx index e6a0bdecf2..c17861751f 100644 --- a/apps/web/src/components/chat/widget-fix-attachment-card.tsx +++ b/apps/web/src/components/chat/widget-fix-attachment-card.tsx @@ -25,10 +25,10 @@ export function WidgetFixAttachmentCard({ ctx, className }: WidgetFixAttachmentC {(ctx.errorTitle || ctx.errorMessage) && (
    {ctx.errorTitle && ( -
    {ctx.errorTitle}
    +
    {ctx.errorTitle}
    )} {ctx.errorMessage && ( -
    +
    {ctx.errorMessage}
    )} diff --git a/apps/web/src/components/code-review/author-avatar.tsx b/apps/web/src/components/code-review/author-avatar.tsx index 35b3265c84..13c9bf2dc0 100644 --- a/apps/web/src/components/code-review/author-avatar.tsx +++ b/apps/web/src/components/code-review/author-avatar.tsx @@ -4,7 +4,7 @@ import { cn } from "@maple/ui/lib/utils" /** A GitHub login's avatar, from GitHub's public `.png` redirect; the initial while it loads. */ export function AuthorAvatar({ login, className }: { login: string; className?: string }) { return ( - + {login.slice(0, 1).toUpperCase()} diff --git a/apps/web/src/components/common/data-table.tsx b/apps/web/src/components/common/data-table.tsx index d92fe55d37..15908fd5a3 100644 --- a/apps/web/src/components/common/data-table.tsx +++ b/apps/web/src/components/common/data-table.tsx @@ -55,7 +55,7 @@ export function ColumnHead({ return (
    ({ } export function MetaChip({ children }: { children: React.ReactNode }) { - return {children} + return {children} } /* ------------------------------------------------------------------------------------------------- diff --git a/apps/web/src/components/common/image-dropzone.tsx b/apps/web/src/components/common/image-dropzone.tsx index 656e6da948..d04052ecee 100644 --- a/apps/web/src/components/common/image-dropzone.tsx +++ b/apps/web/src/components/common/image-dropzone.tsx @@ -104,7 +104,7 @@ export function ImageDropzone({ > {preview} {isDragging && ( -
    +
    Drop image
    )} diff --git a/apps/web/src/components/common/series-legend.tsx b/apps/web/src/components/common/series-legend.tsx index e207e7ed7c..83cc7f1fb8 100644 --- a/apps/web/src/components/common/series-legend.tsx +++ b/apps/web/src/components/common/series-legend.tsx @@ -15,12 +15,12 @@ const VARIANTS = { root: "flex flex-wrap items-center justify-end gap-x-3 gap-y-1", item: "inline-flex items-baseline gap-1.5", dot: "size-1.5 translate-y-[-1px] rounded-full", - label: "text-[11px] text-muted-foreground", - value: "font-mono text-[11px] text-foreground/85 tabular-nums", + label: "text-2xs text-muted-foreground", + value: "font-mono text-2xs text-foreground/85 tabular-nums", }, chip: { root: "flex flex-wrap items-center gap-2", - item: "inline-flex items-center gap-1.5 rounded-full border bg-background px-2 py-0.5 text-[11px]", + item: "inline-flex items-center gap-1.5 rounded-full border bg-background px-2 py-0.5 text-2xs", dot: "size-2 rounded-full", label: "font-medium text-foreground/80", value: "font-mono text-muted-foreground tabular-nums", diff --git a/apps/web/src/components/common/service-pills.tsx b/apps/web/src/components/common/service-pills.tsx index 91a8200c44..300013355d 100644 --- a/apps/web/src/components/common/service-pills.tsx +++ b/apps/web/src/components/common/service-pills.tsx @@ -17,13 +17,13 @@ export function ServicePills({ services }: { services: ReadonlyArray }) } className="flex min-w-0 flex-wrap gap-1"> {services.slice(0, VISIBLE_SERVICES).map((service) => ( - + {service} ))} {services.length > VISIBLE_SERVICES && ( - + +{services.length - VISIBLE_SERVICES} )} diff --git a/apps/web/src/components/common/stat-rail.tsx b/apps/web/src/components/common/stat-rail.tsx index 2da71ceb8e..56b6f571b4 100644 --- a/apps/web/src/components/common/stat-rail.tsx +++ b/apps/web/src/components/common/stat-rail.tsx @@ -97,7 +97,7 @@ export function StatRailItem({
    @@ -105,7 +105,7 @@ export function StatRailItem({ {action ?? (delta ? ( - + {delta} ) : null)} @@ -134,7 +134,7 @@ export function StatRailItem({ )}
    {subline ? ( -
    {subline}
    +
    {subline}
    ) : null} ) diff --git a/apps/web/src/components/dashboard-builder/blank-dashboard-empty.tsx b/apps/web/src/components/dashboard-builder/blank-dashboard-empty.tsx index 900915808e..685ca5b24f 100644 --- a/apps/web/src/components/dashboard-builder/blank-dashboard-empty.tsx +++ b/apps/web/src/components/dashboard-builder/blank-dashboard-empty.tsx @@ -83,7 +83,7 @@ export function BlankDashboardEmpty({
    {/* Templates instantiate into a *new* board, so say so here rather than letting the button read as "fill this one in for me". */} -

    +

    {readOnly ? "Read-only. You can’t add widgets to this dashboard." : "Templates create a new dashboard from this org’s data."} diff --git a/apps/web/src/components/dashboard-builder/config/chart-picker.tsx b/apps/web/src/components/dashboard-builder/config/chart-picker.tsx index a0a3326315..71200da271 100644 --- a/apps/web/src/components/dashboard-builder/config/chart-picker.tsx +++ b/apps/web/src/components/dashboard-builder/config/chart-picker.tsx @@ -95,7 +95,7 @@ function PickerCard({ {children}

    {title}
    - {description &&
    {description}
    } + {description &&
    {description}
    }
    ) diff --git a/apps/web/src/components/dashboard-builder/config/funnel-query-panel.tsx b/apps/web/src/components/dashboard-builder/config/funnel-query-panel.tsx index 9b42de5ce5..ebec1df5e3 100644 --- a/apps/web/src/components/dashboard-builder/config/funnel-query-panel.tsx +++ b/apps/web/src/components/dashboard-builder/config/funnel-query-panel.tsx @@ -105,7 +105,7 @@ export function FunnelQueryPanelView({
    Steps - + in order · session step only first · up to 10
    @@ -123,7 +123,7 @@ export function FunnelQueryPanelView({ {/* Population filter */}
    - Where + Where {/* The vocabulary is the `product_events` scope's; the data source is the editor's required prop and is not consulted under that scope, and the facet values come in explicitly. */} @@ -140,7 +140,7 @@ export function FunnelQueryPanelView({ ariaLabel="Funnel population filter" />
    -

    +

    {filterError ? ( {filterError} ) : ( @@ -156,7 +156,7 @@ export function FunnelQueryPanelView({

    {funnel.addOns.keyBy && (
    - Count by + Count by [ @@ -227,7 +227,7 @@ export function FunnelQueryPanelView({ ) : null} - + the whole chain must complete within this long of step 1
    @@ -235,7 +235,7 @@ export function FunnelQueryPanelView({ {funnel.addOns.breakdown && (
    - Breakdown + Breakdown @@ -245,7 +245,7 @@ export function FunnelQueryPanelView({ }) } /> - + one bar per group, top 6
    diff --git a/apps/web/src/components/dashboard-builder/config/list-config-panel.tsx b/apps/web/src/components/dashboard-builder/config/list-config-panel.tsx index 3756f8044a..326ba0dfdb 100644 --- a/apps/web/src/components/dashboard-builder/config/list-config-panel.tsx +++ b/apps/web/src/components/dashboard-builder/config/list-config-panel.tsx @@ -415,7 +415,7 @@ export function ListConfigPanel() {
    {slow.length > 0 && ( - + {slow.map((h) => (

    {h.reason}

    ))} @@ -424,7 +424,7 @@ export function ListConfigPanel() { )} {fast.length > 0 && ( - + {fast.map((h) => (

    {h.reason}

    ))} @@ -450,7 +450,7 @@ export function ListConfigPanel() { max={200} className="w-32" /> -

    +

    Max 200. Recommended: 25-50 for dashboard widgets.

    diff --git a/apps/web/src/components/dashboard-builder/config/markdown-editor-panel.tsx b/apps/web/src/components/dashboard-builder/config/markdown-editor-panel.tsx index 3f1d0d536f..209850a40e 100644 --- a/apps/web/src/components/dashboard-builder/config/markdown-editor-panel.tsx +++ b/apps/web/src/components/dashboard-builder/config/markdown-editor-panel.tsx @@ -18,7 +18,7 @@ export function MarkdownEditorPanel({ content, onChange }: MarkdownEditorPanelPr
    Content -

    +

    Markdown: # heading, **bold**, - list,{" "} [link](url)

    diff --git a/apps/web/src/components/dashboard-builder/config/paths-query-panel.tsx b/apps/web/src/components/dashboard-builder/config/paths-query-panel.tsx index d01e5b2230..3f59a211ac 100644 --- a/apps/web/src/components/dashboard-builder/config/paths-query-panel.tsx +++ b/apps/web/src/components/dashboard-builder/config/paths-query-panel.tsx @@ -98,7 +98,7 @@ export function PathsQueryPanelView({ paths, onUpdate, suggestions }: PathsQuery ]} onChange={(direction) => onUpdate((current) => ({ ...current, direction }))} /> - + {paths.direction === "after" ? "what people did next, from the first time they hit the anchor" : "how people got there, back from the last time they hit the anchor"} @@ -122,7 +122,7 @@ export function PathsQueryPanelView({ paths, onUpdate, suggestions }: PathsQuery {/* Depth + branches */}
    - Steps + Steps
    - Branches + Branches ({ ...current, branches: Number(branches) })) } /> - + named per step, the rest fold into Other
    @@ -153,7 +153,7 @@ export function PathsQueryPanelView({ paths, onUpdate, suggestions }: PathsQuery {/* Population filter */}
    - Where + Where
    -

    +

    {filterError ? ( {filterError} ) : ( @@ -182,7 +182,7 @@ export function PathsQueryPanelView({ paths, onUpdate, suggestions }: PathsQuery

    {paths.addOns.keyBy && (
    - Count by + Count by [ @@ -249,13 +249,13 @@ export function PathsQueryPanelView({ paths, onUpdate, suggestions }: PathsQuery ) : null} - of the anchor + of the anchor
    )} {paths.addOns.include && (
    - Include + Include - Exclude + Exclude - + event names or page paths, comma-separated, dropped before sequencing
    diff --git a/apps/web/src/components/dashboard-builder/config/query-panel-shell.tsx b/apps/web/src/components/dashboard-builder/config/query-panel-shell.tsx index 4eaee3f1c9..e49a58ffc5 100644 --- a/apps/web/src/components/dashboard-builder/config/query-panel-shell.tsx +++ b/apps/web/src/components/dashboard-builder/config/query-panel-shell.tsx @@ -97,7 +97,7 @@ export function QueryPanelShell({ {name} @@ -155,7 +155,7 @@ export function AddOnToggleBar({ onClick={() => onToggle(key)} aria-pressed={active[key]} className={cn( - "px-2 py-0.5 text-[11px] rounded-sm border transition-colors", + "px-2 py-0.5 text-2xs rounded-sm border transition-colors", active[key] ? "bg-primary/10 border-primary/30 text-primary" : "bg-muted/40 border-transparent text-muted-foreground hover:text-foreground", diff --git a/apps/web/src/components/dashboard-builder/config/query-panel.tsx b/apps/web/src/components/dashboard-builder/config/query-panel.tsx index d24eeadf02..e88603caf8 100644 --- a/apps/web/src/components/dashboard-builder/config/query-panel.tsx +++ b/apps/web/src/components/dashboard-builder/config/query-panel.tsx @@ -591,7 +591,7 @@ function AddOnSections({
    {query.addOns.groupBy && query.dataSource !== "metrics" && (
    - Group By + Group By onUpdate((current) => ({ ...current, groupBy: value }))} @@ -603,7 +603,7 @@ function AddOnSections({ {query.addOns.having && (
    - Having + Having @@ -620,7 +620,7 @@ function AddOnSections({ {query.addOns.orderBy && (
    - Order By + Order By @@ -655,7 +655,7 @@ function AddOnSections({ {query.addOns.limit && (
    - Limit + Limit @@ -674,7 +674,7 @@ function AddOnSections({ {query.addOns.legend && (
    - Legend + Legend diff --git a/apps/web/src/components/dashboard-builder/config/raw-sql-editor-panel.tsx b/apps/web/src/components/dashboard-builder/config/raw-sql-editor-panel.tsx index 0f767f212f..517da138fd 100644 --- a/apps/web/src/components/dashboard-builder/config/raw-sql-editor-panel.tsx +++ b/apps/web/src/components/dashboard-builder/config/raw-sql-editor-panel.tsx @@ -85,17 +85,17 @@ export function RawSqlEditorPanel({ sql - ClickHouse + ClickHouse
    {sqlIssue !== null && !collapsed && ( - + {sqlIssue.code === "MissingOrgFilter" ? "Missing $__orgFilter" : sqlIssue.message} )} @@ -142,7 +142,7 @@ export function RawSqlEditorPanel({ type="button" title={hint.description} onClick={() => insertToken(hint.token)} - className="px-2 py-0.5 text-[11px] rounded-sm bg-muted/40 text-muted-foreground font-mono transition-colors hover:bg-muted hover:text-foreground" + className="px-2 py-0.5 text-2xs rounded-sm bg-muted/40 text-muted-foreground font-mono transition-colors hover:bg-muted hover:text-foreground" > {hint.token} @@ -153,7 +153,7 @@ export function RawSqlEditorPanel({ type="button" title={`Dashboard variable — expands to the selected value, e.g. ServiceName IN ($${name}). "All" expands to every value.`} onClick={() => insertToken(`$${name}`)} - className="px-2 py-0.5 text-[11px] rounded-sm bg-primary/10 text-primary font-mono transition-colors hover:bg-primary/20" + className="px-2 py-0.5 text-2xs rounded-sm bg-primary/10 text-primary font-mono transition-colors hover:bg-primary/20" > ${name} @@ -164,7 +164,7 @@ export function RawSqlEditorPanel({
    @@ -185,7 +185,7 @@ export function RawSqlEditorPanel({ } className="h-7 w-20 text-xs" /> - s + s
    )}
    @@ -200,7 +200,7 @@ export function RawSqlEditorPanel({ Run Preview )} - + Targets {targetLabel ?? widget?.visualization}
    diff --git a/apps/web/src/components/dashboard-builder/config/settings-fields.tsx b/apps/web/src/components/dashboard-builder/config/settings-fields.tsx index ef0a39aa80..4ae24bdad8 100644 --- a/apps/web/src/components/dashboard-builder/config/settings-fields.tsx +++ b/apps/web/src/components/dashboard-builder/config/settings-fields.tsx @@ -241,7 +241,7 @@ function RampSwatch({ scale }: { scale: HeatmapColorScale }) { {[0, 1, 2, 3, 4].map((stop) => ( ))} diff --git a/apps/web/src/components/dashboard-builder/config/variables-manager-dialog.tsx b/apps/web/src/components/dashboard-builder/config/variables-manager-dialog.tsx index 936c5d8e60..721be1d761 100644 --- a/apps/web/src/components/dashboard-builder/config/variables-manager-dialog.tsx +++ b/apps/web/src/components/dashboard-builder/config/variables-manager-dialog.tsx @@ -196,7 +196,7 @@ function VariablesEditor({ {startedEmpty && ( -
    +

    A variable adds a selector to the toolbar; widgets that reference it re-query when the selection changes. @@ -226,7 +226,7 @@ function VariablesEditor({ {TYPE_LABELS[draft.type]} - + {errors[index] !== null && editingIndex !== index ? ( {errors[index]} ) : ( @@ -322,12 +322,12 @@ function VariableForm({ onChange={(event) => onChange({ ...variable, name: event.target.value })} /> {error !== null ? ( - + {error} ) : ( variable.name !== "" && ( - + Reference it as ${variable.name} in widget filters and SQL. diff --git a/apps/web/src/components/dashboard-builder/config/widget-query-builder-page.tsx b/apps/web/src/components/dashboard-builder/config/widget-query-builder-page.tsx index ce1aadaeff..5c1ca21670 100644 --- a/apps/web/src/components/dashboard-builder/config/widget-query-builder-page.tsx +++ b/apps/web/src/components/dashboard-builder/config/widget-query-builder-page.tsx @@ -516,7 +516,7 @@ export function WidgetQueryBuilderPage({ - A + A

    ) : showFunnelPanel ? ( @@ -531,7 +531,7 @@ export function WidgetQueryBuilderPage({ - A + A
    ) : ( @@ -589,7 +589,7 @@ export function WidgetQueryBuilderPage({ - + {state.queries.map((q) => q.name).join(", ")} {state.formulas.length > 0 && `, ${state.formulas.map((f) => f.name).join(", ")}`} diff --git a/apps/web/src/components/dashboard-builder/history/dashboard-history-panel.tsx b/apps/web/src/components/dashboard-builder/history/dashboard-history-panel.tsx index cbd92c4554..a0ce50e164 100644 --- a/apps/web/src/components/dashboard-builder/history/dashboard-history-panel.tsx +++ b/apps/web/src/components/dashboard-builder/history/dashboard-history-panel.tsx @@ -35,7 +35,7 @@ export function DashboardHistoryPanel({

    History

    - {versions.length} + {versions.length}

    No history yet

    -

    +

    Each save is captured here so you can revisit or restore.

    diff --git a/apps/web/src/components/dashboard-builder/history/preview-banner.tsx b/apps/web/src/components/dashboard-builder/history/preview-banner.tsx index caadd9aded..39ef5bf018 100644 --- a/apps/web/src/components/dashboard-builder/history/preview-banner.tsx +++ b/apps/web/src/components/dashboard-builder/history/preview-banner.tsx @@ -40,7 +40,7 @@ export function PreviewBanner({ dashboardId, preview, onCancel, onRestored }: Pr <>
    -
    +
    PREVIEW · diff --git a/apps/web/src/components/dashboard-builder/history/version-list-item.tsx b/apps/web/src/components/dashboard-builder/history/version-list-item.tsx index 0745d19e7a..e309909569 100644 --- a/apps/web/src/components/dashboard-builder/history/version-list-item.tsx +++ b/apps/web/src/components/dashboard-builder/history/version-list-item.tsx @@ -98,7 +98,7 @@ export function VersionListItem({ version, isPreviewing, isCurrent, onPreview }:
    {isCurrent && ( - + Current )} @@ -122,7 +122,7 @@ export function VersionListItem({ version, isPreviewing, isCurrent, onPreview }:
    {summary}
    -
    +
    {title} - + {count} - {note && {note}} + {note && {note}}
    ) } diff --git a/apps/web/src/components/dashboard-builder/list/dashboard-list.tsx b/apps/web/src/components/dashboard-builder/list/dashboard-list.tsx index 2c5e629e16..ad2189766f 100644 --- a/apps/web/src/components/dashboard-builder/list/dashboard-list.tsx +++ b/apps/web/src/components/dashboard-builder/list/dashboard-list.tsx @@ -142,13 +142,13 @@ function DashboardRow({ {dashboard.name} {/* Below sm the scope lane collapses onto this line, so the row keeps its information when the column can't fit. */} - + {[empty ? "no widgets" : widgetCountLabel(dashboard), reads.short] .filter(Boolean) .join(" · ")} {dashboard.description && ( - + {dashboard.description} )} @@ -160,18 +160,18 @@ function DashboardRow({ {empty ? "no widgets" : widgetCountLabel(dashboard)} - + {empty ? "" : reads.short} - + {formatRelativeTimeOrDate(dashboard.updatedAt)} @@ -257,7 +257,7 @@ function DashboardRowMenu({ {readOnly && ( <> - + Dashboard store unreachable — writes are disabled @@ -385,7 +385,7 @@ export function DashboardList({ - + {filtering || scope === "favorites" ? `${scoped} of ${dashboards.length}` : `${dashboards.length} of ${dashboards.length}`} @@ -393,7 +393,7 @@ export function DashboardList({
    {filtering && !nothingAtAll && ( -
    +
    {matched} of {dashboards.length} match name, description or tag @@ -602,7 +602,7 @@ function TagFilterMenu({ <> Tags {selected.length > 0 && ( - + {selected.length} )} @@ -626,7 +626,7 @@ function CreateRow({ readOnly, onCreate }: { readOnly: boolean; onCreate: () => New dashboard - + Start blank, or pick a template already wired to metrics you send. diff --git a/apps/web/src/components/dashboard-builder/tag-editor.tsx b/apps/web/src/components/dashboard-builder/tag-editor.tsx index dd0a883dd7..2028d45652 100644 --- a/apps/web/src/components/dashboard-builder/tag-editor.tsx +++ b/apps/web/src/components/dashboard-builder/tag-editor.tsx @@ -161,7 +161,7 @@ function TagEditor({
    {drafts.length === 0 ? ( -

    +

    No tags yet — this dashboard won't appear under any Tags filter.

    ) : ( @@ -170,7 +170,7 @@ function TagEditor({ {tag}
    -

    +

    {ready ? "Collected by" : "Emitted by"} {requirement.collector}. {!ready && requirement.hint ? ` ${requirement.hint}` : ""}

    @@ -128,7 +128,7 @@ export function TemplateDetailPanel({ template, readiness, creating, onCreate }:

    {template.name}

    -
    +
    {CATEGORY_LABELS[template.category] ?? template.category} / @@ -145,7 +145,7 @@ export function TemplateDetailPanel({ template, readiness, creating, onCreate }:
    -

    +

    That's the dashboard you'd get right now.

    @@ -162,7 +162,7 @@ export function TemplateDetailPanel({ template, readiness, creating, onCreate }: - + {parameter.required ? "required" : "optional"}
    @@ -181,7 +181,7 @@ export function TemplateDetailPanel({ template, readiness, creating, onCreate }: }} /> {parameter.description && ( -

    +

    {parameter.description}

    )} @@ -233,7 +233,7 @@ export function TemplateDetailPanel({ template, readiness, creating, onCreate }: )} -

    +

    {missingRequired.length > 0 ? `Fill in ${missingRequired.join(" and ")} first.` : ready diff --git a/apps/web/src/components/dashboard-builder/templates/template-list.tsx b/apps/web/src/components/dashboard-builder/templates/template-list.tsx index 1df42db1d1..d8d8066521 100644 --- a/apps/web/src/components/dashboard-builder/templates/template-list.tsx +++ b/apps/web/src/components/dashboard-builder/templates/template-list.tsx @@ -92,14 +92,14 @@ function TemplateRow({ > {template.name} - + {widgetCountLabel(template)} {status} @@ -180,7 +180,7 @@ export function TemplateList({

    {searching && !loading && ( -
    +
    {matched} of {total} match name, description or tag
    @@ -276,7 +276,7 @@ export function TemplateList({ /> {gatedByCategory.map(({ category, templates: group }) => (
    -
    +
    {CATEGORY_LABELS[category] ?? category}
    {group.map((template) => ( @@ -306,7 +306,7 @@ export function TemplateList({ Blank dashboard - start from nothing + start from nothing diff --git a/apps/web/src/components/dashboard-builder/toolbar/embed-widget-dialog.tsx b/apps/web/src/components/dashboard-builder/toolbar/embed-widget-dialog.tsx index 6f97b05689..47ad9e11a2 100644 --- a/apps/web/src/components/dashboard-builder/toolbar/embed-widget-dialog.tsx +++ b/apps/web/src/components/dashboard-builder/toolbar/embed-widget-dialog.tsx @@ -381,7 +381,7 @@ function EmbedUrlOptions() { {param} {description} - + {example} diff --git a/apps/web/src/components/dashboard-builder/toolbar/variable-selects.tsx b/apps/web/src/components/dashboard-builder/toolbar/variable-selects.tsx index 0d0d8d64ba..29885d8bff 100644 --- a/apps/web/src/components/dashboard-builder/toolbar/variable-selects.tsx +++ b/apps/web/src/components/dashboard-builder/toolbar/variable-selects.tsx @@ -139,7 +139,7 @@ function VariableControl({ item === ALL_VALUE ? ( All - + no filter diff --git a/apps/web/src/components/dashboard-builder/widgets/types/markdown.tsx b/apps/web/src/components/dashboard-builder/widgets/types/markdown.tsx index 6c5513078e..43b9b69414 100644 --- a/apps/web/src/components/dashboard-builder/widgets/types/markdown.tsx +++ b/apps/web/src/components/dashboard-builder/widgets/types/markdown.tsx @@ -24,7 +24,7 @@ function MarkdownPresetPreview({ preset }: { preset: WidgetPresetDefinition }) { // eslint-disable-next-line react/no-array-index-key -- fixed sample content
    {line.replace(/^#+\s*/, "").replace(/[*`]/g, "")}
    diff --git a/apps/web/src/components/dashboard-builder/widgets/types/preset-preview.tsx b/apps/web/src/components/dashboard-builder/widgets/types/preset-preview.tsx index 58cb3d1225..39483b62b5 100644 --- a/apps/web/src/components/dashboard-builder/widgets/types/preset-preview.tsx +++ b/apps/web/src/components/dashboard-builder/widgets/types/preset-preview.tsx @@ -18,7 +18,7 @@ export function PreviewFrame({ }) { return (
    -
    {title}
    +
    {title}
    {children}
    ) @@ -58,7 +58,7 @@ export function rowsPresetPreview(sampleRows: Record ( {column.header} @@ -73,7 +73,7 @@ export function rowsPresetPreview(sampleRows: Record ( {formatCellValue(row[column.field], column.unit)} diff --git a/apps/web/src/components/dashboard-builder/widgets/widget-shell.tsx b/apps/web/src/components/dashboard-builder/widgets/widget-shell.tsx index f361a8ba07..d7f11a9a93 100644 --- a/apps/web/src/components/dashboard-builder/widgets/widget-shell.tsx +++ b/apps/web/src/components/dashboard-builder/widgets/widget-shell.tsx @@ -162,7 +162,7 @@ export function WidgetShell({ )} {timeRangeLabel && ( @@ -185,7 +185,7 @@ export function WidgetShell({ {visible.map((item) => ( {/* A dashed outline, not a filled square, when the series is painted as a dashed stroke — an errors overlay drawn dashed @@ -193,7 +193,7 @@ export function WidgetShell({ the chart does not. Mirrors `FixedMetricLegend`. */} 0 && ( i.label).join(", ")} > +{overflow} @@ -316,7 +316,7 @@ export function WidgetShell({ {children} {footer != null && ( -
    {footer}
    +
    {footer}
    )} ) @@ -346,7 +346,7 @@ export function WidgetEmptyState() { return ( No data in the selected time range - + Widen the time range or check the query's filters. @@ -392,7 +392,7 @@ export function WidgetFrame({ (dataState.kind === "range" ? "Range too wide" : "Not configured")}
    {dataState.message && ( - + {dataState.message} )} @@ -401,7 +401,7 @@ export function WidgetFrame({ variant="outline" size="xs" onClick={narrowRange} - className="mt-1 h-6 gap-1 text-[10px]" + className="mt-1 h-6 gap-1 text-3xs" > {actions?.narrowRangeLabel ?? "Narrow range"} @@ -412,7 +412,7 @@ export function WidgetFrame({ variant="outline" size="xs" onClick={configure} - className="mt-1 h-6 gap-1 text-[10px]" + className="mt-1 h-6 gap-1 text-3xs" > Edit @@ -425,7 +425,7 @@ export function WidgetFrame({ {dataState.title ?? "Unable to load"} {dataState.message && ( - + {dataState.message} )} @@ -434,7 +434,7 @@ export function WidgetFrame({ variant="outline" size="xs" onClick={fix} - className="mt-1 h-6 gap-1 text-[10px]" + className="mt-1 h-6 gap-1 text-3xs" > Fix with AI diff --git a/apps/web/src/components/dashboard/app-sidebar.tsx b/apps/web/src/components/dashboard/app-sidebar.tsx index f3021e68e3..554ef9a811 100644 --- a/apps/web/src/components/dashboard/app-sidebar.tsx +++ b/apps/web/src/components/dashboard/app-sidebar.tsx @@ -391,7 +391,7 @@ function NavRow({ {item.badge ? ( - + {item.badge} @@ -486,7 +486,7 @@ function PinnedGroup({ currentPath }: { currentPath: string }) { {visible.length === 0 ? ( -

    +

    Pin a dashboard to keep it here.

    ) : ( diff --git a/apps/web/src/components/dashboard/service-health-section.tsx b/apps/web/src/components/dashboard/service-health-section.tsx index 837c8652fe..8d1ccf76c1 100644 --- a/apps/web/src/components/dashboard/service-health-section.tsx +++ b/apps/web/src/components/dashboard/service-health-section.tsx @@ -293,7 +293,7 @@ export function ServiceHealthList(props: ServiceHealthProps) { Services -

    +

    Status reflects active alerts and baseline anomalies.

    @@ -400,7 +400,7 @@ function ServiceHealthRow({ {service.serviceName} - + {service.environment} {primaryCause && ( diff --git a/apps/web/src/components/dashboard/user-avatar.tsx b/apps/web/src/components/dashboard/user-avatar.tsx index 05f1da32e1..33e101548d 100644 --- a/apps/web/src/components/dashboard/user-avatar.tsx +++ b/apps/web/src/components/dashboard/user-avatar.tsx @@ -13,7 +13,7 @@ export function UserAvatar({ name: string className?: string }) { - const base = className ?? "size-6 rounded-md text-[10px]" + const base = className ?? "size-6 rounded-md text-3xs" return imageUrl ? ( {name} ) : ( diff --git a/apps/web/src/components/errors/actor-chip.tsx b/apps/web/src/components/errors/actor-chip.tsx index 7a262df9be..aaac47f22e 100644 --- a/apps/web/src/components/errors/actor-chip.tsx +++ b/apps/web/src/components/errors/actor-chip.tsx @@ -85,8 +85,8 @@ function initialsFrom(name: string): string { } const SIZE_CLASS = { - sm: "size-5 text-[9px]", - md: "size-7 text-[11px]", + sm: "size-5 text-4xs", + md: "size-7 text-2xs", } as const /** diff --git a/apps/web/src/components/errors/attach-pull-request-dialog.tsx b/apps/web/src/components/errors/attach-pull-request-dialog.tsx index 46211492da..8e3b549837 100644 --- a/apps/web/src/components/errors/attach-pull-request-dialog.tsx +++ b/apps/web/src/components/errors/attach-pull-request-dialog.tsx @@ -268,7 +268,7 @@ export function AttachPullRequestDialog({ : pr.state}
    - + {pr.headRef} {pr.authorLogin ? ` · ${pr.authorLogin}` : ""} diff --git a/apps/web/src/components/errors/error-signal-row.tsx b/apps/web/src/components/errors/error-signal-row.tsx index 2cd97b84e5..037adcdc54 100644 --- a/apps/web/src/components/errors/error-signal-row.tsx +++ b/apps/web/src/components/errors/error-signal-row.tsx @@ -80,7 +80,7 @@ function SignalActivity({ ) : null} {commentCount > 0 ? ( @@ -90,7 +90,7 @@ function SignalActivity({ {prCount > 0 ? ( 0 ? "text-foreground/70" : "text-muted-foreground", )} title={ @@ -167,7 +167,7 @@ export function ErrorSignalHeader({
    diff --git a/apps/web/src/components/errors/issue-occurrences-table.tsx b/apps/web/src/components/errors/issue-occurrences-table.tsx index 08131ee24c..1b79125d62 100644 --- a/apps/web/src/components/errors/issue-occurrences-table.tsx +++ b/apps/web/src/components/errors/issue-occurrences-table.tsx @@ -56,7 +56,7 @@ export function IssueOccurrencesTable({ traces }: IssueOccurrencesTableProps) { search={{ t: trace.timestamp }} className={cn( "inline-flex items-center gap-1 rounded-full border border-border/60 bg-muted/40 px-2 py-0.5", - "font-mono text-[11px] text-muted-foreground tabular-nums", + "font-mono text-2xs text-muted-foreground tabular-nums", "transition-colors hover:border-primary/40 hover:bg-primary/10 hover:text-primary", )} > diff --git a/apps/web/src/components/errors/issue-pickers.tsx b/apps/web/src/components/errors/issue-pickers.tsx index 02cb514635..708752540c 100644 --- a/apps/web/src/components/errors/issue-pickers.tsx +++ b/apps/web/src/components/errors/issue-pickers.tsx @@ -141,7 +141,7 @@ export function StatePicker({ title={`Status: ${WORKFLOW_LABEL[current]} · click to change`} className={cn( TRIGGER, - "-ml-1.5 inline-flex h-6 max-w-full items-center gap-1.5 px-1.5 text-[11px] whitespace-nowrap text-muted-foreground hover:text-foreground data-popup-open:text-foreground", + "-ml-1.5 inline-flex h-6 max-w-full items-center gap-1.5 px-1.5 text-2xs whitespace-nowrap text-muted-foreground hover:text-foreground data-popup-open:text-foreground", className, )} > diff --git a/apps/web/src/components/errors/issue-sidebar.tsx b/apps/web/src/components/errors/issue-sidebar.tsx index 753fca287e..6b072410ea 100644 --- a/apps/web/src/components/errors/issue-sidebar.tsx +++ b/apps/web/src/components/errors/issue-sidebar.tsx @@ -223,13 +223,13 @@ function EnvironmentValue({ environments }: { environments: ReadonlyArray (
  • {env.name} - + {env.count.toLocaleString()}
  • ))} {hidden > 0 ? ( -
  • +{hidden} more
  • +
  • +{hidden} more
  • ) : null} ) diff --git a/apps/web/src/components/errors/issue-timeline.tsx b/apps/web/src/components/errors/issue-timeline.tsx index b4dbf8996b..dbb2417386 100644 --- a/apps/web/src/components/errors/issue-timeline.tsx +++ b/apps/web/src/components/errors/issue-timeline.tsx @@ -297,7 +297,7 @@ export function IssueTimeline({
    Escalation - + {escalation.severity} · {escalation.status}
    @@ -335,7 +335,7 @@ export function IssueTimeline({
    {EVENT_LABEL[event.type]} {event.fromState && event.toState ? ( - + {event.fromState} → {event.toState} ) : null} @@ -367,7 +367,7 @@ function AuthorLabel({ return ( ({ onKeyDown={onInputKeyDown} className="h-9 min-w-0 flex-1 bg-transparent text-sm text-foreground outline-none placeholder:text-muted-foreground" /> - {hotkey ? {hotkey} : null} + {hotkey ? {hotkey} : null}
    No match @@ -186,7 +186,7 @@ export function QuickPickMenu({ ) : null} {item.shortcut ? ( - + {item.shortcut} ) : null} diff --git a/apps/web/src/components/errors/signal-state-chip.tsx b/apps/web/src/components/errors/signal-state-chip.tsx index ebd8119f91..c87203bbe6 100644 --- a/apps/web/src/components/errors/signal-state-chip.tsx +++ b/apps/web/src/components/errors/signal-state-chip.tsx @@ -46,7 +46,7 @@ export function SignalStateChip({ return ( {namespace} Pinned diff --git a/apps/web/src/components/funnels/funnel-step-builder.tsx b/apps/web/src/components/funnels/funnel-step-builder.tsx index 8a9ca87962..34317e9ac8 100644 --- a/apps/web/src/components/funnels/funnel-step-builder.tsx +++ b/apps/web/src/components/funnels/funnel-step-builder.tsx @@ -206,7 +206,7 @@ function StepRow({ {!single && (
    - {filterError ?

    {filterError}

    : null} + {filterError ?

    {filterError}

    : null}
    ) : null}
    @@ -445,7 +445,7 @@ function SuggestingInput({ {name} {countOf.get(name) !== undefined ? ( - + {formatNumber(countOf.get(name)!)} ) : null} diff --git a/apps/web/src/components/header/onboarding-checklist-button.tsx b/apps/web/src/components/header/onboarding-checklist-button.tsx index 7220e1f93d..9778cad4aa 100644 --- a/apps/web/src/components/header/onboarding-checklist-button.tsx +++ b/apps/web/src/components/header/onboarding-checklist-button.tsx @@ -135,7 +135,7 @@ function ProgressChip({ completed, total }: { completed: number; total: number } size="xs" mono className={cn( - "text-[11px] font-semibold sm:text-[11px]", + "text-2xs font-semibold sm:text-2xs", completed === total ? "bg-primary text-primary-foreground" : "bg-primary/15 text-primary", )} > @@ -298,7 +298,7 @@ export function OnboardingChecklistPanel({ function OptionalTag() { return ( - + Optional ) @@ -335,7 +335,7 @@ function StepRow({ className="group flex items-center gap-3 rounded-md px-2 py-2 text-sm text-foreground outline-none transition-colors hover:bg-muted/60 focus-visible:ring-2 focus-visible:ring-ring" > {index} diff --git a/apps/web/src/components/infra/cloudflare/cloudflare-breakdown-panel.tsx b/apps/web/src/components/infra/cloudflare/cloudflare-breakdown-panel.tsx index a17d24167c..e79ac31bbc 100644 --- a/apps/web/src/components/infra/cloudflare/cloudflare-breakdown-panel.tsx +++ b/apps/web/src/components/infra/cloudflare/cloudflare-breakdown-panel.tsx @@ -419,7 +419,7 @@ function StoredBreakdown({
    } error={() => ( -

    +

    Couldn't load the {dimension.column.toLowerCase()} breakdown.

    )} @@ -446,7 +446,7 @@ function StoredBreakdown({ meta={ // Below 99.5% the fold is actually hiding something; above it, saying so is noise. data.coverage < 0.995 && data.totals.length > 0 ? ( - + {formatPercent(data.coverage)} of zone requests ) : null @@ -520,7 +520,7 @@ function Footer({ total={total} noun={dimension.noun} align="start" - className="justify-start gap-x-3 gap-y-1 px-3 py-2 font-mono text-[10px]" + className="justify-start gap-x-3 gap-y-1 px-3 py-2 font-mono text-3xs" > {collectedFrom ? collected from {collectedFrom} : null} {onSearchLive ? ( @@ -577,7 +577,7 @@ function LiveBreakdown({ onChange={onSearchChange} count={count} meta={ - + Live from Cloudflare · no history } @@ -600,7 +600,7 @@ function LiveBreakdown({ error={() => ( <> {toolbar(0)} -

    +

    Couldn't reach Cloudflare's analytics API for this zone right now.

    @@ -611,7 +611,7 @@ function LiveBreakdown({ return ( <> {toolbar(0)} -

    +

    Cloudflare can't serve this breakdown: {data.unavailableReason}

    @@ -637,7 +637,7 @@ function LiveBreakdown({ emptyMessage={`No ${dimension.noun} match "${query}" in this window.`} interactive={false} /> -

    +

    Cloudflare's top {rows.length} for "{query}" · clear the filter to return to stored data

    diff --git a/apps/web/src/components/infra/cloudflare/cloudflare-edge-share-band.tsx b/apps/web/src/components/infra/cloudflare/cloudflare-edge-share-band.tsx index d801ae3988..942932ec46 100644 --- a/apps/web/src/components/infra/cloudflare/cloudflare-edge-share-band.tsx +++ b/apps/web/src/components/infra/cloudflare/cloudflare-edge-share-band.tsx @@ -54,10 +54,10 @@ export function CloudflareEdgeShareBand({ cacheBuckets, className }: CloudflareE {formatPercent(edgeShare)} - served at the edge + served at the edge
    - from origin + from origin {formatPercent(originShare)} @@ -96,11 +96,11 @@ export function CloudflareEdgeShareBand({ cacheBuckets, className }: CloudflareE - {seg.label} - + {seg.label} + {formatNumber(seg.requests)} @@ -108,11 +108,11 @@ export function CloudflareEdgeShareBand({ cacheBuckets, className }: CloudflareE - Origin - + Origin + {formatNumber(originRequests)} diff --git a/apps/web/src/components/infra/cloudflare/cloudflare-zone-detail-charts.tsx b/apps/web/src/components/infra/cloudflare/cloudflare-zone-detail-charts.tsx index ed5c603310..53d5f99bc5 100644 --- a/apps/web/src/components/infra/cloudflare/cloudflare-zone-detail-charts.tsx +++ b/apps/web/src/components/infra/cloudflare/cloudflare-zone-detail-charts.tsx @@ -257,7 +257,7 @@ export function StackedBreakdownChart({ style={{ background: seriesColor(s) }} /> {seriesLabel(s)} @@ -265,7 +265,7 @@ export function StackedBreakdownChart({ ))} {legendOverflow > 0 ? ( - +{legendOverflow} + +{legendOverflow} ) : null} } @@ -486,7 +486,7 @@ export function CloudflareZoneLatencyChart({ if (activeSeries.length === 0) { return ( -

    +

    No timing quantiles for this window — Cloudflare only exposes zone latency percentiles on some plans.

    @@ -501,7 +501,7 @@ export function CloudflareZoneLatencyChart({ legend={activeSeries.map((s) => ( - {s.label} + {s.label} ))} > diff --git a/apps/web/src/components/infra/cloudflare/compact-filter-input.tsx b/apps/web/src/components/infra/cloudflare/compact-filter-input.tsx index 1abd78a00b..a9d56ed67f 100644 --- a/apps/web/src/components/infra/cloudflare/compact-filter-input.tsx +++ b/apps/web/src/components/infra/cloudflare/compact-filter-input.tsx @@ -30,7 +30,7 @@ export function CompactFilterInput({ onChange={(event) => onChange(event.target.value)} placeholder={placeholder} aria-label={label} - className="min-w-0 flex-1 bg-transparent font-mono text-[11px] text-foreground placeholder:text-muted-foreground focus-visible:outline-none [&::-webkit-search-cancel-button]:hidden" + className="min-w-0 flex-1 bg-transparent font-mono text-2xs text-foreground placeholder:text-muted-foreground focus-visible:outline-none [&::-webkit-search-cancel-button]:hidden" /> {value ? (
    diff --git a/apps/web/src/components/infra/host-detail-chart.tsx b/apps/web/src/components/infra/host-detail-chart.tsx index d24bf6a643..ea740aaed5 100644 --- a/apps/web/src/components/infra/host-detail-chart.tsx +++ b/apps/web/src/components/infra/host-detail-chart.tsx @@ -167,7 +167,7 @@ export function MetricStrip({
    {label}
    {caption ? ( -
    {caption}
    +
    {caption}
    ) : null}
    diff --git a/apps/web/src/components/infra/host-detail-header.tsx b/apps/web/src/components/infra/host-detail-header.tsx index b36b7515a2..4748b04ec3 100644 --- a/apps/web/src/components/infra/host-detail-header.tsx +++ b/apps/web/src/components/infra/host-detail-header.tsx @@ -62,7 +62,7 @@ export function HostDetailHeader({ summary, hostName, onWidenRange }: HostDetail ) diff --git a/apps/web/src/components/infra/host-metadata-panel.tsx b/apps/web/src/components/infra/host-metadata-panel.tsx index 5d131e612f..e65f6b7b9b 100644 --- a/apps/web/src/components/infra/host-metadata-panel.tsx +++ b/apps/web/src/components/infra/host-metadata-panel.tsx @@ -17,7 +17,7 @@ interface SectionProps { function Section({ title, children }: SectionProps) { return (
    -
    {title}
    +
    {title}
    {children}
    ) diff --git a/apps/web/src/components/infra/host-table.tsx b/apps/web/src/components/infra/host-table.tsx index 9c87d31a92..221594eda8 100644 --- a/apps/web/src/components/infra/host-table.tsx +++ b/apps/web/src/components/infra/host-table.tsx @@ -127,7 +127,7 @@ export function HostTable({ hosts, waiting }: HostTableProps) {
    diff --git a/apps/web/src/components/infra/infra-correlation-panel.tsx b/apps/web/src/components/infra/infra-correlation-panel.tsx index fb2836c075..d391179aca 100644 --- a/apps/web/src/components/infra/infra-correlation-panel.tsx +++ b/apps/web/src/components/infra/infra-correlation-panel.tsx @@ -95,7 +95,7 @@ export function InfraCorrelationPanel({
    {correlation.identifier} @@ -192,7 +192,7 @@ function renderCharts(correlation: InfraCorrelation, startTime: string, endTime: /** Typed SPA deep-link into the matching infra detail route, per kind. */ function CorrelationLink({ correlation }: { correlation: InfraCorrelation }) { const className = - "inline-flex shrink-0 items-center gap-1 whitespace-nowrap text-[11px] text-muted-foreground transition-colors hover:text-foreground" + "inline-flex shrink-0 items-center gap-1 whitespace-nowrap text-2xs text-muted-foreground transition-colors hover:text-foreground" const content = ( <> View in Infrastructure diff --git a/apps/web/src/components/infra/kubernetes/pod-peek-sheet.tsx b/apps/web/src/components/infra/kubernetes/pod-peek-sheet.tsx index f04d9773c2..a30c14da91 100644 --- a/apps/web/src/components/infra/kubernetes/pod-peek-sheet.tsx +++ b/apps/web/src/components/infra/kubernetes/pod-peek-sheet.tsx @@ -186,7 +186,7 @@ export function PodPeekSheet({ value={pod.lastSeen} prefix="seen" mono - className="ml-auto text-[11px] text-muted-foreground" + className="ml-auto text-2xs text-muted-foreground" /> } @@ -247,11 +247,11 @@ export function PodPeekSheet({ {position ? ( - + {position.index + 1} of {position.count} ) : null} - + ↑ ↓ walk the list diff --git a/apps/web/src/components/infra/node-table.tsx b/apps/web/src/components/infra/node-table.tsx index 348923b122..2bc422c2cc 100644 --- a/apps/web/src/components/infra/node-table.tsx +++ b/apps/web/src/components/infra/node-table.tsx @@ -116,7 +116,7 @@ export function NodeTable({ nodes, waiting, referenceTime }: NodeTableProps) {
    diff --git a/apps/web/src/components/infra/overview/infra-overview.tsx b/apps/web/src/components/infra/overview/infra-overview.tsx index 7d0f520b5f..d4f317a84a 100644 --- a/apps/web/src/components/infra/overview/infra-overview.tsx +++ b/apps/web/src/components/infra/overview/infra-overview.tsx @@ -414,7 +414,7 @@ function HealthBar({ segments }: { segments: ReadonlyArray }) { className: SEGMENT_CLASS[segment.key], }))} /> - + {drawn.map((segment) => ( {segment.count.toLocaleString()} {SEGMENT_LABEL[segment.key]} diff --git a/apps/web/src/components/infra/planetscale/planetscale-activity-feed.tsx b/apps/web/src/components/infra/planetscale/planetscale-activity-feed.tsx index f443a9e101..c81885ecd1 100644 --- a/apps/web/src/components/infra/planetscale/planetscale-activity-feed.tsx +++ b/apps/web/src/components/infra/planetscale/planetscale-activity-feed.tsx @@ -82,16 +82,16 @@ export function PlanetScaleActivityRow({ ) : ( - {branchName} + {branchName} ) ) : null} {actorLogin !== null ? ( - + {actorLogin} ) : null} diff --git a/apps/web/src/components/infra/planetscale/planetscale-alert-menu.tsx b/apps/web/src/components/infra/planetscale/planetscale-alert-menu.tsx index a40e01816f..5587f59b25 100644 --- a/apps/web/src/components/infra/planetscale/planetscale-alert-menu.tsx +++ b/apps/web/src/components/infra/planetscale/planetscale-alert-menu.tsx @@ -84,7 +84,7 @@ export function PlanetScaleAlertMenu({ >
    {suggestion.title} - + {suggestion.summary}
    diff --git a/apps/web/src/components/infra/planetscale/planetscale-branch-breakdown-panel.tsx b/apps/web/src/components/infra/planetscale/planetscale-branch-breakdown-panel.tsx index 262bc17055..b35c285f69 100644 --- a/apps/web/src/components/infra/planetscale/planetscale-branch-breakdown-panel.tsx +++ b/apps/web/src/components/infra/planetscale/planetscale-branch-breakdown-panel.tsx @@ -271,7 +271,7 @@ export function PlanetScaleBranchBreakdownPanel({ })} -
    +
    {spec.additive ? `Bars show share of ${formatNumber(total)} total across ${candidates.length} branch${candidates.length === 1 ? "" : "es"}.` : // Not "% of database": these are maxima, and they do not sum. diff --git a/apps/web/src/components/infra/planetscale/planetscale-top-queries.tsx b/apps/web/src/components/infra/planetscale/planetscale-top-queries.tsx index 27f6bfc2a8..9ad2a0d248 100644 --- a/apps/web/src/components/infra/planetscale/planetscale-top-queries.tsx +++ b/apps/web/src/components/infra/planetscale/planetscale-top-queries.tsx @@ -101,12 +101,12 @@ export function PlanetScaleTopQueries({ {response.rows.map((row) => (
    -

    +

    {row.normalizedSql}

    -
    +
    {formatNumber(row.queryCount)} calls - p50 + p50 - p99 + p99 {formatNumber(row.rowsReadPerQuery)} rows read/query diff --git a/apps/web/src/components/infra/pod-table.tsx b/apps/web/src/components/infra/pod-table.tsx index 19bb2a7d3d..b3a67e315b 100644 --- a/apps/web/src/components/infra/pod-table.tsx +++ b/apps/web/src/components/infra/pod-table.tsx @@ -237,7 +237,7 @@ export function PodTable({
    diff --git a/apps/web/src/components/infra/primitives/avg-peak.tsx b/apps/web/src/components/infra/primitives/avg-peak.tsx index 8b2ec051c8..8a25d18227 100644 --- a/apps/web/src/components/infra/primitives/avg-peak.tsx +++ b/apps/web/src/components/infra/primitives/avg-peak.tsx @@ -1,7 +1,7 @@ /** avg → peak. One number can't distinguish a steady 60% from a spike to 100%. */ export function AvgPeak({ avg, peak, format }: { avg: number; peak: number; format: (n: number) => string }) { return ( - + {format(avg)} → {format(peak)} diff --git a/apps/web/src/components/infra/primitives/filter-chips.tsx b/apps/web/src/components/infra/primitives/filter-chips.tsx index 3f4ff13a6a..8048fa5550 100644 --- a/apps/web/src/components/infra/primitives/filter-chips.tsx +++ b/apps/web/src/components/infra/primitives/filter-chips.tsx @@ -26,7 +26,7 @@ export interface FilterChip { const VISIBLE_LIMIT = 6 const CHIP_CLASS = - "inline-flex items-center gap-1 rounded-sm border border-border/70 bg-background/60 py-0.5 pr-0.5 pl-1.5 font-mono text-[10px] text-muted-foreground" + "inline-flex items-center gap-1 rounded-sm border border-border/70 bg-background/60 py-0.5 pr-0.5 pl-1.5 font-mono text-3xs text-muted-foreground" export function FilterChipRail({ chips, diff --git a/apps/web/src/components/infra/primitives/fleet-band.tsx b/apps/web/src/components/infra/primitives/fleet-band.tsx index a3fcdd81ae..7e5296485a 100644 --- a/apps/web/src/components/infra/primitives/fleet-band.tsx +++ b/apps/web/src/components/infra/primitives/fleet-band.tsx @@ -80,7 +80,7 @@ export function FleetBand({ {total.toLocaleString()} - + {total === 1 ? noun : `${noun}s`} in scope @@ -101,7 +101,7 @@ export function FleetBand({ ) : (
    )} - {caption} + {caption}
    {cells.map((cell) => ( ({ active && "bg-muted/60", )} > - {label} + {label} ({ > {value} - {hint} + {hint} ) diff --git a/apps/web/src/components/infra/primitives/meta-line.tsx b/apps/web/src/components/infra/primitives/meta-line.tsx index aecb520ad1..8a6558d15b 100644 --- a/apps/web/src/components/infra/primitives/meta-line.tsx +++ b/apps/web/src/components/infra/primitives/meta-line.tsx @@ -46,7 +46,7 @@ export function MetaLine({ return (
    {label} @@ -78,7 +78,7 @@ function MeterRow({ label, fraction, hideLabel }: Meter & { hideLabel?: boolean diff --git a/apps/web/src/components/infra/primitives/mono-link-button.tsx b/apps/web/src/components/infra/primitives/mono-link-button.tsx index 67205417dd..2e8f51534a 100644 --- a/apps/web/src/components/infra/primitives/mono-link-button.tsx +++ b/apps/web/src/components/infra/primitives/mono-link-button.tsx @@ -8,7 +8,7 @@ export function MonoLinkButton({ className, type = "button", ...props }: React.C
    diff --git a/apps/web/src/components/infra/service-lens/correlation-strips.tsx b/apps/web/src/components/infra/service-lens/correlation-strips.tsx index 3095eab060..cafa965d13 100644 --- a/apps/web/src/components/infra/service-lens/correlation-strips.tsx +++ b/apps/web/src/components/infra/service-lens/correlation-strips.tsx @@ -67,7 +67,7 @@ export function CorrelationStrips({ series, xDomain, waiting = false, className >
    {strip.label} - {strip.source} + {strip.source}
    ) : services.length === 0 ? ( -

    +

    No service resolves to a Kubernetes workload in this window.

    ) : ( @@ -77,10 +77,10 @@ export function ServiceLensRail({ {unlinkedCount != null && unlinkedCount > 0 && (
    -
    +
    {unlinkedCount} {unlinkedCount === 1 ? "service" : "services"} not linked
    -

    +

    Their spans carry no workload identity, so the lens can't reach their pods.{" "} {service.serviceName} - + {utilization == null ? "—" : formatPercent(utilization)} - + {service.podCount} diff --git a/apps/web/src/components/infra/status-badge.tsx b/apps/web/src/components/infra/status-badge.tsx index 2328d8e0e2..da8cd8e6b0 100644 --- a/apps/web/src/components/infra/status-badge.tsx +++ b/apps/web/src/components/infra/status-badge.tsx @@ -36,7 +36,7 @@ export function HostStatusBadge({ lastSeen, referenceTime, quiet, className }: H return (

    diff --git a/apps/web/src/components/ingest/connection-status.tsx b/apps/web/src/components/ingest/connection-status.tsx index 99efb21a1e..16ce825458 100644 --- a/apps/web/src/components/ingest/connection-status.tsx +++ b/apps/web/src/components/ingest/connection-status.tsx @@ -18,7 +18,7 @@ export function ConnectionStatusPill({ connection }: { connection: IngestConnect Watching for your first trace…
    - + Not ready to instrument?
    {showNotAdmin ? ( -

    +

    Only organization admins can change or disconnect {manifest.name} workspaces.

    ) : null} diff --git a/apps/web/src/components/integrations/cloudflare-account-card.tsx b/apps/web/src/components/integrations/cloudflare-account-card.tsx index f7a421fed0..d423ad408b 100644 --- a/apps/web/src/components/integrations/cloudflare-account-card.tsx +++ b/apps/web/src/components/integrations/cloudflare-account-card.tsx @@ -75,7 +75,7 @@ function CloudflareAccountsStrip({ accounts }: { readonly accounts: ReadonlyArra {account.accountName ?? account.accountId} - + {account.accountId} @@ -326,7 +326,7 @@ export function CloudflareAccountCard() { > Error details - + {accountError.raw} diff --git a/apps/web/src/components/integrations/cloudflare-stat-cards.tsx b/apps/web/src/components/integrations/cloudflare-stat-cards.tsx index 5189a1b0a2..0b97403c3b 100644 --- a/apps/web/src/components/integrations/cloudflare-stat-cards.tsx +++ b/apps/web/src/components/integrations/cloudflare-stat-cards.tsx @@ -85,7 +85,7 @@ export function CloudflareStatCards({ action={ Open diff --git a/apps/web/src/components/integrations/cloudflare-zone-board.tsx b/apps/web/src/components/integrations/cloudflare-zone-board.tsx index 2bc4ace839..2a2120b8bc 100644 --- a/apps/web/src/components/integrations/cloudflare-zone-board.tsx +++ b/apps/web/src/components/integrations/cloudflare-zone-board.tsx @@ -147,7 +147,7 @@ function ErrorLine({ info, raw }: { info: CloudflareErrorInfo; raw: string }) { > Details - + {raw} @@ -295,11 +295,11 @@ function ResourceRow({ {name} {/* In a narrow card the status column is hidden, so surface the detail under the name. */} -
    {status.detail}
    +
    {status.detail}
    @@ -592,7 +592,7 @@ export function CloudflareWorkersCard({ {aggregate.kind === "issue" || aggregate.kind === "no-data" ? ( -
    +
    {aggregate.detail}
    ) : null} @@ -600,7 +600,7 @@ export function CloudflareWorkersCard({ {scripts.length === 0 ? (
    - {aggregate.detail} + {aggregate.detail}
    ) : (
    @@ -624,7 +624,7 @@ export function CloudflareWorkersCard({
    {status ? ( -
    +
    {status.externalUserEmail ? (
    {status.externalUserEmail} authorized diff --git a/apps/web/src/components/integrations/planetscale-integration-card.tsx b/apps/web/src/components/integrations/planetscale-integration-card.tsx index 05bac6a7c5..b9231da23d 100644 --- a/apps/web/src/components/integrations/planetscale-integration-card.tsx +++ b/apps/web/src/components/integrations/planetscale-integration-card.tsx @@ -650,7 +650,7 @@ function PlanetScaleWebhookConfig() { {config.secret} -

    +

    PlanetScale signs each delivery with this secret ( X-PlanetScale-Signature); Maple rejects anything that doesn't verify. diff --git a/apps/web/src/components/integrations/planetscale-setup-checklist.tsx b/apps/web/src/components/integrations/planetscale-setup-checklist.tsx index 8bd1a458a5..ab0580a36e 100644 --- a/apps/web/src/components/integrations/planetscale-setup-checklist.tsx +++ b/apps/web/src/components/integrations/planetscale-setup-checklist.tsx @@ -87,7 +87,7 @@ function StepMarker({ step, number }: { step: SetupStep; number: number }) { ) : ( {number} @@ -96,7 +96,7 @@ function StepMarker({ step, number }: { step: SetupStep; number: number }) { return ( {number} diff --git a/apps/web/src/components/investigations/action-detail-sheet.tsx b/apps/web/src/components/investigations/action-detail-sheet.tsx index f8588e7ca1..8eba6e3be7 100644 --- a/apps/web/src/components/investigations/action-detail-sheet.tsx +++ b/apps/web/src/components/investigations/action-detail-sheet.tsx @@ -71,7 +71,7 @@ export function EvidenceChips({ item }: { item: ActionEvidenceItem }) { title={traceId} className="rounded" > - + {shortId(traceId, "generic", { ellipsis: true })} @@ -79,7 +79,7 @@ export function EvidenceChips({ item }: { item: ActionEvidenceItem }) { {item.logPatterns.map((pattern) => ( {pattern} @@ -142,7 +142,7 @@ export function ActionDetailSheet({ * chip, not a disabled button: a button implies it will work * once something is enabled, and there is nothing to enable. */} - + {action.promise}

    diff --git a/apps/web/src/components/investigations/flow/flow-edge.tsx b/apps/web/src/components/investigations/flow/flow-edge.tsx index 48f5498960..02c83dab6a 100644 --- a/apps/web/src/components/investigations/flow/flow-edge.tsx +++ b/apps/web/src/components/investigations/flow/flow-edge.tsx @@ -106,7 +106,7 @@ export const FlowEdge = memo(function FlowEdge({ // an absolutely-positioned layer, so anything that permits wrapping // collapses "TRIPPED" into a 23px column of single letters. "pointer-events-none absolute z-10 whitespace-pre text-center", - "font-mono text-[9px] font-medium uppercase leading-3 tracking-[0.1em] text-muted-foreground", + "font-mono text-4xs font-medium uppercase leading-3 tracking-[0.1em] text-muted-foreground", )} // Parked above the midpoint of the straight run, not on it. style={{ diff --git a/apps/web/src/components/investigations/flow/flow-nodes.tsx b/apps/web/src/components/investigations/flow/flow-nodes.tsx index 7894d78aea..41c183595e 100644 --- a/apps/web/src/components/investigations/flow/flow-nodes.tsx +++ b/apps/web/src/components/investigations/flow/flow-nodes.tsx @@ -147,7 +147,7 @@ export const FlowSpineNode = memo(function FlowSpineNode({ data }: NodeProps & { * that *is* the running thing was the only one on the canvas not saying. */} {data.phase ? ( - + {data.phase} ) : null} @@ -158,7 +158,7 @@ export const FlowSpineNode = memo(function FlowSpineNode({ data }: NodeProps & { */} {data.live ? : null} {data.status ? ( -

    +

    ) : null} {data.note ? ( -

    +

    {data.note} {data.current ? "\nyou are here" : null}

    @@ -193,7 +193,7 @@ export const FlowSpineNode = memo(function FlowSpineNode({ data }: NodeProps & { variant="orDate" tooltip="title" mono - className="mt-auto pt-0.5 text-[9px] leading-3 text-muted-foreground/70" + className="mt-auto pt-0.5 text-4xs leading-3 text-muted-foreground/70" /> ) : null} @@ -261,7 +261,7 @@ export const FlowPendingVerdictNode = memo(function FlowPendingVerdictNode({
    {data.note ? ( -

    {data.note}

    +

    {data.note}

    ) : null} {/* * Two bars where the verdict node prints its suspected cause and its @@ -290,7 +290,7 @@ export const FlowHeadingNode = memo(function FlowHeadingNode({ data, }: NodeProps & { data: { text: string } }) { return ( - + {data.text} ) @@ -394,7 +394,7 @@ export const FlowActionNode = memo(function FlowActionNode({ data }: NodeProps & * `task` is a real kind — so the two lanes hold across every row. */} - + {data.ordinal} @@ -405,7 +405,7 @@ export const FlowActionNode = memo(function FlowActionNode({ data }: NodeProps & {data.target ? ( {data.target.label} → @@ -415,7 +415,7 @@ export const FlowActionNode = memo(function FlowActionNode({ data }: NodeProps & * dim chip on the action they would perform — a roadmap promise * attached to a real handle, not a placeholder box on the canvas. */} - + {data.promise}

    diff --git a/apps/web/src/components/investigations/investigation-meta.tsx b/apps/web/src/components/investigations/investigation-meta.tsx index b694292ee2..6abf777e44 100644 --- a/apps/web/src/components/investigations/investigation-meta.tsx +++ b/apps/web/src/components/investigations/investigation-meta.tsx @@ -103,7 +103,7 @@ function Provenance({ investigation }: { investigation: V2Investigation }) { : "Opened by a member of your team" return ( -

    +

    {[model, tokens, opened].filter(Boolean).join(" · ")}

    ) diff --git a/apps/web/src/components/logs/highlighted-text.tsx b/apps/web/src/components/logs/highlighted-text.tsx index 614af75515..9f4e9b3470 100644 --- a/apps/web/src/components/logs/highlighted-text.tsx +++ b/apps/web/src/components/logs/highlighted-text.tsx @@ -44,7 +44,7 @@ export const HighlightedText = React.memo(function HighlightedText({ text, query segment.match ? ( {segment.text} diff --git a/apps/web/src/components/logs/log-meta-strip.tsx b/apps/web/src/components/logs/log-meta-strip.tsx index ac05b60a32..adc0909a61 100644 --- a/apps/web/src/components/logs/log-meta-strip.tsx +++ b/apps/web/src/components/logs/log-meta-strip.tsx @@ -39,7 +39,7 @@ export function LogMetaStrip({ log, timeZone, showOpenFullPage = true }: LogMeta to="/traces/$traceId" params={{ traceId: log.traceId }} search={{ t: log.timestamp }} - className="inline-flex shrink-0 items-center gap-1 rounded border border-primary/20 bg-primary/5 px-1.5 py-0.5 font-mono text-[11px] text-primary hover:bg-primary/10 transition-colors" + className="inline-flex shrink-0 items-center gap-1 rounded border border-primary/20 bg-primary/5 px-1.5 py-0.5 font-mono text-2xs text-primary hover:bg-primary/10 transition-colors" title={`View trace ${log.traceId}`} > @@ -48,7 +48,7 @@ export function LogMetaStrip({ log, timeZone, showOpenFullPage = true }: LogMeta )} {log.spanId && ( - + span:{shortId(log.spanId, "span")} )} diff --git a/apps/web/src/components/logs/log-raw-panel.tsx b/apps/web/src/components/logs/log-raw-panel.tsx index 8a36e26fe6..e5ba160902 100644 --- a/apps/web/src/components/logs/log-raw-panel.tsx +++ b/apps/web/src/components/logs/log-raw-panel.tsx @@ -40,10 +40,10 @@ export function LogRawPanel({ log }: LogRawPanelProps) { label="Log JSON" idleLabel="Copy" iconSize={10} - className="h-5 px-1.5 text-[10px]" + className="h-5 px-1.5 text-3xs" />
    -
    +			
     				
     			
    diff --git a/apps/web/src/components/logs/log-row-expanded.tsx b/apps/web/src/components/logs/log-row-expanded.tsx index e94027f37a..7a82347b12 100644 --- a/apps/web/src/components/logs/log-row-expanded.tsx +++ b/apps/web/src/components/logs/log-row-expanded.tsx @@ -38,7 +38,7 @@ export function LogRowExpanded({ log, highlight, onOpenDetail }: LogRowExpandedP label="Log JSON" idleLabel="JSON" iconSize={10} - className="h-5 px-1.5 text-[10px]" + className="h-5 px-1.5 text-3xs" onClick={(e) => e.stopPropagation()} />
    diff --git a/apps/web/src/components/logs/log-search-help.tsx b/apps/web/src/components/logs/log-search-help.tsx index 66333d4c19..6aa15626b4 100644 --- a/apps/web/src/components/logs/log-search-help.tsx +++ b/apps/web/src/components/logs/log-search-help.tsx @@ -53,7 +53,7 @@ export function LogSearchHelp() {

    What you can search

    -

    +

    One box. It reads the shape of what you type and picks the lookup.

    @@ -63,10 +63,10 @@ export function LogSearchHelp() {
    -
    +
    {lookup.example}
    -
    +
    {lookup.does}{" "} ({lookup.note})
    @@ -76,11 +76,11 @@ export function LogSearchHelp() { {/* The text row's claim, shown rather than asserted — and rendered through the same splitter the stream uses, so it cannot drift. */} -
    +
    -

    +

    A trace scope becomes a chip you can remove. Wrap an id in{" "} "quotes" to search it as text instead.

    diff --git a/apps/web/src/components/logs/log-search-mode-badge.tsx b/apps/web/src/components/logs/log-search-mode-badge.tsx index d02fd3f652..e9669e5ed4 100644 --- a/apps/web/src/components/logs/log-search-mode-badge.tsx +++ b/apps/web/src/components/logs/log-search-mode-badge.tsx @@ -18,7 +18,7 @@ export function LogSearchModeBadge({ mode, className }: { mode: LogSearchMode; c return (
    - + {spanNameMap.get(spanChanged) ?? shortId(spanChanged, "span")} @@ -145,18 +145,18 @@ export function LogTraceTimeline({ currentLog, onLogSelect }: LogTraceTimelinePr if (!isCurrent) onLogSelect(log) }} > - + {formatTimelineOffset(relativeMs)} {log.serviceName !== currentLog.serviceName && ( - + {log.serviceName} )} diff --git a/apps/web/src/components/logs/logs-table.tsx b/apps/web/src/components/logs/logs-table.tsx index 639f5ead09..05a7d79852 100644 --- a/apps/web/src/components/logs/logs-table.tsx +++ b/apps/web/src/components/logs/logs-table.tsx @@ -215,7 +215,7 @@ const LogRow = React.memo(function LogRow({ {log.severityText} diff --git a/apps/web/src/components/logs/logs-volume-chart.tsx b/apps/web/src/components/logs/logs-volume-chart.tsx index 133a0e46f4..20f42efb1e 100644 --- a/apps/web/src/components/logs/logs-volume-chart.tsx +++ b/apps/web/src/components/logs/logs-volume-chart.tsx @@ -298,7 +298,7 @@ function EmptyVolumeStrip({ className="flex w-full select-none pt-1 text-muted-foreground" aria-label="Log volume by severity, no logs in the selected range" > -
    +
    0
    @@ -322,11 +322,11 @@ function EmptyVolumeStrip({
    No log volume in this window -
      +
        {legend.map((severity) => (
      • {severity} @@ -339,7 +339,7 @@ function EmptyVolumeStrip({ {ticks.map((tick, i) => ( ) : ( -
        +
        {loading ? "Loading…" : "Not enough datapoints for a preview"}
        )}
        -
        +
        {entry.serviceNames.length === 1 ? entry.serviceNames[0] @@ -82,7 +82,7 @@ export function MetricPreviewCard({ entry, points, loading, onOpen }: MetricPrev {entry.metricUnit && ( - + {entry.metricUnit} )} diff --git a/apps/web/src/components/metrics/metrics-table.tsx b/apps/web/src/components/metrics/metrics-table.tsx index d5bdbc08ba..6dd9f9d94e 100644 --- a/apps/web/src/components/metrics/metrics-table.tsx +++ b/apps/web/src/components/metrics/metrics-table.tsx @@ -147,7 +147,7 @@ export function MetricsTable({ className="text-xs" /> {metric.metricDescription && ( - + {metric.metricDescription} )} diff --git a/apps/web/src/components/onboarding/onboarding-header-actions.tsx b/apps/web/src/components/onboarding/onboarding-header-actions.tsx index e0dbfc97e3..bdef4deee6 100644 --- a/apps/web/src/components/onboarding/onboarding-header-actions.tsx +++ b/apps/web/src/components/onboarding/onboarding-header-actions.tsx @@ -15,7 +15,7 @@ import { clearSelfHostedSessionToken } from "@/lib/services/common/self-hosted-a import { ClerkOrgSwitcherMenu, OrgAvatar } from "@/components/dashboard/org-switcher-menu" import { UserAvatar } from "@/components/dashboard/user-avatar" -const AVATAR_CLASS = "size-5 rounded-md text-[10px]" +const AVATAR_CLASS = "size-5 rounded-md text-3xs" export function OnboardingOrgSwitcher() { if (!isClerkAuthEnabled) return null diff --git a/apps/web/src/components/onboarding/step-region.tsx b/apps/web/src/components/onboarding/step-region.tsx index 111cd299bb..10f97c80a5 100644 --- a/apps/web/src/components/onboarding/step-region.tsx +++ b/apps/web/src/components/onboarding/step-region.tsx @@ -125,7 +125,7 @@ export function StepRegion() { } footer={ handleApplySuggestion(index)} > {suggestion.label} - {suggestion.kind} + {suggestion.kind} ))}
        diff --git a/apps/web/src/components/releases/release-changeset.tsx b/apps/web/src/components/releases/release-changeset.tsx index 10076ab8b4..2b64c4bbad 100644 --- a/apps/web/src/components/releases/release-changeset.tsx +++ b/apps/web/src/components/releases/release-changeset.tsx @@ -129,7 +129,7 @@ function ReleaseChangesetLoaded({ rangesKey, base }: { rangesKey: string; base: const range = Result.isSuccess(result) ? result.value.ranges[0] : undefined const action = ( - + since {shortReleaseLabel(base)} ) @@ -183,12 +183,12 @@ function ReleaseChangesetLoaded({ rangesKey, base }: { rangesKey: string; base: > {subject} - + {shortReleaseLabel(commit.sha)} {author}
        - + {formatRelativeTimeOrDate( new Date(commit.committedAt).toISOString(), undefined, @@ -199,7 +199,7 @@ function ReleaseChangesetLoaded({ rangesKey, base }: { rangesKey: string; base: ) })} {hidden > 0 ? ( -
        +
        {hidden} older {pluralize(hidden, "commit")} not shown
        ) : null} diff --git a/apps/web/src/components/releases/release-deploy-overview.tsx b/apps/web/src/components/releases/release-deploy-overview.tsx index 26725f01c2..a58d3fea01 100644 --- a/apps/web/src/components/releases/release-deploy-overview.tsx +++ b/apps/web/src/components/releases/release-deploy-overview.tsx @@ -140,7 +140,7 @@ function BeforeAfter({ return ( {before !== undefined ? ( - {format(before)} → + {format(before)} → ) : null} + against the version each replaced } @@ -234,7 +234,7 @@ function DeployServiceRow({ )} - + {impact.baseline ? shortReleaseLabel(impact.baseline.commitSha) : "-"} diff --git a/apps/web/src/components/releases/release-detail-panels.tsx b/apps/web/src/components/releases/release-detail-panels.tsx index 93b24c0725..2e337a5e8d 100644 --- a/apps/web/src/components/releases/release-detail-panels.tsx +++ b/apps/web/src/components/releases/release-detail-panels.tsx @@ -114,11 +114,11 @@ export function ReleaseComparison({ impact }: { impact: ReleaseServiceImpact }) title="This version vs. the previous one" action={ baseline === undefined ? ( - no previous version + no previous version ) : ( replaced {shortReleaseLabel(baseline.commitSha)} @@ -169,7 +169,7 @@ export function ReleaseComparison({ impact }: { impact: ReleaseServiceImpact })
    )} {baseline !== undefined && !comparable ? ( -
    +
    Changes are withheld below {MIN_COMPARE_SPANS} requests on either side.
    ) : null} @@ -200,7 +200,7 @@ export function ReleaseVersionsRail({ + {countLabel(sorted.length, "version")} } diff --git a/apps/web/src/components/releases/release-issues-panel.tsx b/apps/web/src/components/releases/release-issues-panel.tsx index 86de125add..e233e15da8 100644 --- a/apps/web/src/components/releases/release-issues-panel.tsx +++ b/apps/web/src/components/releases/release-issues-panel.tsx @@ -69,12 +69,12 @@ export function IssueList({ {issues.length} diff --git a/apps/web/src/components/releases/releases-live-now.tsx b/apps/web/src/components/releases/releases-live-now.tsx index 5003352a4c..e59d64bc62 100644 --- a/apps/web/src/components/releases/releases-live-now.tsx +++ b/apps/web/src/components/releases/releases-live-now.tsx @@ -30,11 +30,11 @@ export function ReleasesLiveNow({ live, timeSearch, environments }: ReleasesLive
    Live now {behind > 0 ? ( - + {countLabel(behind, "service")} not on the latest release ) : ( - + Every service is on its latest release )} @@ -64,23 +64,23 @@ export function ReleasesLiveNow({ live, timeSearch, environments }: ReleasesLive > {version.serviceName} - + {shortReleaseLabel(version.commitSha)} {version.share < ROLLOUT_COMPLETE_SHARE ? ( - + {Math.round(version.share * 100)}% ) : null} {version.behind > 0 ? ( - + {version.behind} behind ) : null} ))} {hidden > 0 ? ( - +{hidden} + +{hidden} ) : null}
    diff --git a/apps/web/src/components/releases/releases-table.tsx b/apps/web/src/components/releases/releases-table.tsx index 7e731a7aa1..ec3c4fee07 100644 --- a/apps/web/src/components/releases/releases-table.tsx +++ b/apps/web/src/components/releases/releases-table.tsx @@ -75,7 +75,7 @@ function Delta({ value, baseline, format, tone }: DeltaProps) { return ( {baseline !== undefined ? ( - + {format(baseline)} → ) : null} @@ -132,7 +132,7 @@ function ServiceChips({ services }: { services: ReadonlyArray ))} {flagged.length > 2 ? ( - +{flagged.length - 2} + +{flagged.length - 2} ) : null} ) @@ -186,7 +186,7 @@ function ReleaseTitle({ commitSha, commit, health, figure, range }: ReleaseTitle {health === "healthy" ? null : }
    -
    +
    {commit ? {shortReleaseLabel(commitSha)} : null} {author ? {author} : null} {!commit && !resolvable ? deployment reference : null} diff --git a/apps/web/src/components/releases/releases-timeline.tsx b/apps/web/src/components/releases/releases-timeline.tsx index c73e44742c..58af768672 100644 --- a/apps/web/src/components/releases/releases-timeline.tsx +++ b/apps/web/src/components/releases/releases-timeline.tsx @@ -219,7 +219,7 @@ export function ReleasesTimeline({ +
    {RELEASE_HEALTH_ORDER.map((band) => ( - + @@ -278,7 +278,7 @@ export function ReleasesTimeline({ )} /> {count > 1 ? ( - + {count} ) : null} @@ -289,7 +289,7 @@ export function ReleasesTimeline({
    ))} {hidden > 0 ? ( -
    +
    +{hidden} more {pluralize(hidden, "service")} @@ -298,7 +298,7 @@ export function ReleasesTimeline({
    {labels.map((label, index) => ( diff --git a/apps/web/src/components/replays/marker-legend.tsx b/apps/web/src/components/replays/marker-legend.tsx index b2acb205d3..62ce0932f9 100644 --- a/apps/web/src/components/replays/marker-legend.tsx +++ b/apps/web/src/components/replays/marker-legend.tsx @@ -14,7 +14,7 @@ export function MarkerLegend({ className }: { className?: string }) { return (
      - + {summary.rootServiceName} @@ -453,7 +453,7 @@ function TraceBar({ return ( )) .onError(() => ( -
      +
      Couldn’t load spans for this trace.
      )) @@ -507,7 +507,7 @@ function TraceSpanLane({ const spans: ReadonlyArray = res.spans if (spans.length === 0) { return ( -
      +
      No spans found for this trace.
      ) @@ -553,8 +553,8 @@ function SpanRowItem({ span, seek }: { span: SpanRow; seek: SeekContext }) { spanName={span.spanName} spanAttributes={span.spanAttributes} spanKind={span.spanKind} - className="text-[10px]" - textClassName="text-[10px] text-muted-foreground" + className="text-3xs" + textClassName="text-3xs text-muted-foreground" />
      } /> @@ -561,7 +561,7 @@ function EventKindLegend({ className }: { className?: string }) { return (
    • {label} @@ -594,7 +594,7 @@ function EventProps({ attributes }: { attributes?: string }) { if (entries.length === 0) return null return ( - + {entries.map(([key, value]) => ( {key}={value} @@ -644,7 +644,7 @@ function EventLine({ className="flex w-full items-center gap-2 px-3 py-1.5 text-left hover:bg-muted/50" title="Seek replay to this moment" > - + {clockAt(ev.timestamp)} @@ -654,9 +654,9 @@ function EventLine({ {lead} - {trail && {trail}} + {trail && {trail}} - + {ev.type === "network" ? ( <> @@ -694,20 +694,20 @@ function EventDetail({ ev }: { ev: EventRow }) { return (
      {fullUrl && ( - {fullUrl} + {fullUrl} )} {ev.type === "click" && ev.targetText && ev.targetSelector && ( - + {ev.targetSelector} )} {ev.type === "console" && ( - + {ev.message} )} {ev.type === "error" && ev.errorStack && ( - + {ev.errorStack.split("\n").slice(0, 3).join("\n")} )} @@ -719,7 +719,7 @@ function EventDetail({ ev }: { ev: EventRow }) { // Carry the event timestamp so the span-hierarchy query narrows the // ClickHouse partition scan instead of reading the full retention. search={{ t: ev.timestamp }} - className="w-fit rounded-sm border border-input px-2 py-0.5 text-[10px] text-muted-foreground hover:text-foreground" + className="w-fit rounded-sm border border-input px-2 py-0.5 text-3xs text-muted-foreground hover:text-foreground" title="Open backend trace" > Open trace @@ -844,7 +844,7 @@ function TraceListRow({ summary }: { summary: SessionTraceSummary }) { /> @@ -852,7 +852,7 @@ function TraceListRow({ summary }: { summary: SessionTraceSummary }) {
      - + {summary.rootServiceName} · {summary.spanCount} span{summary.spanCount === 1 ? "" : "s"} {isError ? " · error" : ""} @@ -862,7 +862,7 @@ function TraceListRow({ summary }: { summary: SessionTraceSummary }) { search={{ t: summary.startTime }} target="_blank" rel="noreferrer" - className="inline-flex shrink-0 items-center gap-1 text-[11px] text-info-foreground underline-offset-2 hover:underline" + className="inline-flex shrink-0 items-center gap-1 text-2xs text-info-foreground underline-offset-2 hover:underline" > open @@ -1013,7 +1013,7 @@ function SessionTab({ sessionId, session }: { sessionId: string; session: Sessio )} {session.userAgent && ( - + {session.userAgent} @@ -1114,7 +1114,7 @@ function IdentityGroup({ session }: { session: SessionRailSession }) { )} {traits.length > 0 && ( -
      +
      {traits.map(([key, value]) => ( {formatSessionDuration(total)} - on the page + on the page
      {share && ( @@ -1191,7 +1191,7 @@ function SessionSummary({ session }: { session: SessionRailSession }) { total={100} className="mt-3 h-1 gap-px bg-muted" /> -
      +
      {active != null && ( - + {label} diff --git a/apps/web/src/components/replays/sessions-list.tsx b/apps/web/src/components/replays/sessions-list.tsx index ecf372204f..3718d87829 100644 --- a/apps/web/src/components/replays/sessions-list.tsx +++ b/apps/web/src/components/replays/sessions-list.tsx @@ -258,7 +258,7 @@ export function SessionsList({ function ColumnHeader() { return ( -
      +
      User Org Tags diff --git a/apps/web/src/components/route-error.tsx b/apps/web/src/components/route-error.tsx index 5d6da1749c..75e6f8e4df 100644 --- a/apps/web/src/components/route-error.tsx +++ b/apps/web/src/components/route-error.tsx @@ -102,7 +102,7 @@ function RouteError({ error, info, reset }: ErrorComponentProps) { Stack trace -
      +					
       						{stack}
       					
      diff --git a/apps/web/src/components/service-map/service-map-view.tsx b/apps/web/src/components/service-map/service-map-view.tsx index f26df9afe6..770574334d 100644 --- a/apps/web/src/components/service-map/service-map-view.tsx +++ b/apps/web/src/components/service-map/service-map-view.tsx @@ -149,9 +149,9 @@ function MetricTile({ }) { return (
      - {label} + {label} {children} - {caption !== undefined && {caption}} + {caption !== undefined && {caption}}
      ) } @@ -235,7 +235,7 @@ function EdgeRow({ /> {service}
      -
      +
      {unit} @@ -312,7 +312,7 @@ function ServiceDetailPanel({ View service @@ -326,7 +326,7 @@ function ServiceDetailPanel({
      {serviceId} {overview?.serviceNamespace ? ( - + {overview.serviceNamespace} ) : null} @@ -343,7 +343,7 @@ function ServiceDetailPanel({ Infrastructure {serviceWorkloads.length > 0 && ( - + {serviceWorkloads.length} )} @@ -519,7 +519,7 @@ function ServiceWorkloadRow({ workload }: { workload: ServiceWorkload }) {

      {workload.workloadName}

      -

      +

      {workload.namespace || "default"} {workload.clusterName ? ` · ${workload.clusterName}` : ""}

      @@ -532,7 +532,7 @@ function ServiceWorkloadRow({ workload }: { workload: ServiceWorkload }) {
      -
      +
      CPU @@ -556,7 +556,7 @@ function ServiceWorkloadRow({ workload }: { workload: ServiceWorkload }) { View workload @@ -573,7 +573,7 @@ function ServiceWorkloadRow({ workload }: { workload: ServiceWorkload }) { namespaces: workload.namespace ? [workload.namespace] : undefined, } } - className="inline-flex items-center gap-1 text-[10px] text-primary hover:text-primary/80 transition-colors" + className="inline-flex items-center gap-1 text-3xs text-primary hover:text-primary/80 transition-colors" > View pods @@ -589,12 +589,12 @@ function ServiceInfraEmptyState() {

      No Kubernetes workloads found

      -

      +

      This service has no spans tagged with k8s.deployment.name in the selected window. Install the maple-k8s-infra Helm chart and label your namespace to enable infrastructure context:

      -
      +			
       				kubectl label namespace <ns> maple.io/instrument=true
       			
      @@ -867,7 +867,7 @@ function PlanetScaleSection({
      PlanetScale - + {planetscale.kind === "postgresql" ? "Postgres" : "MySQL"} · {planetscale.branchCount}{" "} {pluralize(planetscale.branchCount, "branch", "branches")} @@ -937,12 +937,12 @@ function PlanetScaleSection({ className="flex items-center justify-between gap-2 rounded-md border border-border bg-card px-2.5 py-2 text-xs" >
      - + {row.branch} {info?.production ? prod : null}
      -
      +
      {formatRate(row.connectionsAvg)} conns
      - + {branch.name} {branch.production ? prod : null}
      - + {branch.ready ? "no metrics" : "not ready"}
      @@ -1013,7 +1013,7 @@ function HyperdriveSection({ configs }: { configs: ReadonlyArray Hyperdrive Configs - + {countLabel(configs.length, "config")}
      @@ -1031,10 +1031,10 @@ function HyperdriveSection({ configs }: { configs: ReadonlyArray
      -
      +
      {config.matched ? ( {config.matched.name} - + {config.matched.kind === "postgresql" ? "Postgres" : "MySQL"} on PlanetScale @@ -1053,7 +1053,7 @@ function HyperdriveSection({ configs }: { configs: ReadonlyArray {config.originDatabase} - + PlanetScale (not in inventory) @@ -1061,11 +1061,11 @@ function HyperdriveSection({ configs }: { configs: ReadonlyArray {config.originDatabase} {config.originHost ? ( - + {config.originHost} ) : ( - + private origin )} @@ -1233,7 +1233,7 @@ function DatabaseDetailPanel({
      Query Activity {summaryWaiting && summaryResponse && ( - Refreshing + Refreshing )}
      {Result.builder(summaryResult) @@ -1263,15 +1263,15 @@ function DatabaseDetailPanel({ className="rounded-md border border-border bg-card px-2.5 py-2" >
      -

      +

      {formatQueryLabel(query.queryLabel)}

      -
      +
      - + {copy.encoding}
      { if (element) labels.current.set("overlay:legend", element) else labels.current.delete("overlay:legend") }} - className="pointer-events-none absolute bottom-14 left-4 flex flex-wrap gap-3 rounded-md sm:bottom-4 bg-background/95 px-3 py-2 text-[10px] text-foreground/85" + className="pointer-events-none absolute bottom-14 left-4 flex flex-wrap gap-3 rounded-md sm:bottom-4 bg-background/95 px-3 py-2 text-3xs text-foreground/85" > {(["healthy", "elevated", "degraded"] as const).map((status) => ( @@ -267,7 +267,7 @@ export function ServiceMap3DViewport({
    -
    +
    Drag to orbit · scroll to zoom · right-drag to pan {selectedId diff --git a/apps/web/src/components/services/dependency-table.tsx b/apps/web/src/components/services/dependency-table.tsx index 5e714420ff..35c928353c 100644 --- a/apps/web/src/components/services/dependency-table.tsx +++ b/apps/web/src/components/services/dependency-table.tsx @@ -145,7 +145,7 @@ export function DependencyTable({ serviceName, rows, startTime, endTime, timePre {row.name} {row.subtitle ? ( - + {row.subtitle} ) : null} @@ -226,7 +226,7 @@ export function DependencyTable({ serviceName, rows, startTime, endTime, timePre {row.name} {row.subtitle ? ( - + {row.subtitle} ) : null} diff --git a/apps/web/src/components/services/service-api-tab.tsx b/apps/web/src/components/services/service-api-tab.tsx index fafe3c909f..6bf5eab926 100644 --- a/apps/web/src/components/services/service-api-tab.tsx +++ b/apps/web/src/components/services/service-api-tab.tsx @@ -379,7 +379,7 @@ function GroupRows({ group, seconds, maxima, expanded, onToggle, onSelect }: Gro
    {copy.explainer} - + {sample.join(" · ")} {remaining > 0 ? ` · ${remaining.toLocaleString()} more` : ""} @@ -448,7 +448,7 @@ function GroupHeaderRow({ muted?: boolean }) { const numeric = - "py-1.5 text-right align-middle font-mono text-[11.5px] tabular-nums text-muted-foreground/70" + "py-1.5 text-right align-middle font-mono text-2xs tabular-nums text-muted-foreground/70" return ( @@ -462,7 +462,7 @@ function GroupHeaderRow({ > {title} - {count} + {count}
    @@ -550,7 +550,7 @@ function MethodLabel({ method }: { method: string }) { return ( @@ -588,7 +588,7 @@ function MobileGroup({ > {title} - + {group.endpoints.length} ·{" "} {formatRate(callsPerSecond(group.totals.estimatedSpanCount, seconds))} req/s @@ -597,7 +597,7 @@ function MobileGroup({ variant="outline" size="sm" onClick={onToggle} - className="h-6 shrink-0 px-2 text-[11px]" + className="h-6 shrink-0 px-2 text-2xs" > {expanded ? "Hide" : "Show"} diff --git a/apps/web/src/components/services/service-dependencies-tab.tsx b/apps/web/src/components/services/service-dependencies-tab.tsx index 9e1a6f1077..71a77d89ca 100644 --- a/apps/web/src/components/services/service-dependencies-tab.tsx +++ b/apps/web/src/components/services/service-dependencies-tab.tsx @@ -261,7 +261,7 @@ export function ServiceDependenciesTab({ aria-busy={isWaiting || undefined} > {summary ? ( -
    +
    {dedupedRows.length}{" "} diff --git a/apps/web/src/components/services/service-errors-panel.tsx b/apps/web/src/components/services/service-errors-panel.tsx index cf4bc2e623..87e78f6deb 100644 --- a/apps/web/src/components/services/service-errors-panel.tsx +++ b/apps/web/src/components/services/service-errors-panel.tsx @@ -24,7 +24,7 @@ function PanelFrame({ children, detailLimited }: { children: React.ReactNode; de action={
    {detailLimited && ( - Latest 90 days + Latest 90 days )} {/* `/errors/issues` now 302s to `/errors` and rewrites the time range to 7d on the way through. Link to the hub directly. */} diff --git a/apps/web/src/components/services/service-recent-deploys.tsx b/apps/web/src/components/services/service-recent-deploys.tsx index f7db56c3c6..2c0329071e 100644 --- a/apps/web/src/components/services/service-recent-deploys.tsx +++ b/apps/web/src/components/services/service-recent-deploys.tsx @@ -116,7 +116,7 @@ function RowFrame({
    {line1}
    {chip}
    -
    {line2}
    +
    {line2}
    ) @@ -310,7 +310,7 @@ export function ServiceRecentDeploys({ releases, isLoading = false }: ServiceRec ))} {expanded && hiddenCount > 0 ? ( -
    +
    …and {hiddenCount} more {pluralize(hiddenCount, "version")} in this window
    ) : null} diff --git a/apps/web/src/components/services/service-table-cells.tsx b/apps/web/src/components/services/service-table-cells.tsx index b985672a4c..9785e87ae4 100644 --- a/apps/web/src/components/services/service-table-cells.tsx +++ b/apps/web/src/components/services/service-table-cells.tsx @@ -99,7 +99,7 @@ export function MobileSortBar({ onSort, }: MobileSortBarProps) { return ( -
    +
    Sort {options.map(([key, label]) => { const active = sortKey === key diff --git a/apps/web/src/components/services/service-top-operations-panel.tsx b/apps/web/src/components/services/service-top-operations-panel.tsx index acfb9e730d..a67e89493f 100644 --- a/apps/web/src/components/services/service-top-operations-panel.tsx +++ b/apps/web/src/components/services/service-top-operations-panel.tsx @@ -87,7 +87,7 @@ export function ServiceTopOperationsPanel({ {op.spanName} - + op.spanCount} diff --git a/apps/web/src/components/services/service-usage-panel.tsx b/apps/web/src/components/services/service-usage-panel.tsx index e2872d3480..2e6892f6f9 100644 --- a/apps/web/src/components/services/service-usage-panel.tsx +++ b/apps/web/src/components/services/service-usage-panel.tsx @@ -108,7 +108,7 @@ export function ServiceUsagePanel({ title="Ingest this window" action={ envFilterActive ? ( - all environments + all environments ) : undefined } className={refreshingClass(isWaiting)} @@ -129,7 +129,7 @@ export function ServiceUsagePanel({ previous={prev} suffix="vs prev" flatThreshold={0.005} - className="text-[10px] text-muted-foreground" + className="text-3xs text-muted-foreground" />
    ) diff --git a/apps/web/src/components/services/service-workloads-panel.tsx b/apps/web/src/components/services/service-workloads-panel.tsx index 6a2afa2411..8a159fd19f 100644 --- a/apps/web/src/components/services/service-workloads-panel.tsx +++ b/apps/web/src/components/services/service-workloads-panel.tsx @@ -67,7 +67,7 @@ export function ServiceWorkloadsPanel({ title="Kubernetes" action={ envFilterActive ? ( - all environments + all environments ) : undefined } className={refreshingClass(isWaiting)} @@ -84,12 +84,12 @@ export function ServiceWorkloadsPanel({ {workload.workloadName} - + {KIND_LABEL[workload.workloadKind]} · {workload.namespace} {workload.clusterName ? ` · ${workload.clusterName}` : ""} - + {countLabel(workload.podCount, "pod")} {(workload.avgCpuLimitUtilization != null || diff --git a/apps/web/src/components/services/services-table.tsx b/apps/web/src/components/services/services-table.tsx index 3df9a78ee3..55bb1c7d97 100644 --- a/apps/web/src/components/services/services-table.tsx +++ b/apps/web/src/components/services/services-table.tsx @@ -254,7 +254,7 @@ interface DeployLinesProps { function deployMetaLine(text: string) { return text === "" ? null : ( - {text} + {text} ) } @@ -354,7 +354,7 @@ const DeployCell = React.memo(function DeployCell({ commits }: { commits: Commit return N/A } const stateLine = info.errorsSince ? ( - + {info.firstSeen !== "" ? `${formatRelativeTimeOrDate(info.firstSeen, undefined, effectiveTimezone)} · ` : ""} @@ -369,7 +369,7 @@ const DeployCell = React.memo(function DeployCell({ commits }: { commits: Commit style={{ width: `${info.rollout.percentage}%` }} /> - + {info.rollout.percentage}% · +{info.rollout.others.length} @@ -491,7 +491,7 @@ const ServiceRow = React.memo(function ServiceRow({
    {delta !== undefined && ( -
    {delta.label}
    +
    {delta.label}
    )} @@ -534,7 +534,7 @@ const ServiceRow = React.memo(function ServiceRow({ /> {service.hasSampling && ( - + ~{formatThroughput(service.tracedThroughput, "/s")} traced )} diff --git a/apps/web/src/components/settings/api-keys-section.tsx b/apps/web/src/components/settings/api-keys-section.tsx index 02249eab0c..fc9d66c699 100644 --- a/apps/web/src/components/settings/api-keys-section.tsx +++ b/apps/web/src/components/settings/api-keys-section.tsx @@ -216,7 +216,7 @@ export function ApiKeysSection() { }))} /> {buckets.active.length > 0 && ( - + {standardCount} standard · {mcpCount} mcp @@ -507,10 +507,10 @@ function ApiReference() {
    - + {family.id}:read - + {family.id}:write
    @@ -615,7 +615,7 @@ function ApiKeyRow({ )}
    - + {createdMeta}
    @@ -623,7 +623,7 @@ function ApiKeyRow({ {apiKey.key_prefix} @@ -632,14 +632,14 @@ function ApiKeyRow({
    - + {apiKey.last_used_at ? : "—"} @@ -676,17 +676,17 @@ function ApiKeyRow({ function ScopesCell({ apiKey }: { apiKey: ApiKey }) { if (apiKey.kind === "mcp") { - return MCP tools + return MCP tools } if (apiKey.scopes === null) { - return Full access + return Full access } const compact = apiKey.scopes.map((scope) => scope.replace(/:write$/, ":w").replace(/:read$/, ":r")) const shown = compact.slice(0, 2).join(" · ") const extra = compact.length - 2 return ( {shown} diff --git a/apps/web/src/components/settings/audit-log-section.tsx b/apps/web/src/components/settings/audit-log-section.tsx index 8cb1e831ed..dd78e0a06c 100644 --- a/apps/web/src/components/settings/audit-log-section.tsx +++ b/apps/web/src/components/settings/audit-log-section.tsx @@ -391,7 +391,7 @@ function ActorCell({ entry }: { entry: V2AuditLogEntry }) { minting user's id too, and wearing it would credit a human for something they may not have done. */} {entry.actor_type === "user" ? ( - + {entry.actor_avatar_url !== null && } {initialsOf(entry.actor_name ?? entry.actor_id ?? "")} @@ -462,12 +462,12 @@ function AuditLogRow({ entry }: { entry: V2AuditLogEntry }) { )}
    {denied && entry.denial_reason !== null && ( - + {entry.denial_reason} )} {entry.changes !== null && entry.changes.fields.length > 0 && ( -

    +

    {entry.changes.fields.join(", ")}

    )} @@ -505,7 +505,7 @@ function ResourceCell({ entry }: { entry: V2AuditLogEntry }) { )} {id !== null && ( - + {id} )} @@ -517,7 +517,7 @@ function ResourceCell({ entry }: { entry: V2AuditLogEntry }) { function Identifier({ value, label }: { value: string; label: string }) { return ( - + {value} @@ -573,11 +573,11 @@ function MetadataList({ metadata }: { metadata: Record }) { return ( {block !== null ? ( -
    +							
     								{block}
     							
    ) : ( - + )} @@ -626,7 +626,7 @@ function AuditLogDetail({ entry }: { entry: V2AuditLogEntry }) { - + {entry.action} {entry.outcome === "denied" ? ( diff --git a/apps/web/src/components/settings/billing-controls-card.tsx b/apps/web/src/components/settings/billing-controls-card.tsx index 40c43a472c..2acb77107d 100644 --- a/apps/web/src/components/settings/billing-controls-card.tsx +++ b/apps/web/src/components/settings/billing-controls-card.tsx @@ -85,7 +85,7 @@ export function BillingControlsCard({ ? "Paid overage uncapped" : `${formatFeatureUsage(featureId, limit)} paid overage`}

    -

    +

    {stopAt === null ? "No enforced stop this cycle" : `Stops at ${formatFeatureUsage(featureId, stopAt)} total usage`} diff --git a/apps/web/src/components/settings/billing-details-dialog.tsx b/apps/web/src/components/settings/billing-details-dialog.tsx index 2be7e1dd61..e8947eabf1 100644 --- a/apps/web/src/components/settings/billing-details-dialog.tsx +++ b/apps/web/src/components/settings/billing-details-dialog.tsx @@ -175,7 +175,7 @@ export function BillingDetailsDialog({

    -

    +

    Stored on your Stripe customer and printed on every invoice from the next one on. Add your VAT or tax ID separately below the details.

    diff --git a/apps/web/src/components/settings/billing-details-section.tsx b/apps/web/src/components/settings/billing-details-section.tsx index ed49436f67..7a37d6b58e 100644 --- a/apps/web/src/components/settings/billing-details-section.tsx +++ b/apps/web/src/components/settings/billing-details-section.tsx @@ -273,7 +273,7 @@ export function BillingDetailsSection({ canEdit }: { readonly canEdit: boolean } {canEdit && (
    -

    +

    EU, UK and Australian numbers are checked against the official registry; the ID is printed on invoices either way.

    diff --git a/apps/web/src/components/settings/cost-breakdown.tsx b/apps/web/src/components/settings/cost-breakdown.tsx index 4b934f7041..c09d7be9fe 100644 --- a/apps/web/src/components/settings/cost-breakdown.tsx +++ b/apps/web/src/components/settings/cost-breakdown.tsx @@ -35,7 +35,7 @@ export function CostBreakdown({ estimate }: { estimate: CycleCostEstimate }) {

    {line.label}

    {line.detail && ( -

    +

    {line.detail}

    )} @@ -55,7 +55,7 @@ export function CostBreakdown({ estimate }: { estimate: CycleCostEstimate }) {
    -

    +

    So far this cycle · excludes taxes & credits {estimate.partial && " · some items are on legacy pricing we can't itemize — see your invoice for the exact amount"} diff --git a/apps/web/src/components/settings/create-api-key-dialog.tsx b/apps/web/src/components/settings/create-api-key-dialog.tsx index b11826565d..6ac3cef30a 100644 --- a/apps/web/src/components/settings/create-api-key-dialog.tsx +++ b/apps/web/src/components/settings/create-api-key-dialog.tsx @@ -184,7 +184,7 @@ export function CreateApiKeyDialog({ open, onOpenChange, onCreated, kind }: Crea

    {createdKey.name} - + {createdKey.key_prefix}… {createdKey.scopes !== null && diff --git a/apps/web/src/components/settings/escalation-policy-section.tsx b/apps/web/src/components/settings/escalation-policy-section.tsx index 0ee66c2ae2..d77cd32cd5 100644 --- a/apps/web/src/components/settings/escalation-policy-section.tsx +++ b/apps/web/src/components/settings/escalation-policy-section.tsx @@ -188,7 +188,7 @@ export function EscalationPolicySection({ isAdmin }: { isAdmin: boolean }) {
    - + Min. AI confidence

    diff --git a/apps/web/src/components/time-range-picker/timezone-select.tsx b/apps/web/src/components/time-range-picker/timezone-select.tsx index 31ffa8c5c7..7373dd0988 100644 --- a/apps/web/src/components/time-range-picker/timezone-select.tsx +++ b/apps/web/src/components/time-range-picker/timezone-select.tsx @@ -171,7 +171,7 @@ export function TimezoneSelect() { aria-label="Timezone" className={cn( "-mr-1.5 inline-flex h-6 min-w-0 cursor-pointer items-center gap-2 rounded-md px-1.5", - "text-[11px] tracking-tight outline-none transition-colors", + "text-2xs tracking-tight outline-none transition-colors", "hover:bg-muted/60 focus-visible:ring-[3px] focus-visible:ring-ring/24 data-popup-open:bg-muted/60", )} > @@ -181,7 +181,7 @@ export function TimezoneSelect() { {formatUtcOffset(effectiveTimezone)} {selectedTimezone === null && ( - + System )} @@ -245,10 +245,10 @@ export function TimezoneSelect() { )} - + {formatClock(zone, now)} - + {formatUtcOffset(zone, now)} diff --git a/apps/web/src/components/traces/span-detail-panel.tsx b/apps/web/src/components/traces/span-detail-panel.tsx index 6cf371eed0..27a1d60393 100644 --- a/apps/web/src/components/traces/span-detail-panel.tsx +++ b/apps/web/src/components/traces/span-detail-panel.tsx @@ -93,7 +93,7 @@ function SpanPositionBar({ style={{ left: `${offsetPct}%`, width: `${widthPct}%`, backgroundColor: color }} />

    -
    +
    +{formatDuration(Math.max(offsetMs, 0))} {formatDuration(totalDurationMs)} total
    @@ -110,7 +110,7 @@ function LogEntry({ log, timeZone, onClick }: { log: Log; timeZone: string; onCl className="block w-full p-2 text-left hover:bg-muted/30 cursor-pointer" onClick={() => onClick?.(log)} > -
    +
    {formatTimestampInTimezone(log.timestamp, { timeZone })}
    @@ -261,11 +261,11 @@ export function SpanDetailPanel({
    - + {span.serviceName} - {kindLabel} + {kindLabel}
    @@ -336,7 +336,7 @@ export function SpanDetailPanel({ )}
    {/* Two columns only once the panel is wide enough for them to hold real values. */} -
    +
    {platform.edge && ( @@ -460,7 +460,7 @@ export function SpanDetailPanel({ )) .onError(() => ( <> -

    +

    Couldn't load all attributes. Showing the ones loaded with the trace.

    diff --git a/apps/web/src/components/traces/trace-anatomy-strip.tsx b/apps/web/src/components/traces/trace-anatomy-strip.tsx index 69ab9215e7..6ed638e483 100644 --- a/apps/web/src/components/traces/trace-anatomy-strip.tsx +++ b/apps/web/src/components/traces/trace-anatomy-strip.tsx @@ -105,7 +105,7 @@ export function TraceAnatomyStrip({ {share.serviceName} - + {share.percent.toFixed(share.percent < 10 ? 1 : 0)}% diff --git a/apps/web/src/components/traces/trace-peek-sheet.tsx b/apps/web/src/components/traces/trace-peek-sheet.tsx index 4cc4795131..65c78d380c 100644 --- a/apps/web/src/components/traces/trace-peek-sheet.tsx +++ b/apps/web/src/components/traces/trace-peek-sheet.tsx @@ -203,7 +203,7 @@ export function TracePeekSheet({ {position ? ( - + {position.index + 1} of {position.count} ) : null} diff --git a/apps/web/src/components/traces/traces-table.tsx b/apps/web/src/components/traces/traces-table.tsx index 868acfa7cb..50d06f8fff 100644 --- a/apps/web/src/components/traces/traces-table.tsx +++ b/apps/web/src/components/traces/traces-table.tsx @@ -307,7 +307,7 @@ function TracesTableView({ * glance); the full timestamp stays available on the tooltip. */} 0 ? ( diff --git a/apps/web/src/components/vcs/commit-sha-hover-card.tsx b/apps/web/src/components/vcs/commit-sha-hover-card.tsx index c31ec98478..4e887c241f 100644 --- a/apps/web/src/components/vcs/commit-sha-hover-card.tsx +++ b/apps/web/src/components/vcs/commit-sha-hover-card.tsx @@ -332,10 +332,10 @@ function CommitListRow({ sha }: { sha: string }) {
    - + {shortId(sha, "generic", { length: 18, ellipsis: true })} - Deployment reference + Deployment reference
    ) @@ -371,7 +371,7 @@ function CommitListRowLink({ commit }: { commit: VcsCommitDetailResponse }) { > {title}
    - + {author}
    - {shortId(sha)} - {note} + {shortId(sha)} + {note}
    ) @@ -457,7 +457,7 @@ function CopyableSha({ sha }: { sha: string }) { type="button" onClick={() => void copy(sha)} aria-label="Copy commit SHA" - className="group inline-flex items-center gap-1.5 rounded bg-muted px-1.5 py-0.5 font-mono text-[11px] text-foreground/80 transition-colors hover:bg-muted/70" + className="group inline-flex items-center gap-1.5 rounded bg-muted px-1.5 py-0.5 font-mono text-2xs text-foreground/80 transition-colors hover:bg-muted/70" > {shortId(sha, "sha")} {name.slice(0, 2)} diff --git a/apps/web/src/lab/agent-tools-lab.tsx b/apps/web/src/lab/agent-tools-lab.tsx index 747c26bb81..a9be99312e 100644 --- a/apps/web/src/lab/agent-tools-lab.tsx +++ b/apps/web/src/lab/agent-tools-lab.tsx @@ -161,7 +161,7 @@ export function AgentToolsLab() { ) : null} - + {JSON.stringify(search)}
    diff --git a/apps/web/src/lab/charts/heatmap-spike.tsx b/apps/web/src/lab/charts/heatmap-spike.tsx index 813dba5fce..7ded2a7ed5 100644 --- a/apps/web/src/lab/charts/heatmap-spike.tsx +++ b/apps/web/src/lab/charts/heatmap-spike.tsx @@ -437,7 +437,7 @@ export const HeatmapSpike = memo(function HeatmapSpike({ /> ))}
    - No data + No data
    ) @@ -451,7 +451,7 @@ export const HeatmapSpike = memo(function HeatmapSpike({ definition={definition} footer={ model.prunedColumns > 0 || model.prunedRows > 0 ? ( -

    +

    {[ model.prunedColumns > 0 ? pluralize(model.prunedColumns, "empty column") : null, model.prunedRows > 0 ? pluralize(model.prunedRows, "empty row") : null, @@ -491,7 +491,7 @@ export const HeatmapSpike = memo(function HeatmapSpike({ return (

    {label} diff --git a/apps/web/src/lab/charts/histogram-spike.tsx b/apps/web/src/lab/charts/histogram-spike.tsx index 4a2b21258a..416038f12a 100644 --- a/apps/web/src/lab/charts/histogram-spike.tsx +++ b/apps/web/src/lab/charts/histogram-spike.tsx @@ -192,7 +192,7 @@ export const HistogramSpike = memo(function HistogramSpike({ return (
    - No data + No data
    ) @@ -217,7 +217,7 @@ export const HistogramSpike = memo(function HistogramSpike({
    diff --git a/apps/web/src/lab/charts/pie-spike.tsx b/apps/web/src/lab/charts/pie-spike.tsx index dacd91a1b6..1e436c1bdb 100644 --- a/apps/web/src/lab/charts/pie-spike.tsx +++ b/apps/web/src/lab/charts/pie-spike.tsx @@ -226,7 +226,7 @@ function PieFigure({ return (
    {slice.name} diff --git a/apps/web/src/lab/charts/sankey-spike.tsx b/apps/web/src/lab/charts/sankey-spike.tsx index a075b4bc86..33b30ecc22 100644 --- a/apps/web/src/lab/charts/sankey-spike.tsx +++ b/apps/web/src/lab/charts/sankey-spike.tsx @@ -363,7 +363,7 @@ function SankeyFigure({ return (
    {datum.data.service} @@ -380,7 +380,7 @@ function SankeyFigure({
    diff --git a/apps/web/src/lab/charts/stacked-bar-spike.tsx b/apps/web/src/lab/charts/stacked-bar-spike.tsx index 81676b90d4..c1f062048a 100644 --- a/apps/web/src/lab/charts/stacked-bar-spike.tsx +++ b/apps/web/src/lab/charts/stacked-bar-spike.tsx @@ -256,8 +256,8 @@ function StackedBarFigure({ {datum.service} diff --git a/apps/web/src/lab/charts/trace-scatter-spike.tsx b/apps/web/src/lab/charts/trace-scatter-spike.tsx index 14521909c6..fa91112376 100644 --- a/apps/web/src/lab/charts/trace-scatter-spike.tsx +++ b/apps/web/src/lab/charts/trace-scatter-spike.tsx @@ -279,7 +279,7 @@ export const TraceScatterSpike = memo(function TraceScatterSpike({
    diff --git a/apps/web/src/lab/charts/treemap-spike.tsx b/apps/web/src/lab/charts/treemap-spike.tsx index 538fea82cd..9a8775c824 100644 --- a/apps/web/src/lab/charts/treemap-spike.tsx +++ b/apps/web/src/lab/charts/treemap-spike.tsx @@ -278,7 +278,7 @@ function TreemapFigure({
    {service} diff --git a/apps/web/src/lab/lab-index.tsx b/apps/web/src/lab/lab-index.tsx index f77356ada4..91b258bbca 100644 --- a/apps/web/src/lab/lab-index.tsx +++ b/apps/web/src/lab/lab-index.tsx @@ -56,7 +56,7 @@ export function LabIndex() { {entry.title} - + {entry.path} @@ -64,7 +64,7 @@ export function LabIndex() { {entry.description} {entry.session === "required" && ( - + Session required )} diff --git a/apps/web/src/lab/query-builder-lab.tsx b/apps/web/src/lab/query-builder-lab.tsx index 5951dd4b38..e361fb543b 100644 --- a/apps/web/src/lab/query-builder-lab.tsx +++ b/apps/web/src/lab/query-builder-lab.tsx @@ -239,9 +239,9 @@ function QueryBuilderAtomResults({ input }: { input: QueryBuilderTimeseriesInput Combined result error - query_engine + query_engine
    -

    {displayError(error).message}

    +

    {displayError(error).message}

    )) .onSuccess((response) => { @@ -258,8 +258,8 @@ function QueryBuilderAtomResults({ input }: { input: QueryBuilderTimeseriesInput Combined result success - query_engine - + query_engine + {data.length} buckets
    @@ -267,7 +267,7 @@ function QueryBuilderAtomResults({ input }: { input: QueryBuilderTimeseriesInput {warnings.length > 0 && (
    {warnings.map((warning) => ( -

    +

    - {warning}

    ))} @@ -287,13 +287,13 @@ function QueryBuilderAtomResults({ input }: { input: QueryBuilderTimeseriesInput {data.slice(0, 12).map((point) => ( - + {point.bucket} {seriesKeys.map((key) => ( {point.series[key] ?? 0} @@ -495,13 +495,13 @@ function QueryBuilderLabInner({ startTime, endTime }: QueryBuilderLabProps) {
    - + {startTime} {" -> "} {endTime} {lastRunAt && ( - last run: {lastRunAt} + last run: {lastRunAt} )}
    -

    {noQueriesError}

    +

    {noQueriesError}

    ) : submittedInput ? ( @@ -552,7 +552,7 @@ function QueryBuilderLabInner({ startTime, endTime }: QueryBuilderLabProps) {
    {query.name} @@ -607,7 +607,7 @@ function QueryBuilderLabInner({ startTime, endTime }: QueryBuilderLabProps) { /> @@ -760,7 +760,7 @@ function QueryBuilderLabInner({ startTime, endTime }: QueryBuilderLabProps) { ) if (!hasSlowHints(hints)) return null return ( -

    +

    {slowHintsSummary(hints)}

    ) @@ -980,7 +980,7 @@ function QueryBuilderLabInner({ startTime, endTime }: QueryBuilderLabProps) {
    {formula.name} @@ -1042,7 +1042,7 @@ function QueryBuilderLabInner({ startTime, endTime }: QueryBuilderLabProps) { UI State Preview -
    +						
     							{JSON.stringify(
     								{
     									startTime,
    diff --git a/apps/web/src/lab/service-map-3d/index.tsx b/apps/web/src/lab/service-map-3d/index.tsx
    index e439e09d4d..f6fc2b7426 100644
    --- a/apps/web/src/lab/service-map-3d/index.tsx
    +++ b/apps/web/src/lab/service-map-3d/index.tsx
    @@ -135,7 +135,7 @@ function ServiceInventory({
     						
     					)
     				})}
    -				

    +

    Select a connected service to follow the request path.

    @@ -150,7 +150,7 @@ function ServiceInventory({

    Services & dependencies

    {topology.nodes.length}
    -

    Select a node to inspect its calls.

    +

    Select a node to inspect its calls.

    -
    +
    Sorted by error rate {degraded} degraded
    @@ -178,17 +178,17 @@ function ServiceInventory({ {node.label} - + {node.kind === "service" ? node.namespace : node.kind} - + {formatErrorRate(node.errorRate)} ))}
    -

    +

    Sample health thresholds
    Elevated > 1% · Degraded > 5% errors @@ -213,7 +213,7 @@ export function ServiceMap3DLab() {

    Service map

    - + Voxel lab
    @@ -221,7 +221,7 @@ export function ServiceMap3DLab() { A voxel landscape of services and their connections.

    -
    +
    Sample topology diff --git a/apps/web/src/lab/widget-lab/widget-lab.tsx b/apps/web/src/lab/widget-lab/widget-lab.tsx index ed047a7dc1..58ebedc78c 100644 --- a/apps/web/src/lab/widget-lab/widget-lab.tsx +++ b/apps/web/src/lab/widget-lab/widget-lab.tsx @@ -202,7 +202,7 @@ function CopyScenarios() { // for a glyph. It toasts, and tints the row it copied. label: "CopyableValue (inline)", node: ( - + 7f3c9a21b4e8 diff --git a/apps/web/src/routes/alerts/$ruleId.tsx b/apps/web/src/routes/alerts/$ruleId.tsx index 9609ce5013..e6b3a2de14 100644 --- a/apps/web/src/routes/alerts/$ruleId.tsx +++ b/apps/web/src/routes/alerts/$ruleId.tsx @@ -1458,7 +1458,7 @@ function ChecksPanel({ {skipped} evaluation{skipped === 1 ? "" : "s"} hidden by the status filter @@ -1561,7 +1561,7 @@ function ChecksPanel({ reintroduce the coverage mismatch this redesign removes. */} {bucket == null && nextCursor !== null && (
    - + {loadedChecks.length} of {totals.total} loaded diff --git a/apps/web/src/routes/analytics/index.tsx b/apps/web/src/routes/analytics/index.tsx index ff51946ef2..96cdf183cb 100644 --- a/apps/web/src/routes/analytics/index.tsx +++ b/apps/web/src/routes/analytics/index.tsx @@ -248,7 +248,7 @@ function WebAnalyticsPage() { diff --git a/apps/web/src/routes/dashboards/index.tsx b/apps/web/src/routes/dashboards/index.tsx index 5f10fcdaef..6b0d5d4911 100644 --- a/apps/web/src/routes/dashboards/index.tsx +++ b/apps/web/src/routes/dashboards/index.tsx @@ -268,7 +268,7 @@ function PageShell({ +
    {summary}
    ) : undefined diff --git a/apps/web/src/routes/infra/cloudflare/index.tsx b/apps/web/src/routes/infra/cloudflare/index.tsx index 774441f52f..295646e5d9 100644 --- a/apps/web/src/routes/infra/cloudflare/index.tsx +++ b/apps/web/src/routes/infra/cloudflare/index.tsx @@ -261,7 +261,7 @@ function CloudflareData({ background: zoneSeries.colors.get(name), }} /> - + {name} @@ -273,7 +273,7 @@ function CloudflareData({ className="size-1.5 rounded-full" style={{ background: OTHER_ZONES_COLOR }} /> - + Other zones ({zoneSeries.otherCount}) diff --git a/apps/web/src/routes/infra/kubernetes/services/$serviceName.tsx b/apps/web/src/routes/infra/kubernetes/services/$serviceName.tsx index e2a12ee86b..e9be5704ae 100644 --- a/apps/web/src/routes/infra/kubernetes/services/$serviceName.tsx +++ b/apps/web/src/routes/infra/kubernetes/services/$serviceName.tsx @@ -323,7 +323,7 @@ function LensBody({ (Result.isSuccess(cpuResult) && cpuResult.waiting) const workloadMeta = workload ? ( -
    +
    Service signal over infrastructure signal - + one cursor, one time axis
    @@ -408,11 +408,11 @@ function LensBody({

    The pods behind this service

    - + worst first, by peak saturation
    - + {totalPods > pods.length ? `Top ${pods.length} of ${totalPods.toLocaleString()}` : `${totalPods.toLocaleString()} ${totalPods === 1 ? "pod" : "pods"}`} @@ -483,7 +483,7 @@ function PodDistribution({ key={node} to="/infra/kubernetes/nodes/$nodeName" params={{ nodeName: node }} - className="flex items-center gap-2.5 rounded-md border px-2.5 py-1.5 font-mono text-[11px] transition-colors hover:bg-accent/50" + className="flex items-center gap-2.5 rounded-md border px-2.5 py-1.5 font-mono text-2xs transition-colors hover:bg-accent/50" > {node} diff --git a/apps/web/src/routes/infra/kubernetes/workloads/$kind/$workloadName.tsx b/apps/web/src/routes/infra/kubernetes/workloads/$kind/$workloadName.tsx index 6be5d0c34b..e03085b371 100644 --- a/apps/web/src/routes/infra/kubernetes/workloads/$kind/$workloadName.tsx +++ b/apps/web/src/routes/infra/kubernetes/workloads/$kind/$workloadName.tsx @@ -190,7 +190,7 @@ function WorkloadDetailPage() { value={metric} onChange={setMetric} /> - + {events.length} } /> {Result.isInitial(eventsResult) ? ( @@ -617,7 +617,7 @@ function PlanetScaleDatabaseData({ surface="insights" />
    - PlanetScale Query Insights + PlanetScale Query Insights
    navigate({ search: (prev) => ({ ...prev, groups: g }) })} className={cn( - "rounded px-1.5 py-0.5 font-mono text-[11px] transition-colors", + "rounded px-1.5 py-0.5 font-mono text-2xs transition-colors", g === params.groups ? "bg-primary text-primary-foreground" : "text-muted-foreground hover:text-foreground", diff --git a/apps/web/src/routes/releases/$commitSha.tsx b/apps/web/src/routes/releases/$commitSha.tsx index 4d91df2f14..906af01891 100644 --- a/apps/web/src/routes/releases/$commitSha.tsx +++ b/apps/web/src/routes/releases/$commitSha.tsx @@ -467,7 +467,7 @@ function ReleaseBodyLoaded({ - + {series === "version" ? `Only spans that carried ${shortReleaseLabel(commitSha)}` : baselineCommitSha === undefined diff --git a/apps/web/src/routes/releases/index.tsx b/apps/web/src/routes/releases/index.tsx index 2b103bb749..d12316221b 100644 --- a/apps/web/src/routes/releases/index.tsx +++ b/apps/web/src/routes/releases/index.tsx @@ -300,7 +300,7 @@ function ReleasesTableWithIssues({
    {capped ? ( - + Issue counts cover the 100 most recently active issues introduced in this window. ) : null} diff --git a/apps/web/src/routes/select-plan.tsx b/apps/web/src/routes/select-plan.tsx index 4279d634ea..72367e7fe2 100644 --- a/apps/web/src/routes/select-plan.tsx +++ b/apps/web/src/routes/select-plan.tsx @@ -84,7 +84,7 @@ function SelectPlanPageInner() { {TRIAL_DURATION_DAYS}-day free trial diff --git a/packages/ui/src/components/attributes/attributes-table.tsx b/packages/ui/src/components/attributes/attributes-table.tsx index 46d95dd1a7..e10d7d8b0b 100644 --- a/packages/ui/src/components/attributes/attributes-table.tsx +++ b/packages/ui/src/components/attributes/attributes-table.tsx @@ -103,13 +103,13 @@ export function AttributeRow({ value={attrKey} label="attribute key" className={cn( - "text-[11px] leading-relaxed text-muted-foreground break-words", + "text-2xs leading-relaxed text-muted-foreground break-words", !plainKey && "font-mono", )} > {displayKey ?? attrKey} -
    +
    {parsed !== null ? ( ) : override != null ? ( @@ -159,7 +159,7 @@ function AttributeFilterAction({ aria-label={label} title={label} onClick={onClick} - className="rounded-sm px-1 py-0.5 font-sans text-[10px] uppercase tracking-[0.06em] text-muted-foreground transition-colors hover:bg-muted hover:text-foreground" + className="rounded-sm px-1 py-0.5 font-sans text-3xs uppercase tracking-[0.06em] text-muted-foreground transition-colors hover:bg-muted hover:text-foreground" > {children} @@ -224,7 +224,7 @@ export function AttributesTable({ attributes, title, searchQuery, groupByNamespa key={group.namespace} defaultOpen={group.entries.length <= 8 || !!searchQuery} > - + {group.namespace} - + {group.entries.length} @@ -335,7 +335,7 @@ export function AttributesSection({ )} {internalCount > 0 && ( - + {matched.map((group) => (
    -
    +
    {group.label}
    diff --git a/packages/ui/src/components/charts/_shared/chart-skeleton.tsx b/packages/ui/src/components/charts/_shared/chart-skeleton.tsx index 392e1a6300..96aca48575 100644 --- a/packages/ui/src/components/charts/_shared/chart-skeleton.tsx +++ b/packages/ui/src/components/charts/_shared/chart-skeleton.tsx @@ -58,7 +58,7 @@ function Bars({ heights, delay }: { heights: number[]; delay: (i: number) => num {heights.map((h, i) => (
    ))} @@ -120,7 +120,7 @@ function PathsGhost() {
    {PATH_COLUMNS.map((_, i) => ( -
    +
    ))}
    @@ -262,7 +262,7 @@ function renderVariant(variant: ChartSkeletonVariant) { style={{ gridTemplateColumns: "minmax(0, 38%) 1fr 44px" }} >
    @@ -271,7 +271,7 @@ function renderVariant(variant: ChartSkeletonVariant) { style={{ width: `${w}%`, animationDelay: `${-i * 0.13}s` }} />
    -
    +
    ))}
    @@ -284,10 +284,10 @@ function renderVariant(variant: ChartSkeletonVariant) {
    -
    +
    -
    +
    {[100, 44, 20, 8].map((h, i) => { @@ -315,11 +315,11 @@ function renderVariant(variant: ChartSkeletonVariant) {
    -
    +
    {i > 0 && ( diff --git a/packages/ui/src/components/charts/_shared/chart-state.tsx b/packages/ui/src/components/charts/_shared/chart-state.tsx index 66d80a85d2..1eccc1b3a4 100644 --- a/packages/ui/src/components/charts/_shared/chart-state.tsx +++ b/packages/ui/src/components/charts/_shared/chart-state.tsx @@ -13,7 +13,7 @@ import { ChartSkeleton, type ChartSkeletonVariant } from "./chart-skeleton" * Every async chart renders the same three branches, and before this each one * spelled them out by hand. The result was drift in every dimension that is * supposed to be a constant: `rounded-none` vs `rounded-md` vs `rounded-lg` on - * the skeleton, `font-mono text-[11px]` vs `text-xs` on the message, a + * the skeleton, `font-mono text-2xs` vs `text-xs` on the message, a * `border-destructive/40 bg-destructive/5` error box copied verbatim across four * files. None of that is a per-chart decision, so none of it belongs at a call * site. @@ -132,7 +132,7 @@ export function ChartLoading({ } /** Shared type + layout of the two message states, so they cannot drift apart. */ -const MESSAGE_BASE = "flex items-center justify-center px-3 text-center font-mono text-[11px]" +const MESSAGE_BASE = "flex items-center justify-center px-3 text-center font-mono text-2xs" /** * A chart with nothing to draw — "no data in this window", "not collected yet". @@ -167,7 +167,7 @@ export function ChartEmpty({
    {children} - {hint != null && {hint}} + {hint != null && {hint}}
    ) diff --git a/packages/ui/src/components/charts/_shared/query-builder-legend.tsx b/packages/ui/src/components/charts/_shared/query-builder-legend.tsx index b64b04dc0e..85e78c0d20 100644 --- a/packages/ui/src/components/charts/_shared/query-builder-legend.tsx +++ b/packages/ui/src/components/charts/_shared/query-builder-legend.tsx @@ -147,7 +147,7 @@ function CompactStrip({ layout, maxHeight }: { layout: "bottom" | "right"; maxHe )} > {entry.label} @@ -208,7 +208,7 @@ function StatsTable({ diff --git a/packages/ui/src/components/charts/funnel/funnel-dropoff-chart.tsx b/packages/ui/src/components/charts/funnel/funnel-dropoff-chart.tsx index dfc8d41517..ecf174f1ad 100644 --- a/packages/ui/src/components/charts/funnel/funnel-dropoff-chart.tsx +++ b/packages/ui/src/components/charts/funnel/funnel-dropoff-chart.tsx @@ -194,7 +194,7 @@ export function FunnelDropoffChart({ data, className, unit, showStepPercent }: Q if (steps.length === 0 || (steps[0]?.value ?? 0) <= 0) { return (
    - No data + No data
    ) } @@ -222,7 +222,7 @@ export function FunnelDropoffChart({ data, className, unit, showStepPercent }: Q onPointerLeave={() => setHover(null)} data-slot="funnel-dropoff" > -
    +
    {isGrouped ? (
    {legend.map((entry) => ( @@ -232,7 +232,7 @@ export function FunnelDropoffChart({ data, className, unit, showStepPercent }: Q title={entry.name} > {entry.name} @@ -250,7 +250,7 @@ export function FunnelDropoffChart({ data, className, unit, showStepPercent }: Q {showPercent ? "Conversion rate" : "Converted"} - + {showPercent ? fmtPct(last.ofFirst) : `${fmtValue(last.value, unit)} of ${fmtValue(first.value, unit)}`} @@ -282,7 +282,7 @@ export function FunnelDropoffChart({ data, className, unit, showStepPercent }: Q
    {showPercent ? fmtPct(step.ofFirst) : fmtValue(step.value, unit)} - + {showPercent ? fmtValue(step.value, unit) : index === 0 @@ -363,7 +363,7 @@ export function FunnelDropoffChart({ data, className, unit, showStepPercent }: Q )} {prev && showPercent && step.ofPrev !== null && ( @@ -396,13 +396,13 @@ export function FunnelDropoffChart({ data, className, unit, showStepPercent }: Q })}
    {hidden > 0 && ( -
    +
    +{hidden} more
    )} {hovered && hoveredPrev && !isGrouped && (
    @@ -445,7 +445,7 @@ export function FunnelDropoffChart({ data, className, unit, showStepPercent }: Q {hovered.leavers.length > 0 && hovered.dropped > 0 && ( <>
    -
    +
    Dropped here went to
    @@ -504,7 +504,7 @@ function Row({ {value} - {share !== undefined && {share}} + {share !== undefined && {share}}
    ) diff --git a/packages/ui/src/components/charts/funnel/query-builder-funnel-chart.tsx b/packages/ui/src/components/charts/funnel/query-builder-funnel-chart.tsx index 525e554f84..bb133f84a9 100644 --- a/packages/ui/src/components/charts/funnel/query-builder-funnel-chart.tsx +++ b/packages/ui/src/components/charts/funnel/query-builder-funnel-chart.tsx @@ -228,7 +228,7 @@ function FunnelBarsChart({ data, className, unit, showStepPercent }: QueryBuilde if (stages.length === 0) { return (
    - No data + No data
    ) } @@ -249,7 +249,7 @@ function FunnelBarsChart({ data, className, unit, showStepPercent }: QueryBuilde > {isGrouped && (
    @@ -266,7 +266,7 @@ function FunnelBarsChart({ data, className, unit, showStepPercent }: QueryBuilde title={entry.name} > {entry.name} @@ -287,7 +287,7 @@ function FunnelBarsChart({ data, className, unit, showStepPercent }: QueryBuilde onPointerEnter={() => setHover(i)} > {/* Label row */} -
    +
    @@ -343,13 +343,13 @@ function FunnelBarsChart({ data, className, unit, showStepPercent }: QueryBuilde {stage.groups.map((group) => (
    setHoverGroup(group.name)} onPointerLeave={() => setHoverGroup(null)} title={`${group.name} · ${fmtValue(group.value, unit)}`} >
    0 && ( -
    +
    +{hiddenCount} more
    )} diff --git a/packages/ui/src/components/charts/hbar/query-builder-hbar-chart.tsx b/packages/ui/src/components/charts/hbar/query-builder-hbar-chart.tsx index 565ad3140d..2dbb9fbd0c 100644 --- a/packages/ui/src/components/charts/hbar/query-builder-hbar-chart.tsx +++ b/packages/ui/src/components/charts/hbar/query-builder-hbar-chart.tsx @@ -108,7 +108,7 @@ export function QueryBuilderHbarChart({ data, className, unit }: QueryBuilderHba if (bars.length === 0) { return (
    - No data + No data
    ) } @@ -139,7 +139,7 @@ export function QueryBuilderHbarChart({ data, className, unit }: QueryBuilderHba // Label / track / value: the value column is sized by its content // and right-aligned, so the numbers line up down the panel however // long the category names are. - className="grid min-h-0 shrink-0 items-center gap-2 text-[11px] leading-none" + className="grid min-h-0 shrink-0 items-center gap-2 text-2xs leading-none" style={{ gridTemplateColumns: "minmax(0, 38%) 1fr max-content", height: rowH, @@ -180,7 +180,7 @@ export function QueryBuilderHbarChart({ data, className, unit }: QueryBuilderHba
    {hiddenCount > 0 && (
    diff --git a/packages/ui/src/components/charts/heatmap/query-builder-heatmap-chart.tsx b/packages/ui/src/components/charts/heatmap/query-builder-heatmap-chart.tsx index 9e653c04d3..e1aa5a222b 100644 --- a/packages/ui/src/components/charts/heatmap/query-builder-heatmap-chart.tsx +++ b/packages/ui/src/components/charts/heatmap/query-builder-heatmap-chart.tsx @@ -641,7 +641,7 @@ function HeatmapLegend({ {Array.from({ length: LEGEND_STEPS }).map((_, index) => (
    ))}
    -
    No data
    +
    No data
    @@ -996,7 +996,7 @@ export function QueryBuilderHeatmapChart({ footer={ footnote ? (

    diff --git a/packages/ui/src/components/charts/histogram/query-builder-histogram-chart.tsx b/packages/ui/src/components/charts/histogram/query-builder-histogram-chart.tsx index 986ddc51b5..2095ed1c0e 100644 --- a/packages/ui/src/components/charts/histogram/query-builder-histogram-chart.tsx +++ b/packages/ui/src/components/charts/histogram/query-builder-histogram-chart.tsx @@ -212,7 +212,7 @@ function CountTooltipBody({ heading, count, color }: { heading: string; count: n {heading}

    - +
    Count @@ -517,7 +517,7 @@ export function QueryBuilderHistogramChart({ return (
    - No data + No data
    ) } diff --git a/packages/ui/src/components/charts/paths/paths-chart.tsx b/packages/ui/src/components/charts/paths/paths-chart.tsx index 16a4dce2ac..ad7a3a7420 100644 --- a/packages/ui/src/components/charts/paths/paths-chart.tsx +++ b/packages/ui/src/components/charts/paths/paths-chart.tsx @@ -205,7 +205,7 @@ export function PathsChart({ data, className, direction = "after" }: PathsChartP if (!anchor || anchor.count <= 0) { return (
    - No data + No data
    ) } @@ -251,7 +251,7 @@ export function PathsChart({ data, className, direction = "after" }: PathsChartP x={atRightEdge ? x + NODE_W : x} y={10} textAnchor={atRightEdge ? "end" : "start"} - className="fill-muted-foreground text-[10px] font-medium uppercase tracking-wider" + className="fill-muted-foreground text-3xs font-medium uppercase tracking-wider" > {label} @@ -345,7 +345,7 @@ export function PathsChart({ data, className, direction = "after" }: PathsChartP y={node.y + Math.min(node.h, 12) / 2 + 3.5} textAnchor={labelLeft ? "start" : "end"} className={cn( - "text-[11px] font-medium", + "text-2xs font-medium", node.kind === "event" ? "fill-foreground" : "fill-muted-foreground", @@ -359,7 +359,7 @@ export function PathsChart({ data, className, direction = "after" }: PathsChartP {formatNumber(node.count)} @@ -374,7 +374,7 @@ export function PathsChart({ data, className, direction = "after" }: PathsChartP )} {hoveredNode && graph && (
    {labelOf(hoveredNode)} - + {hoveredNode.column === 0 ? "anchor" : reverse @@ -415,7 +415,7 @@ export function PathsChart({ data, className, direction = "after" }: PathsChartP {hoveredNode.count.toLocaleString("en-US")} - + {((hoveredNode.count / anchor.count) * 100).toFixed( hoveredNode.count / anchor.count < 0.1 ? 1 : 0, )} @@ -426,7 +426,7 @@ export function PathsChart({ data, className, direction = "after" }: PathsChartP {hoveredNode.column > 0 && ( <>
    -
    +
    Came from
    {links diff --git a/packages/ui/src/components/charts/pie/query-builder-pie-chart.tsx b/packages/ui/src/components/charts/pie/query-builder-pie-chart.tsx index 5dae804a44..2bdc62ce90 100644 --- a/packages/ui/src/components/charts/pie/query-builder-pie-chart.tsx +++ b/packages/ui/src/components/charts/pie/query-builder-pie-chart.tsx @@ -585,7 +585,7 @@ export function QueryBuilderPieChart({ ref={containerRef} className={cn("relative grid h-full w-full place-items-center", className)} > - No data + No data
    ) } @@ -668,10 +668,10 @@ export function QueryBuilderPieChart({ const slice = points[0]?.datum if (!slice) return null return ( -
    +
    {slice.name} diff --git a/packages/ui/src/components/detail-rail.tsx b/packages/ui/src/components/detail-rail.tsx index e68b587d2b..2cadcb1490 100644 --- a/packages/ui/src/components/detail-rail.tsx +++ b/packages/ui/src/components/detail-rail.tsx @@ -35,7 +35,7 @@ function Group({ className, )} > -

    +

    {label}

    {children}
    @@ -85,7 +85,7 @@ function Row({ {label} {hint ? ( - {hint} + {hint} ) : null}
    @@ -115,7 +115,7 @@ function Field({
    {label} - {hint ? {hint} : null} + {hint ? {hint} : null}
    {children}
    @@ -144,7 +144,7 @@ function MetaRow({ }) { if (!value) return null const valueNode = ( - + {value} ) @@ -153,8 +153,8 @@ function MetaRow({ data-slot="detail-rail-meta-row" className="group flex items-baseline justify-between gap-3 border-b border-border/60 py-1.5 last:border-0" > - {label} -
    + {label} +
    {tooltip ? ( } className="cursor-default"> diff --git a/packages/ui/src/components/error-section.tsx b/packages/ui/src/components/error-section.tsx index ba9bc9c298..14ee87fe1c 100644 --- a/packages/ui/src/components/error-section.tsx +++ b/packages/ui/src/components/error-section.tsx @@ -96,19 +96,19 @@ export function ErrorSection({ message, title = "Error", badge, prompt, classNam
    - + {title} {badge && ( - + {badge} )} {body.format === "json" && ( @@ -139,7 +139,7 @@ export function ErrorSection({ message, title = "Error", badge, prompt, classNam data-copy-status={status} onClick={() => void copy(body.full)} className={cn( - "mt-1.5 block w-full cursor-copy rounded text-left font-mono text-[11px] text-foreground/90 leading-relaxed", + "mt-1.5 block w-full cursor-copy rounded text-left font-mono text-2xs text-foreground/90 leading-relaxed", "transition-colors duration-150 hover:text-foreground motion-reduce:transition-none", "data-[copy-status=copied]:text-severity-info", )} @@ -172,7 +172,7 @@ export function ErrorSection({ message, title = "Error", badge, prompt, classNam type="button" aria-expanded={expanded} onClick={() => setExpanded((open) => !open)} - className="mt-1 rounded text-[11px] text-destructive/70 hover:text-destructive" + className="mt-1 rounded text-2xs text-destructive/70 hover:text-destructive" > {expanded ? "Show less" : "Show more"} diff --git a/packages/ui/src/components/filters/filter-section.tsx b/packages/ui/src/components/filters/filter-section.tsx index bc1b4f9ba5..687c90fcec 100644 --- a/packages/ui/src/components/filters/filter-section.tsx +++ b/packages/ui/src/components/filters/filter-section.tsx @@ -261,14 +261,14 @@ function FilterSectionBase({ {!isOpen && selected.length > 0 && ( - + {selected.length} )} {/* Its own badge, not folded into the count above: a collapsed section hiding an exclusion is exactly the state that reads as "my data is missing". */} {!isOpen && excluded.length > 0 && ( - + −{excluded.length} )} @@ -524,7 +524,7 @@ function FilterRowAction({ onClick, label, pressed, children }: FilterRowActionP aria-pressed={pressed} onClick={onClick} className={cn( - "rounded-sm px-1 py-0.5 text-[10px] uppercase tracking-[0.06em] transition-colors", + "rounded-sm px-1 py-0.5 text-3xs uppercase tracking-[0.06em] transition-colors", pressed ? "bg-destructive/12 text-destructive hover:bg-destructive/20" : "text-muted-foreground hover:bg-muted hover:text-foreground", diff --git a/packages/ui/src/components/filters/filter-styles.ts b/packages/ui/src/components/filters/filter-styles.ts index 2b7af2ec98..a12becfd5b 100644 --- a/packages/ui/src/components/filters/filter-styles.ts +++ b/packages/ui/src/components/filters/filter-styles.ts @@ -1,2 +1,2 @@ /** The one uppercase micro-label recipe every filter section header uses. */ -export const FILTER_SECTION_LABEL = "text-[11px] font-medium uppercase tracking-[0.1em]" +export const FILTER_SECTION_LABEL = "text-2xs font-medium uppercase tracking-[0.1em]" diff --git a/packages/ui/src/components/filters/range-filter-section.tsx b/packages/ui/src/components/filters/range-filter-section.tsx index ce3e5efc91..2c20ed48a2 100644 --- a/packages/ui/src/components/filters/range-filter-section.tsx +++ b/packages/ui/src/components/filters/range-filter-section.tsx @@ -171,7 +171,7 @@ export function RangeFilterSection({ {title} {!isOpen && hasActiveRange && ( - + {formatRange(minValue, maxValue, unit)} applyPreset(preset)} aria-pressed={isActive} className={cn( - "rounded-full border px-2 py-0.5 text-[11px] transition-colors", + "rounded-full border px-2 py-0.5 text-2xs transition-colors", isActive ? "border-primary/30 bg-primary/10 text-foreground" : "border-border/60 text-muted-foreground hover:border-border hover:bg-muted hover:text-foreground", @@ -288,7 +288,7 @@ export function RangeFilterSection({ @@ -409,7 +409,7 @@ function RangeHistogram({
    {/* Fixed-height readout instead of a floating tooltip — a popover would clip inside a sidebar this narrow, and the total is worth showing anyway. */} -
    +
    {hovered ? ( <> {describe(hovered)} @@ -457,7 +457,7 @@ function RangeHistogram({ ) })}
    -
    +
    {formatValue(first.from, unit)} {formatValue((buckets[Math.floor(buckets.length / 2)] ?? first).from, unit)} diff --git a/packages/ui/src/components/http-status-code.tsx b/packages/ui/src/components/http-status-code.tsx index c359a34f2a..57109484b1 100644 --- a/packages/ui/src/components/http-status-code.tsx +++ b/packages/ui/src/components/http-status-code.tsx @@ -19,7 +19,7 @@ export function HttpStatusCode({ className={cn( "font-mono tabular-nums", variant === "badge" - ? cn("rounded-sm px-1 py-px text-[10px]", TONE_SOFT[tone]) + ? cn("rounded-sm px-1 py-px text-3xs", TONE_SOFT[tone]) : tone === "neutral" ? "text-muted-foreground" : TONE_TEXT[tone], diff --git a/packages/ui/src/components/logs/log-attribute-chip.tsx b/packages/ui/src/components/logs/log-attribute-chip.tsx index 1d1ff15c0b..67d6655e53 100644 --- a/packages/ui/src/components/logs/log-attribute-chip.tsx +++ b/packages/ui/src/components/logs/log-attribute-chip.tsx @@ -150,7 +150,7 @@ export function LogAttributeChip({ attrKey, value, tone }: LogAttributeChipProps } }} className={cn( - "inline-flex items-center gap-1 h-[18px] px-1.5 rounded border text-[10px] font-mono leading-none whitespace-nowrap shrink-0 cursor-pointer transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring", + "inline-flex items-center gap-1 h-[18px] px-1.5 rounded border text-3xs font-mono leading-none whitespace-nowrap shrink-0 cursor-pointer transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring", TONE_CLASSES[tone], )} > @@ -168,7 +168,7 @@ export function LogAttributeChip({ attrKey, value, tone }: LogAttributeChipProps onPointerLeave={scheduleClose} >
    -
    +
    Attribute
    @@ -176,7 +176,7 @@ export function LogAttributeChip({ attrKey, value, tone }: LogAttributeChipProps
    -
    +
    Value
    diff --git a/packages/ui/src/components/logs/severity-badge.tsx b/packages/ui/src/components/logs/severity-badge.tsx index 63dfff8e6e..53ae18fe34 100644 --- a/packages/ui/src/components/logs/severity-badge.tsx +++ b/packages/ui/src/components/logs/severity-badge.tsx @@ -13,7 +13,7 @@ export function SeverityBadge({ severity, className }: SeverityBadgeProps) { return ( ) diff --git a/packages/ui/src/components/plot/plot-tooltip.tsx b/packages/ui/src/components/plot/plot-tooltip.tsx index 40c6e29187..7f576a2951 100644 --- a/packages/ui/src/components/plot/plot-tooltip.tsx +++ b/packages/ui/src/components/plot/plot-tooltip.tsx @@ -271,8 +271,8 @@ export function PlotTooltipBody({ setOpen(!open)} - className="px-2 py-1 text-[10px] font-mono bg-card/90 backdrop-blur-sm border border-border rounded text-muted-foreground hover:text-foreground transition-colors" + className="px-2 py-1 text-3xs font-mono bg-card/90 backdrop-blur-sm border border-border rounded text-muted-foreground hover:text-foreground transition-colors" > {open ? "Close" : "Debug"} {open && (
    - + Layout Config @@ -189,8 +189,8 @@ function LayoutDebugPanel({ {SLIDER_DEFS.map(({ key, label, min, max, step }) => (
    - - + + {config[key]}
    @@ -206,7 +206,7 @@ function LayoutDebugPanel({
    ))}
    -
    +						
     							{JSON.stringify(config, null, 2)}
     						
    @@ -985,7 +985,7 @@ const serviceSwatchColor = (service: string) => /** Pointer hints, the service or platform color key, and the health dot key under the map. */ function ServiceMapLegend({ colorMode, services }: { colorMode: ServiceMapColorMode; services: string[] }) { return ( -
    +
    {/* Pointer hints only: on touch the gestures are different, and the two lines they cost are the whole legend's height on a phone. */} Drag nodes to arrange @@ -1009,7 +1009,7 @@ function ServiceMapLegend({ colorMode, services }: { colorMode: ServiceMapColorM +{services.length - 3} more -
    +
    {services.map((service) => (
    - + {hasSampling ? "~" : ""} {formatCallCount(hasSampling ? estimatedCallCount : callCount)} {errorRate > 0 && ( diff --git a/packages/ui/src/components/service-map/service-map-namespace-group.tsx b/packages/ui/src/components/service-map/service-map-namespace-group.tsx index 2e8b7ca264..1e26845117 100644 --- a/packages/ui/src/components/service-map/service-map-namespace-group.tsx +++ b/packages/ui/src/components/service-map/service-map-namespace-group.tsx @@ -36,7 +36,7 @@ export const NamespaceGroupNode = memo(function NamespaceGroupNode({ data }: Nam style={{ borderColor, backgroundColor: bgColor }} > {label} diff --git a/packages/ui/src/components/service-map/service-map-node.tsx b/packages/ui/src/components/service-map/service-map-node.tsx index f9899e8eb0..c8ba79a09d 100644 --- a/packages/ui/src/components/service-map/service-map-node.tsx +++ b/packages/ui/src/components/service-map/service-map-node.tsx @@ -76,12 +76,12 @@ function MetricCell({ }) { return (
    - + {label} @@ -174,7 +174,7 @@ function DatabaseNode({ data }: { data: ServiceNodeData }) { {title} {badge} @@ -318,7 +318,7 @@ function ServiceNode({ data }: { data: ServiceNodeData }) { ) : ( - + {runtimeInfo.short} ))} @@ -357,13 +357,13 @@ function ServiceNode({ data }: { data: ServiceNodeData }) { {/* Pods badge — empty placeholder when no infra so widths stay stable */}
    - + pods {infra ? ( - + {infra.podCount} @@ -379,7 +379,7 @@ function ServiceNode({ data }: { data: ServiceNodeData }) { ) : ( - + – )} @@ -423,7 +423,7 @@ function NamespaceAggregateNode({ data }: { data: ServiceNodeData }) { {label} {nsMemberCount ?? 0} services diff --git a/packages/ui/src/components/traces/color-by-picker.tsx b/packages/ui/src/components/traces/color-by-picker.tsx index 3c1aa62895..440c1a720d 100644 --- a/packages/ui/src/components/traces/color-by-picker.tsx +++ b/packages/ui/src/components/traces/color-by-picker.tsx @@ -38,7 +38,7 @@ export function ColorByPicker({ value, onChange, rootSpans }: ColorByPickerProps if (next) onChange(next) }} > - + Color: {colorByLabel(value)} diff --git a/packages/ui/src/components/traces/flamegraph-minimap.tsx b/packages/ui/src/components/traces/flamegraph-minimap.tsx index 9abf95e604..8350320257 100644 --- a/packages/ui/src/components/traces/flamegraph-minimap.tsx +++ b/packages/ui/src/components/traces/flamegraph-minimap.tsx @@ -148,7 +148,7 @@ export function FlamegraphMinimap({ /> )} -
    +
    Minimap
    diff --git a/packages/ui/src/components/traces/flamegraph.tsx b/packages/ui/src/components/traces/flamegraph.tsx index d4c6913f1f..fb166ca4c8 100644 --- a/packages/ui/src/components/traces/flamegraph.tsx +++ b/packages/ui/src/components/traces/flamegraph.tsx @@ -196,7 +196,7 @@ export function Flamegraph({ {[0, 25, 50, 75, 100].map((pct) => (
    {formatDuration(((focusedSpan?.durationMs ?? totalDurationMs) * pct) / 100)} @@ -226,7 +226,7 @@ export function Flamegraph({ {bar.span.spanName} {bar.widthPercent > 12 && ( - + {bar.span.serviceName} )} - + {formatDuration(bar.span.durationMs)} @@ -275,16 +275,16 @@ export function Flamegraph({
    -
    +
    - + Click {" "} select - + Shift+Click {" "} zoom diff --git a/packages/ui/src/components/traces/flow-edge.tsx b/packages/ui/src/components/traces/flow-edge.tsx index 3875814aa8..ff50bbd9ea 100644 --- a/packages/ui/src/components/traces/flow-edge.tsx +++ b/packages/ui/src/components/traces/flow-edge.tsx @@ -116,7 +116,7 @@ export const TraceFlowEdge = memo(function TraceFlowEdge({ className="pointer-events-none overflow-visible" >
    - + {label}
    diff --git a/packages/ui/src/components/traces/flow-node.tsx b/packages/ui/src/components/traces/flow-node.tsx index c553cfbe5c..5e2d9a06ee 100644 --- a/packages/ui/src/components/traces/flow-node.tsx +++ b/packages/ui/src/components/traces/flow-node.tsx @@ -100,7 +100,7 @@ function StatusBadge({ statusCode: string }) { const { platform, cacheInfo, httpInfo } = desc - const base = "shrink-0 rounded px-1.5 py-0.5 text-[10px] font-semibold" + const base = "shrink-0 rounded px-1.5 py-0.5 text-3xs font-semibold" if (platform?.outcome?.bad) { return ( @@ -166,12 +166,12 @@ export const FlowSpanNode = memo(function FlowSpanNode({ data }: FlowSpanNodePro isSelected && "ring-2 ring-primary ring-offset-2 ring-offset-background", )} > -
    +
    Missing Span
    -
    Not ingested or dropped
    +
    Not ingested or dropped
    {isCombined && ( - + ×{count} )} @@ -254,7 +254,7 @@ export const FlowSpanNode = memo(function FlowSpanNode({ data }: FlowSpanNodePro {/* Row 1: operation + status */}
    {primaryText} @@ -263,7 +263,7 @@ export const FlowSpanNode = memo(function FlowSpanNode({ data }: FlowSpanNodePro
    {/* Row 2: service + category label + duration */} -
    +
    {span.serviceName} · diff --git a/packages/ui/src/components/traces/flow-view.tsx b/packages/ui/src/components/traces/flow-view.tsx index 2cb7c265a8..7b14cf14b3 100644 --- a/packages/ui/src/components/traces/flow-view.tsx +++ b/packages/ui/src/components/traces/flow-view.tsx @@ -205,7 +205,7 @@ export function TraceFlowView({
    -
    +
    Click to select | Scroll to zoom diff --git a/packages/ui/src/components/traces/http-span-label.tsx b/packages/ui/src/components/traces/http-span-label.tsx index 1136551ccc..9cc26bb6b9 100644 --- a/packages/ui/src/components/traces/http-span-label.tsx +++ b/packages/ui/src/components/traces/http-span-label.tsx @@ -35,7 +35,7 @@ export function HttpSpanLabel({ > diff --git a/packages/ui/src/components/traces/span-hierarchy.tsx b/packages/ui/src/components/traces/span-hierarchy.tsx index b30861af18..12bf5db771 100644 --- a/packages/ui/src/components/traces/span-hierarchy.tsx +++ b/packages/ui/src/components/traces/span-hierarchy.tsx @@ -196,7 +196,7 @@ export function SpanHierarchy() { onExpandAll={() => setExpandedSpans(collectAllCollapsibleIds(rootSpans))} /> {flat.length < totalSpanCount && ( - + {flat.length} of {totalSpanCount} spans diff --git a/packages/ui/src/components/traces/span-row.tsx b/packages/ui/src/components/traces/span-row.tsx index 0bd9af8abe..3ceca83abf 100644 --- a/packages/ui/src/components/traces/span-row.tsx +++ b/packages/ui/src/components/traces/span-row.tsx @@ -69,7 +69,7 @@ function SpanRowImpl({ missing @@ -87,7 +87,7 @@ function SpanRowImpl({
    @@ -159,7 +159,7 @@ function SpanRowImpl({
    )} - + {platform && ( @@ -189,7 +189,7 @@ function SpanRowImpl({ >