@polishd/next 0.2.1-dev.1 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,148 +3,26 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
3
3
  /**
4
4
  * Polishd — AI summary card (client).
5
5
  *
6
- * Sits at the top of the dashboard. First visit walks the owner through a
7
- * five-step setup (connect a model → describe the site → scan the codebase →
8
- * connect GitHub → pick a refresh cadence); after that the card is just the
9
- * story: summary text,
10
- * when it was generated, a refresh icon to force a regenerate, and a gear that
11
- * reveals the full settings (including the project profile) on demand.
6
+ * Sits at the top of the Analytics tab, and is now only ever the story: the
7
+ * summary text, its wins and losses, when it was generated, and a refresh to
8
+ * force a regenerate. Configuring the model — provider, key, site context,
9
+ * codebase profile, GitHub — moved to the Settings tab, so the first thing you
10
+ * see on the dashboard is what Polishd found rather than a form.
12
11
  *
13
12
  * The card renders the cached summary handed down from the server on first
14
13
  * paint — no model call on load. A model is only hit on explicit actions or
15
- * the server-side cadence refresh. The API key is write-only: we never receive
16
- * it back, only a "configured" flag.
14
+ * the server-side cadence refresh.
17
15
  */
18
- import { useEffect, useState, useTransition } from "react";
19
- import { createIssueFromLossAction, generateProfileAction, generateSummaryAction, listModelsAction, saveAISettingsAction, verifyGithubAction, } from "../ai/actions";
20
- const border = "border-[#2e2e2e]";
21
- const card = `border ${border} rounded-lg bg-[#0a0a0a]`;
22
- const labelCls = "text-[11px] font-medium uppercase tracking-[0.08em] text-[#666]";
23
- const inputCls = "w-full rounded-md border border-[#2e2e2e] bg-[#111] px-3 py-2 text-[13px] text-white placeholder:text-[#555] focus:border-[#555] focus:outline-none";
24
- const primaryBtn = "rounded-md bg-white px-3 py-1.5 text-[12px] font-medium text-black transition-opacity hover:opacity-90 disabled:cursor-not-allowed disabled:opacity-40";
25
- const ghostBtn = "rounded-md border border-[#2e2e2e] px-2.5 py-1.5 text-[12px] text-[#aaa] transition-colors hover:border-[#555] hover:text-white disabled:cursor-not-allowed disabled:opacity-40";
26
- const iconBtn = "flex h-7 w-7 items-center justify-center rounded-md border border-[#2e2e2e] text-[#aaa] transition-colors hover:border-[#555] hover:text-white disabled:cursor-not-allowed disabled:opacity-40";
27
- const PROVIDERS = [
28
- {
29
- value: "anthropic",
30
- label: "Anthropic (Claude)",
31
- modelHint: "claude-opus-4-8",
32
- keyUrl: "https://console.anthropic.com/settings/keys",
33
- keyHost: "console.anthropic.com",
34
- },
35
- {
36
- value: "openai",
37
- label: "OpenAI",
38
- modelHint: "gpt-4o-mini",
39
- keyUrl: "https://platform.openai.com/api-keys",
40
- keyHost: "platform.openai.com",
41
- },
42
- {
43
- value: "openai-compatible",
44
- label: "OpenAI-compatible",
45
- modelHint: "model id",
46
- keyUrl: "https://openrouter.ai/keys",
47
- keyHost: "your provider (e.g. openrouter.ai)",
48
- },
49
- {
50
- value: "google",
51
- label: "Google (Gemini)",
52
- modelHint: "gemini-1.5-flash",
53
- keyUrl: "https://aistudio.google.com/app/apikey",
54
- keyHost: "aistudio.google.com",
55
- },
56
- ];
57
- const CADENCES = [
58
- { value: "manual", label: "Manual", hint: "Only when you press refresh" },
59
- { value: "daily", label: "Daily", hint: "Refreshes on your first dashboard visit each day, if data changed" },
60
- { value: "weekly", label: "Weekly", hint: "Refreshes at most once a week, if data changed" },
61
- ];
62
- function relTime(ms) {
63
- const s = Math.max(0, Math.round((Date.now() - ms) / 1000));
64
- if (s < 60)
65
- return "just now";
66
- const m = Math.round(s / 60);
67
- if (m < 60)
68
- return `${m}m ago`;
69
- const h = Math.round(m / 60);
70
- if (h < 24)
71
- return `${h}h ago`;
72
- return `${Math.round(h / 24)}d ago`;
73
- }
74
- // ── Icons (Feather, inlined) ─────────────────────────────────────────────────
75
- function RefreshIcon({ spinning }) {
76
- return (_jsxs("svg", { width: "13", height: "13", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className: spinning ? "animate-spin" : undefined, "aria-hidden": true, children: [_jsx("polyline", { points: "23 4 23 10 17 10" }), _jsx("path", { d: "M20.49 15a9 9 0 1 1-2.12-9.36L23 10" })] }));
77
- }
78
- function GearIcon() {
79
- return (_jsxs("svg", { width: "13", height: "13", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": true, children: [_jsx("circle", { cx: "12", cy: "12", r: "3" }), _jsx("path", { d: "M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z" })] }));
80
- }
81
- // ── Model field ──────────────────────────────────────────────────────────────
82
- /**
83
- * The "Model" input, shared by the onboarding wizard and the settings panel.
84
- * Starts as free text (any provider works this way). If the provider exposes
85
- * a list-models endpoint and a usable key is available (typed in this form,
86
- * or already stored for this same provider), a "Load available models" link
87
- * fetches the live list and swaps the input for a dropdown — so the owner
88
- * picks from what their key can actually call instead of guessing an id.
89
- */
90
- function ModelField({ provider, model, onModel, apiKey, baseUrl, hasStoredKey, }) {
91
- const [models, setModels] = useState(null);
92
- const [error, setError] = useState(null);
93
- const [pending, startLoad] = useTransition();
94
- const prov = PROVIDERS.find((p) => p.value === provider);
95
- // A fetched list is provider-specific — drop it the moment the provider
96
- // changes so a stale Gemini list can't linger under "OpenAI".
97
- useEffect(() => {
98
- setModels(null);
99
- setError(null);
100
- }, [provider]);
101
- const needsBaseUrl = provider === "openai-compatible" && !baseUrl.trim();
102
- const canFetch = (apiKey.trim().length > 0 || hasStoredKey) && !needsBaseUrl;
103
- const load = () => {
104
- if (!canFetch || pending)
105
- return;
106
- setError(null);
107
- startLoad(async () => {
108
- const res = await listModelsAction({
109
- provider,
110
- apiKey: apiKey.trim() || undefined,
111
- baseUrl: baseUrl.trim() || undefined,
112
- });
113
- if (res.ok) {
114
- setModels(res.models);
115
- if (res.models.length > 0 && !res.models.includes(model))
116
- onModel(res.models[0]);
117
- }
118
- else {
119
- setError(res.message);
120
- }
121
- });
122
- };
123
- // Auto-load once when a stored key already covers this provider — most
124
- // visits land here with nothing to type, so the dropdown should just work.
125
- useEffect(() => {
126
- if (hasStoredKey && models === null && !pending)
127
- load();
128
- // eslint-disable-next-line react-hooks/exhaustive-deps
129
- }, [hasStoredKey]);
130
- return (_jsxs("label", { className: "block", children: [_jsx("span", { className: labelCls, children: "Model" }), models && models.length > 0 ? (_jsxs(_Fragment, { children: [_jsxs("select", { value: model, onChange: (e) => onModel(e.target.value), className: `${inputCls} mt-1.5 font-mono`, children: [!models.includes(model) && model && _jsx("option", { value: model, children: model }), models.map((m) => (_jsx("option", { value: m, children: m }, m)))] }), _jsx("button", { type: "button", onClick: () => setModels(null), className: "mt-1 text-[11px] text-[#555] hover:text-[#888]", children: "Type a different model id" })] })) : (_jsxs(_Fragment, { children: [_jsx("input", { value: model, onChange: (e) => onModel(e.target.value), placeholder: prov?.modelHint, className: `${inputCls} mt-1.5 font-mono` }), _jsx("button", { type: "button", onClick: load, disabled: !canFetch || pending, title: needsBaseUrl
131
- ? "Add a base URL first"
132
- : canFetch
133
- ? "Fetch the list of models available to this key"
134
- : "Add an API key first", className: "mt-1 text-[11px] text-[#888] underline decoration-[#444] underline-offset-2 hover:text-white disabled:cursor-not-allowed disabled:no-underline disabled:opacity-40", children: pending ? "Loading models…" : "Load available models" }), error && _jsx("span", { className: "mt-1 block text-[11px] text-red-400", children: error })] }))] }));
135
- }
16
+ import { useState, useTransition } from "react";
17
+ import { createIssueFromLossAction, generateSummaryAction } from "../ai/actions";
18
+ import { TabLink } from "./chrome";
19
+ import { GearIcon, RefreshIcon, border, card, iconBtn, labelCls, primaryBtn, relTime } from "./ui";
136
20
  export default function SummaryCard({ initialSummary, initialSettings, initialStale, initialProfile, initialGaps, sourceAvailable, }) {
137
21
  const [summary, setSummary] = useState(initialSummary);
138
- const [settings, setSettings] = useState(initialSettings);
139
22
  const [stale, setStale] = useState(initialStale);
140
- const [profile, setProfile] = useState(initialProfile);
141
- const [gaps, setGaps] = useState(initialGaps);
142
23
  const [error, setError] = useState(null);
143
- const [showSettings, setShowSettings] = useState(false);
144
- // The wizard shows exactly once: a fresh install (no key, nothing cached).
145
- // After step 1 saves a key, reloads land on the normal card for good.
146
- const [onboarding, setOnboarding] = useState(!initialSettings.hasApiKey && !initialSummary && !initialSettings.fromEnv);
147
24
  const [pending, startGenerate] = useTransition();
25
+ const settings = initialSettings;
148
26
  const generate = (force) => {
149
27
  setError(null);
150
28
  startGenerate(async () => {
@@ -154,33 +32,33 @@ export default function SummaryCard({ initialSummary, initialSettings, initialSt
154
32
  setStale(false);
155
33
  }
156
34
  else {
157
- if (res.error === "no-key")
158
- setShowSettings(true);
159
35
  setError(res.message);
160
36
  }
161
37
  });
162
38
  };
163
39
  const hasSummary = summary !== null;
164
40
  const cadence = settings.refreshCadence ?? "manual";
165
- return (_jsxs("section", { className: `mb-8 ${card} overflow-hidden`, children: [_jsxs("div", { className: `flex items-center justify-between gap-3 border-b ${border} px-4 py-3 sm:px-5`, children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: labelCls, children: "All you need to know" }), settings.hasApiKey && (_jsxs("span", { className: "hidden rounded-full bg-[#1a1a1a] px-2 py-0.5 text-[10px] font-medium text-[#888] sm:inline", children: [settings.provider, " \u00B7 ", settings.model] }))] }), !onboarding && (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("button", { type: "button", onClick: () => generate(hasSummary), disabled: pending || !settings.hasApiKey, title: settings.hasApiKey ? "Regenerate the summary now" : "Connect a model first", "aria-label": "Refresh summary", className: iconBtn, children: _jsx(RefreshIcon, { spinning: pending }) }), _jsx("button", { type: "button", onClick: () => setShowSettings((s) => !s), title: "Setup & settings", "aria-label": "Setup and settings", className: `${iconBtn} ${showSettings ? "border-[#555] text-white" : ""}`, children: _jsx(GearIcon, {}) })] }))] }), onboarding ? (_jsx(OnboardingWizard, { settings: settings, sourceAvailable: sourceAvailable, onSettings: setSettings, onProfile: (p) => {
166
- setProfile(p);
167
- setGaps([]);
168
- }, onSummary: (s) => {
169
- setSummary(s);
170
- setStale(false);
171
- }, onError: setError, onDone: () => setOnboarding(false) })) : (_jsxs(_Fragment, { children: [_jsxs("div", { className: "px-4 py-4 sm:px-5 sm:py-5", children: [error && (_jsx("div", { className: "mb-3 rounded-md border border-red-900/50 bg-red-950/30 px-3 py-2 text-[12px] text-red-400", children: error })), hasSummary ? (_jsxs(_Fragment, { children: [_jsx("p", { className: "text-[14px] leading-relaxed text-[#e4e4e4]", children: summary.text }), _jsx(WinsLosses, { wins: summary.wins, losses: summary.losses, githubConnected: settings.hasGithubToken && !!settings.githubRepo }), _jsxs("div", { className: "mt-3 flex flex-wrap items-center gap-x-3 gap-y-1 text-[11px] text-[#555]", children: [_jsxs("span", { children: ["Generated ", relTime(summary.generatedAt), " \u00B7 ", summary.provider, "/", summary.model, cadence !== "manual" && ` · refreshes ${cadence}`] }), stale && (_jsx("span", { className: "rounded-full bg-amber-950/50 px-2 py-0.5 text-amber-400", children: "New data since this summary \u2014 refresh to update" }))] })] })) : (_jsxs("div", { className: "flex flex-wrap items-center justify-between gap-3", children: [_jsx("p", { className: "text-[13px] leading-relaxed text-[#888]", children: settings.hasApiKey
172
- ? "No summary yet — generate the story of how visitors are using this site from the signals below."
173
- : "No model connected. Open settings to add an API key." }), _jsx("button", { type: "button", onClick: () => (settings.hasApiKey ? generate(false) : setShowSettings(true)), disabled: pending, className: primaryBtn, children: pending ? "Thinking…" : settings.hasApiKey ? "Generate summary" : "Open settings" })] }))] }), showSettings && (_jsxs(_Fragment, { children: [_jsx(ProfileStrip, { profile: profile, gaps: gaps, hasApiKey: settings.hasApiKey, sourceAvailable: sourceAvailable, onScanned: (p) => {
174
- setProfile(p);
175
- setGaps([]);
176
- setError(null);
177
- // A new profile changes the summary's inputs — flag the cached one.
178
- if (summary)
179
- setStale(true);
180
- }, onError: setError }), _jsx(SettingsPanel, { settings: settings, onSaved: (next) => {
181
- setSettings(next);
182
- setError(null);
183
- } })] }))] }))] }));
41
+ return (_jsxs("section", { className: `mb-8 ${card} overflow-hidden`, children: [_jsxs("div", { className: `flex items-center justify-between gap-3 border-b ${border} px-4 py-3 sm:px-5`, children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: labelCls, children: "All you need to know" }), settings.hasApiKey && (_jsxs("span", { className: "hidden rounded-full bg-[#1a1a1a] px-2 py-0.5 text-[10px] font-medium text-[#888] sm:inline", children: [settings.provider, " \u00B7 ", settings.model] }))] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("button", { type: "button", onClick: () => generate(hasSummary), disabled: pending || !settings.hasApiKey, title: settings.hasApiKey ? "Regenerate the summary now" : "Connect a model first", "aria-label": "Refresh summary", className: iconBtn, children: _jsx(RefreshIcon, { spinning: pending }) }), _jsx(TabLink, { tab: "settings", title: "Model, site context and GitHub settings", "aria-label": "Open settings", className: iconBtn, children: _jsx(GearIcon, {}) })] })] }), _jsxs("div", { className: "px-4 py-4 sm:px-5 sm:py-5", children: [error && (_jsx("div", { className: "mb-3 rounded-md border border-red-900/50 bg-red-950/30 px-3 py-2 text-[12px] text-red-400", children: error })), hasSummary ? (_jsxs(_Fragment, { children: [_jsx("p", { className: "text-[14px] leading-relaxed text-[#e4e4e4]", children: summary.text }), _jsx(WinsLosses, { wins: summary.wins, losses: summary.losses, githubConnected: settings.hasGithubToken && !!settings.githubRepo }), _jsxs("div", { className: "mt-3 flex flex-wrap items-center gap-x-3 gap-y-1 text-[11px] text-[#555]", children: [_jsxs("span", { children: ["Generated ", relTime(summary.generatedAt), " \u00B7 ", summary.provider, "/", summary.model, cadence !== "manual" && ` · refreshes ${cadence}`] }), stale && (_jsx("span", { className: "rounded-full bg-amber-950/50 px-2 py-0.5 text-amber-400", children: "New data since this summary \u2014 refresh to update" }))] })] })) : (_jsxs("div", { className: "flex flex-wrap items-center justify-between gap-3", children: [_jsx("p", { className: "text-[13px] leading-relaxed text-[#888]", children: settings.hasApiKey
42
+ ? "No summary yet — generate the story of how visitors are using this site from the signals below."
43
+ : "No model connected yet. Add a key in Settings and Polishd will read these numbers back to you in plain English." }), settings.hasApiKey ? (_jsx("button", { type: "button", onClick: () => generate(false), disabled: pending, className: primaryBtn, children: pending ? "Thinking…" : "Generate summary" })) : (_jsx(TabLink, { tab: "settings", className: primaryBtn, children: "Connect a model" }))] }))] }), _jsx(ProfileNudge, { profile: initialProfile, gaps: initialGaps, sourceAvailable: sourceAvailable })] }));
44
+ }
45
+ /**
46
+ * The one piece of setup worth surfacing next to a summary: whether the model
47
+ * has actually read the codebase this summary is describing. The controls live
48
+ * in Settings; this only says why you'd want to go there.
49
+ */
50
+ function ProfileNudge({ profile, gaps, sourceAvailable, }) {
51
+ let message = null;
52
+ if (!profile && sourceAvailable) {
53
+ message =
54
+ "The model hasn't read your codebase yet — one scan lets every summary name real components instead of selectors.";
55
+ }
56
+ else if (gaps.length > 0) {
57
+ message = `${gaps.length} ${gaps.length === 1 ? "component has" : "components have"} appeared since the last codebase scan.`;
58
+ }
59
+ if (!message)
60
+ return null;
61
+ return (_jsxs("div", { className: `flex flex-wrap items-center justify-between gap-2 border-t ${border} bg-[#080808] px-4 py-2.5 sm:px-5`, children: [_jsx("span", { className: "text-[11px] text-[#666]", children: message }), _jsxs(TabLink, { tab: "settings", className: "text-[11px] text-[#888] underline decoration-[#444] underline-offset-2 hover:text-white", children: [profile ? "Re-scan in Settings" : "Scan in Settings", " \u2192"] })] }));
184
62
  }
185
63
  // ── Wins & losses ────────────────────────────────────────────────────────────
186
64
  /**
@@ -222,166 +100,4 @@ function WinsLosses({ wins, losses, githubConnected, }) {
222
100
  return null;
223
101
  return (_jsxs("div", { className: "mt-4 grid gap-4 sm:grid-cols-2", children: [hasWins && (_jsxs("div", { children: [_jsx("div", { className: `${labelCls} mb-2 text-emerald-500`, children: "Wins" }), _jsx("ul", { className: "space-y-1.5", children: wins.map((w, i) => (_jsxs("li", { className: "flex gap-2 text-[13px] leading-snug text-[#bbb]", children: [_jsx("span", { className: "mt-px shrink-0 text-emerald-500", children: "\u2713" }), _jsx("span", { children: w })] }, i))) })] })), hasLosses && (_jsxs("div", { children: [_jsx("div", { className: `${labelCls} mb-2 text-red-400`, children: "Losses" }), _jsx("ul", { className: "space-y-2.5", children: losses.map((l, i) => (_jsxs("li", { className: "flex gap-2 text-[13px] leading-snug text-[#bbb]", children: [_jsx("span", { className: "mt-px shrink-0 text-red-400", children: "\u2715" }), _jsxs("span", { children: [l.issue, _jsxs("span", { className: "mt-0.5 flex flex-wrap items-center gap-1.5", children: [_jsx("code", { className: "rounded bg-[#1a1a1a] px-1.5 py-0.5 font-mono text-[10px] text-[#888]", children: l.evidence }), l.location ? (_jsx("code", { className: "rounded bg-[#101c14] px-1.5 py-0.5 font-mono text-[10px] text-emerald-500", children: l.location })) : (_jsx("span", { className: "rounded bg-[#1a1a1a] px-1.5 py-0.5 text-[10px] text-[#666]", title: "The citation is real analytics data, but no matching file was found on disk (dynamic content, or source not available here).", children: "not matched to source" })), (githubConnected || !!l.issueUrl) && _jsx(FileBugButton, { loss: l })] })] })] }, i))) })] }))] }));
224
102
  }
225
- // ── Onboarding wizard ────────────────────────────────────────────────────────
226
- const STEPS = ["Model", "Your site", "Codebase", "GitHub", "Cadence"];
227
- function StepShell({ step, title, intro, children, }) {
228
- return (_jsxs("div", { className: "px-4 py-5 sm:px-5", children: [_jsx("div", { className: "mb-4 flex items-center gap-1.5", children: STEPS.map((name, i) => (_jsxs("span", { className: "flex items-center gap-1.5", children: [_jsxs("span", { className: `flex h-5 items-center rounded-full px-2 text-[10px] font-medium ${i === step
229
- ? "bg-white text-black"
230
- : i < step
231
- ? "bg-[#1a1a1a] text-emerald-400"
232
- : "bg-[#1a1a1a] text-[#555]"}`, children: [i < step ? "✓ " : `${i + 1} · `, name] }), i < STEPS.length - 1 && _jsx("span", { className: "h-px w-3 bg-[#2e2e2e]" })] }, name))) }), _jsx("h3", { className: "text-[15px] font-semibold text-white", children: title }), _jsx("p", { className: "mt-1 max-w-xl text-[12px] leading-relaxed text-[#888]", children: intro }), _jsx("div", { className: "mt-4", children: children })] }));
233
- }
234
- function OnboardingWizard({ settings, sourceAvailable, onSettings, onProfile, onSummary, onError, onDone, }) {
235
- const [step, setStep] = useState(0);
236
- const [error, setError] = useState(null);
237
- // Step 1 — model
238
- const [provider, setProvider] = useState(settings.provider);
239
- const [model, setModel] = useState(settings.model);
240
- const [apiKey, setApiKey] = useState("");
241
- const [baseUrl, setBaseUrl] = useState(settings.baseUrl ?? "");
242
- // Step 2 — site
243
- const [context, setContext] = useState(settings.context ?? "");
244
- const [audience, setAudience] = useState(settings.audience ?? "");
245
- const [ideology, setIdeology] = useState(settings.ideology ?? "");
246
- // Step 3 — codebase
247
- const [sourceDirs, setSourceDirs] = useState(settings.sourceDirs ?? "");
248
- const [scanned, setScanned] = useState(null);
249
- // Step 4 — GitHub
250
- const [githubRepo, setGithubRepo] = useState(settings.githubRepo ?? "");
251
- const [githubToken, setGithubToken] = useState("");
252
- const [githubStatus, setGithubStatus] = useState(null);
253
- const [autoIssues, setAutoIssues] = useState(settings.githubAutoIssues ?? false);
254
- // Step 5 — cadence
255
- const [cadence, setCadence] = useState("manual");
256
- const [pending, startStep] = useTransition();
257
- const prov = PROVIDERS.find((p) => p.value === provider);
258
- const next = () => {
259
- setError(null);
260
- setStep((s) => s + 1);
261
- };
262
- const saveModel = () => startStep(async () => {
263
- const saved = await saveAISettingsAction({ provider, model, apiKey, baseUrl });
264
- onSettings(saved);
265
- setApiKey("");
266
- if (!saved.hasApiKey) {
267
- setError("Paste an API key to continue — the model can't be called without one.");
268
- return;
269
- }
270
- next();
271
- });
272
- const saveSite = () => startStep(async () => {
273
- onSettings(await saveAISettingsAction({ context, audience, ideology }));
274
- next();
275
- });
276
- const scan = () => startStep(async () => {
277
- setError(null);
278
- onSettings(await saveAISettingsAction({ sourceDirs }));
279
- const res = await generateProfileAction();
280
- if (res.ok) {
281
- setScanned(res.profile);
282
- onProfile(res.profile);
283
- }
284
- else {
285
- setError(res.message);
286
- }
287
- });
288
- const connectGithub = () => startStep(async () => {
289
- setError(null);
290
- const saved = await saveAISettingsAction({
291
- githubRepo,
292
- githubToken,
293
- githubAutoIssues: autoIssues,
294
- });
295
- onSettings(saved);
296
- setGithubToken("");
297
- const res = await verifyGithubAction();
298
- if (res.ok)
299
- setGithubStatus(res.status);
300
- else
301
- setError(res.message);
302
- });
303
- // The toggle stays visible after connecting — persist its latest state.
304
- const finishGithub = () => startStep(async () => {
305
- onSettings(await saveAISettingsAction({ githubAutoIssues: autoIssues }));
306
- next();
307
- });
308
- const finish = () => startStep(async () => {
309
- onSettings(await saveAISettingsAction({ refreshCadence: cadence }));
310
- const res = await generateSummaryAction(false);
311
- if (res.ok)
312
- onSummary(res.summary);
313
- else
314
- onError(res.message); // wizard is closing — surface it on the card
315
- onDone();
316
- });
317
- return (_jsxs("div", { className: "bg-[#080808]", children: [error && (_jsx("div", { className: "mx-4 mt-4 rounded-md border border-red-900/50 bg-red-950/30 px-3 py-2 text-[12px] text-red-400 sm:mx-5", children: error })), step === 0 && (_jsxs(StepShell, { step: 0, title: "Connect a model", intro: "Bring your own key \u2014 pick the provider you already pay for. The key is stored server-side in your database and never sent back to the browser.", children: [_jsxs("div", { className: "grid gap-4 sm:grid-cols-2", children: [_jsxs("label", { className: "block", children: [_jsx("span", { className: labelCls, children: "Provider" }), _jsx("select", { value: provider, onChange: (e) => setProvider(e.target.value), className: `${inputCls} mt-1.5`, children: PROVIDERS.map((p) => (_jsx("option", { value: p.value, children: p.label }, p.value))) })] }), _jsx(ModelField, { provider: provider, model: model, onModel: setModel, apiKey: apiKey, baseUrl: baseUrl, hasStoredKey: settings.hasApiKey && settings.provider === provider }), _jsxs("label", { className: "block sm:col-span-2", children: [_jsx("span", { className: labelCls, children: "API key" }), _jsx("input", { type: "password", value: apiKey, onChange: (e) => setApiKey(e.target.value), placeholder: settings.hasApiKey ? "•••••••• (stored — leave blank to keep)" : "Paste your key", autoComplete: "off", className: `${inputCls} mt-1.5` }), prov && (_jsxs("span", { className: "mt-1 block text-[11px] text-[#555]", children: ["Get a key from", " ", _jsx("a", { href: prov.keyUrl, target: "_blank", rel: "noreferrer noopener", className: "text-[#888] underline decoration-[#444] underline-offset-2 hover:text-white", children: prov.keyHost }), "."] }))] }), provider === "openai-compatible" && (_jsxs("label", { className: "block sm:col-span-2", children: [_jsx("span", { className: labelCls, children: "Base URL" }), _jsx("input", { value: baseUrl, onChange: (e) => setBaseUrl(e.target.value), placeholder: "https://openrouter.ai/api/v1", className: `${inputCls} mt-1.5 font-mono` })] }))] }), _jsxs("div", { className: "mt-4 flex items-center gap-3", children: [_jsx("button", { type: "button", onClick: saveModel, disabled: pending || (!apiKey && !settings.hasApiKey), className: primaryBtn, children: pending ? "Saving…" : "Continue" }), _jsx("button", { type: "button", onClick: onDone, className: "text-[11px] text-[#555] hover:text-[#888]", children: "Skip setup" })] })] })), step === 1 && (_jsxs(StepShell, { step: 1, title: "Tell it about your site", intro: "Optional, but the story gets sharper when the model knows what the site is for and who it serves. All three feed the codebase profile in the next step.", children: [_jsxs("label", { className: "block", children: [_jsx("span", { className: labelCls, children: "What is this site?" }), _jsx("textarea", { value: context, onChange: (e) => setContext(e.target.value), rows: 2, placeholder: "e.g. A personal notes site. Visitors read articles and browse by tag. The /admin editor is owner-only.", className: `${inputCls} mt-1.5 resize-y` })] }), _jsxs("div", { className: "mt-4 grid gap-4 sm:grid-cols-2", children: [_jsxs("label", { className: "block", children: [_jsx("span", { className: labelCls, children: "Target audience" }), _jsx("input", { value: audience, onChange: (e) => setAudience(e.target.value), placeholder: "e.g. Recruiters and fellow designers", className: `${inputCls} mt-1.5` })] }), _jsxs("label", { className: "block", children: [_jsx("span", { className: labelCls, children: "Ideology / values" }), _jsx("input", { value: ideology, onChange: (e) => setIdeology(e.target.value), placeholder: "e.g. Depth over clicks \u2014 long reads matter most", className: `${inputCls} mt-1.5` })] })] }), _jsxs("div", { className: "mt-4 flex items-center gap-3", children: [_jsx("button", { type: "button", onClick: saveSite, disabled: pending, className: primaryBtn, children: pending ? "Saving…" : "Continue" }), _jsx("button", { type: "button", onClick: next, className: ghostBtn, children: "Skip" })] })] })), step === 2 && (_jsxs(StepShell, { step: 2, title: "Scan your codebase", intro: "A one-time scan teaches the model your pages and components, so every future summary understands the site without re-reading code. It's cached in your database \u2014 the codebase is only touched again if new components appear or you re-scan.", children: [scanned ? (_jsxs("div", { className: "rounded-md border border-emerald-900/50 bg-emerald-950/20 px-3 py-2.5 text-[12px] text-emerald-400", children: ["Profiled ", scanned.sourceFiles, " files \u00B7 ", scanned.coveredIdentifiers.length, " components", scanned.truncated ? " (large app — clipped to budget)" : "", ". The model now knows your site's structure."] })) : (_jsxs(_Fragment, { children: [!sourceAvailable && (_jsx("div", { className: "mb-3 rounded-md border border-amber-900/50 bg-amber-950/20 px-3 py-2 text-[12px] text-amber-400", children: "No source tree found on disk here \u2014 this step needs to run where the code lives (local dev or CI). You can skip it now and scan later." })), _jsxs("label", { className: "block max-w-md", children: [_jsx("span", { className: labelCls, children: "Source folders" }), _jsx("span", { className: "ml-1 text-[11px] text-[#555]", children: "\u2014 optional; defaults to src / app / components / pages / lib." }), _jsx("input", { value: sourceDirs, onChange: (e) => setSourceDirs(e.target.value), placeholder: "e.g. src, content", className: `${inputCls} mt-1.5 font-mono` })] })] })), _jsx("div", { className: "mt-4 flex items-center gap-3", children: scanned ? (_jsx("button", { type: "button", onClick: next, className: primaryBtn, children: "Continue" })) : (_jsxs(_Fragment, { children: [_jsx("button", { type: "button", onClick: scan, disabled: pending || !sourceAvailable, className: primaryBtn, children: pending ? "Scanning…" : "Scan codebase" }), _jsx("button", { type: "button", onClick: next, className: ghostBtn, children: "Skip for now" })] })) })] })), step === 3 && (_jsxs(StepShell, { step: 3, title: "Connect your GitHub repository", intro: "Optional. With the repo connected, problems the model finds are verified against your actual source code \u2014 real ones become GitHub issues with the technical analysis and fix suggestions, false alarms are dropped. A fine-grained token scoped to just this repo is all it needs.", children: [githubStatus ? (_jsxs("div", { className: "rounded-md border border-emerald-900/50 bg-emerald-950/20 px-3 py-2.5 text-[12px] text-emerald-400", children: ["Connected to ", githubStatus.repo, " \u00B7 default branch", " ", _jsx("code", { className: "font-mono", children: githubStatus.defaultBranch }), !githubStatus.issuesEnabled && " · issues are disabled on this repo", !githubStatus.canPush && " · token can't push (branches/PRs unavailable)"] })) : (_jsxs("div", { className: "grid gap-4 sm:grid-cols-2", children: [_jsxs("label", { className: "block", children: [_jsx("span", { className: labelCls, children: "Repository" }), _jsx("input", { value: githubRepo, onChange: (e) => setGithubRepo(e.target.value), placeholder: "owner/repo", className: `${inputCls} mt-1.5 font-mono` })] }), _jsxs("label", { className: "block", children: [_jsx("span", { className: labelCls, children: "Access token" }), _jsx("input", { type: "password", value: githubToken, onChange: (e) => setGithubToken(e.target.value), placeholder: settings.hasGithubToken ? "•••••••• (stored — leave blank to keep)" : "github_pat_…", autoComplete: "off", className: `${inputCls} mt-1.5` }), _jsxs("span", { className: "mt-1 block text-[11px] text-[#555]", children: ["Create a", " ", _jsx("a", { href: "https://github.com/settings/personal-access-tokens/new", target: "_blank", rel: "noreferrer noopener", className: "text-[#888] underline decoration-[#444] underline-offset-2 hover:text-white", children: "fine-grained token" }), " ", "for this repo with Contents (read) and Issues & Pull requests (write). Stored server-side; never sent to the browser."] })] })] })), _jsxs("label", { className: "mt-4 flex max-w-xl cursor-pointer items-start gap-2.5", children: [_jsx("input", { type: "checkbox", checked: autoIssues, onChange: (e) => setAutoIssues(e.target.checked), className: "mt-0.5 h-3.5 w-3.5 shrink-0 cursor-pointer accent-white" }), _jsxs("span", { children: [_jsx("span", { className: "block text-[13px] font-medium text-white", children: "Allow creating issues automatically" }), _jsx("span", { className: "mt-0.5 block text-[11px] leading-snug text-[#666]", children: "Every new problem a summary finds is verified against the source and \u2014 when it holds up \u2014 filed as a GitHub issue on its own, with technical details and fix suggestions. The same problem is never filed twice." })] })] }), _jsx("div", { className: "mt-4 flex items-center gap-3", children: githubStatus ? (_jsx("button", { type: "button", onClick: finishGithub, disabled: pending, className: primaryBtn, children: pending ? "Saving…" : "Continue" })) : (_jsxs(_Fragment, { children: [_jsx("button", { type: "button", onClick: connectGithub, disabled: pending || !githubRepo.trim() || (!githubToken && !settings.hasGithubToken), className: primaryBtn, children: pending ? "Connecting…" : "Connect GitHub" }), _jsx("button", { type: "button", onClick: next, className: ghostBtn, children: "Skip for now" })] })) })] })), step === 4 && (_jsxs(StepShell, { step: 4, title: "How often should the story refresh?", intro: "With the profile cached, a refresh only spends tokens when there's new behavior to narrate \u2014 unchanged data is always free. Auto-refresh runs in the background when you open the dashboard past the cadence.", children: [_jsx("div", { className: "grid gap-2 sm:grid-cols-3", children: CADENCES.map((c) => (_jsxs("button", { type: "button", onClick: () => setCadence(c.value), className: `rounded-md border px-3 py-2.5 text-left transition-colors ${cadence === c.value
318
- ? "border-white bg-[#141414]"
319
- : "border-[#2e2e2e] hover:border-[#555]"}`, children: [_jsx("span", { className: "block text-[13px] font-medium text-white", children: c.label }), _jsx("span", { className: "mt-0.5 block text-[11px] leading-snug text-[#666]", children: c.hint })] }, c.value))) }), _jsx("div", { className: "mt-4", children: _jsx("button", { type: "button", onClick: finish, disabled: pending, className: primaryBtn, children: pending ? "Generating your first summary…" : "Finish & generate first summary" }) })] }))] }));
320
- }
321
- // ── Project profile strip (inside settings) ──────────────────────────────────
322
- function ProfileStrip({ profile, gaps, hasApiKey, sourceAvailable, onScanned, onError, }) {
323
- const [expanded, setExpanded] = useState(false);
324
- const [pending, startScan] = useTransition();
325
- const scan = () => {
326
- startScan(async () => {
327
- const res = await generateProfileAction();
328
- if (res.ok)
329
- onScanned(res.profile);
330
- else
331
- onError(res.message);
332
- });
333
- };
334
- const canScan = hasApiKey && sourceAvailable && !pending;
335
- return (_jsxs("div", { className: `border-t ${border} bg-[#080808] px-4 py-3 sm:px-5`, children: [_jsxs("div", { className: "flex flex-wrap items-center justify-between gap-2", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-2 text-[11px] text-[#555]", children: [_jsx("span", { className: labelCls, children: "Project profile" }), profile ? (_jsxs(_Fragment, { children: [_jsxs("span", { children: ["scanned ", relTime(profile.generatedAt), " \u00B7 ", profile.sourceFiles, " files \u00B7", " ", profile.coveredIdentifiers.length, " components", profile.truncated ? " · clipped to budget" : ""] }), gaps.length > 0 && (_jsxs("span", { className: "rounded-full bg-amber-950/50 px-2 py-0.5 text-amber-400", children: [gaps.length, " new ", gaps.length === 1 ? "component" : "components", " not covered \u2014 re-scan"] })), _jsx("button", { type: "button", onClick: () => setExpanded((e) => !e), className: "text-[#888] underline decoration-[#444] underline-offset-2 hover:text-white", children: expanded ? "Hide" : "View" })] })) : (_jsx("span", { children: sourceAvailable
336
- ? "Not scanned yet — one scan teaches the model your pages and components, so every summary understands the site without re-reading code."
337
- : "Source not on disk here — run the scan in local dev; the saved profile then serves everywhere." }))] }), _jsx("button", { type: "button", onClick: scan, disabled: !canScan, title: !hasApiKey
338
- ? "Add an API key first"
339
- : !sourceAvailable
340
- ? "No source tree found on disk"
341
- : undefined, className: "rounded-md border border-[#2e2e2e] px-2.5 py-1 text-[11px] text-[#aaa] transition-colors hover:border-[#555] hover:text-white disabled:cursor-not-allowed disabled:opacity-40", children: pending ? "Scanning…" : profile ? "Re-scan codebase" : "Scan codebase" })] }), expanded && profile && (_jsx("p", { className: "mt-3 whitespace-pre-wrap text-[12px] leading-relaxed text-[#999]", children: profile.text }))] }));
342
- }
343
- // ── Full settings form (inside settings) ─────────────────────────────────────
344
- function SettingsPanel({ settings, onSaved, }) {
345
- const [provider, setProvider] = useState(settings.provider);
346
- const [model, setModel] = useState(settings.model);
347
- const [apiKey, setApiKey] = useState("");
348
- const [baseUrl, setBaseUrl] = useState(settings.baseUrl ?? "");
349
- const [instructions, setInstructions] = useState(settings.instructions ?? "");
350
- const [context, setContext] = useState(settings.context ?? "");
351
- const [audience, setAudience] = useState(settings.audience ?? "");
352
- const [ideology, setIdeology] = useState(settings.ideology ?? "");
353
- const [sourceDirs, setSourceDirs] = useState(settings.sourceDirs ?? "");
354
- const [cadence, setCadence] = useState(settings.refreshCadence ?? "manual");
355
- const [githubRepo, setGithubRepo] = useState(settings.githubRepo ?? "");
356
- const [githubToken, setGithubToken] = useState("");
357
- const [autoIssues, setAutoIssues] = useState(settings.githubAutoIssues ?? false);
358
- const [saved, setSaved] = useState(false);
359
- const [pending, startSave] = useTransition();
360
- const prov = PROVIDERS.find((p) => p.value === provider);
361
- const save = () => {
362
- setSaved(false);
363
- startSave(async () => {
364
- const next = await saveAISettingsAction({
365
- provider,
366
- model,
367
- apiKey, // blank keeps the stored key
368
- baseUrl,
369
- instructions,
370
- context,
371
- audience,
372
- ideology,
373
- sourceDirs,
374
- refreshCadence: cadence,
375
- githubRepo,
376
- githubToken, // blank keeps the stored token
377
- githubAutoIssues: autoIssues,
378
- });
379
- onSaved(next);
380
- setApiKey("");
381
- setGithubToken("");
382
- setSaved(true);
383
- });
384
- };
385
- return (_jsxs("div", { className: `border-t ${border} bg-[#080808] px-4 py-4 sm:px-5 sm:py-5`, children: [_jsxs("div", { className: "grid gap-4 sm:grid-cols-2", children: [_jsxs("label", { className: "block", children: [_jsx("span", { className: labelCls, children: "Provider" }), _jsx("select", { value: provider, onChange: (e) => setProvider(e.target.value), className: `${inputCls} mt-1.5`, children: PROVIDERS.map((p) => (_jsx("option", { value: p.value, children: p.label }, p.value))) })] }), _jsx(ModelField, { provider: provider, model: model, onModel: setModel, apiKey: apiKey, baseUrl: baseUrl, hasStoredKey: settings.hasApiKey && settings.provider === provider }), _jsxs("label", { className: "block", children: [_jsx("span", { className: labelCls, children: "API key" }), _jsx("input", { type: "password", value: apiKey, onChange: (e) => setApiKey(e.target.value), placeholder: settings.hasApiKey ? "•••••••• (stored — leave blank to keep)" : "Paste your key", autoComplete: "off", className: `${inputCls} mt-1.5` }), prov && (_jsxs("span", { className: "mt-1 block text-[11px] text-[#555]", children: ["Get a key from", " ", _jsx("a", { href: prov.keyUrl, target: "_blank", rel: "noreferrer noopener", className: "text-[#888] underline decoration-[#444] underline-offset-2 hover:text-white", children: prov.keyHost }), ". Stored server-side; never sent to the browser."] }))] }), _jsxs("label", { className: "block", children: [_jsx("span", { className: labelCls, children: "Auto-refresh" }), _jsx("select", { value: cadence, onChange: (e) => setCadence(e.target.value), className: `${inputCls} mt-1.5`, children: CADENCES.map((c) => (_jsxs("option", { value: c.value, children: [c.label, " \u2014 ", c.hint.toLowerCase()] }, c.value))) })] }), provider === "openai-compatible" && (_jsxs("label", { className: "block", children: [_jsx("span", { className: labelCls, children: "Base URL" }), _jsx("input", { value: baseUrl, onChange: (e) => setBaseUrl(e.target.value), placeholder: "https://openrouter.ai/api/v1", className: `${inputCls} mt-1.5 font-mono` })] }))] }), _jsxs("label", { className: "mt-4 block", children: [_jsx("span", { className: labelCls, children: "Site description" }), _jsx("span", { className: "ml-1 text-[11px] text-[#555]", children: "\u2014 what the site is, who it's for, key flows. Helps the model interpret the numbers." }), _jsx("textarea", { value: context, onChange: (e) => setContext(e.target.value), rows: 2, placeholder: "e.g. A personal notes site. Visitors read articles and browse by tag. The /admin editor is owner-only.", className: `${inputCls} mt-1.5 resize-y` })] }), _jsxs("div", { className: "mt-4 grid gap-4 sm:grid-cols-2", children: [_jsxs("label", { className: "block", children: [_jsx("span", { className: labelCls, children: "Target audience" }), _jsx("span", { className: "ml-1 text-[11px] text-[#555]", children: "\u2014 optional; guides the profile scan." }), _jsx("input", { value: audience, onChange: (e) => setAudience(e.target.value), placeholder: "e.g. Recruiters and fellow designers", className: `${inputCls} mt-1.5` })] }), _jsxs("label", { className: "block", children: [_jsx("span", { className: labelCls, children: "Ideology / values" }), _jsx("span", { className: "ml-1 text-[11px] text-[#555]", children: "\u2014 optional: what success looks like." }), _jsx("input", { value: ideology, onChange: (e) => setIdeology(e.target.value), placeholder: "e.g. Depth over clicks \u2014 long reads matter most", className: `${inputCls} mt-1.5` })] })] }), _jsxs("label", { className: "mt-4 block", children: [_jsx("span", { className: labelCls, children: "Instructions" }), _jsx("span", { className: "ml-1 text-[11px] text-[#555]", children: "\u2014 optional: tone, focus, what to call out." }), _jsx("textarea", { value: instructions, onChange: (e) => setInstructions(e.target.value), rows: 2, placeholder: "e.g. Focus on conversion blockers. Keep it blunt.", className: `${inputCls} mt-1.5 resize-y` })] }), _jsxs("div", { className: "mt-4 grid gap-4 sm:grid-cols-2", children: [_jsxs("label", { className: "block", children: [_jsx("span", { className: labelCls, children: "GitHub repository" }), _jsx("span", { className: "ml-1 text-[11px] text-[#555]", children: "\u2014 optional; enables filing bugs from losses." }), _jsx("input", { value: githubRepo, onChange: (e) => setGithubRepo(e.target.value), placeholder: "owner/repo", className: `${inputCls} mt-1.5 font-mono` })] }), _jsxs("label", { className: "block", children: [_jsx("span", { className: labelCls, children: "GitHub token" }), _jsx("span", { className: "ml-1 text-[11px] text-[#555]", children: "\u2014 Contents (read), Issues & Pull requests (write)." }), _jsx("input", { type: "password", value: githubToken, onChange: (e) => setGithubToken(e.target.value), placeholder: settings.hasGithubToken ? "•••••••• (stored — leave blank to keep)" : "github_pat_…", autoComplete: "off", className: `${inputCls} mt-1.5` })] })] }), _jsxs("label", { className: "mt-4 flex cursor-pointer items-center gap-2.5", children: [_jsx("input", { type: "checkbox", checked: autoIssues, onChange: (e) => setAutoIssues(e.target.checked), className: "h-3.5 w-3.5 shrink-0 cursor-pointer accent-white" }), _jsx("span", { className: "text-[13px] text-white", children: "Allow creating issues automatically" }), _jsx("span", { className: "text-[11px] text-[#555]", children: "\u2014 new problems are verified against the source, then filed on their own; never twice." })] }), _jsxs("label", { className: "mt-4 block", children: [_jsx("span", { className: labelCls, children: "Source folders" }), _jsx("span", { className: "ml-1 text-[11px] text-[#555]", children: "\u2014 optional, comma-separated, relative to the project root. Defaults to src / app / components / pages / lib." }), _jsx("input", { value: sourceDirs, onChange: (e) => setSourceDirs(e.target.value), placeholder: "e.g. src, content", className: `${inputCls} mt-1.5 font-mono` })] }), _jsxs("div", { className: "mt-4 flex items-center gap-3", children: [_jsx("button", { type: "button", onClick: save, disabled: pending, className: primaryBtn, children: pending ? "Saving…" : "Save settings" }), saved && _jsx("span", { className: "text-[12px] text-emerald-400", children: "Saved" }), settings.fromEnv && (_jsx("span", { className: "text-[11px] text-[#555]", children: "Defaults loaded from environment variables." }))] })] }));
386
- }
387
103
  //# sourceMappingURL=summary.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"summary.js","sourceRoot":"","sources":["../../src/dashboard/summary.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"summary.js","sourceRoot":"","sources":["../../src/dashboard/summary.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Polishd — the dashboard's shared visual vocabulary.
3
+ *
4
+ * Class strings and small icons used by more than one panel. They lived as
5
+ * copies in every file until the settings form moved into its own tab and the
6
+ * copies started to drift; one definition is what keeps the Analytics, Design
7
+ * and Settings tabs looking like the same product.
8
+ *
9
+ * No `"use client"` here on purpose — plain constants and stateless SVG work in
10
+ * either environment, and the server-rendered panels import them too.
11
+ */
12
+ export declare const border = "border-[#2e2e2e]";
13
+ export declare const card = "border border-[#2e2e2e] rounded-lg bg-[#0a0a0a]";
14
+ export declare const divider = "border-t border-[#2e2e2e]";
15
+ export declare const labelCls = "text-[11px] font-medium uppercase tracking-[0.08em] text-[#666]";
16
+ export declare const inputCls = "w-full rounded-md border border-[#2e2e2e] bg-[#111] px-3 py-2 text-[13px] text-white placeholder:text-[#555] focus:border-[#555] focus:outline-none";
17
+ export declare const primaryBtn = "rounded-md bg-white px-3 py-1.5 text-[12px] font-medium text-black transition-opacity hover:opacity-90 disabled:cursor-not-allowed disabled:opacity-40";
18
+ export declare const ghostBtn = "rounded-md border border-[#2e2e2e] px-2.5 py-1.5 text-[12px] text-[#aaa] transition-colors hover:border-[#555] hover:text-white disabled:cursor-not-allowed disabled:opacity-40";
19
+ export declare const iconBtn = "flex h-7 w-7 items-center justify-center rounded-md border border-[#2e2e2e] text-[#aaa] transition-colors hover:border-[#555] hover:text-white disabled:cursor-not-allowed disabled:opacity-40";
20
+ /** "3m ago" — coarse on purpose; these timestamps are context, not data. */
21
+ export declare function relTime(ms: number): string;
22
+ export declare function RefreshIcon({ spinning }: {
23
+ spinning?: boolean;
24
+ }): import("react").JSX.Element;
25
+ export declare function GearIcon(): import("react").JSX.Element;
26
+ export declare function ChartIcon(): import("react").JSX.Element;
27
+ export declare function DropletIcon(): import("react").JSX.Element;
28
+ /** The tab rail's in-flight marker: same 13px box as the icon it replaces. */
29
+ export declare function SpinnerIcon(): import("react").JSX.Element;
30
+ //# sourceMappingURL=ui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../src/dashboard/ui.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,eAAO,MAAM,MAAM,qBAAqB,CAAC;AACzC,eAAO,MAAM,IAAI,oDAA6C,CAAC;AAC/D,eAAO,MAAM,OAAO,8BAAuB,CAAC;AAC5C,eAAO,MAAM,QAAQ,oEAAoE,CAAC;AAC1F,eAAO,MAAM,QAAQ,wJACkI,CAAC;AACxJ,eAAO,MAAM,UAAU,2JACmI,CAAC;AAC3J,eAAO,MAAM,QAAQ,oLAC8J,CAAC;AACpL,eAAO,MAAM,OAAO,mMAC8K,CAAC;AAEnM,4EAA4E;AAC5E,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAQ1C;AAID,wBAAgB,WAAW,CAAC,EAAE,QAAgB,EAAE,EAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,+BAkBvE;AAED,wBAAgB,QAAQ,gCAiBvB;AAED,wBAAgB,SAAS,gCAkBxB;AAED,wBAAgB,WAAW,gCAgB1B;AAED,8EAA8E;AAC9E,wBAAgB,WAAW,gCAiB1B"}