@polishd/next 0.2.1-dev.1 → 0.2.1-dev.2

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.
@@ -0,0 +1,51 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * Polishd — the dashboard's shared visual vocabulary.
4
+ *
5
+ * Class strings and small icons used by more than one panel. They lived as
6
+ * copies in every file until the settings form moved into its own tab and the
7
+ * copies started to drift; one definition is what keeps the Analytics, Design
8
+ * and Settings tabs looking like the same product.
9
+ *
10
+ * No `"use client"` here on purpose — plain constants and stateless SVG work in
11
+ * either environment, and the server-rendered panels import them too.
12
+ */
13
+ export const border = "border-[#2e2e2e]";
14
+ export const card = `border ${border} rounded-lg bg-[#0a0a0a]`;
15
+ export const divider = `border-t ${border}`;
16
+ export const labelCls = "text-[11px] font-medium uppercase tracking-[0.08em] text-[#666]";
17
+ export const inputCls = "w-full rounded-md border border-[#2e2e2e] bg-[#111] px-3 py-2 text-[13px] text-white placeholder:text-[#555] focus:border-[#555] focus:outline-none";
18
+ export 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";
19
+ export const ghostBtn = "rounded-md border border-[#2e2e2e] px-2.5 py-1.5 text-[12px] text-[#aaa] transition-colors hover:border-[#555] hover:text-white disabled:cursor-not-allowed disabled:opacity-40";
20
+ export 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";
21
+ /** "3m ago" — coarse on purpose; these timestamps are context, not data. */
22
+ export function relTime(ms) {
23
+ const s = Math.max(0, Math.round((Date.now() - ms) / 1000));
24
+ if (s < 60)
25
+ return "just now";
26
+ const m = Math.round(s / 60);
27
+ if (m < 60)
28
+ return `${m}m ago`;
29
+ const h = Math.round(m / 60);
30
+ if (h < 24)
31
+ return `${h}h ago`;
32
+ return `${Math.round(h / 24)}d ago`;
33
+ }
34
+ // ── Icons (Feather, inlined) ─────────────────────────────────────────────────
35
+ export function RefreshIcon({ spinning = false }) {
36
+ 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" })] }));
37
+ }
38
+ export function GearIcon() {
39
+ return (_jsxs("svg", { width: "13", height: "13", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": true, children: [_jsx("circle", { cx: "12", cy: "12", r: "3" }), _jsx("path", { d: "M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z" })] }));
40
+ }
41
+ export function ChartIcon() {
42
+ return (_jsxs("svg", { width: "13", height: "13", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": true, children: [_jsx("line", { x1: "18", y1: "20", x2: "18", y2: "10" }), _jsx("line", { x1: "12", y1: "20", x2: "12", y2: "4" }), _jsx("line", { x1: "6", y1: "20", x2: "6", y2: "14" })] }));
43
+ }
44
+ export function DropletIcon() {
45
+ return (_jsx("svg", { width: "13", height: "13", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": true, children: _jsx("path", { d: "M12 2.69l5.66 5.66a8 8 0 1 1-11.31 0z" }) }));
46
+ }
47
+ /** The tab rail's in-flight marker: same 13px box as the icon it replaces. */
48
+ export function SpinnerIcon() {
49
+ return (_jsxs("svg", { width: "13", height: "13", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", className: "animate-spin", "aria-hidden": true, children: [_jsx("circle", { cx: "12", cy: "12", r: "9", opacity: "0.25" }), _jsx("path", { d: "M21 12a9 9 0 0 0-9-9" })] }));
50
+ }
51
+ //# sourceMappingURL=ui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/dashboard/ui.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;AAEH,MAAM,CAAC,MAAM,MAAM,GAAG,kBAAkB,CAAC;AACzC,MAAM,CAAC,MAAM,IAAI,GAAG,UAAU,MAAM,0BAA0B,CAAC;AAC/D,MAAM,CAAC,MAAM,OAAO,GAAG,YAAY,MAAM,EAAE,CAAC;AAC5C,MAAM,CAAC,MAAM,QAAQ,GAAG,iEAAiE,CAAC;AAC1F,MAAM,CAAC,MAAM,QAAQ,GACnB,qJAAqJ,CAAC;AACxJ,MAAM,CAAC,MAAM,UAAU,GACrB,wJAAwJ,CAAC;AAC3J,MAAM,CAAC,MAAM,QAAQ,GACnB,iLAAiL,CAAC;AACpL,MAAM,CAAC,MAAM,OAAO,GAClB,gMAAgM,CAAC;AAEnM,4EAA4E;AAC5E,MAAM,UAAU,OAAO,CAAC,EAAU;IAChC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IAC5D,IAAI,CAAC,GAAG,EAAE;QAAE,OAAO,UAAU,CAAC;IAC9B,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IAC7B,IAAI,CAAC,GAAG,EAAE;QAAE,OAAO,GAAG,CAAC,OAAO,CAAC;IAC/B,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IAC7B,IAAI,CAAC,GAAG,EAAE;QAAE,OAAO,GAAG,CAAC,OAAO,CAAC;IAC/B,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC;AACtC,CAAC;AAED,gFAAgF;AAEhF,MAAM,UAAU,WAAW,CAAC,EAAE,QAAQ,GAAG,KAAK,EAA0B;IACtE,OAAO,CACL,eACE,KAAK,EAAC,IAAI,EACV,MAAM,EAAC,IAAI,EACX,OAAO,EAAC,WAAW,EACnB,IAAI,EAAC,MAAM,EACX,MAAM,EAAC,cAAc,EACrB,WAAW,EAAC,GAAG,EACf,aAAa,EAAC,OAAO,EACrB,cAAc,EAAC,OAAO,EACtB,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,kCAGhD,mBAAU,MAAM,EAAC,kBAAkB,GAAG,EACtC,eAAM,CAAC,EAAC,qCAAqC,GAAG,IAC5C,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,QAAQ;IACtB,OAAO,CACL,eACE,KAAK,EAAC,IAAI,EACV,MAAM,EAAC,IAAI,EACX,OAAO,EAAC,WAAW,EACnB,IAAI,EAAC,MAAM,EACX,MAAM,EAAC,cAAc,EACrB,WAAW,EAAC,GAAG,EACf,aAAa,EAAC,OAAO,EACrB,cAAc,EAAC,OAAO,kCAGtB,iBAAQ,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,CAAC,EAAC,GAAG,GAAG,EAChC,eAAM,CAAC,EAAC,guBAAguB,GAAG,IACvuB,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,CACL,eACE,KAAK,EAAC,IAAI,EACV,MAAM,EAAC,IAAI,EACX,OAAO,EAAC,WAAW,EACnB,IAAI,EAAC,MAAM,EACX,MAAM,EAAC,cAAc,EACrB,WAAW,EAAC,GAAG,EACf,aAAa,EAAC,OAAO,EACrB,cAAc,EAAC,OAAO,kCAGtB,eAAM,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,GAAG,EACxC,eAAM,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,GAAG,GAAG,EACvC,eAAM,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,IAAI,GAAG,IAClC,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,CACL,cACE,KAAK,EAAC,IAAI,EACV,MAAM,EAAC,IAAI,EACX,OAAO,EAAC,WAAW,EACnB,IAAI,EAAC,MAAM,EACX,MAAM,EAAC,cAAc,EACrB,WAAW,EAAC,GAAG,EACf,aAAa,EAAC,OAAO,EACrB,cAAc,EAAC,OAAO,iCAGtB,eAAM,CAAC,EAAC,uCAAuC,GAAG,GAC9C,CACP,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,WAAW;IACzB,OAAO,CACL,eACE,KAAK,EAAC,IAAI,EACV,MAAM,EAAC,IAAI,EACX,OAAO,EAAC,WAAW,EACnB,IAAI,EAAC,MAAM,EACX,MAAM,EAAC,cAAc,EACrB,WAAW,EAAC,KAAK,EACjB,aAAa,EAAC,OAAO,EACrB,SAAS,EAAC,cAAc,kCAGxB,iBAAQ,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,CAAC,EAAC,GAAG,EAAC,OAAO,EAAC,MAAM,GAAG,EAC/C,eAAM,CAAC,EAAC,sBAAsB,GAAG,IAC7B,CACP,CAAC;AACJ,CAAC"}
@@ -117,6 +117,7 @@
117
117
  --radius-xl: .75rem;
118
118
  --ease-out: cubic-bezier(0, 0, .2, 1);
119
119
  --animate-spin: spin 1s linear infinite;
120
+ --animate-pulse: pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;
120
121
  --default-transition-duration: .15s;
121
122
  --default-transition-timing-function: cubic-bezier(.4, 0, .2, 1);
122
123
  }
@@ -233,6 +234,18 @@
233
234
  visibility: visible;
234
235
  }
235
236
 
237
+ .polishd-root.polishd-root .sr-only {
238
+ clip-path: inset(50%);
239
+ white-space: nowrap;
240
+ border-width: 0;
241
+ width: 1px;
242
+ height: 1px;
243
+ margin: -1px;
244
+ padding: 0;
245
+ position: absolute;
246
+ overflow: hidden;
247
+ }
248
+
236
249
  .polishd-root.polishd-root .absolute {
237
250
  position: absolute;
238
251
  }
@@ -559,6 +572,10 @@
559
572
  height: calc(var(--spacing) * 5);
560
573
  }
561
574
 
575
+ .polishd-root.polishd-root .h-6 {
576
+ height: calc(var(--spacing) * 6);
577
+ }
578
+
562
579
  .polishd-root.polishd-root .h-7 {
563
580
  height: calc(var(--spacing) * 7);
564
581
  }
@@ -567,10 +584,18 @@
567
584
  height: calc(var(--spacing) * 9);
568
585
  }
569
586
 
587
+ .polishd-root.polishd-root .h-11 {
588
+ height: calc(var(--spacing) * 11);
589
+ }
590
+
570
591
  .polishd-root.polishd-root .h-12 {
571
592
  height: calc(var(--spacing) * 12);
572
593
  }
573
594
 
595
+ .polishd-root.polishd-root .h-14 {
596
+ height: calc(var(--spacing) * 14);
597
+ }
598
+
574
599
  .polishd-root.polishd-root .h-16 {
575
600
  height: calc(var(--spacing) * 16);
576
601
  }
@@ -587,6 +612,10 @@
587
612
  height: 15px;
588
613
  }
589
614
 
615
+ .polishd-root.polishd-root .h-\[22px\] {
616
+ height: 22px;
617
+ }
618
+
590
619
  .polishd-root.polishd-root .h-\[58px\] {
591
620
  height: 58px;
592
621
  }
@@ -647,6 +676,10 @@
647
676
  width: calc(var(--spacing) * 7);
648
677
  }
649
678
 
679
+ .polishd-root.polishd-root .w-9 {
680
+ width: calc(var(--spacing) * 9);
681
+ }
682
+
650
683
  .polishd-root.polishd-root .w-10 {
651
684
  width: calc(var(--spacing) * 10);
652
685
  }
@@ -671,6 +704,14 @@
671
704
  width: calc(var(--spacing) * 28);
672
705
  }
673
706
 
707
+ .polishd-root.polishd-root .w-32 {
708
+ width: calc(var(--spacing) * 32);
709
+ }
710
+
711
+ .polishd-root.polishd-root .w-40 {
712
+ width: calc(var(--spacing) * 40);
713
+ }
714
+
674
715
  .polishd-root.polishd-root .w-64 {
675
716
  width: calc(var(--spacing) * 64);
676
717
  }
@@ -691,10 +732,18 @@
691
732
  width: 52px;
692
733
  }
693
734
 
735
+ .polishd-root.polishd-root .w-\[68\%\] {
736
+ width: 68%;
737
+ }
738
+
694
739
  .polishd-root.polishd-root .w-\[74px\] {
695
740
  width: 74px;
696
741
  }
697
742
 
743
+ .polishd-root.polishd-root .w-\[92\%\] {
744
+ width: 92%;
745
+ }
746
+
698
747
  .polishd-root.polishd-root .w-full {
699
748
  width: 100%;
700
749
  }
@@ -743,6 +792,10 @@
743
792
  max-width: 58ch;
744
793
  }
745
794
 
795
+ .polishd-root.polishd-root .max-w-\[68ch\] {
796
+ max-width: 68ch;
797
+ }
798
+
746
799
  .polishd-root.polishd-root .max-w-\[320px\] {
747
800
  max-width: 320px;
748
801
  }
@@ -755,6 +808,10 @@
755
808
  max-width: calc(100vw - 2rem);
756
809
  }
757
810
 
811
+ .polishd-root.polishd-root .max-w-full {
812
+ max-width: 100%;
813
+ }
814
+
758
815
  .polishd-root.polishd-root .max-w-lg {
759
816
  max-width: var(--container-lg);
760
817
  }
@@ -852,6 +909,10 @@
852
909
  transform: var(--tw-rotate-x, ) var(--tw-rotate-y, ) var(--tw-rotate-z, ) var(--tw-skew-x, ) var(--tw-skew-y, );
853
910
  }
854
911
 
912
+ .polishd-root.polishd-root .animate-pulse {
913
+ animation: var(--animate-pulse);
914
+ }
915
+
855
916
  .polishd-root.polishd-root .animate-spin {
856
917
  animation: var(--animate-spin);
857
918
  }
@@ -1006,6 +1067,10 @@
1006
1067
  column-gap: calc(var(--spacing) * 4);
1007
1068
  }
1008
1069
 
1070
+ .polishd-root.polishd-root .gap-x-6 {
1071
+ column-gap: calc(var(--spacing) * 6);
1072
+ }
1073
+
1009
1074
  .polishd-root.polishd-root .gap-y-0\.5 {
1010
1075
  row-gap: calc(var(--spacing) * .5);
1011
1076
  }
@@ -1014,6 +1079,14 @@
1014
1079
  row-gap: var(--spacing);
1015
1080
  }
1016
1081
 
1082
+ .polishd-root.polishd-root .gap-y-4 {
1083
+ row-gap: calc(var(--spacing) * 4);
1084
+ }
1085
+
1086
+ .polishd-root.polishd-root .self-center {
1087
+ align-self: center;
1088
+ }
1089
+
1017
1090
  .polishd-root.polishd-root .self-start {
1018
1091
  align-self: flex-start;
1019
1092
  }
@@ -1380,6 +1453,16 @@
1380
1453
  }
1381
1454
  }
1382
1455
 
1456
+ .polishd-root.polishd-root .bg-red-950\/60 {
1457
+ background-color: #46080999;
1458
+ }
1459
+
1460
+ @supports (color: color-mix(in lab, red, red)) {
1461
+ .polishd-root.polishd-root .bg-red-950\/60 {
1462
+ background-color: color-mix(in oklab, var(--color-red-950) 60%, transparent);
1463
+ }
1464
+ }
1465
+
1383
1466
  .polishd-root.polishd-root .bg-white {
1384
1467
  background-color: var(--color-white);
1385
1468
  }
@@ -1452,6 +1535,10 @@
1452
1535
  padding-block: calc(var(--spacing) * 3);
1453
1536
  }
1454
1537
 
1538
+ .polishd-root.polishd-root .py-3\.5 {
1539
+ padding-block: calc(var(--spacing) * 3.5);
1540
+ }
1541
+
1455
1542
  .polishd-root.polishd-root .py-4 {
1456
1543
  padding-block: calc(var(--spacing) * 4);
1457
1544
  }
@@ -1460,6 +1547,10 @@
1460
1547
  padding-block: calc(var(--spacing) * 5);
1461
1548
  }
1462
1549
 
1550
+ .polishd-root.polishd-root .py-6 {
1551
+ padding-block: calc(var(--spacing) * 6);
1552
+ }
1553
+
1463
1554
  .polishd-root.polishd-root .py-8 {
1464
1555
  padding-block: calc(var(--spacing) * 8);
1465
1556
  }
@@ -1484,6 +1575,10 @@
1484
1575
  padding-block: 13px;
1485
1576
  }
1486
1577
 
1578
+ .polishd-root.polishd-root .py-\[18px\] {
1579
+ padding-block: 18px;
1580
+ }
1581
+
1487
1582
  .polishd-root.polishd-root .py-\[76px\] {
1488
1583
  padding-block: 76px;
1489
1584
  }
@@ -1757,6 +1852,11 @@
1757
1852
  line-height: 1.25;
1758
1853
  }
1759
1854
 
1855
+ .polishd-root.polishd-root .leading-\[1\.35\] {
1856
+ --tw-leading: 1.35;
1857
+ line-height: 1.35;
1858
+ }
1859
+
1760
1860
  .polishd-root.polishd-root .leading-none {
1761
1861
  --tw-leading: 1;
1762
1862
  line-height: 1;
@@ -2221,6 +2321,12 @@
2221
2321
  }
2222
2322
  }
2223
2323
 
2324
+ @media (min-width: 520px) {
2325
+ .polishd-root.polishd-root .min-\[520px\]\:grid-cols-6 {
2326
+ grid-template-columns: repeat(6, minmax(0, 1fr));
2327
+ }
2328
+ }
2329
+
2224
2330
  @media (min-width: 560px) {
2225
2331
  .polishd-root.polishd-root .min-\[560px\]\:ml-auto {
2226
2332
  margin-left: auto;
@@ -2384,6 +2490,10 @@
2384
2490
  grid-template-columns: repeat(6, minmax(0, 1fr));
2385
2491
  }
2386
2492
 
2493
+ .polishd-root.polishd-root .lg\:grid-cols-\[1\.25fr_1fr\] {
2494
+ grid-template-columns: 1.25fr 1fr;
2495
+ }
2496
+
2387
2497
  .polishd-root.polishd-root .lg\:grid-cols-\[1fr_1\.35fr\] {
2388
2498
  grid-template-columns: 1fr 1.35fr;
2389
2499
  }
@@ -2758,3 +2868,9 @@
2758
2868
  transform: rotate(360deg);
2759
2869
  }
2760
2870
  }
2871
+
2872
+ @keyframes pulse {
2873
+ 50% {
2874
+ opacity: .5;
2875
+ }
2876
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@polishd/next",
3
- "version": "0.2.1-dev.1",
3
+ "version": "0.2.1-dev.2",
4
4
  "description": "Drop-in product analytics for Next.js — capture real user behavioral signals (rage/dead clicks, scroll depth, errors, web vitals) and explore them on a built-in dashboard. What gets measured gets improved.",
5
5
  "type": "module",
6
6
  "license": "MIT",