@polishd/next 0.1.0 → 0.2.1-dev.0

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.
Files changed (95) hide show
  1. package/AGENTS.md +161 -46
  2. package/CHANGELOG.md +163 -0
  3. package/README.md +275 -49
  4. package/bin/doctor.mjs +374 -0
  5. package/bin/init.mjs +215 -188
  6. package/bin/polishd.mjs +85 -0
  7. package/bin/shared.mjs +114 -0
  8. package/dist/ai/actions.d.ts +13 -2
  9. package/dist/ai/actions.d.ts.map +1 -1
  10. package/dist/ai/actions.js +19 -1
  11. package/dist/ai/actions.js.map +1 -1
  12. package/dist/ai/design.d.ts +28 -0
  13. package/dist/ai/design.d.ts.map +1 -0
  14. package/dist/ai/design.js +245 -0
  15. package/dist/ai/design.js.map +1 -0
  16. package/dist/ai/guard.d.ts +44 -3
  17. package/dist/ai/guard.d.ts.map +1 -1
  18. package/dist/ai/guard.js +13 -2
  19. package/dist/ai/guard.js.map +1 -1
  20. package/dist/ai/providers.d.ts +2 -0
  21. package/dist/ai/providers.d.ts.map +1 -1
  22. package/dist/ai/providers.js +70 -0
  23. package/dist/ai/providers.js.map +1 -1
  24. package/dist/ai/settings.d.ts +15 -1
  25. package/dist/ai/settings.d.ts.map +1 -1
  26. package/dist/ai/settings.js +38 -1
  27. package/dist/ai/settings.js.map +1 -1
  28. package/dist/ai/types.d.ts +57 -0
  29. package/dist/ai/types.d.ts.map +1 -1
  30. package/dist/client/design-scan.d.ts +37 -0
  31. package/dist/client/design-scan.d.ts.map +1 -0
  32. package/dist/client/design-scan.js +319 -0
  33. package/dist/client/design-scan.js.map +1 -0
  34. package/dist/client/init.d.ts.map +1 -1
  35. package/dist/client/init.js +67 -2
  36. package/dist/client/init.js.map +1 -1
  37. package/dist/config.d.ts +57 -3
  38. package/dist/config.d.ts.map +1 -1
  39. package/dist/config.js +62 -3
  40. package/dist/config.js.map +1 -1
  41. package/dist/dashboard/design-review-card.d.ts +15 -0
  42. package/dist/dashboard/design-review-card.d.ts.map +1 -0
  43. package/dist/dashboard/design-review-card.js +82 -0
  44. package/dist/dashboard/design-review-card.js.map +1 -0
  45. package/dist/dashboard/design.d.ts +10 -0
  46. package/dist/dashboard/design.d.ts.map +1 -0
  47. package/dist/dashboard/design.js +83 -0
  48. package/dist/dashboard/design.js.map +1 -0
  49. package/dist/dashboard/index.d.ts +35 -5
  50. package/dist/dashboard/index.d.ts.map +1 -1
  51. package/dist/dashboard/index.js +176 -18
  52. package/dist/dashboard/index.js.map +1 -1
  53. package/dist/dashboard/journeys.d.ts.map +1 -1
  54. package/dist/dashboard/journeys.js +1 -0
  55. package/dist/dashboard/journeys.js.map +1 -1
  56. package/dist/dashboard/summary.d.ts.map +1 -1
  57. package/dist/dashboard/summary.js +59 -5
  58. package/dist/dashboard/summary.js.map +1 -1
  59. package/dist/dashboard/token-auth.d.ts +56 -0
  60. package/dist/dashboard/token-auth.d.ts.map +1 -0
  61. package/dist/dashboard/token-auth.js +158 -0
  62. package/dist/dashboard/token-auth.js.map +1 -0
  63. package/dist/dashboard/unlock.d.ts +2 -0
  64. package/dist/dashboard/unlock.d.ts.map +1 -0
  65. package/dist/dashboard/unlock.js +54 -0
  66. package/dist/dashboard/unlock.js.map +1 -0
  67. package/dist/dashboard.css +2740 -0
  68. package/dist/proxy.d.ts +53 -5
  69. package/dist/proxy.d.ts.map +1 -1
  70. package/dist/proxy.js +73 -3
  71. package/dist/proxy.js.map +1 -1
  72. package/dist/route.d.ts.map +1 -1
  73. package/dist/route.js +11 -3
  74. package/dist/route.js.map +1 -1
  75. package/dist/server/design.d.ts +93 -0
  76. package/dist/server/design.d.ts.map +1 -0
  77. package/dist/server/design.js +430 -0
  78. package/dist/server/design.js.map +1 -0
  79. package/dist/server/ingest.d.ts +33 -2
  80. package/dist/server/ingest.d.ts.map +1 -1
  81. package/dist/server/ingest.js +70 -8
  82. package/dist/server/ingest.js.map +1 -1
  83. package/dist/server/queries.d.ts +16 -0
  84. package/dist/server/queries.d.ts.map +1 -1
  85. package/dist/server/queries.js +80 -16
  86. package/dist/server/queries.js.map +1 -1
  87. package/dist/session.d.ts.map +1 -1
  88. package/dist/session.js +4 -2
  89. package/dist/session.js.map +1 -1
  90. package/dist/shared/types.d.ts +31 -1
  91. package/dist/shared/types.d.ts.map +1 -1
  92. package/dist/shared/types.js +1 -0
  93. package/dist/shared/types.js.map +1 -1
  94. package/docs/SETUP.md +308 -51
  95. package/package.json +14 -7
@@ -7,8 +7,12 @@
7
7
  * behavioral signals (rage/dead clicks, scroll depth, web vitals), batches
8
8
  * events, and flushes on an interval, on soft navigation, and on pagehide.
9
9
  */
10
- import { defaultPolishdConfig } from "../config";
10
+ import { defaultPolishdConfig, isDashboardPath } from "../config";
11
+ import { scheduleDesignScan } from "./design-scan";
11
12
  let started = false;
13
+ // Next inlines this at build time. Guarded for any bundler that doesn't define
14
+ // `process`, in which case we simply stay quiet.
15
+ const IS_DEV = typeof process !== "undefined" && process.env && process.env.NODE_ENV !== "production";
12
16
  export function initPolishd(options = {}) {
13
17
  // Guard: client-only, run once, respect enable flag and Do Not Track.
14
18
  if (typeof window === "undefined" || started)
@@ -26,6 +30,14 @@ export function initPolishd(options = {}) {
26
30
  let currentPath = location.pathname;
27
31
  let maxScrollPct = 0;
28
32
  const push = (e) => {
33
+ // The dashboard is where you *read* the story, not part of it. Reading it
34
+ // is browsing too — clicks, scrolls, page views — and left alone that
35
+ // traffic outranks the real site. Drop it here, at the one funnel every
36
+ // signal (including <PolishdMonitor>'s, via __polishdTrack) passes through,
37
+ // and per-event rather than once at init so a soft navigation back out to
38
+ // the real site resumes capture normally.
39
+ if (isDashboardPath(e.path ?? currentPath, cfg.dashboardRoute))
40
+ return;
29
41
  queue.push({ ts: Date.now(), path: currentPath, ...e });
30
42
  if (queue.length >= cfg.maxBatchSize)
31
43
  flush();
@@ -34,6 +46,32 @@ export function initPolishd(options = {}) {
34
46
  // events (e.g. hover) without coupling to React internals.
35
47
  window.__polishdTrack = push;
36
48
  // ---- transport -----------------------------------------------------------
49
+ // Ingest answers a missing session cookie with `ok: true` and HTTP 200 — on
50
+ // purpose, so beacons never retry — and `sendBeacon` cannot read a response
51
+ // at all. So a proxy that isn't running is invisible from the browser unless
52
+ // we deliberately look. Inspect the first fetch flush of the page; if the
53
+ // proxy is down every flush fails the same way, so one check is enough.
54
+ let diagnosed = false;
55
+ const diagnose = (res) => {
56
+ if (diagnosed || !IS_DEV)
57
+ return;
58
+ diagnosed = true;
59
+ res
60
+ .json()
61
+ .then((body) => {
62
+ if (body?.reason !== "no_session")
63
+ return;
64
+ console.warn("[polishd] events are being dropped: the request carried no session cookie, " +
65
+ "so the proxy that mints it isn't running on this path.\n" +
66
+ " Expected `proxy.ts` (Next 16+) or `middleware.ts` (Next 15) at the project " +
67
+ "root, exporting a function of the same name.\n" +
68
+ " `config.matcher` must be an inline literal and must cover this path.\n" +
69
+ " Run `npx @polishd/next doctor` to check.");
70
+ })
71
+ .catch(() => {
72
+ // A body we can't parse is not a diagnosis; stay quiet.
73
+ });
74
+ };
37
75
  const flush = (useBeacon = false) => {
38
76
  if (queue.length === 0)
39
77
  return;
@@ -51,7 +89,9 @@ export function initPolishd(options = {}) {
51
89
  headers: { "Content-Type": "application/json" },
52
90
  body,
53
91
  keepalive: true,
54
- }).catch(() => {
92
+ })
93
+ .then(diagnose)
94
+ .catch(() => {
55
95
  // Network hiccup: put events back so the next flush retries them.
56
96
  queue.unshift(...batch);
57
97
  });
@@ -153,7 +193,22 @@ export function initPolishd(options = {}) {
153
193
  push({ type: "scroll_depth", value: maxScrollPct });
154
194
  currentPath = location.pathname;
155
195
  maxScrollPct = 0;
196
+ emitViewport(); // no-op unless the session started on the dashboard
156
197
  push({ type: "page_view", path: currentPath });
198
+ emitDesignScan();
199
+ };
200
+ // ---- design scan (feeds the dashboard's Design tab) -----------------------
201
+ // One scan per path per session, after the page settles. The payload is a
202
+ // compact tally of the page's rendered typography, colors, radii and
203
+ // paddings — the deterministic input to the design review.
204
+ const emitDesignScan = () => {
205
+ const path = currentPath;
206
+ if (isDashboardPath(path, cfg.dashboardRoute))
207
+ return; // never scan the dashboard
208
+ scheduleDesignScan(path, (payloadJson, elements) => {
209
+ push({ type: "design_scan", path, meta: { payload: payloadJson, el: elements } });
210
+ flush();
211
+ });
157
212
  };
158
213
  // Patch History API so Next.js soft navigations emit page views.
159
214
  const wrapHistory = (method) => {
@@ -171,11 +226,20 @@ export function initPolishd(options = {}) {
171
226
  // dashboard. The category is stored in `text` (a plain, portable column) so
172
227
  // it can be grouped without per-backend JSON querying.
173
228
  const deviceCategory = (w) => w < 640 ? "mobile" : w < 1024 ? "tablet" : "desktop";
229
+ // One sample per session. It's session-scoped rather than page-scoped, so a
230
+ // session that happens to start on the dashboard defers it to the first real
231
+ // page instead of losing it — hence the flag rather than a single init call.
232
+ let viewportSent = false;
174
233
  const emitViewport = () => {
234
+ if (viewportSent)
235
+ return;
236
+ if (isDashboardPath(currentPath, cfg.dashboardRoute))
237
+ return;
175
238
  const w = window.innerWidth || document.documentElement.clientWidth || 0;
176
239
  const h = window.innerHeight || document.documentElement.clientHeight || 0;
177
240
  if (w <= 0)
178
241
  return;
242
+ viewportSent = true;
179
243
  push({
180
244
  type: "viewport",
181
245
  value: w,
@@ -270,5 +334,6 @@ export function initPolishd(options = {}) {
270
334
  // One device/viewport sample per session, plus the initial page view.
271
335
  emitViewport();
272
336
  push({ type: "page_view", path: currentPath });
337
+ emitDesignScan();
273
338
  }
274
339
  //# sourceMappingURL=init.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/client/init.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/client/init.ts"],"names":[],"mappings":"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"}
package/dist/config.d.ts CHANGED
@@ -6,8 +6,10 @@
6
6
  * Anthropic keys) never live here — they are read from `process.env` on the
7
7
  * server only. See `server/store.ts`.
8
8
  *
9
- * The host app can override any of these by editing the root `polishd.config.ts`
10
- * re-export, which keeps the public surface in one obvious place.
9
+ * A root `polishd.config.ts` is a convenience for keeping your overrides in one
10
+ * file — but nothing imports it for you. Whatever it exports has to be passed
11
+ * to `initPolishd()`, `createPolishdRoute()` and your proxy explicitly. See
12
+ * `definePolishdConfig` below.
11
13
  */
12
14
  export interface PolishdConfig {
13
15
  /** Whether capture is active at all. Disable to fully no-op the client. */
@@ -29,8 +31,60 @@ export interface PolishdConfig {
29
31
  databasePath: string;
30
32
  /** Name of the anonymous session cookie set by the middleware. */
31
33
  sessionCookie: string;
34
+ /**
35
+ * Route the dashboard itself is mounted at. Nothing that happens on this
36
+ * route (or below it) is ever captured — the dashboard is a tool for reading
37
+ * the story, not part of the story, and its own clicks would otherwise show
38
+ * up as the site's most-used feature. Change this only if you mounted
39
+ * `createPolishdPage()` somewhere other than `/polishd`.
40
+ */
41
+ dashboardRoute: string;
32
42
  }
33
43
  export declare const defaultPolishdConfig: PolishdConfig;
34
- /** Type-checked helper for the host app's root `polishd.config.ts`. */
44
+ /**
45
+ * Type-checked helper for the host app's root `polishd.config.ts`.
46
+ *
47
+ * Important: this file is **not** loaded automatically. It cannot be — the
48
+ * three places that need config run in three different runtimes (the browser,
49
+ * the Edge proxy, and the Node route handler), and the Edge one has no
50
+ * filesystem to read it from. So the object it returns has to be threaded to
51
+ * each of them by hand:
52
+ *
53
+ * import polishd from "@/polishd.config";
54
+ * initPolishd(polishd); // instrumentation-client.ts
55
+ * export const POST = createPolishdRoute(polishd); // api/polishd/route.ts
56
+ * const { proxy } = createPolishdProxy(polishd); // proxy.ts
57
+ *
58
+ * Miss one and the layers disagree silently: a client posting to one route
59
+ * while the handler reads another, or a proxy minting `a` while ingest looks
60
+ * for `b`, which presents as the empty dashboard described in
61
+ * {@link resolveSessionCookie}.
62
+ *
63
+ * For `sessionCookie` specifically, prefer `POLISHD_SESSION_COOKIE` — it is
64
+ * the one channel all three runtimes can read, so it cannot go half-applied.
65
+ */
35
66
  export declare function definePolishdConfig(overrides: Partial<PolishdConfig>): PolishdConfig;
67
+ /**
68
+ * Resolve the session cookie name from the one source every runtime shares.
69
+ *
70
+ * The cookie name is the single setting that *must* agree across process
71
+ * boundaries: the proxy mints it at the Edge and the ingest route reads it in
72
+ * Node. If those two disagree, every beacon arrives without a recognised
73
+ * session and is dropped — the same silent, 200-returning, empty-dashboard
74
+ * failure as a proxy that never ran at all.
75
+ *
76
+ * An explicit argument still wins, for anyone threading a config object
77
+ * deliberately. Absent that, `POLISHD_SESSION_COOKIE` is read directly, which
78
+ * both runtimes can do, so a single env var keeps them in step with nothing to
79
+ * remember.
80
+ */
81
+ export declare function resolveSessionCookie(override?: string): string;
82
+ /**
83
+ * True when `path` is the dashboard route or a page beneath it. The single
84
+ * definition of "this is the dashboard's own traffic", shared by the browser
85
+ * capture layer and the ingest endpoint so the two can't drift.
86
+ *
87
+ * A blank route disables the exclusion rather than matching everything.
88
+ */
89
+ export declare function isDashboardPath(path: string, route: string): boolean;
36
90
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,aAAa;IAC5B,2EAA2E;IAC3E,OAAO,EAAE,OAAO,CAAC;IACjB,6EAA6E;IAC7E,QAAQ,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,eAAe,EAAE,MAAM,CAAC;IACxB,6EAA6E;IAC7E,YAAY,EAAE,MAAM,CAAC;IACrB,0DAA0D;IAC1D,UAAU,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,SAAS,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/C,+EAA+E;IAC/E,YAAY,EAAE,MAAM,CAAC;IACrB,kEAAkE;IAClE,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,oBAAoB,EAAE,aASlC,CAAC;AAEF,uEAAuE;AACvE,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,aAAa,CAEpF"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,aAAa;IAC5B,2EAA2E;IAC3E,OAAO,EAAE,OAAO,CAAC;IACjB,6EAA6E;IAC7E,QAAQ,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,eAAe,EAAE,MAAM,CAAC;IACxB,6EAA6E;IAC7E,YAAY,EAAE,MAAM,CAAC;IACrB,0DAA0D;IAC1D,UAAU,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,SAAS,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/C,+EAA+E;IAC/E,YAAY,EAAE,MAAM,CAAC;IACrB,kEAAkE;IAClE,aAAa,EAAE,MAAM,CAAC;IACtB;;;;;;OAMG;IACH,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,eAAO,MAAM,oBAAoB,EAAE,aAUlC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,aAAa,CAEpF;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAK9D;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAIpE"}
package/dist/config.js CHANGED
@@ -6,8 +6,10 @@
6
6
  * Anthropic keys) never live here — they are read from `process.env` on the
7
7
  * server only. See `server/store.ts`.
8
8
  *
9
- * The host app can override any of these by editing the root `polishd.config.ts`
10
- * re-export, which keeps the public surface in one obvious place.
9
+ * A root `polishd.config.ts` is a convenience for keeping your overrides in one
10
+ * file — but nothing imports it for you. Whatever it exports has to be passed
11
+ * to `initPolishd()`, `createPolishdRoute()` and your proxy explicitly. See
12
+ * `definePolishdConfig` below.
11
13
  */
12
14
  export const defaultPolishdConfig = {
13
15
  enabled: true,
@@ -18,9 +20,66 @@ export const defaultPolishdConfig = {
18
20
  rageClick: { count: 3, windowMs: 500 },
19
21
  databasePath: ".polishd/analytics.db",
20
22
  sessionCookie: "polishd_session",
23
+ dashboardRoute: "/polishd",
21
24
  };
22
- /** Type-checked helper for the host app's root `polishd.config.ts`. */
25
+ /**
26
+ * Type-checked helper for the host app's root `polishd.config.ts`.
27
+ *
28
+ * Important: this file is **not** loaded automatically. It cannot be — the
29
+ * three places that need config run in three different runtimes (the browser,
30
+ * the Edge proxy, and the Node route handler), and the Edge one has no
31
+ * filesystem to read it from. So the object it returns has to be threaded to
32
+ * each of them by hand:
33
+ *
34
+ * import polishd from "@/polishd.config";
35
+ * initPolishd(polishd); // instrumentation-client.ts
36
+ * export const POST = createPolishdRoute(polishd); // api/polishd/route.ts
37
+ * const { proxy } = createPolishdProxy(polishd); // proxy.ts
38
+ *
39
+ * Miss one and the layers disagree silently: a client posting to one route
40
+ * while the handler reads another, or a proxy minting `a` while ingest looks
41
+ * for `b`, which presents as the empty dashboard described in
42
+ * {@link resolveSessionCookie}.
43
+ *
44
+ * For `sessionCookie` specifically, prefer `POLISHD_SESSION_COOKIE` — it is
45
+ * the one channel all three runtimes can read, so it cannot go half-applied.
46
+ */
23
47
  export function definePolishdConfig(overrides) {
24
48
  return { ...defaultPolishdConfig, ...overrides };
25
49
  }
50
+ /**
51
+ * Resolve the session cookie name from the one source every runtime shares.
52
+ *
53
+ * The cookie name is the single setting that *must* agree across process
54
+ * boundaries: the proxy mints it at the Edge and the ingest route reads it in
55
+ * Node. If those two disagree, every beacon arrives without a recognised
56
+ * session and is dropped — the same silent, 200-returning, empty-dashboard
57
+ * failure as a proxy that never ran at all.
58
+ *
59
+ * An explicit argument still wins, for anyone threading a config object
60
+ * deliberately. Absent that, `POLISHD_SESSION_COOKIE` is read directly, which
61
+ * both runtimes can do, so a single env var keeps them in step with nothing to
62
+ * remember.
63
+ */
64
+ export function resolveSessionCookie(override) {
65
+ if (override)
66
+ return override;
67
+ const fromEnv = process.env.POLISHD_SESSION_COOKIE;
68
+ if (fromEnv && fromEnv.length > 0)
69
+ return fromEnv;
70
+ return defaultPolishdConfig.sessionCookie;
71
+ }
72
+ /**
73
+ * True when `path` is the dashboard route or a page beneath it. The single
74
+ * definition of "this is the dashboard's own traffic", shared by the browser
75
+ * capture layer and the ingest endpoint so the two can't drift.
76
+ *
77
+ * A blank route disables the exclusion rather than matching everything.
78
+ */
79
+ export function isDashboardPath(path, route) {
80
+ const r = route.replace(/\/+$/, "");
81
+ if (!r)
82
+ return false;
83
+ return path === r || path.startsWith(`${r}/`);
84
+ }
26
85
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAqBH,MAAM,CAAC,MAAM,oBAAoB,GAAkB;IACjD,OAAO,EAAE,IAAI;IACb,QAAQ,EAAE,cAAc;IACxB,eAAe,EAAE,MAAM;IACvB,YAAY,EAAE,EAAE;IAChB,UAAU,EAAE,CAAC;IACb,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE;IACtC,YAAY,EAAE,uBAAuB;IACrC,aAAa,EAAE,iBAAiB;CACjC,CAAC;AAEF,uEAAuE;AACvE,MAAM,UAAU,mBAAmB,CAAC,SAAiC;IACnE,OAAO,EAAE,GAAG,oBAAoB,EAAE,GAAG,SAAS,EAAE,CAAC;AACnD,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AA6BH,MAAM,CAAC,MAAM,oBAAoB,GAAkB;IACjD,OAAO,EAAE,IAAI;IACb,QAAQ,EAAE,cAAc;IACxB,eAAe,EAAE,MAAM;IACvB,YAAY,EAAE,EAAE;IAChB,UAAU,EAAE,CAAC;IACb,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE;IACtC,YAAY,EAAE,uBAAuB;IACrC,aAAa,EAAE,iBAAiB;IAChC,cAAc,EAAE,UAAU;CAC3B,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,mBAAmB,CAAC,SAAiC;IACnE,OAAO,EAAE,GAAG,oBAAoB,EAAE,GAAG,SAAS,EAAE,CAAC;AACnD,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,oBAAoB,CAAC,QAAiB;IACpD,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;IACnD,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,OAAO,CAAC;IAClD,OAAO,oBAAoB,CAAC,aAAa,CAAC;AAC5C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,KAAa;IACzD,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACpC,IAAI,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACrB,OAAO,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAChD,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { PolishdDesignReview } from "../ai/types";
2
+ /** Re-run the deterministic metrics: refresh the server render in place. */
3
+ export declare function RefreshMetricsButton(): import("react").JSX.Element;
4
+ export interface DesignReviewCardProps {
5
+ initialReview: PolishdDesignReview | null;
6
+ initialStale: boolean;
7
+ hasApiKey: boolean;
8
+ provider: string;
9
+ model: string;
10
+ /** Pages with a design scan — 0 disables generation with a hint. */
11
+ scannedPages: number;
12
+ }
13
+ /** The model's aesthetic read of the measured design system. */
14
+ export default function DesignReviewCard({ initialReview, initialStale, hasApiKey, provider, model, scannedPages, }: DesignReviewCardProps): import("react").JSX.Element;
15
+ //# sourceMappingURL=design-review-card.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"design-review-card.d.ts","sourceRoot":"","sources":["../../src/dashboard/design-review-card.tsx"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAsB,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAwC3E,4EAA4E;AAC5E,wBAAgB,oBAAoB,gCAenC;AAED,MAAM,WAAW,qBAAqB;IACpC,aAAa,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAC1C,YAAY,EAAE,OAAO,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,oEAAoE;IACpE,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,gEAAgE;AAChE,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,EACvC,aAAa,EACb,YAAY,EACZ,SAAS,EACT,QAAQ,EACR,KAAK,EACL,YAAY,GACb,EAAE,qBAAqB,+BA8FvB"}
@@ -0,0 +1,82 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ /**
4
+ * Polishd — Design tab client pieces.
5
+ *
6
+ * Two interactive controls sit on the otherwise server-rendered Design tab:
7
+ *
8
+ * • `RefreshMetricsButton` — re-runs the deterministic metrics by refreshing
9
+ * the server render (new scans land in the store as visitors browse; this
10
+ * pulls them in without a full reload).
11
+ * • `DesignReviewCard` — the AI's aesthetic read of those metrics. Rendered
12
+ * from the cached review handed down by the server; a model is only called
13
+ * on the explicit refresh action. Uses the same provider/model/key the
14
+ * owner configured for the analytics summary.
15
+ */
16
+ import { useState, useTransition } from "react";
17
+ import { useRouter } from "next/navigation";
18
+ import { generateDesignReviewAction } from "../ai/actions";
19
+ const border = "border-[#2e2e2e]";
20
+ const card = `border ${border} rounded-lg bg-[#0a0a0a]`;
21
+ const labelCls = "text-[11px] font-medium uppercase tracking-[0.08em] text-[#666]";
22
+ 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";
23
+ 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";
24
+ function relTime(ms) {
25
+ const s = Math.max(0, Math.round((Date.now() - ms) / 1000));
26
+ if (s < 60)
27
+ return "just now";
28
+ const m = Math.round(s / 60);
29
+ if (m < 60)
30
+ return `${m}m ago`;
31
+ const h = Math.round(m / 60);
32
+ if (h < 24)
33
+ return `${h}h ago`;
34
+ return `${Math.round(h / 24)}d ago`;
35
+ }
36
+ function RefreshIcon({ spinning }) {
37
+ 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" })] }));
38
+ }
39
+ /** Re-run the deterministic metrics: refresh the server render in place. */
40
+ export function RefreshMetricsButton() {
41
+ const router = useRouter();
42
+ const [pending, startRefresh] = useTransition();
43
+ return (_jsxs("button", { type: "button", onClick: () => startRefresh(() => router.refresh()), disabled: pending, title: "Recompute the design metrics from the latest page scans", className: "flex items-center gap-1.5 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", children: [_jsx(RefreshIcon, { spinning: pending }), pending ? "Refreshing…" : "Refresh metrics"] }));
44
+ }
45
+ /** The model's aesthetic read of the measured design system. */
46
+ export default function DesignReviewCard({ initialReview, initialStale, hasApiKey, provider, model, scannedPages, }) {
47
+ const [review, setReview] = useState(initialReview);
48
+ const [stale, setStale] = useState(initialStale);
49
+ const [error, setError] = useState(null);
50
+ const [pending, startGenerate] = useTransition();
51
+ const generate = (force) => {
52
+ setError(null);
53
+ startGenerate(async () => {
54
+ const res = await generateDesignReviewAction(force);
55
+ if (res.ok) {
56
+ setReview(res.review);
57
+ setStale(false);
58
+ }
59
+ else {
60
+ setError(res.message);
61
+ }
62
+ });
63
+ };
64
+ const canGenerate = hasApiKey && scannedPages > 0;
65
+ 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: "Aesthetic review" }), hasApiKey && (_jsxs("span", { className: "hidden rounded-full bg-[#1a1a1a] px-2 py-0.5 text-[10px] font-medium text-[#888] sm:inline", children: [provider, " \u00B7 ", model] }))] }), _jsx("button", { type: "button", onClick: () => generate(review !== null), disabled: pending || !canGenerate, title: !hasApiKey
66
+ ? "Connect a model first (Analytics tab → summary card settings)"
67
+ : scannedPages === 0
68
+ ? "No pages scanned yet"
69
+ : "Regenerate the design review now", "aria-label": "Refresh design review", className: iconBtn, children: _jsx(RefreshIcon, { spinning: pending }) })] }), _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 })), review ? (_jsxs(_Fragment, { children: [_jsx("p", { className: "text-[14px] leading-relaxed text-[#e4e4e4]", children: review.text }), _jsx(StrengthsIssues, { strengths: review.strengths, issues: review.issues }), _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(review.generatedAt), " \u00B7 ", review.provider, "/", review.model] }), stale && (_jsx("span", { className: "rounded-full bg-amber-950/50 px-2 py-0.5 text-amber-400", children: "Metrics changed since this review \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: !hasApiKey
70
+ ? "No model connected. Configure one in the Analytics tab's summary card — the design review uses the same provider and key."
71
+ : scannedPages === 0
72
+ ? "No pages scanned yet — browse the site and the design metrics will appear here."
73
+ : "No review yet — ask the model how coherent this design system reads, and what would sharpen it." }), _jsx("button", { type: "button", onClick: () => generate(false), disabled: pending || !canGenerate, className: primaryBtn, children: pending ? "Reviewing…" : "Generate review" })] }))] })] }));
74
+ }
75
+ function StrengthsIssues({ strengths, issues, }) {
76
+ const hasStrengths = !!strengths?.length;
77
+ const hasIssues = !!issues?.length;
78
+ if (!hasStrengths && !hasIssues)
79
+ return null;
80
+ return (_jsxs("div", { className: "mt-4 grid gap-4 sm:grid-cols-2", children: [hasStrengths && (_jsxs("div", { children: [_jsx("div", { className: `${labelCls} mb-2 text-emerald-500`, children: "Working" }), _jsx("ul", { className: "space-y-1.5", children: strengths.map((s, 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: s })] }, i))) })] })), hasIssues && (_jsxs("div", { children: [_jsx("div", { className: `${labelCls} mb-2 text-amber-400`, children: "Breaking the system" }), _jsx("ul", { className: "space-y-2.5", children: issues.map((iss, i) => (_jsxs("li", { className: "flex gap-2 text-[13px] leading-snug text-[#bbb]", children: [_jsx("span", { className: "mt-px shrink-0 text-amber-400", children: "\u2715" }), _jsxs("span", { children: [iss.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: iss.evidence }), iss.suggestion && (_jsxs("span", { className: "rounded bg-[#101c14] px-1.5 py-0.5 text-[10px] text-emerald-500", children: ["\u2192 ", iss.suggestion] }))] })] })] }, i))) })] }))] }));
81
+ }
82
+ //# sourceMappingURL=design-review-card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"design-review-card.js","sourceRoot":"","sources":["../../src/dashboard/design-review-card.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { PolishdDesignData } from "../server/design";
2
+ import type { PolishdAISettingsPublic, PolishdDesignReview } from "../ai/types";
3
+ export interface DesignPanelProps {
4
+ data: PolishdDesignData;
5
+ review: PolishdDesignReview | null;
6
+ reviewStale: boolean;
7
+ settings: PolishdAISettingsPublic;
8
+ }
9
+ export declare function DesignPanel({ data, review, reviewStale, settings }: DesignPanelProps): import("react").JSX.Element;
10
+ //# sourceMappingURL=design.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"design.d.ts","sourceRoot":"","sources":["../../src/dashboard/design.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAGV,iBAAiB,EAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAyThF,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,iBAAiB,CAAC;IACxB,MAAM,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACnC,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,uBAAuB,CAAC;CACnC;AAED,wBAAgB,WAAW,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,gBAAgB,+BAoEpF"}
@@ -0,0 +1,83 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import DesignReviewCard, { RefreshMetricsButton } from "./design-review-card";
3
+ const border = "border-[#2e2e2e]";
4
+ const card = `border ${border} rounded-lg bg-[#0a0a0a]`;
5
+ const label = "text-[11px] font-medium uppercase tracking-[0.08em] text-[#666]";
6
+ const divider = `border-t ${border}`;
7
+ function OutlierBadge({ text = "one-off" }) {
8
+ return (_jsx("span", { className: "rounded px-1.5 py-0.5 text-[9px] font-semibold uppercase tracking-wider bg-amber-950 text-amber-400", children: text }));
9
+ }
10
+ /** The deterministic findings for one section, rendered inside its card. */
11
+ function SectionFlags({ flags, section }) {
12
+ const own = flags.filter((f) => f.section === section);
13
+ if (own.length === 0)
14
+ return null;
15
+ return (_jsx("div", { className: "space-y-2 px-4 pt-4 sm:px-5", children: own.map((f, i) => (_jsx("div", { className: `rounded-md border px-3 py-2 text-[12px] leading-relaxed ${f.severity === "warn"
16
+ ? "border-amber-900/50 bg-amber-950/30 text-amber-400"
17
+ : "border-[#1e3a5f]/60 bg-[#0c1a2b]/60 text-[#7fb2e5]"}`, children: f.message }, i))) }));
18
+ }
19
+ function Section({ title, tip, children }) {
20
+ return (_jsxs("section", { className: "mb-8", children: [_jsxs("div", { className: `mb-3 flex items-baseline gap-2 ${label}`, children: [title, tip && _jsx("span", { className: "normal-case tracking-normal text-[11px] font-normal text-[#444]", children: tip })] }), children] }));
21
+ }
22
+ // ── Typography ───────────────────────────────────────────────────────────────
23
+ function TypographySection({ data }) {
24
+ const shown = data.fonts.slice(0, 14);
25
+ const hidden = data.fonts.length - shown.length;
26
+ return (_jsx(Section, { title: "Typography", tip: "\u2014 every family / size / weight combination rendered on the site, most used first.", children: _jsxs("div", { className: `${card} overflow-hidden`, children: [_jsx(SectionFlags, { flags: data.flags, section: "typography" }), data.families.length > 0 && (_jsx("div", { className: "flex flex-wrap items-center gap-2 px-4 pt-4 sm:px-5", children: data.families.map((f) => (_jsxs("span", { className: "rounded-full border border-[#2e2e2e] px-2.5 py-1 text-[11px] text-[#aaa]", children: [f.family, " ", _jsxs("span", { className: "text-[#555]", children: ["\u00B7 ", f.count.toLocaleString(), " uses"] })] }, f.family))) })), _jsxs("div", { className: "mt-2", children: [shown.map((f, i) => (_jsxs("div", { className: `flex flex-wrap items-baseline gap-x-4 gap-y-1 px-4 py-3 sm:px-5 ${i > 0 ? divider : ""}`, children: [_jsx("span", { className: "min-w-0 flex-1 truncate text-white", style: {
27
+ fontFamily: `"${f.family}", ui-sans-serif, system-ui, sans-serif`,
28
+ fontSize: `${Math.min(f.sizePx, 34)}px`,
29
+ fontWeight: f.weight,
30
+ lineHeight: 1.25,
31
+ }, children: f.sample || "The quick brown fox jumps over the lazy dog" }), _jsxs("span", { className: "flex shrink-0 items-center gap-1.5 text-[11px] tabular-nums text-[#666]", children: [_jsxs("span", { className: "text-[#aaa]", children: [f.sizePx, "px / ", f.weight] }), "\u00B7 ", f.count.toLocaleString(), " uses \u00B7 ", f.pages.length, " ", f.pages.length === 1 ? "page" : "pages", f.tags.length > 0 && _jsxs("span", { className: "text-[#444]", children: ["\u00B7 ", f.tags.join(", ")] }), f.outlier && _jsx(OutlierBadge, {})] })] }, `${f.family}|${f.sizePx}|${f.weight}`))), hidden > 0 && (_jsxs("p", { className: `px-4 py-3 text-[11px] text-[#555] sm:px-5 ${divider}`, children: ["\u2026and ", hidden, " more type ", hidden === 1 ? "style" : "styles", " \u2014 a long tail this size is itself a cohesion signal."] }))] })] }) }));
32
+ }
33
+ // ── Palette ──────────────────────────────────────────────────────────────────
34
+ function roleLabel(roles) {
35
+ const parts = [];
36
+ if (roles.text > 0)
37
+ parts.push("text");
38
+ if (roles.background > 0)
39
+ parts.push("bg");
40
+ if (roles.border > 0)
41
+ parts.push("border");
42
+ return parts.join(" · ");
43
+ }
44
+ function PaletteSection({ data }) {
45
+ const primary = data.colors.slice(0, 6);
46
+ const rest = data.colors.slice(6, 30);
47
+ return (_jsx(Section, { title: "Color palette", tip: "\u2014 the colors your pages actually paint, weighted by how much of the UI they cover.", children: _jsxs("div", { className: `${card} overflow-hidden pb-4`, children: [_jsx(SectionFlags, { flags: data.flags, section: "color" }), primary.length > 0 && (_jsx("div", { className: "grid grid-cols-3 gap-3 px-4 pt-4 sm:grid-cols-6 sm:px-5", children: primary.map((c) => (_jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "h-16 w-full rounded-md border border-[#2e2e2e]", style: { backgroundColor: c.hex } }), _jsx("div", { className: "mt-1.5 truncate font-mono text-[11px] text-[#ccc]", children: c.hex }), _jsxs("div", { className: "flex flex-wrap items-center gap-1 text-[10px] text-[#555]", children: [_jsxs("span", { className: "tabular-nums", children: [c.pct, "%"] }), _jsxs("span", { children: ["\u00B7 ", roleLabel(c.roles)] }), c.outlier && _jsx(OutlierBadge, {})] })] }, c.hex))) })), rest.length > 0 && (_jsx("div", { className: "mt-4 flex flex-wrap gap-2 px-4 sm:px-5", children: rest.map((c) => (_jsxs("span", { className: "flex items-center gap-1.5 rounded-full border border-[#2e2e2e] py-1 pl-1.5 pr-2.5", title: `${c.hex} · ${c.pct}% · ${roleLabel(c.roles)} · ${c.pages.length} page(s)`, children: [_jsx("span", { className: "h-4 w-4 rounded-full border border-[#2e2e2e]", style: { backgroundColor: c.hex } }), _jsx("span", { className: "font-mono text-[10px] text-[#999]", children: c.hex }), c.outlier && _jsx(OutlierBadge, {})] }, c.hex))) }))] }) }));
48
+ }
49
+ // ── Contrast ─────────────────────────────────────────────────────────────────
50
+ function ContrastSection({ data }) {
51
+ const failing = data.contrast.filter((p) => !p.passes);
52
+ if (data.contrast.length === 0)
53
+ return null;
54
+ return (_jsx(Section, { title: "Contrast", tip: "\u2014 every text-on-background pairing measured against WCAG AA.", children: _jsxs("div", { className: `${card} overflow-hidden`, children: [_jsx(SectionFlags, { flags: data.flags, section: "contrast" }), failing.length === 0 ? (_jsxs("p", { className: "px-4 py-4 text-[13px] text-emerald-500 sm:px-5", children: ["All ", data.contrast.length, " measured text/background pairs meet WCAG AA. Nice."] })) : (_jsx("div", { className: "mt-2", children: failing.slice(0, 8).map((p, i) => (_jsxs("div", { className: `flex flex-wrap items-center gap-3 px-4 py-3 sm:px-5 ${i > 0 ? divider : ""}`, children: [_jsx("span", { className: "flex h-9 w-14 shrink-0 items-center justify-center rounded-md border border-[#2e2e2e] text-[14px] font-medium", style: { backgroundColor: p.bg, color: p.fg }, children: "Aa" }), _jsxs("span", { className: "font-mono text-[11px] text-[#999]", children: [p.fg, " on ", p.bg] }), _jsxs("span", { className: "text-[12px] tabular-nums text-red-400", children: [p.ratio, ":1 ", _jsxs("span", { className: "text-[#666]", children: ["(needs ", p.required, ":1 at ", p.minSizePx, "px)"] })] }), _jsxs("span", { className: "text-[11px] text-[#555]", children: [p.pages.slice(0, 2).join(", "), p.pages.length > 2 ? ", …" : ""] })] }, `${p.fg}|${p.bg}`))) }))] }) }));
55
+ }
56
+ // ── Radii & spacing ──────────────────────────────────────────────────────────
57
+ function RadiusSection({ data }) {
58
+ if (data.radii.length === 0)
59
+ return null;
60
+ return (_jsx(Section, { title: "Corner radii", tip: "\u2014 rounding in use on visible boxes and controls.", children: _jsxs("div", { className: `${card} overflow-hidden pb-4`, children: [_jsx(SectionFlags, { flags: data.flags, section: "radius" }), _jsx("div", { className: "flex flex-wrap items-end gap-4 px-4 pt-4 sm:px-5", children: data.radii.slice(0, 12).map((r) => (_jsxs("div", { className: "flex flex-col items-center gap-1.5", children: [_jsx("div", { className: "h-12 w-12 border border-[#555] bg-[#161616]", style: {
61
+ borderRadius: r.value === "full" ? "9999px" : r.value.replace(" (mixed)", ""),
62
+ } }), _jsxs("div", { className: "flex items-center gap-1 text-[11px] text-[#999]", children: [_jsx("span", { className: "font-mono", children: r.value }), r.outlier && _jsx(OutlierBadge, {})] }), _jsxs("span", { className: "text-[10px] tabular-nums text-[#555]", children: ["\u00D7", r.count.toLocaleString()] })] }, r.value))) })] }) }));
63
+ }
64
+ function SpacingSection({ data }) {
65
+ if (data.spacing.length === 0)
66
+ return null;
67
+ const scale = [...data.spacing].sort((a, b) => a.px - b.px).slice(0, 18);
68
+ const max = Math.max(...scale.map((s) => s.px), 1);
69
+ return (_jsx(Section, { title: "Spacing", tip: "\u2014 padding values in use, as a scale. Bars are to scale.", children: _jsxs("div", { className: `${card} overflow-hidden pb-4`, children: [_jsx(SectionFlags, { flags: data.flags, section: "spacing" }), _jsx("div", { className: "space-y-1.5 px-4 pt-4 sm:px-5", children: scale.map((s) => (_jsxs("div", { className: "flex items-center gap-3", children: [_jsxs("span", { className: "w-12 shrink-0 text-right font-mono text-[11px] tabular-nums text-[#999]", children: [s.px, "px"] }), _jsx("div", { className: "h-3 flex-1 overflow-hidden rounded-sm bg-[#141414]", children: _jsx("div", { className: `h-full rounded-sm ${s.offGrid ? "bg-amber-500/70" : "bg-blue-500/80"}`, style: { width: `${Math.max((s.px / max) * 100, 2)}%` } }) }), _jsxs("span", { className: "w-16 shrink-0 text-right text-[11px] tabular-nums text-[#555]", children: ["\u00D7", s.count.toLocaleString()] }), _jsx("span", { className: "w-14 shrink-0 text-[10px] text-amber-400", children: s.offGrid ? "off-grid" : "" })] }, s.px))) })] }) }));
70
+ }
71
+ // ── Scanned pages ────────────────────────────────────────────────────────────
72
+ function ScannedPages({ data }) {
73
+ if (data.pages.length === 0)
74
+ return null;
75
+ return (_jsx(Section, { title: "Scanned pages", tip: "\u2014 latest design scan per route; the dashboard itself is never scanned.", children: _jsx("div", { className: card, children: data.pages.map((p, i) => (_jsxs("div", { className: `flex items-center justify-between gap-3 px-4 py-2.5 sm:px-5 ${i > 0 ? divider : ""}`, children: [_jsx("span", { className: "truncate font-mono text-[12px] text-[#ccc]", children: p.path }), _jsxs("span", { className: "shrink-0 text-[11px] tabular-nums text-[#555]", children: [p.elements.toLocaleString(), " elements \u00B7", " ", new Date(p.scannedAt).toLocaleDateString(undefined, { month: "short", day: "numeric" })] })] }, p.path))) }) }));
76
+ }
77
+ export function DesignPanel({ data, review, reviewStale, settings }) {
78
+ const hasScans = data.pages.length > 0;
79
+ return (_jsxs("main", { className: "text-white", children: [_jsxs("div", { className: `mb-8 flex items-start justify-between gap-3 border-b ${border} pb-6`, children: [_jsxs("div", { children: [_jsx("h1", { className: "text-[22px] font-semibold tracking-tight text-white", children: "Design review" }), _jsx("p", { className: "mt-1 max-w-xl text-[13px] leading-relaxed text-[#666]", children: "Your site's brand guideline, reverse-engineered from the rendered pages \u2014 the typography, palette, radii and spacing it actually ships, with anything that breaks the system flagged." })] }), _jsxs("div", { className: "flex shrink-0 items-center gap-2", children: [_jsx(RefreshMetricsButton, {}), _jsx("div", { className: `whitespace-nowrap rounded-full px-3 py-1 text-[11px] font-medium ${hasScans ? "bg-emerald-950 text-emerald-400" : "bg-[#1a1a1a] text-[#666]"}`, children: hasScans
80
+ ? `● ${data.pages.length} ${data.pages.length === 1 ? "page" : "pages"} scanned`
81
+ : "○ no scans yet" })] })] }), !data.ready && (_jsxs("div", { className: "mb-8 rounded-lg border border-amber-900/50 bg-amber-950/30 px-4 py-3 text-[13px] text-amber-400", children: ["The analytics store isn't writable in this environment. Run locally or configure a database \u2014 see the ", _jsx("span", { className: "font-mono text-amber-300", children: "@polishd/next" }), " ", "DATABASE.md guide."] })), data.ready && !hasScans && (_jsx("div", { className: `mb-8 ${card} px-5 py-8 text-center`, children: _jsx("p", { className: "text-[13px] text-[#888]", children: "No design scans captured yet. Each page measures its own rendered design (fonts, colors, radii, spacing) once per visitor session \u2014 browse a few pages of the site, then refresh the metrics." }) })), _jsx(DesignReviewCard, { initialReview: review, initialStale: reviewStale, hasApiKey: settings.hasApiKey, provider: settings.provider, model: settings.model, scannedPages: data.pages.length }), hasScans && (_jsxs(_Fragment, { children: [_jsx(TypographySection, { data: data }), _jsx(PaletteSection, { data: data }), _jsx(ContrastSection, { data: data }), _jsx(RadiusSection, { data: data }), _jsx(SpacingSection, { data: data }), _jsx(ScannedPages, { data: data })] }))] }));
82
+ }
83
+ //# sourceMappingURL=design.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"design.js","sourceRoot":"","sources":["../../src/dashboard/design.tsx"],"names":[],"mappings":"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"}