@polishd/next 0.2.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 (47) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/README.md +37 -1
  3. package/dist/ai/actions.d.ts +7 -1
  4. package/dist/ai/actions.d.ts.map +1 -1
  5. package/dist/ai/actions.js +10 -0
  6. package/dist/ai/actions.js.map +1 -1
  7. package/dist/ai/design.d.ts +28 -0
  8. package/dist/ai/design.d.ts.map +1 -0
  9. package/dist/ai/design.js +245 -0
  10. package/dist/ai/design.js.map +1 -0
  11. package/dist/ai/types.d.ts +47 -0
  12. package/dist/ai/types.d.ts.map +1 -1
  13. package/dist/client/design-scan.d.ts +37 -0
  14. package/dist/client/design-scan.d.ts.map +1 -0
  15. package/dist/client/design-scan.js +319 -0
  16. package/dist/client/design-scan.js.map +1 -0
  17. package/dist/client/init.d.ts.map +1 -1
  18. package/dist/client/init.js +16 -0
  19. package/dist/client/init.js.map +1 -1
  20. package/dist/dashboard/design-review-card.d.ts +15 -0
  21. package/dist/dashboard/design-review-card.d.ts.map +1 -0
  22. package/dist/dashboard/design-review-card.js +82 -0
  23. package/dist/dashboard/design-review-card.js.map +1 -0
  24. package/dist/dashboard/design.d.ts +10 -0
  25. package/dist/dashboard/design.d.ts.map +1 -0
  26. package/dist/dashboard/design.js +83 -0
  27. package/dist/dashboard/design.js.map +1 -0
  28. package/dist/dashboard/index.d.ts +1 -0
  29. package/dist/dashboard/index.d.ts.map +1 -1
  30. package/dist/dashboard/index.js +34 -4
  31. package/dist/dashboard/index.js.map +1 -1
  32. package/dist/dashboard/journeys.d.ts.map +1 -1
  33. package/dist/dashboard/journeys.js +1 -0
  34. package/dist/dashboard/journeys.js.map +1 -1
  35. package/dist/dashboard.css +139 -0
  36. package/dist/server/design.d.ts +93 -0
  37. package/dist/server/design.d.ts.map +1 -0
  38. package/dist/server/design.js +430 -0
  39. package/dist/server/design.js.map +1 -0
  40. package/dist/server/ingest.d.ts.map +1 -1
  41. package/dist/server/ingest.js +9 -1
  42. package/dist/server/ingest.js.map +1 -1
  43. package/dist/shared/types.d.ts +31 -1
  44. package/dist/shared/types.d.ts.map +1 -1
  45. package/dist/shared/types.js +1 -0
  46. package/dist/shared/types.js.map +1 -1
  47. package/package.json +1 -1
@@ -78,6 +78,7 @@
78
78
  --color-red-950: oklch(25.8% .092 26.042);
79
79
  --color-amber-300: oklch(87.9% .169 91.605);
80
80
  --color-amber-400: oklch(82.8% .189 84.429);
81
+ --color-amber-500: oklch(76.9% .188 70.08);
81
82
  --color-amber-900: oklch(41.4% .112 45.904);
82
83
  --color-amber-950: oklch(27.9% .077 45.635);
83
84
  --color-emerald-400: oklch(76.5% .177 163.223);
@@ -100,6 +101,7 @@
100
101
  --container-lg: 32rem;
101
102
  --container-xl: 36rem;
102
103
  --container-5xl: 64rem;
104
+ --container-6xl: 72rem;
103
105
  --font-weight-normal: 400;
104
106
  --font-weight-medium: 500;
105
107
  --font-weight-semibold: 600;
@@ -109,6 +111,7 @@
109
111
  --tracking-wider: .05em;
110
112
  --leading-snug: 1.375;
111
113
  --leading-relaxed: 1.625;
114
+ --radius-sm: .25rem;
112
115
  --radius-md: .375rem;
113
116
  --radius-lg: .5rem;
114
117
  --radius-xl: .75rem;
@@ -218,6 +221,10 @@
218
221
  pointer-events: none;
219
222
  }
220
223
 
224
+ .polishd-root.polishd-root .collapse {
225
+ visibility: collapse;
226
+ }
227
+
221
228
  .polishd-root.polishd-root .invisible {
222
229
  visibility: hidden;
223
230
  }
@@ -540,6 +547,10 @@
540
547
  height: calc(var(--spacing) * 3.5);
541
548
  }
542
549
 
550
+ .polishd-root.polishd-root .h-4 {
551
+ height: calc(var(--spacing) * 4);
552
+ }
553
+
543
554
  .polishd-root.polishd-root .h-5 {
544
555
  height: calc(var(--spacing) * 5);
545
556
  }
@@ -548,6 +559,18 @@
548
559
  height: calc(var(--spacing) * 7);
549
560
  }
550
561
 
562
+ .polishd-root.polishd-root .h-9 {
563
+ height: calc(var(--spacing) * 9);
564
+ }
565
+
566
+ .polishd-root.polishd-root .h-12 {
567
+ height: calc(var(--spacing) * 12);
568
+ }
569
+
570
+ .polishd-root.polishd-root .h-16 {
571
+ height: calc(var(--spacing) * 16);
572
+ }
573
+
551
574
  .polishd-root.polishd-root .h-\[5px\] {
552
575
  height: 5px;
553
576
  }
@@ -608,6 +631,10 @@
608
631
  width: calc(var(--spacing) * 3.5);
609
632
  }
610
633
 
634
+ .polishd-root.polishd-root .w-4 {
635
+ width: calc(var(--spacing) * 4);
636
+ }
637
+
611
638
  .polishd-root.polishd-root .w-7 {
612
639
  width: calc(var(--spacing) * 7);
613
640
  }
@@ -620,6 +647,10 @@
620
647
  width: calc(var(--spacing) * 12);
621
648
  }
622
649
 
650
+ .polishd-root.polishd-root .w-14 {
651
+ width: calc(var(--spacing) * 14);
652
+ }
653
+
623
654
  .polishd-root.polishd-root .w-16 {
624
655
  width: calc(var(--spacing) * 16);
625
656
  }
@@ -672,6 +703,10 @@
672
703
  max-width: var(--container-5xl);
673
704
  }
674
705
 
706
+ .polishd-root.polishd-root .max-w-6xl {
707
+ max-width: var(--container-6xl);
708
+ }
709
+
675
710
  .polishd-root.polishd-root .max-w-\[15ch\] {
676
711
  max-width: 15ch;
677
712
  }
@@ -833,6 +868,10 @@
833
868
  grid-template-columns: repeat(2, minmax(0, 1fr));
834
869
  }
835
870
 
871
+ .polishd-root.polishd-root .grid-cols-3 {
872
+ grid-template-columns: repeat(3, minmax(0, 1fr));
873
+ }
874
+
836
875
  .polishd-root.polishd-root .flex-col {
837
876
  flex-direction: column;
838
877
  }
@@ -873,6 +912,10 @@
873
912
  gap: calc(var(--spacing) * .5);
874
913
  }
875
914
 
915
+ .polishd-root.polishd-root .gap-1 {
916
+ gap: var(--spacing);
917
+ }
918
+
876
919
  .polishd-root.polishd-root .gap-1\.5 {
877
920
  gap: calc(var(--spacing) * 1.5);
878
921
  }
@@ -901,6 +944,10 @@
901
944
  gap: calc(var(--spacing) * 5);
902
945
  }
903
946
 
947
+ .polishd-root.polishd-root .gap-6 {
948
+ gap: calc(var(--spacing) * 6);
949
+ }
950
+
904
951
  .polishd-root.polishd-root .gap-10 {
905
952
  gap: calc(var(--spacing) * 10);
906
953
  }
@@ -947,6 +994,10 @@
947
994
  column-gap: calc(var(--spacing) * 3);
948
995
  }
949
996
 
997
+ .polishd-root.polishd-root .gap-x-4 {
998
+ column-gap: calc(var(--spacing) * 4);
999
+ }
1000
+
950
1001
  .polishd-root.polishd-root .gap-y-0\.5 {
951
1002
  row-gap: calc(var(--spacing) * .5);
952
1003
  }
@@ -1013,6 +1064,10 @@
1013
1064
  border-radius: var(--radius-md);
1014
1065
  }
1015
1066
 
1067
+ .polishd-root.polishd-root .rounded-sm {
1068
+ border-radius: var(--radius-sm);
1069
+ }
1070
+
1016
1071
  .polishd-root.polishd-root .rounded-t-xl {
1017
1072
  border-top-left-radius: var(--radius-xl);
1018
1073
  border-top-right-radius: var(--radius-xl);
@@ -1057,6 +1112,10 @@
1057
1112
  border-color: #1a1a1a;
1058
1113
  }
1059
1114
 
1115
+ .polishd-root.polishd-root .border-\[\#1e3a5f\]\/60 {
1116
+ border-color: oklab(34.6182% -.0177443 -.0713795 / .6);
1117
+ }
1118
+
1060
1119
  .polishd-root.polishd-root .border-\[\#2e2e2e\] {
1061
1120
  border-color: #2e2e2e;
1062
1121
  }
@@ -1111,6 +1170,10 @@
1111
1170
  background-color: #0a0a0a;
1112
1171
  }
1113
1172
 
1173
+ .polishd-root.polishd-root .bg-\[\#0c1a2b\]\/60 {
1174
+ background-color: oklab(21.479% -.0106614 -.037564 / .6);
1175
+ }
1176
+
1114
1177
  .polishd-root.polishd-root .bg-\[\#1a1a1a\] {
1115
1178
  background-color: #1a1a1a;
1116
1179
  }
@@ -1159,10 +1222,24 @@
1159
1222
  background-color: #141414;
1160
1223
  }
1161
1224
 
1225
+ .polishd-root.polishd-root .bg-\[\#161616\] {
1226
+ background-color: #161616;
1227
+ }
1228
+
1162
1229
  .polishd-root.polishd-root .bg-\[\#f5a623\] {
1163
1230
  background-color: #f5a623;
1164
1231
  }
1165
1232
 
1233
+ .polishd-root.polishd-root .bg-amber-500\/70 {
1234
+ background-color: #f99c00b3;
1235
+ }
1236
+
1237
+ @supports (color: color-mix(in lab, red, red)) {
1238
+ .polishd-root.polishd-root .bg-amber-500\/70 {
1239
+ background-color: color-mix(in oklab, var(--color-amber-500) 70%, transparent);
1240
+ }
1241
+ }
1242
+
1166
1243
  .polishd-root.polishd-root .bg-amber-950 {
1167
1244
  background-color: var(--color-amber-950);
1168
1245
  }
@@ -1221,6 +1298,16 @@
1221
1298
  background-color: var(--color-blue-500);
1222
1299
  }
1223
1300
 
1301
+ .polishd-root.polishd-root .bg-blue-500\/80 {
1302
+ background-color: #3080ffcc;
1303
+ }
1304
+
1305
+ @supports (color: color-mix(in lab, red, red)) {
1306
+ .polishd-root.polishd-root .bg-blue-500\/80 {
1307
+ background-color: color-mix(in oklab, var(--color-blue-500) 80%, transparent);
1308
+ }
1309
+ }
1310
+
1224
1311
  .polishd-root.polishd-root .bg-blue-950 {
1225
1312
  background-color: var(--color-blue-950);
1226
1313
  }
@@ -1405,6 +1492,10 @@
1405
1492
  padding-top: 88px;
1406
1493
  }
1407
1494
 
1495
+ .polishd-root.polishd-root .pr-2\.5 {
1496
+ padding-right: calc(var(--spacing) * 2.5);
1497
+ }
1498
+
1408
1499
  .polishd-root.polishd-root .pr-3 {
1409
1500
  padding-right: calc(var(--spacing) * 3);
1410
1501
  }
@@ -1425,6 +1516,10 @@
1425
1516
  padding-bottom: calc(var(--spacing) * 3);
1426
1517
  }
1427
1518
 
1519
+ .polishd-root.polishd-root .pb-4 {
1520
+ padding-bottom: calc(var(--spacing) * 4);
1521
+ }
1522
+
1428
1523
  .polishd-root.polishd-root .pb-6 {
1429
1524
  padding-bottom: calc(var(--spacing) * 6);
1430
1525
  }
@@ -1441,6 +1536,10 @@
1441
1536
  padding-bottom: 72px;
1442
1537
  }
1443
1538
 
1539
+ .polishd-root.polishd-root .pl-1\.5 {
1540
+ padding-left: calc(var(--spacing) * 1.5);
1541
+ }
1542
+
1444
1543
  .polishd-root.polishd-root .pl-4 {
1445
1544
  padding-left: calc(var(--spacing) * 4);
1446
1545
  }
@@ -1760,6 +1859,10 @@
1760
1859
  color: #0cce6b;
1761
1860
  }
1762
1861
 
1862
+ .polishd-root.polishd-root .text-\[\#7fb2e5\] {
1863
+ color: #7fb2e5;
1864
+ }
1865
+
1763
1866
  .polishd-root.polishd-root .text-\[\#444\] {
1764
1867
  color: #444;
1765
1868
  }
@@ -2032,6 +2135,10 @@
2032
2135
  border-color: #555;
2033
2136
  }
2034
2137
 
2138
+ .polishd-root.polishd-root .hover\:bg-\[\#0f0f0f\]:hover {
2139
+ background-color: #0f0f0f;
2140
+ }
2141
+
2035
2142
  .polishd-root.polishd-root .hover\:bg-\[\#1a1a1a\]:hover {
2036
2143
  background-color: #1a1a1a;
2037
2144
  }
@@ -2153,6 +2260,10 @@
2153
2260
  grid-template-columns: repeat(4, minmax(0, 1fr));
2154
2261
  }
2155
2262
 
2263
+ .polishd-root.polishd-root .sm\:grid-cols-6 {
2264
+ grid-template-columns: repeat(6, minmax(0, 1fr));
2265
+ }
2266
+
2156
2267
  .polishd-root.polishd-root .sm\:gap-4 {
2157
2268
  gap: calc(var(--spacing) * 4);
2158
2269
  }
@@ -2221,14 +2332,30 @@
2221
2332
  position: sticky;
2222
2333
  }
2223
2334
 
2335
+ .polishd-root.polishd-root .lg\:top-8 {
2336
+ top: calc(var(--spacing) * 8);
2337
+ }
2338
+
2224
2339
  .polishd-root.polishd-root .lg\:top-\[128px\] {
2225
2340
  top: 128px;
2226
2341
  }
2227
2342
 
2343
+ .polishd-root.polishd-root .lg\:mt-5 {
2344
+ margin-top: calc(var(--spacing) * 5);
2345
+ }
2346
+
2347
+ .polishd-root.polishd-root .lg\:block {
2348
+ display: block;
2349
+ }
2350
+
2228
2351
  .polishd-root.polishd-root .lg\:min-h-\[52vh\] {
2229
2352
  min-height: 52vh;
2230
2353
  }
2231
2354
 
2355
+ .polishd-root.polishd-root .lg\:w-44 {
2356
+ width: calc(var(--spacing) * 44);
2357
+ }
2358
+
2232
2359
  .polishd-root.polishd-root .lg\:grid-cols-3 {
2233
2360
  grid-template-columns: repeat(3, minmax(0, 1fr));
2234
2361
  }
@@ -2245,6 +2372,18 @@
2245
2372
  grid-template-columns: 380px 1fr;
2246
2373
  }
2247
2374
 
2375
+ .polishd-root.polishd-root .lg\:flex-col {
2376
+ flex-direction: column;
2377
+ }
2378
+
2379
+ .polishd-root.polishd-root .lg\:flex-row {
2380
+ flex-direction: row;
2381
+ }
2382
+
2383
+ .polishd-root.polishd-root .lg\:gap-10 {
2384
+ gap: calc(var(--spacing) * 10);
2385
+ }
2386
+
2248
2387
  .polishd-root.polishd-root .lg\:gap-16 {
2249
2388
  gap: calc(var(--spacing) * 16);
2250
2389
  }
@@ -0,0 +1,93 @@
1
+ export interface DesignFontUsage {
2
+ family: string;
3
+ sizePx: number;
4
+ weight: number;
5
+ /** Elements across all pages rendering this exact combination. */
6
+ count: number;
7
+ /** Real text sampled from the site in this style. */
8
+ sample: string | null;
9
+ /** Tag names seen carrying it (h1, p, button…). */
10
+ tags: string[];
11
+ pages: string[];
12
+ /** True when this looks like a one-off rather than part of the type scale. */
13
+ outlier: boolean;
14
+ }
15
+ export type DesignColorRole = "text" | "background" | "border";
16
+ export interface DesignColorUsage {
17
+ hex: string;
18
+ /** Total tallies across roles. */
19
+ count: number;
20
+ roles: Record<DesignColorRole, number>;
21
+ pages: string[];
22
+ /** Share of all color tallies, 0–100. */
23
+ pct: number;
24
+ outlier: boolean;
25
+ }
26
+ export interface DesignContrastPair {
27
+ fg: string;
28
+ bg: string;
29
+ count: number;
30
+ /** Smallest font size this pair was seen at, px. */
31
+ minSizePx: number;
32
+ /** WCAG 2.x contrast ratio, e.g. 4.53. */
33
+ ratio: number;
34
+ /** The AA threshold that applies at `minSizePx` (3 for large text, else 4.5). */
35
+ required: number;
36
+ passes: boolean;
37
+ pages: string[];
38
+ }
39
+ export interface DesignRadiusUsage {
40
+ /** "8px", "9999px (full)" style label. */
41
+ value: string;
42
+ count: number;
43
+ pages: string[];
44
+ outlier: boolean;
45
+ }
46
+ export interface DesignSpacingUsage {
47
+ px: number;
48
+ count: number;
49
+ pages: string[];
50
+ /** True when the value sits off the site's dominant spacing grid. */
51
+ offGrid: boolean;
52
+ }
53
+ export type DesignFlagSection = "typography" | "color" | "contrast" | "radius" | "spacing";
54
+ export interface DesignFlag {
55
+ section: DesignFlagSection;
56
+ severity: "warn" | "info";
57
+ message: string;
58
+ }
59
+ export interface DesignPageScan {
60
+ path: string;
61
+ scannedAt: number;
62
+ elements: number;
63
+ }
64
+ export interface PolishdDesignData {
65
+ ready: boolean;
66
+ /** Pages with a scan, newest first. */
67
+ pages: DesignPageScan[];
68
+ fonts: DesignFontUsage[];
69
+ /** Distinct font families, most used first. */
70
+ families: {
71
+ family: string;
72
+ count: number;
73
+ }[];
74
+ colors: DesignColorUsage[];
75
+ contrast: DesignContrastPair[];
76
+ radii: DesignRadiusUsage[];
77
+ spacing: DesignSpacingUsage[];
78
+ flags: DesignFlag[];
79
+ }
80
+ export declare const EMPTY_DESIGN_DATA: PolishdDesignData;
81
+ /** WCAG 2.x contrast ratio between two hex colors, or null if unparseable. */
82
+ export declare function contrastRatio(a: string, b: string): number | null;
83
+ /**
84
+ * Build the full design dataset: merge per-page tallies site-wide, then run
85
+ * the deterministic checks. Read-only; degrades to `EMPTY_DESIGN_DATA`.
86
+ */
87
+ export declare function getDesignData(): Promise<PolishdDesignData>;
88
+ /**
89
+ * Rule-based checks over the aggregated data. Pure function of its input so
90
+ * it's easy to test and the AI layer can quote the same findings verbatim.
91
+ */
92
+ export declare function buildDesignFlags(data: PolishdDesignData): DesignFlag[];
93
+ //# sourceMappingURL=design.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"design.d.ts","sourceRoot":"","sources":["../../src/server/design.ts"],"names":[],"mappings":"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"}