@polishd/next 0.2.3-dev.4 → 0.2.3-dev.6

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 (61) hide show
  1. package/CHANGELOG.md +63 -0
  2. package/README.md +12 -5
  3. package/bin/init.mjs +4 -1
  4. package/dist/ai/actions.d.ts +7 -1
  5. package/dist/ai/actions.d.ts.map +1 -1
  6. package/dist/ai/actions.js +10 -1
  7. package/dist/ai/actions.js.map +1 -1
  8. package/dist/ai/design.d.ts +5 -1
  9. package/dist/ai/design.d.ts.map +1 -1
  10. package/dist/ai/design.js +21 -4
  11. package/dist/ai/design.js.map +1 -1
  12. package/dist/ai/issues.d.ts +22 -11
  13. package/dist/ai/issues.d.ts.map +1 -1
  14. package/dist/ai/issues.js +102 -43
  15. package/dist/ai/issues.js.map +1 -1
  16. package/dist/ai/types.d.ts +3 -0
  17. package/dist/ai/types.d.ts.map +1 -1
  18. package/dist/dashboard/design-review-card.d.ts +3 -1
  19. package/dist/dashboard/design-review-card.d.ts.map +1 -1
  20. package/dist/dashboard/design-review-card.js +14 -6
  21. package/dist/dashboard/design-review-card.js.map +1 -1
  22. package/dist/dashboard/design.d.ts.map +1 -1
  23. package/dist/dashboard/design.js +75 -17
  24. package/dist/dashboard/design.js.map +1 -1
  25. package/dist/dashboard/file-bug-button.d.ts +14 -0
  26. package/dist/dashboard/file-bug-button.d.ts.map +1 -0
  27. package/dist/dashboard/file-bug-button.js +37 -0
  28. package/dist/dashboard/file-bug-button.js.map +1 -0
  29. package/dist/dashboard/snapshot-actions.d.ts +15 -5
  30. package/dist/dashboard/snapshot-actions.d.ts.map +1 -1
  31. package/dist/dashboard/snapshot-actions.js +69 -24
  32. package/dist/dashboard/snapshot-actions.js.map +1 -1
  33. package/dist/dashboard/snapshots.d.ts.map +1 -1
  34. package/dist/dashboard/snapshots.js +58 -8
  35. package/dist/dashboard/snapshots.js.map +1 -1
  36. package/dist/dashboard/summary.d.ts.map +1 -1
  37. package/dist/dashboard/summary.js +8 -36
  38. package/dist/dashboard/summary.js.map +1 -1
  39. package/dist/dashboard/ui.d.ts +1 -0
  40. package/dist/dashboard/ui.d.ts.map +1 -1
  41. package/dist/dashboard/ui.js +1 -0
  42. package/dist/dashboard/ui.js.map +1 -1
  43. package/dist/dashboard/value-preview.d.ts +47 -0
  44. package/dist/dashboard/value-preview.d.ts.map +1 -0
  45. package/dist/dashboard/value-preview.js +138 -0
  46. package/dist/dashboard/value-preview.js.map +1 -0
  47. package/dist/dashboard.css +170 -50
  48. package/dist/server/snapshots.d.ts +69 -10
  49. package/dist/server/snapshots.d.ts.map +1 -1
  50. package/dist/server/snapshots.js +407 -158
  51. package/dist/server/snapshots.js.map +1 -1
  52. package/dist/server/value-previews.d.ts +47 -0
  53. package/dist/server/value-previews.d.ts.map +1 -0
  54. package/dist/server/value-previews.js +313 -0
  55. package/dist/server/value-previews.js.map +1 -0
  56. package/dist/shared/design-values.d.ts +71 -0
  57. package/dist/shared/design-values.d.ts.map +1 -0
  58. package/dist/shared/design-values.js +98 -0
  59. package/dist/shared/design-values.js.map +1 -0
  60. package/docs/SETUP.md +10 -0
  61. package/package.json +1 -1
@@ -1,12 +1,59 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { designValueKey } from "../shared/design-values";
2
3
  import DesignReviewCard, { RefreshMetricsButton } from "./design-review-card";
3
4
  import SnapshotsCard from "./snapshots";
4
5
  import { Annotated, ColorToken, ContrastMeter, contrastPercent } from "./design-tokens";
5
6
  import OverflowRow from "./overflow-row";
6
7
  import ShowMore from "./show-more";
7
8
  import { border, card, divider, labelCls as label } from "./ui";
9
+ import ValuePreview from "./value-preview";
8
10
  /** Rows shown before a list collapses behind "Show more". */
9
11
  const VISIBLE_ROWS = 5;
12
+ /**
13
+ * Index the snapshots' value pictures. A value's newest picture wins, from
14
+ * whichever snapshot took it — an older picture of a value that's still
15
+ * flagged still shows where it lived. Without one, the newest snapshot's
16
+ * "looked and didn't find it" is the next most useful thing to say.
17
+ */
18
+ function previewIndex(snapshots) {
19
+ const pictured = new Map();
20
+ for (const s of snapshots) {
21
+ for (const p of s.previews ?? []) {
22
+ if (pictured.has(p.key))
23
+ continue;
24
+ pictured.set(p.key, {
25
+ snapshotId: s.id,
26
+ file: p.file,
27
+ route: p.route,
28
+ device: p.device,
29
+ theme: p.theme,
30
+ capturedAt: s.capturedAt,
31
+ });
32
+ }
33
+ }
34
+ const latest = snapshots[0];
35
+ const missed = new Set(latest?.previewMisses ?? []);
36
+ return (ref) => {
37
+ const key = designValueKey(ref);
38
+ const preview = pictured.get(key);
39
+ if (preview)
40
+ return { kind: "pictured", preview };
41
+ if (latest && missed.has(key))
42
+ return { kind: "missed", capturedAt: latest.capturedAt };
43
+ return { kind: "none", hasSnapshots: snapshots.length > 0 };
44
+ };
45
+ }
46
+ /**
47
+ * A value's markup, wrapped in its hover card when it's flagged — one-off or
48
+ * off-grid — and rendered as a plain box otherwise.
49
+ */
50
+ function Flaggable({ flagged, value, label: valueLabel, pages, previews, className, flaggedClassName, children, }) {
51
+ if (!flagged)
52
+ return _jsx("div", { className: className, children: children });
53
+ return (_jsx(ValuePreview, { label: valueLabel, pages: pages, state: previews(value), className: `${className} ${flaggedClassName}`, children: children }));
54
+ }
55
+ /** Rows highlight on hover and keyboard focus alike. */
56
+ const FLAGGED_ROW = "transition-colors hover:bg-[#111] focus-visible:bg-[#111]";
10
57
  function OutlierBadge({ text = "one-off" }) {
11
58
  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 }));
12
59
  }
@@ -28,18 +75,18 @@ function Section({ title, tip, children }) {
28
75
  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] }));
29
76
  }
30
77
  // ── Typography ───────────────────────────────────────────────────────────────
31
- function FontRow({ f, first }) {
32
- return (_jsxs("div", { className: `flex flex-wrap items-baseline gap-x-4 gap-y-1 px-4 py-3 sm:px-5 ${first ? "" : divider}`, children: [_jsx("span", { className: "min-w-0 flex-1 truncate text-white", style: {
78
+ function FontRow({ f, first, previews, }) {
79
+ return (_jsxs(Flaggable, { flagged: f.outlier, value: { kind: "font", family: f.family, sizePx: f.sizePx, weight: f.weight }, label: `${f.sizePx}px / ${f.weight}`, pages: f.pages, previews: previews, className: `flex flex-wrap items-baseline gap-x-4 gap-y-1 px-4 py-3 sm:px-5 ${first ? "" : divider}`, flaggedClassName: FLAGGED_ROW, children: [_jsx("span", { className: "min-w-0 flex-1 truncate text-white", style: {
33
80
  fontFamily: `"${f.family}", ui-sans-serif, system-ui, sans-serif`,
34
81
  fontSize: `${Math.min(f.sizePx, 34)}px`,
35
82
  fontWeight: f.weight,
36
83
  lineHeight: 1.25,
37
84
  }, 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, {})] })] }));
38
85
  }
39
- function TypographySection({ data }) {
86
+ function TypographySection({ data, previews }) {
40
87
  const visible = data.fonts.slice(0, VISIBLE_ROWS);
41
88
  const overflow = data.fonts.slice(VISIBLE_ROWS, 40);
42
- 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: [visible.map((f, i) => (_jsx(FontRow, { f: f, first: i === 0 }, `${f.family}|${f.sizePx}|${f.weight}`))), _jsx(ShowMore, { count: overflow.length, label: "type styles", children: overflow.map((f) => (_jsx(FontRow, { f: f, first: false }, `${f.family}|${f.sizePx}|${f.weight}`))) })] })] }) }));
89
+ return (_jsx(Section, { title: "Typography", tip: "\u2014 every family / size / weight combination rendered on the site, most used first. Hover a one-off to see where it renders.", 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: [visible.map((f, i) => (_jsx(FontRow, { f: f, first: i === 0, previews: previews }, `${f.family}|${f.sizePx}|${f.weight}`))), _jsx(ShowMore, { count: overflow.length, label: "type styles", children: overflow.map((f) => (_jsx(FontRow, { f: f, first: false, previews: previews }, `${f.family}|${f.sizePx}|${f.weight}`))) })] })] }) }));
43
90
  }
44
91
  // ── Palette ──────────────────────────────────────────────────────────────────
45
92
  function roleLabel(roles) {
@@ -52,13 +99,23 @@ function roleLabel(roles) {
52
99
  parts.push("border");
53
100
  return parts.join(" · ");
54
101
  }
55
- function ColorChip({ c }) {
56
- return (_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, {})] }));
102
+ function colorRef(c) {
103
+ const roles = ["text", "background", "border"].filter((r) => c.roles[r] > 0);
104
+ return { kind: "color", hex: c.hex, roles: [...roles] };
105
+ }
106
+ function ColorChip({ c, previews }) {
107
+ const chip = "flex items-center gap-1.5 rounded-full border border-[#2e2e2e] py-1 pl-1.5 pr-2.5";
108
+ const body = (_jsxs(_Fragment, { 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, {})] }));
109
+ // A flagged chip's hover card carries everything the tooltip would.
110
+ if (c.outlier) {
111
+ return (_jsx(ValuePreview, { label: c.hex, pages: c.pages, state: previews(colorRef(c)), className: `${chip} transition-colors hover:border-[#555] focus-visible:border-[#777]`, children: body }));
112
+ }
113
+ return (_jsx("span", { className: chip, title: `${c.hex} · ${c.pct}% · ${roleLabel(c.roles)} · ${c.pages.length} page(s)`, children: body }));
57
114
  }
58
- function PaletteSection({ data }) {
115
+ function PaletteSection({ data, previews }) {
59
116
  const primary = data.colors.slice(0, 6);
60
117
  const chips = data.colors.slice(6, 48);
61
- 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))) })), chips.length > 0 && (_jsx(OverflowRow, { label: "colors", className: "mt-4 px-4 sm:px-5", rowClassName: "flex flex-wrap gap-2", children: chips.map((c) => (_jsx(ColorChip, { c: c }, c.hex))) }))] }) }));
118
+ return (_jsx(Section, { title: "Color palette", tip: "\u2014 the colors your pages actually paint, weighted by how much of the UI they cover. Hover a one-off to see where it renders.", 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(Flaggable, { flagged: c.outlier, value: colorRef(c), label: c.hex, pages: c.pages, previews: previews, className: "min-w-0", flaggedClassName: "rounded-md focus-visible:ring-1 focus-visible:ring-amber-500/60", 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))) })), chips.length > 0 && (_jsx(OverflowRow, { label: "colors", className: "mt-4 px-4 sm:px-5", rowClassName: "flex flex-wrap gap-2", children: chips.map((c) => (_jsx(ColorChip, { c: c, previews: previews }, c.hex))) }))] }) }));
62
119
  }
63
120
  // ── Contrast ─────────────────────────────────────────────────────────────────
64
121
  function ContrastRow({ p, first }) {
@@ -73,28 +130,28 @@ function ContrastSection({ data }) {
73
130
  return (_jsx(Section, { title: "Contrast", tip: "\u2014 every text-on-background pairing measured against WCAG AA.", children: _jsx("div", { className: `${card} overflow-hidden`, children: 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."] })) : (_jsxs("div", { className: "mt-2", children: [visible.map((p, i) => (_jsx(ContrastRow, { p: p, first: i === 0 }, `${p.fg}|${p.bg}`))), _jsx(ShowMore, { count: overflow.length, label: "failing pairs", children: overflow.map((p) => (_jsx(ContrastRow, { p: p, first: false }, `${p.fg}|${p.bg}`))) })] })) }) }));
74
131
  }
75
132
  // ── Radii & spacing ──────────────────────────────────────────────────────────
76
- function RadiusChip({ r }) {
77
- return (_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: {
133
+ function RadiusChip({ r, previews }) {
134
+ return (_jsxs(Flaggable, { flagged: r.outlier, value: { kind: "radius", value: r.value }, label: `${r.value} radius`, pages: r.pages, previews: previews, className: "flex flex-col items-center gap-1.5", flaggedClassName: `-m-1.5 rounded-md p-1.5 ${FLAGGED_ROW}`, children: [_jsx("div", { className: "h-12 w-12 border border-[#555] bg-[#161616]", style: {
78
135
  borderRadius: r.value === "full" ? "9999px" : r.value.replace(" (mixed)", ""),
79
136
  } }), _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()] })] }));
80
137
  }
81
- function RadiusSection({ data }) {
138
+ function RadiusSection({ data, previews }) {
82
139
  if (data.radii.length === 0)
83
140
  return null;
84
141
  const radii = data.radii.slice(0, 20);
85
- 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(OverflowRow, { label: "radii", className: "px-4 pt-4 sm:px-5", rowClassName: "flex flex-wrap items-end gap-4", children: radii.map((r) => (_jsx(RadiusChip, { r: r }, r.value))) })] }) }));
142
+ return (_jsx(Section, { title: "Corner radii", tip: "\u2014 rounding in use on visible boxes and controls. Hover a one-off to see where it renders.", children: _jsxs("div", { className: `${card} overflow-hidden pb-4`, children: [_jsx(SectionFlags, { flags: data.flags, section: "radius" }), _jsx(OverflowRow, { label: "radii", className: "px-4 pt-4 sm:px-5", rowClassName: "flex flex-wrap items-end gap-4", children: radii.map((r) => (_jsx(RadiusChip, { r: r, previews: previews }, r.value))) })] }) }));
86
143
  }
87
- function SpacingRow({ s, max }) {
88
- return (_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" : "" })] }));
144
+ function SpacingRow({ s, max, previews, }) {
145
+ return (_jsxs(Flaggable, { flagged: s.offGrid, value: { kind: "spacing", px: s.px }, label: `${s.px}px padding`, pages: s.pages, previews: previews, className: "flex items-center gap-3", flaggedClassName: `-mx-1.5 rounded px-1.5 ${FLAGGED_ROW}`, 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" : "" })] }));
89
146
  }
90
- function SpacingSection({ data }) {
147
+ function SpacingSection({ data, previews }) {
91
148
  if (data.spacing.length === 0)
92
149
  return null;
93
150
  const scale = [...data.spacing].sort((a, b) => a.px - b.px).slice(0, 24);
94
151
  const max = Math.max(...scale.map((s) => s.px), 1);
95
152
  const visible = scale.slice(0, VISIBLE_ROWS);
96
153
  const overflow = scale.slice(VISIBLE_ROWS);
97
- 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: visible.map((s) => (_jsx(SpacingRow, { s: s, max: max }, s.px))) }), _jsx(ShowMore, { count: overflow.length, label: "padding values", children: _jsx("div", { className: "mt-1.5 space-y-1.5 px-4 pb-1 sm:px-5", children: overflow.map((s) => (_jsx(SpacingRow, { s: s, max: max }, s.px))) }) })] }) }));
154
+ return (_jsx(Section, { title: "Spacing", tip: "\u2014 padding values in use, as a scale. Bars are to scale. Hover an off-grid value to see where it renders.", 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: visible.map((s) => (_jsx(SpacingRow, { s: s, max: max, previews: previews }, s.px))) }), _jsx(ShowMore, { count: overflow.length, label: "padding values", children: _jsx("div", { className: "mt-1.5 space-y-1.5 px-4 pb-1 sm:px-5", children: overflow.map((s) => (_jsx(SpacingRow, { s: s, max: max, previews: previews }, s.px))) }) })] }) }));
98
155
  }
99
156
  // ── Scanned pages ────────────────────────────────────────────────────────────
100
157
  function PageRow({ p, first }) {
@@ -109,8 +166,9 @@ function ScannedPages({ data }) {
109
166
  }
110
167
  export function DesignPanel({ data, review, reviewStale, settings, snapshots, captureIssue, }) {
111
168
  const hasScans = data.pages.length > 0;
169
+ const previews = previewIndex(snapshots);
112
170
  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
113
171
  ? `● ${data.pages.length} ${data.pages.length === 1 ? "page" : "pages"} scanned`
114
- : "○ 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(SnapshotsCard, { initial: snapshots, captureIssue: captureIssue }), _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 })] }))] }));
172
+ : "○ 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(SnapshotsCard, { initial: snapshots, captureIssue: captureIssue }), _jsx(DesignReviewCard, { initialReview: review, initialStale: reviewStale, hasApiKey: settings.hasApiKey, provider: settings.provider, model: settings.model, scannedPages: data.pages.length, githubConnected: settings.hasGithubToken && !!settings.githubRepo }), hasScans && (_jsxs(_Fragment, { children: [_jsx(TypographySection, { data: data, previews: previews }), _jsx(PaletteSection, { data: data, previews: previews }), _jsx(ContrastSection, { data: data }), _jsx(RadiusSection, { data: data, previews: previews }), _jsx(SpacingSection, { data: data, previews: previews }), _jsx(ScannedPages, { data: data })] }))] }));
115
173
  }
116
174
  //# sourceMappingURL=design.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"design.js","sourceRoot":"","sources":["../../src/dashboard/design.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"design.js","sourceRoot":"","sources":["../../src/dashboard/design.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { CreateIssueResult } from "../ai/types";
2
+ export interface FileBugButtonProps {
3
+ /** The issue already filed for this finding, when known at render time. */
4
+ filed: {
5
+ url: string;
6
+ number: number;
7
+ } | null;
8
+ /** The verify-and-file server action for this finding. */
9
+ file: () => Promise<CreateIssueResult>;
10
+ /** Telemetry name for the button (see the data-component note in summary.tsx). */
11
+ dataComponent: string;
12
+ }
13
+ export declare function FileBugButton({ filed, file, dataComponent }: FileBugButtonProps): import("react").JSX.Element;
14
+ //# sourceMappingURL=file-bug-button.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-bug-button.d.ts","sourceRoot":"","sources":["../../src/dashboard/file-bug-button.tsx"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAGrD,MAAM,WAAW,kBAAkB;IACjC,2EAA2E;IAC3E,KAAK,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC9C,0DAA0D;IAC1D,IAAI,EAAE,MAAM,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACvC,kFAAkF;IAClF,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,aAAa,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,kBAAkB,+BAoD/E"}
@@ -0,0 +1,37 @@
1
+ "use client";
2
+ import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
3
+ /**
4
+ * Polishd — the "file bug" micro-button, shared by every card that can turn a
5
+ * model finding into a GitHub issue: the summary's losses and the design
6
+ * review's issues.
7
+ *
8
+ * One click runs the caller's verify-and-file server action. The server checks
9
+ * the report against the repository's source first: confirmed reports become
10
+ * issues with the technical analysis and fix suggestions, disproved ones come
11
+ * back as `not-a-bug` with the reasoning — shown here instead of a link.
12
+ * Findings whose issue already exists (auto-filed, or filed on an earlier
13
+ * generation) render as the link straight away via `filed`.
14
+ */
15
+ import { useState, useTransition } from "react";
16
+ import { microBtn } from "./ui";
17
+ export function FileBugButton({ filed, file, dataComponent }) {
18
+ const [created, setCreated] = useState(filed);
19
+ const [failed, setFailed] = useState(null);
20
+ const [pending, startFile] = useTransition();
21
+ if (created) {
22
+ return (_jsxs("a", { href: created.url, target: "_blank", rel: "noreferrer noopener", className: "rounded bg-[#101c14] px-1.5 py-0.5 text-[10px] font-medium text-emerald-500 hover:text-emerald-400", children: ["Issue #", created.number, " \u2197"] }));
23
+ }
24
+ if (failed?.notABug) {
25
+ return (_jsxs("span", { className: "rounded bg-amber-950/50 px-1.5 py-0.5 text-[10px] text-amber-400", title: failed.message, children: ["Checked the source \u2014 not an actual bug: ", failed.message] }));
26
+ }
27
+ const run = () => startFile(async () => {
28
+ setFailed(null);
29
+ const res = await file();
30
+ if (res.ok)
31
+ setCreated({ url: res.url, number: res.number });
32
+ else
33
+ setFailed({ notABug: res.error === "not-a-bug", message: res.message });
34
+ });
35
+ return (_jsxs(_Fragment, { children: [_jsx("button", { type: "button", "data-component": dataComponent, onClick: run, disabled: pending, title: "Verify this problem against the source code, then create a GitHub issue with the technical details", className: microBtn, children: pending ? "Verifying…" : "File bug" }), failed && _jsx("span", { className: "text-[10px] text-red-400", children: failed.message })] }));
36
+ }
37
+ //# sourceMappingURL=file-bug-button.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-bug-button.js","sourceRoot":"","sources":["../../src/dashboard/file-bug-button.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAGhD,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAWhC,MAAM,UAAU,aAAa,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAsB;IAC9E,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAA+C,IAAI,CAAC,CAAC;IACzF,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,GAAG,aAAa,EAAE,CAAC;IAE7C,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CACL,aACE,IAAI,EAAE,OAAO,CAAC,GAAG,EACjB,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,qBAAqB,EACzB,SAAS,EAAC,oGAAoG,wBAEtG,OAAO,CAAC,MAAM,eACpB,CACL,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;QACpB,OAAO,CACL,gBACE,SAAS,EAAC,kEAAkE,EAC5E,KAAK,EAAE,MAAM,CAAC,OAAO,8DAEoB,MAAM,CAAC,OAAO,IAClD,CACR,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAG,GAAG,EAAE,CACf,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,SAAS,CAAC,IAAI,CAAC,CAAC;QAChB,MAAM,GAAG,GAAG,MAAM,IAAI,EAAE,CAAC;QACzB,IAAI,GAAG,CAAC,EAAE;YAAE,UAAU,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;;YACxD,SAAS,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,KAAK,KAAK,WAAW,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;IAEL,OAAO,CACL,8BACE,iBACE,IAAI,EAAC,QAAQ,oBACG,aAAa,EAC7B,OAAO,EAAE,GAAG,EACZ,QAAQ,EAAE,OAAO,EACjB,KAAK,EAAC,oGAAoG,EAC1G,SAAS,EAAE,QAAQ,YAElB,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,GAC7B,EACR,MAAM,IAAI,eAAM,SAAS,EAAC,0BAA0B,YAAE,MAAM,CAAC,OAAO,GAAQ,IAC5E,CACJ,CAAC;AACJ,CAAC"}
@@ -1,10 +1,20 @@
1
- import { type CaptureSnapshotResult } from "../server/snapshots";
1
+ import { type BeginSnapshotResult, type CaptureRouteResult, type CaptureSnapshotResult } from "../server/snapshots";
2
2
  /**
3
- * Shoot the site as it stands: every scanned route (the pages real visitors
4
- * actually rendered), phone and desktop, light and dark. Long-running — a
5
- * dozen routes takes on the order of a minute.
3
+ * Capture is chunked into one action call per route — begin, then one
4
+ * `captureSnapshotRouteAction` per returned route, then finish — so no single
5
+ * request has to outlive a serverless host's function time limit. The client
6
+ * drives the loop; every per-route call is validated against the plan the
7
+ * begin call parked server-side, so the client contributes nothing but ids.
8
+ *
9
+ * Everything after auth reduces to a message rather than a thrown error: a
10
+ * rejected action crashes the dashboard tab into Next's error boundary with
11
+ * an opaque digest, while a returned message renders in the card.
6
12
  */
7
- export declare function captureSnapshotAction(): Promise<CaptureSnapshotResult>;
13
+ export declare function beginSnapshotCaptureAction(): Promise<BeginSnapshotResult>;
14
+ /** Shoot one route of the capture in progress — both devices, both themes. */
15
+ export declare function captureSnapshotRouteAction(id: string, route: string): Promise<CaptureRouteResult>;
16
+ /** Record the accumulated shots as a snapshot and prune old ones. */
17
+ export declare function finishSnapshotCaptureAction(id: string): Promise<CaptureSnapshotResult>;
8
18
  export type SnapshotImageResult = {
9
19
  ok: true;
10
20
  dataUrl: string;
@@ -1 +1 @@
1
- {"version":3,"file":"snapshot-actions.d.ts","sourceRoot":"","sources":["../../src/dashboard/snapshot-actions.ts"],"names":[],"mappings":"AAuBA,OAAO,EAIL,KAAK,qBAAqB,EAC3B,MAAM,qBAAqB,CAAC;AAoB7B;;;;GAIG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,qBAAqB,CAAC,CA+B5E;AAED,MAAM,MAAM,mBAAmB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAA;CAAE,CAAC;AAEhF,8EAA8E;AAC9E,wBAAsB,sBAAsB,CAC1C,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,mBAAmB,CAAC,CAI9B"}
1
+ {"version":3,"file":"snapshot-actions.d.ts","sourceRoot":"","sources":["../../src/dashboard/snapshot-actions.ts"],"names":[],"mappings":"AAwBA,OAAO,EAML,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAC3B,MAAM,qBAAqB,CAAC;AAoB7B;;;;;;;;;;GAUG;AACH,wBAAsB,0BAA0B,IAAI,OAAO,CAAC,mBAAmB,CAAC,CA+C/E;AAED,8EAA8E;AAC9E,wBAAsB,0BAA0B,CAC9C,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,kBAAkB,CAAC,CAY7B;AAED,qEAAqE;AACrE,wBAAsB,2BAA2B,CAC/C,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,qBAAqB,CAAC,CAYhC;AAED,MAAM,MAAM,mBAAmB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAA;CAAE,CAAC;AAEhF,8EAA8E;AAC9E,wBAAsB,sBAAsB,CAC1C,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,mBAAmB,CAAC,CAI9B"}
@@ -19,7 +19,8 @@ import { requirePolishdAuth } from "../ai/guard";
19
19
  import { resolveSettings } from "../ai/settings";
20
20
  import { isDashboardPath, resolveDashboardRoute } from "../config";
21
21
  import { getDesignData } from "../server/design";
22
- import { MAX_SNAPSHOT_ROUTES, captureSnapshot, readSnapshotImage, } from "../server/snapshots";
22
+ import { designPreviewTargets } from "../shared/design-values";
23
+ import { MAX_SNAPSHOT_ROUTES, beginSnapshot, captureSnapshotRoute, finishSnapshot, readSnapshotImage, } from "../server/snapshots";
23
24
  /**
24
25
  * The origin to shoot. `POLISHD_SITE_ORIGIN` wins when set (proxies, tunnels,
25
26
  * a prod URL shot from a dev machine); otherwise the origin the dashboard was
@@ -39,36 +40,80 @@ async function resolveSiteOrigin() {
39
40
  return `${proto}://${host}`;
40
41
  }
41
42
  /**
42
- * Shoot the site as it stands: every scanned route (the pages real visitors
43
- * actually rendered), phone and desktop, light and dark. Long-running — a
44
- * dozen routes takes on the order of a minute.
43
+ * Capture is chunked into one action call per route — begin, then one
44
+ * `captureSnapshotRouteAction` per returned route, then finish — so no single
45
+ * request has to outlive a serverless host's function time limit. The client
46
+ * drives the loop; every per-route call is validated against the plan the
47
+ * begin call parked server-side, so the client contributes nothing but ids.
48
+ *
49
+ * Everything after auth reduces to a message rather than a thrown error: a
50
+ * rejected action crashes the dashboard tab into Next's error boundary with
51
+ * an opaque digest, while a returned message renders in the card.
45
52
  */
46
- export async function captureSnapshotAction() {
53
+ export async function beginSnapshotCaptureAction() {
47
54
  await requirePolishdAuth();
48
- const origin = await resolveSiteOrigin();
49
- if (!origin) {
55
+ try {
56
+ const origin = await resolveSiteOrigin();
57
+ if (!origin) {
58
+ return {
59
+ ok: false,
60
+ message: "Couldn't work out the site's URL from the request — set POLISHD_SITE_ORIGIN " +
61
+ "to the origin the site is reachable at.",
62
+ };
63
+ }
64
+ const data = await getDesignData();
65
+ const dashboardRoute = resolveDashboardRoute();
66
+ // Shoot what visitors have actually rendered, never the dashboard itself
67
+ // (nor the telemetry pseudo-paths the collector namespaces under /~polishd).
68
+ const scanned = data.pages
69
+ .map((p) => p.path)
70
+ .filter((p) => p.startsWith("/") && !p.startsWith("/~") && !isDashboardPath(p, dashboardRoute));
71
+ const routes = (scanned.length > 0 ? scanned : ["/"]).slice(0, MAX_SNAPSHOT_ROUTES);
72
+ // Stamp the snapshot with the same metrics fingerprint the AI review caches
73
+ // under, so "taken before/after this round of changes" is a hash comparison.
74
+ let fingerprint = null;
75
+ if (data.ready && data.pages.length > 0) {
76
+ const { settings } = await resolveSettings();
77
+ fingerprint = fingerprintDigest(buildDesignDigest(data, settings.context));
78
+ }
79
+ // The one-off and off-grid values flagged right now get pictured in place,
80
+ // so hovering one on the Design tab shows the element that carries it.
81
+ const shot = new Set(routes);
82
+ const targets = designPreviewTargets(data).filter((t) => t.pages.some((p) => shot.has(p)));
83
+ return await beginSnapshot({ origin, routes, fingerprint, targets });
84
+ }
85
+ catch (err) {
50
86
  return {
51
87
  ok: false,
52
- message: "Couldn't work out the site's URL from the request — set POLISHD_SITE_ORIGIN " +
53
- "to the origin the site is reachable at.",
88
+ message: `Snapshot capture failed unexpectedly: ${err instanceof Error ? err.message : "unknown error"}`,
54
89
  };
55
90
  }
56
- const data = await getDesignData();
57
- const dashboardRoute = resolveDashboardRoute();
58
- // Shoot what visitors have actually rendered, never the dashboard itself
59
- // (nor the telemetry pseudo-paths the collector namespaces under /~polishd).
60
- const scanned = data.pages
61
- .map((p) => p.path)
62
- .filter((p) => p.startsWith("/") && !p.startsWith("/~") && !isDashboardPath(p, dashboardRoute));
63
- const routes = (scanned.length > 0 ? scanned : ["/"]).slice(0, MAX_SNAPSHOT_ROUTES);
64
- // Stamp the snapshot with the same metrics fingerprint the AI review caches
65
- // under, so "taken before/after this round of changes" is a hash comparison.
66
- let fingerprint = null;
67
- if (data.ready && data.pages.length > 0) {
68
- const { settings } = await resolveSettings();
69
- fingerprint = fingerprintDigest(buildDesignDigest(data, settings.context));
91
+ }
92
+ /** Shoot one route of the capture in progress — both devices, both themes. */
93
+ export async function captureSnapshotRouteAction(id, route) {
94
+ await requirePolishdAuth();
95
+ try {
96
+ return await captureSnapshotRoute(id, route);
97
+ }
98
+ catch (err) {
99
+ return {
100
+ ok: false,
101
+ message: `Screenshot capture failed unexpectedly: ${err instanceof Error ? err.message : "unknown error"}`,
102
+ };
103
+ }
104
+ }
105
+ /** Record the accumulated shots as a snapshot and prune old ones. */
106
+ export async function finishSnapshotCaptureAction(id) {
107
+ await requirePolishdAuth();
108
+ try {
109
+ return await finishSnapshot(id);
110
+ }
111
+ catch (err) {
112
+ return {
113
+ ok: false,
114
+ message: `The snapshot couldn't be recorded: ${err instanceof Error ? err.message : "unknown error"}`,
115
+ };
70
116
  }
71
- return captureSnapshot({ origin, routes, fingerprint });
72
117
  }
73
118
  /** One shot's PNG as a data URL — fetched lazily as tiles scroll into use. */
74
119
  export async function getSnapshotImageAction(snapshotId, file) {
@@ -1 +1 @@
1
- {"version":3,"file":"snapshot-actions.js","sourceRoot":"","sources":["../../src/dashboard/snapshot-actions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"snapshot-actions.js","sourceRoot":"","sources":["../../src/dashboard/snapshot-actions.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"snapshots.d.ts","sourceRoot":"","sources":["../../src/dashboard/snapshots.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,eAAe,EAAuB,MAAM,qBAAqB,CAAC;AAmGhF,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B;;;;;OAKG;IACH,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,kBAAkB,+BAsMlF"}
1
+ {"version":3,"file":"snapshots.d.ts","sourceRoot":"","sources":["../../src/dashboard/snapshots.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,eAAe,EAAuB,MAAM,qBAAqB,CAAC;AAwGhF,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B;;;;;OAKG;IACH,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,kBAAkB,+BA2PlF"}
@@ -10,7 +10,7 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
10
10
  * expands into a full-height lightbox.
11
11
  */
12
12
  import { useEffect, useState, useTransition } from "react";
13
- import { captureSnapshotAction, getSnapshotImageAction } from "./snapshot-actions";
13
+ import { beginSnapshotCaptureAction, captureSnapshotRouteAction, finishSnapshotCaptureAction, getSnapshotImageAction, } from "./snapshot-actions";
14
14
  import { border, card, labelCls, primaryBtn, relTime, RefreshIcon } from "./ui";
15
15
  const DEVICES = ["desktop", "phone"];
16
16
  const THEMES = ["light", "dark"];
@@ -53,6 +53,7 @@ export default function SnapshotsCard({ initial, captureIssue }) {
53
53
  const [error, setError] = useState(null);
54
54
  const [zoom, setZoom] = useState(null);
55
55
  const [pending, startCapture] = useTransition();
56
+ const [progress, setProgress] = useState(null);
56
57
  const selected = snapshots.find((s) => s.id === selectedId) ?? snapshots[0] ?? null;
57
58
  // A site with no dark mode has its identical dark shots dropped at capture
58
59
  // time — hide the toggle rather than offering an empty view.
@@ -60,13 +61,56 @@ export default function SnapshotsCard({ initial, captureIssue }) {
60
61
  const capture = () => {
61
62
  setError(null);
62
63
  startCapture(async () => {
63
- const res = await captureSnapshotAction();
64
- if (res.ok) {
65
- setSnapshots((prev) => [res.snapshot, ...prev]);
66
- setSelectedId(res.snapshot.id);
64
+ // The capture is one action call per route, so no single request has to
65
+ // outlive a serverless host's function time limit — and every await is
66
+ // caught: a rejected action must land in the error box, never in the
67
+ // error boundary (which would take the whole tab down).
68
+ try {
69
+ const begun = await beginSnapshotCaptureAction();
70
+ if (!begun.ok) {
71
+ setError(begun.message);
72
+ return;
73
+ }
74
+ setProgress({ done: 0, total: begun.routes.length });
75
+ const failed = [];
76
+ let failure = null;
77
+ for (const [i, route] of begun.routes.entries()) {
78
+ try {
79
+ const res = await captureSnapshotRouteAction(begun.id, route);
80
+ if (!res.ok) {
81
+ failed.push(route);
82
+ failure = res.message;
83
+ }
84
+ }
85
+ catch {
86
+ failed.push(route);
87
+ failure =
88
+ "the request failed mid-shoot — usually a serverless function " +
89
+ "time limit; the host's function logs will name the exact failure";
90
+ }
91
+ setProgress({ done: i + 1, total: begun.routes.length });
92
+ }
93
+ // Finish even when every route failed: it sweeps the capture's state
94
+ // and reports "every page failed" — the per-route failure is more
95
+ // specific, so it wins the error box when there is one.
96
+ const fin = await finishSnapshotCaptureAction(begun.id);
97
+ if (fin.ok) {
98
+ setSnapshots((prev) => [fin.snapshot, ...prev]);
99
+ setSelectedId(fin.snapshot.id);
100
+ if (failed.length > 0) {
101
+ setError(`${failed.length} of ${begun.routes.length} page${begun.routes.length === 1 ? "" : "s"} failed to capture (${failure}). The rest are in the snapshot.`);
102
+ }
103
+ }
104
+ else {
105
+ setError(failure ? `Capture failed: ${failure}.` : fin.message);
106
+ }
67
107
  }
68
- else {
69
- setError(res.message);
108
+ catch {
109
+ setError("The capture failed before a result came back — your host's function " +
110
+ "logs will name the exact failure.");
111
+ }
112
+ finally {
113
+ setProgress(null);
70
114
  }
71
115
  });
72
116
  };
@@ -81,7 +125,13 @@ export default function SnapshotsCard({ initial, captureIssue }) {
81
125
  // clicks group under these on the collecting side, so "does anyone shoot
82
126
  // a second snapshot?" is answerable. Inert for host apps.
83
127
  _jsxs("section", { "data-component": "design-snapshots", className: `mb-8 ${card} overflow-hidden`, children: [_jsxs("div", { className: `flex flex-wrap 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: "Site snapshots" }), selected && (_jsx("span", { className: "hidden rounded-full bg-[#1a1a1a] px-2 py-0.5 text-[10px] font-medium text-[#888] sm:inline", children: selected.origin }))] }), _jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [selected && (_jsxs(_Fragment, { children: [_jsx(TogglePills, { options: DEVICES, value: device, onChange: setDevice, component: "design-snapshot-device" }), !selected.noDarkMode && (_jsx(TogglePills, { options: THEMES, value: theme, onChange: setTheme, component: "design-snapshot-theme" })), snapshots.length > 1 && (_jsx("select", { "data-component": "design-snapshot-history", value: selected.id, onChange: (e) => setSelectedId(e.target.value), className: "rounded-md border border-[#2e2e2e] bg-[#111] px-2 py-1 text-[11px] text-[#aaa] focus:border-[#555] focus:outline-none", children: snapshots.map((s) => (_jsx("option", { value: s.id, children: relTime(s.capturedAt) }, s.id))) }))] })), _jsx("button", { type: "button", "data-component": "design-snapshot-capture", onClick: capture, disabled: pending || captureIssue !== null, title: captureIssue ??
84
- "Screenshot every scanned page — phone and desktop, light and dark", className: primaryBtn, children: _jsxs("span", { className: "flex items-center gap-1.5", children: [_jsx(RefreshIcon, { spinning: pending }), pending ? "Shooting pages…" : selected ? "Capture again" : "Capture snapshot"] }) })] })] }), _jsxs("div", { className: "px-4 py-4 sm:px-5 sm:py-5", children: [captureIssue && (_jsx("div", { className: "mb-3 rounded-md border border-amber-900/50 bg-amber-950/30 px-3 py-2 text-[12px] text-amber-400", children: captureIssue })), 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 })), pending && (_jsx("p", { className: "mb-3 text-[12px] text-[#888]", children: "Shooting every scanned page at two sizes in two themes \u2014 this can take a minute. Keep this tab open." })), !selected && !pending && (_jsx("p", { className: "text-[13px] leading-relaxed text-[#888]", children: "No snapshots yet. Capture one to see every page of the site as it renders right now \u2014 the \u201Cbefore\u201D to hold future design changes against." })), selected && (_jsxs(_Fragment, { children: [shots.length === 0 ? (_jsxs("p", { className: "text-[13px] text-[#888]", children: ["No ", device, "/", theme, " shots in this snapshot."] })) : (_jsx("div", { className: `grid gap-4 ${device === "phone"
128
+ "Screenshot every scanned page — phone and desktop, light and dark", className: primaryBtn, children: _jsxs("span", { className: "flex items-center gap-1.5", children: [_jsx(RefreshIcon, { spinning: pending }), pending
129
+ ? progress
130
+ ? `Shooting page ${Math.min(progress.done + 1, progress.total)} of ${progress.total}…`
131
+ : "Shooting pages…"
132
+ : selected
133
+ ? "Capture again"
134
+ : "Capture snapshot"] }) })] })] }), _jsxs("div", { className: "px-4 py-4 sm:px-5 sm:py-5", children: [captureIssue && (_jsx("div", { className: "mb-3 rounded-md border border-amber-900/50 bg-amber-950/30 px-3 py-2 text-[12px] text-amber-400", children: captureIssue })), 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 })), pending && (_jsx("p", { className: "mb-3 text-[12px] text-[#888]", children: "Shooting every scanned page at two sizes in two themes, one page at a time \u2014 this can take a minute. Keep this tab open." })), !selected && !pending && (_jsx("p", { className: "text-[13px] leading-relaxed text-[#888]", children: "No snapshots yet. Capture one to see every page of the site as it renders right now \u2014 the \u201Cbefore\u201D to hold future design changes against." })), selected && (_jsxs(_Fragment, { children: [shots.length === 0 ? (_jsxs("p", { className: "text-[13px] text-[#888]", children: ["No ", device, "/", theme, " shots in this snapshot."] })) : (_jsx("div", { className: `grid gap-4 ${device === "phone"
85
135
  ? "grid-cols-3 sm:grid-cols-5 lg:grid-cols-6"
86
136
  : "grid-cols-2 sm:grid-cols-3 lg:grid-cols-4"}`, children: shots.map((s) => (_jsx(ShotTile, { snapshotId: selected.id, shot: s, onZoom: (src, route) => setZoom({ src, route }) }, `${selected.id}|${s.file}`))) })), _jsxs("div", { className: "mt-3 flex flex-wrap items-center gap-x-3 gap-y-1 text-[11px] text-[#555]", children: [_jsxs("span", { children: ["Captured ", relTime(selected.capturedAt)] }), selected.noDarkMode && (_jsx("span", { className: "rounded-full bg-[#1a1a1a] px-2 py-0.5 text-[#777]", children: "Site renders identically in dark mode" })), skipped.length > 0 && (_jsxs("span", { className: "text-amber-400/80", children: [skipped.length, " page", skipped.length === 1 ? "" : "s", " skipped", skipped[0].skipped ? ` (${skipped[0].skipped})` : ""] })), selected.authWalled.length > 0 && (_jsxs("span", { className: "text-amber-400/80", children: ["behind login: ", selected.authWalled.slice(0, 3).join(", "), selected.authWalled.length > 3 ? ", …" : ""] }))] })] }))] }), zoom && (_jsx("div", { role: "dialog", "aria-label": `${zoom.route} screenshot`, onClick: () => setZoom(null), className: "fixed inset-0 z-50 flex cursor-zoom-out items-start justify-center overflow-y-auto bg-black/85 p-6", children: _jsx("img", { src: zoom.src, alt: `${zoom.route} full screenshot`, className: "w-full max-w-3xl rounded-md border border-[#333]" }) }))] }));
87
137
  }