@medialane/ui 0.2.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/dist/components/activity-feed-shell.cjs +90 -0
  2. package/dist/components/activity-feed-shell.cjs.map +1 -0
  3. package/dist/components/activity-feed-shell.d.cts +13 -0
  4. package/dist/components/activity-feed-shell.d.ts +13 -0
  5. package/dist/components/activity-feed-shell.js +56 -0
  6. package/dist/components/activity-feed-shell.js.map +1 -0
  7. package/dist/components/activity-row.cjs +95 -0
  8. package/dist/components/activity-row.cjs.map +1 -0
  9. package/dist/components/activity-row.d.cts +20 -0
  10. package/dist/components/activity-row.d.ts +20 -0
  11. package/dist/components/activity-row.js +61 -0
  12. package/dist/components/activity-row.js.map +1 -0
  13. package/dist/components/activity-ticker.cjs +92 -0
  14. package/dist/components/activity-ticker.cjs.map +1 -0
  15. package/dist/components/activity-ticker.d.cts +12 -0
  16. package/dist/components/activity-ticker.d.ts +12 -0
  17. package/dist/components/activity-ticker.js +58 -0
  18. package/dist/components/activity-ticker.js.map +1 -0
  19. package/dist/components/collection-card.cjs +2 -5
  20. package/dist/components/collection-card.cjs.map +1 -1
  21. package/dist/components/collection-card.js +3 -6
  22. package/dist/components/collection-card.js.map +1 -1
  23. package/dist/components/cta-card-grid.cjs +67 -0
  24. package/dist/components/cta-card-grid.cjs.map +1 -0
  25. package/dist/components/cta-card-grid.d.cts +23 -0
  26. package/dist/components/cta-card-grid.d.ts +23 -0
  27. package/dist/components/cta-card-grid.js +33 -0
  28. package/dist/components/cta-card-grid.js.map +1 -0
  29. package/dist/components/hero-slider.cjs +133 -0
  30. package/dist/components/hero-slider.cjs.map +1 -0
  31. package/dist/components/hero-slider.d.cts +12 -0
  32. package/dist/components/hero-slider.d.ts +12 -0
  33. package/dist/components/hero-slider.js +98 -0
  34. package/dist/components/hero-slider.js.map +1 -0
  35. package/dist/components/launchpad-grid.cjs +77 -0
  36. package/dist/components/launchpad-grid.cjs.map +1 -0
  37. package/dist/components/launchpad-grid.d.cts +20 -0
  38. package/dist/components/launchpad-grid.d.ts +20 -0
  39. package/dist/components/launchpad-grid.js +43 -0
  40. package/dist/components/launchpad-grid.js.map +1 -0
  41. package/dist/components/listing-card.cjs +146 -0
  42. package/dist/components/listing-card.cjs.map +1 -0
  43. package/dist/components/listing-card.d.cts +16 -0
  44. package/dist/components/listing-card.d.ts +16 -0
  45. package/dist/components/listing-card.js +111 -0
  46. package/dist/components/listing-card.js.map +1 -0
  47. package/dist/data/activity.cjs +48 -0
  48. package/dist/data/activity.cjs.map +1 -0
  49. package/dist/data/activity.d.cts +16 -0
  50. package/dist/data/activity.d.ts +16 -0
  51. package/dist/data/activity.js +23 -0
  52. package/dist/data/activity.js.map +1 -0
  53. package/dist/index.cjs +35 -2
  54. package/dist/index.cjs.map +1 -1
  55. package/dist/index.d.cts +11 -0
  56. package/dist/index.d.ts +11 -0
  57. package/dist/index.js +22 -1
  58. package/dist/index.js.map +1 -1
  59. package/dist/medialane.css +184 -0
  60. package/dist/utils/time.cjs +42 -0
  61. package/dist/utils/time.cjs.map +1 -0
  62. package/dist/utils/time.d.cts +7 -0
  63. package/dist/utils/time.d.ts +7 -0
  64. package/dist/utils/time.js +18 -0
  65. package/dist/utils/time.js.map +1 -0
  66. package/package.json +3 -2
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ "use client";
3
+ var __create = Object.create;
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getProtoOf = Object.getPrototypeOf;
8
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __export = (target, all) => {
10
+ for (var name in all)
11
+ __defProp(target, name, { get: all[name], enumerable: true });
12
+ };
13
+ var __copyProps = (to, from, except, desc) => {
14
+ if (from && typeof from === "object" || typeof from === "function") {
15
+ for (let key of __getOwnPropNames(from))
16
+ if (!__hasOwnProp.call(to, key) && key !== except)
17
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
18
+ }
19
+ return to;
20
+ };
21
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
22
+ // If the importer is in node compatibility mode or this is not an ESM
23
+ // file that has been converted to a CommonJS file using a Babel-
24
+ // compatible transform (i.e. "__esModule" has not been set), then set
25
+ // "default" to the CommonJS "module.exports" for node compatibility.
26
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
27
+ mod
28
+ ));
29
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
30
+ var activity_feed_shell_exports = {};
31
+ __export(activity_feed_shell_exports, {
32
+ ActivityFeedShell: () => ActivityFeedShell
33
+ });
34
+ module.exports = __toCommonJS(activity_feed_shell_exports);
35
+ var import_jsx_runtime = require("react/jsx-runtime");
36
+ var import_link = __toESM(require("next/link"), 1);
37
+ var import_lucide_react = require("lucide-react");
38
+ var import_time = require("../utils/time.js");
39
+ function SkeletonRow() {
40
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-3 px-4 py-2.5", children: [
41
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "h-7 w-7 rounded-lg bg-muted animate-pulse shrink-0" }),
42
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "h-7 w-7 rounded-md bg-muted animate-pulse shrink-0" }),
43
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex-1 space-y-1.5", children: [
44
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "h-3 w-32 bg-muted animate-pulse rounded" }),
45
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "h-2.5 w-20 bg-muted animate-pulse rounded" })
46
+ ] }),
47
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-1 text-right", children: [
48
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "h-3.5 w-14 bg-muted animate-pulse rounded" }),
49
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "h-2.5 w-8 bg-muted animate-pulse rounded" })
50
+ ] }),
51
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "h-3 w-10 bg-muted animate-pulse rounded hidden sm:block" })
52
+ ] });
53
+ }
54
+ function ActivityFeedShell({ title, href, hrefLabel = "Activities", lastUpdated, isLoading, children }) {
55
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", { className: "space-y-5", children: [
56
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center justify-between", children: [
57
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-2.5", children: [
58
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "relative h-8 w-8 rounded-xl bg-gradient-to-br from-indigo-500 to-blue-600 flex items-center justify-center shadow-lg shadow-indigo-500/20 shrink-0", children: [
59
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Activity, { className: "h-4 w-4 text-white" }),
60
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "absolute -top-1 -right-1 flex h-2.5 w-2.5", children: [
61
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "animate-ping absolute inline-flex h-full w-full rounded-full bg-emerald-400 opacity-75" }),
62
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "relative inline-flex rounded-full h-2.5 w-2.5 bg-emerald-500" })
63
+ ] })
64
+ ] }),
65
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [
66
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h2", { className: "text-xl sm:text-2xl font-black leading-none", children: title }),
67
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("p", { className: "text-[10px] text-muted-foreground mt-0.5 flex items-center gap-1", children: [
68
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.RefreshCw, { className: "h-2.5 w-2.5" }),
69
+ "Updated ",
70
+ (0, import_time.timeAgo)(lastUpdated)
71
+ ] })
72
+ ] })
73
+ ] }),
74
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_link.default, { href, className: "inline-flex items-center gap-1 text-sm text-muted-foreground hover:text-foreground px-3 py-1.5 rounded-md hover:bg-accent transition-colors", children: [
75
+ hrefLabel,
76
+ " ",
77
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.ArrowRight, { className: "h-3.5 w-3.5" })
78
+ ] })
79
+ ] }),
80
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "bento-cell overflow-hidden divide-y divide-border/40", children: isLoading ? Array.from({ length: 6 }).map((_, i) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SkeletonRow, {}, i)) : !children || Array.isArray(children) && children.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex flex-col items-center gap-2 py-10 text-center", children: [
81
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Activity, { className: "h-8 w-8 text-muted-foreground/30" }),
82
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-sm text-muted-foreground", children: "No activity yet." })
83
+ ] }) : children })
84
+ ] });
85
+ }
86
+ // Annotate the CommonJS export names for ESM import in node:
87
+ 0 && (module.exports = {
88
+ ActivityFeedShell
89
+ });
90
+ //# sourceMappingURL=activity-feed-shell.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/activity-feed-shell.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"next/link\";\nimport { ArrowRight, Activity, RefreshCw } from \"lucide-react\";\nimport { timeAgo } from \"../utils/time.js\";\n\nexport interface ActivityFeedShellProps {\n title: string;\n href: string;\n hrefLabel?: string;\n lastUpdated: string;\n isLoading: boolean;\n children: React.ReactNode;\n}\n\nfunction SkeletonRow() {\n return (\n <div className=\"flex items-center gap-3 px-4 py-2.5\">\n <div className=\"h-7 w-7 rounded-lg bg-muted animate-pulse shrink-0\" />\n <div className=\"h-7 w-7 rounded-md bg-muted animate-pulse shrink-0\" />\n <div className=\"flex-1 space-y-1.5\">\n <div className=\"h-3 w-32 bg-muted animate-pulse rounded\" />\n <div className=\"h-2.5 w-20 bg-muted animate-pulse rounded\" />\n </div>\n <div className=\"space-y-1 text-right\">\n <div className=\"h-3.5 w-14 bg-muted animate-pulse rounded\" />\n <div className=\"h-2.5 w-8 bg-muted animate-pulse rounded\" />\n </div>\n <div className=\"h-3 w-10 bg-muted animate-pulse rounded hidden sm:block\" />\n </div>\n );\n}\n\nexport function ActivityFeedShell({ title, href, hrefLabel = \"Activities\", lastUpdated, isLoading, children }: ActivityFeedShellProps) {\n return (\n <section className=\"space-y-5\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2.5\">\n <div className=\"relative h-8 w-8 rounded-xl bg-gradient-to-br from-indigo-500 to-blue-600 flex items-center justify-center shadow-lg shadow-indigo-500/20 shrink-0\">\n <Activity className=\"h-4 w-4 text-white\" />\n <span className=\"absolute -top-1 -right-1 flex h-2.5 w-2.5\">\n <span className=\"animate-ping absolute inline-flex h-full w-full rounded-full bg-emerald-400 opacity-75\" />\n <span className=\"relative inline-flex rounded-full h-2.5 w-2.5 bg-emerald-500\" />\n </span>\n </div>\n <div>\n <h2 className=\"text-xl sm:text-2xl font-black leading-none\">{title}</h2>\n <p className=\"text-[10px] text-muted-foreground mt-0.5 flex items-center gap-1\">\n <RefreshCw className=\"h-2.5 w-2.5\" />\n Updated {timeAgo(lastUpdated)}\n </p>\n </div>\n </div>\n <Link href={href} className=\"inline-flex items-center gap-1 text-sm text-muted-foreground hover:text-foreground px-3 py-1.5 rounded-md hover:bg-accent transition-colors\">\n {hrefLabel} <ArrowRight className=\"h-3.5 w-3.5\" />\n </Link>\n </div>\n\n <div className=\"bento-cell overflow-hidden divide-y divide-border/40\">\n {isLoading ? (\n Array.from({ length: 6 }).map((_, i) => <SkeletonRow key={i} />)\n ) : !children || (Array.isArray(children) && children.length === 0) ? (\n <div className=\"flex flex-col items-center gap-2 py-10 text-center\">\n <Activity className=\"h-8 w-8 text-muted-foreground/30\" />\n <p className=\"text-sm text-muted-foreground\">No activity yet.</p>\n </div>\n ) : (\n children\n )}\n </div>\n </section>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBM;AAhBN,kBAAiB;AACjB,0BAAgD;AAChD,kBAAwB;AAWxB,SAAS,cAAc;AACrB,SACE,6CAAC,SAAI,WAAU,uCACb;AAAA,gDAAC,SAAI,WAAU,sDAAqD;AAAA,IACpE,4CAAC,SAAI,WAAU,sDAAqD;AAAA,IACpE,6CAAC,SAAI,WAAU,sBACb;AAAA,kDAAC,SAAI,WAAU,2CAA0C;AAAA,MACzD,4CAAC,SAAI,WAAU,6CAA4C;AAAA,OAC7D;AAAA,IACA,6CAAC,SAAI,WAAU,wBACb;AAAA,kDAAC,SAAI,WAAU,6CAA4C;AAAA,MAC3D,4CAAC,SAAI,WAAU,4CAA2C;AAAA,OAC5D;AAAA,IACA,4CAAC,SAAI,WAAU,2DAA0D;AAAA,KAC3E;AAEJ;AAEO,SAAS,kBAAkB,EAAE,OAAO,MAAM,YAAY,cAAc,aAAa,WAAW,SAAS,GAA2B;AACrI,SACE,6CAAC,aAAQ,WAAU,aACjB;AAAA,iDAAC,SAAI,WAAU,qCACb;AAAA,mDAAC,SAAI,WAAU,6BACb;AAAA,qDAAC,SAAI,WAAU,sJACb;AAAA,sDAAC,gCAAS,WAAU,sBAAqB;AAAA,UACzC,6CAAC,UAAK,WAAU,6CACd;AAAA,wDAAC,UAAK,WAAU,0FAAyF;AAAA,YACzG,4CAAC,UAAK,WAAU,gEAA+D;AAAA,aACjF;AAAA,WACF;AAAA,QACA,6CAAC,SACC;AAAA,sDAAC,QAAG,WAAU,+CAA+C,iBAAM;AAAA,UACnE,6CAAC,OAAE,WAAU,oEACX;AAAA,wDAAC,iCAAU,WAAU,eAAc;AAAA,YAAE;AAAA,gBAC5B,qBAAQ,WAAW;AAAA,aAC9B;AAAA,WACF;AAAA,SACF;AAAA,MACA,6CAAC,YAAAA,SAAA,EAAK,MAAY,WAAU,+IACzB;AAAA;AAAA,QAAU;AAAA,QAAC,4CAAC,kCAAW,WAAU,eAAc;AAAA,SAClD;AAAA,OACF;AAAA,IAEA,4CAAC,SAAI,WAAU,wDACZ,sBACC,MAAM,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,MAAM,4CAAC,iBAAiB,CAAG,CAAE,IAC7D,CAAC,YAAa,MAAM,QAAQ,QAAQ,KAAK,SAAS,WAAW,IAC/D,6CAAC,SAAI,WAAU,sDACb;AAAA,kDAAC,gCAAS,WAAU,oCAAmC;AAAA,MACvD,4CAAC,OAAE,WAAU,iCAAgC,8BAAgB;AAAA,OAC/D,IAEA,UAEJ;AAAA,KACF;AAEJ;","names":["Link"]}
@@ -0,0 +1,13 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ interface ActivityFeedShellProps {
4
+ title: string;
5
+ href: string;
6
+ hrefLabel?: string;
7
+ lastUpdated: string;
8
+ isLoading: boolean;
9
+ children: React.ReactNode;
10
+ }
11
+ declare function ActivityFeedShell({ title, href, hrefLabel, lastUpdated, isLoading, children }: ActivityFeedShellProps): react_jsx_runtime.JSX.Element;
12
+
13
+ export { ActivityFeedShell, type ActivityFeedShellProps };
@@ -0,0 +1,13 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ interface ActivityFeedShellProps {
4
+ title: string;
5
+ href: string;
6
+ hrefLabel?: string;
7
+ lastUpdated: string;
8
+ isLoading: boolean;
9
+ children: React.ReactNode;
10
+ }
11
+ declare function ActivityFeedShell({ title, href, hrefLabel, lastUpdated, isLoading, children }: ActivityFeedShellProps): react_jsx_runtime.JSX.Element;
12
+
13
+ export { ActivityFeedShell, type ActivityFeedShellProps };
@@ -0,0 +1,56 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import Link from "next/link";
4
+ import { ArrowRight, Activity, RefreshCw } from "lucide-react";
5
+ import { timeAgo } from "../utils/time.js";
6
+ function SkeletonRow() {
7
+ return /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 px-4 py-2.5", children: [
8
+ /* @__PURE__ */ jsx("div", { className: "h-7 w-7 rounded-lg bg-muted animate-pulse shrink-0" }),
9
+ /* @__PURE__ */ jsx("div", { className: "h-7 w-7 rounded-md bg-muted animate-pulse shrink-0" }),
10
+ /* @__PURE__ */ jsxs("div", { className: "flex-1 space-y-1.5", children: [
11
+ /* @__PURE__ */ jsx("div", { className: "h-3 w-32 bg-muted animate-pulse rounded" }),
12
+ /* @__PURE__ */ jsx("div", { className: "h-2.5 w-20 bg-muted animate-pulse rounded" })
13
+ ] }),
14
+ /* @__PURE__ */ jsxs("div", { className: "space-y-1 text-right", children: [
15
+ /* @__PURE__ */ jsx("div", { className: "h-3.5 w-14 bg-muted animate-pulse rounded" }),
16
+ /* @__PURE__ */ jsx("div", { className: "h-2.5 w-8 bg-muted animate-pulse rounded" })
17
+ ] }),
18
+ /* @__PURE__ */ jsx("div", { className: "h-3 w-10 bg-muted animate-pulse rounded hidden sm:block" })
19
+ ] });
20
+ }
21
+ function ActivityFeedShell({ title, href, hrefLabel = "Activities", lastUpdated, isLoading, children }) {
22
+ return /* @__PURE__ */ jsxs("section", { className: "space-y-5", children: [
23
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
24
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2.5", children: [
25
+ /* @__PURE__ */ jsxs("div", { className: "relative h-8 w-8 rounded-xl bg-gradient-to-br from-indigo-500 to-blue-600 flex items-center justify-center shadow-lg shadow-indigo-500/20 shrink-0", children: [
26
+ /* @__PURE__ */ jsx(Activity, { className: "h-4 w-4 text-white" }),
27
+ /* @__PURE__ */ jsxs("span", { className: "absolute -top-1 -right-1 flex h-2.5 w-2.5", children: [
28
+ /* @__PURE__ */ jsx("span", { className: "animate-ping absolute inline-flex h-full w-full rounded-full bg-emerald-400 opacity-75" }),
29
+ /* @__PURE__ */ jsx("span", { className: "relative inline-flex rounded-full h-2.5 w-2.5 bg-emerald-500" })
30
+ ] })
31
+ ] }),
32
+ /* @__PURE__ */ jsxs("div", { children: [
33
+ /* @__PURE__ */ jsx("h2", { className: "text-xl sm:text-2xl font-black leading-none", children: title }),
34
+ /* @__PURE__ */ jsxs("p", { className: "text-[10px] text-muted-foreground mt-0.5 flex items-center gap-1", children: [
35
+ /* @__PURE__ */ jsx(RefreshCw, { className: "h-2.5 w-2.5" }),
36
+ "Updated ",
37
+ timeAgo(lastUpdated)
38
+ ] })
39
+ ] })
40
+ ] }),
41
+ /* @__PURE__ */ jsxs(Link, { href, className: "inline-flex items-center gap-1 text-sm text-muted-foreground hover:text-foreground px-3 py-1.5 rounded-md hover:bg-accent transition-colors", children: [
42
+ hrefLabel,
43
+ " ",
44
+ /* @__PURE__ */ jsx(ArrowRight, { className: "h-3.5 w-3.5" })
45
+ ] })
46
+ ] }),
47
+ /* @__PURE__ */ jsx("div", { className: "bento-cell overflow-hidden divide-y divide-border/40", children: isLoading ? Array.from({ length: 6 }).map((_, i) => /* @__PURE__ */ jsx(SkeletonRow, {}, i)) : !children || Array.isArray(children) && children.length === 0 ? /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center gap-2 py-10 text-center", children: [
48
+ /* @__PURE__ */ jsx(Activity, { className: "h-8 w-8 text-muted-foreground/30" }),
49
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: "No activity yet." })
50
+ ] }) : children })
51
+ ] });
52
+ }
53
+ export {
54
+ ActivityFeedShell
55
+ };
56
+ //# sourceMappingURL=activity-feed-shell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/activity-feed-shell.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"next/link\";\nimport { ArrowRight, Activity, RefreshCw } from \"lucide-react\";\nimport { timeAgo } from \"../utils/time.js\";\n\nexport interface ActivityFeedShellProps {\n title: string;\n href: string;\n hrefLabel?: string;\n lastUpdated: string;\n isLoading: boolean;\n children: React.ReactNode;\n}\n\nfunction SkeletonRow() {\n return (\n <div className=\"flex items-center gap-3 px-4 py-2.5\">\n <div className=\"h-7 w-7 rounded-lg bg-muted animate-pulse shrink-0\" />\n <div className=\"h-7 w-7 rounded-md bg-muted animate-pulse shrink-0\" />\n <div className=\"flex-1 space-y-1.5\">\n <div className=\"h-3 w-32 bg-muted animate-pulse rounded\" />\n <div className=\"h-2.5 w-20 bg-muted animate-pulse rounded\" />\n </div>\n <div className=\"space-y-1 text-right\">\n <div className=\"h-3.5 w-14 bg-muted animate-pulse rounded\" />\n <div className=\"h-2.5 w-8 bg-muted animate-pulse rounded\" />\n </div>\n <div className=\"h-3 w-10 bg-muted animate-pulse rounded hidden sm:block\" />\n </div>\n );\n}\n\nexport function ActivityFeedShell({ title, href, hrefLabel = \"Activities\", lastUpdated, isLoading, children }: ActivityFeedShellProps) {\n return (\n <section className=\"space-y-5\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2.5\">\n <div className=\"relative h-8 w-8 rounded-xl bg-gradient-to-br from-indigo-500 to-blue-600 flex items-center justify-center shadow-lg shadow-indigo-500/20 shrink-0\">\n <Activity className=\"h-4 w-4 text-white\" />\n <span className=\"absolute -top-1 -right-1 flex h-2.5 w-2.5\">\n <span className=\"animate-ping absolute inline-flex h-full w-full rounded-full bg-emerald-400 opacity-75\" />\n <span className=\"relative inline-flex rounded-full h-2.5 w-2.5 bg-emerald-500\" />\n </span>\n </div>\n <div>\n <h2 className=\"text-xl sm:text-2xl font-black leading-none\">{title}</h2>\n <p className=\"text-[10px] text-muted-foreground mt-0.5 flex items-center gap-1\">\n <RefreshCw className=\"h-2.5 w-2.5\" />\n Updated {timeAgo(lastUpdated)}\n </p>\n </div>\n </div>\n <Link href={href} className=\"inline-flex items-center gap-1 text-sm text-muted-foreground hover:text-foreground px-3 py-1.5 rounded-md hover:bg-accent transition-colors\">\n {hrefLabel} <ArrowRight className=\"h-3.5 w-3.5\" />\n </Link>\n </div>\n\n <div className=\"bento-cell overflow-hidden divide-y divide-border/40\">\n {isLoading ? (\n Array.from({ length: 6 }).map((_, i) => <SkeletonRow key={i} />)\n ) : !children || (Array.isArray(children) && children.length === 0) ? (\n <div className=\"flex flex-col items-center gap-2 py-10 text-center\">\n <Activity className=\"h-8 w-8 text-muted-foreground/30\" />\n <p className=\"text-sm text-muted-foreground\">No activity yet.</p>\n </div>\n ) : (\n children\n )}\n </div>\n </section>\n );\n}\n"],"mappings":";AAkBM,cAEA,YAFA;AAhBN,OAAO,UAAU;AACjB,SAAS,YAAY,UAAU,iBAAiB;AAChD,SAAS,eAAe;AAWxB,SAAS,cAAc;AACrB,SACE,qBAAC,SAAI,WAAU,uCACb;AAAA,wBAAC,SAAI,WAAU,sDAAqD;AAAA,IACpE,oBAAC,SAAI,WAAU,sDAAqD;AAAA,IACpE,qBAAC,SAAI,WAAU,sBACb;AAAA,0BAAC,SAAI,WAAU,2CAA0C;AAAA,MACzD,oBAAC,SAAI,WAAU,6CAA4C;AAAA,OAC7D;AAAA,IACA,qBAAC,SAAI,WAAU,wBACb;AAAA,0BAAC,SAAI,WAAU,6CAA4C;AAAA,MAC3D,oBAAC,SAAI,WAAU,4CAA2C;AAAA,OAC5D;AAAA,IACA,oBAAC,SAAI,WAAU,2DAA0D;AAAA,KAC3E;AAEJ;AAEO,SAAS,kBAAkB,EAAE,OAAO,MAAM,YAAY,cAAc,aAAa,WAAW,SAAS,GAA2B;AACrI,SACE,qBAAC,aAAQ,WAAU,aACjB;AAAA,yBAAC,SAAI,WAAU,qCACb;AAAA,2BAAC,SAAI,WAAU,6BACb;AAAA,6BAAC,SAAI,WAAU,sJACb;AAAA,8BAAC,YAAS,WAAU,sBAAqB;AAAA,UACzC,qBAAC,UAAK,WAAU,6CACd;AAAA,gCAAC,UAAK,WAAU,0FAAyF;AAAA,YACzG,oBAAC,UAAK,WAAU,gEAA+D;AAAA,aACjF;AAAA,WACF;AAAA,QACA,qBAAC,SACC;AAAA,8BAAC,QAAG,WAAU,+CAA+C,iBAAM;AAAA,UACnE,qBAAC,OAAE,WAAU,oEACX;AAAA,gCAAC,aAAU,WAAU,eAAc;AAAA,YAAE;AAAA,YAC5B,QAAQ,WAAW;AAAA,aAC9B;AAAA,WACF;AAAA,SACF;AAAA,MACA,qBAAC,QAAK,MAAY,WAAU,+IACzB;AAAA;AAAA,QAAU;AAAA,QAAC,oBAAC,cAAW,WAAU,eAAc;AAAA,SAClD;AAAA,OACF;AAAA,IAEA,oBAAC,SAAI,WAAU,wDACZ,sBACC,MAAM,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,MAAM,oBAAC,iBAAiB,CAAG,CAAE,IAC7D,CAAC,YAAa,MAAM,QAAQ,QAAQ,KAAK,SAAS,WAAW,IAC/D,qBAAC,SAAI,WAAU,sDACb;AAAA,0BAAC,YAAS,WAAU,oCAAmC;AAAA,MACvD,oBAAC,OAAE,WAAU,iCAAgC,8BAAgB;AAAA,OAC/D,IAEA,UAEJ;AAAA,KACF;AAEJ;","names":[]}
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ "use client";
3
+ var __create = Object.create;
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getProtoOf = Object.getPrototypeOf;
8
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __export = (target, all) => {
10
+ for (var name in all)
11
+ __defProp(target, name, { get: all[name], enumerable: true });
12
+ };
13
+ var __copyProps = (to, from, except, desc) => {
14
+ if (from && typeof from === "object" || typeof from === "function") {
15
+ for (let key of __getOwnPropNames(from))
16
+ if (!__hasOwnProp.call(to, key) && key !== except)
17
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
18
+ }
19
+ return to;
20
+ };
21
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
22
+ // If the importer is in node compatibility mode or this is not an ESM
23
+ // file that has been converted to a CommonJS file using a Babel-
24
+ // compatible transform (i.e. "__esModule" has not been set), then set
25
+ // "default" to the CommonJS "module.exports" for node compatibility.
26
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
27
+ mod
28
+ ));
29
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
30
+ var activity_row_exports = {};
31
+ __export(activity_row_exports, {
32
+ ActivityRow: () => ActivityRow
33
+ });
34
+ module.exports = __toCommonJS(activity_row_exports);
35
+ var import_jsx_runtime = require("react/jsx-runtime");
36
+ var import_image = __toESM(require("next/image"), 1);
37
+ var import_link = __toESM(require("next/link"), 1);
38
+ var import_lucide_react = require("lucide-react");
39
+ var import_address_display = require("./address-display.js");
40
+ var import_currency_icon = require("./currency-icon.js");
41
+ var import_activity = require("../data/activity.js");
42
+ var import_ipfs = require("../utils/ipfs.js");
43
+ var import_time = require("../utils/time.js");
44
+ var import_format = require("../utils/format.js");
45
+ var import_cn = require("../utils/cn.js");
46
+ function ActivityRow({
47
+ activity,
48
+ token,
49
+ showActor = true,
50
+ showExplorer = true,
51
+ compact = false,
52
+ explorerUrl = "https://voyager.online",
53
+ getAssetHref = (c, t) => `/asset/${c}/${t}`,
54
+ getActorHref = (a) => `/creator/${a}`
55
+ }) {
56
+ const config = import_activity.ACTIVITY_TYPE_CONFIG[activity.type] ?? {
57
+ label: activity.type,
58
+ variant: "outline",
59
+ icon: import_lucide_react.ExternalLink,
60
+ colorClass: "text-muted-foreground",
61
+ bgClass: "bg-muted"
62
+ };
63
+ const Icon = config.icon;
64
+ const contract = activity.nftContract ?? activity.contractAddress ?? null;
65
+ const tokenId = activity.nftTokenId ?? activity.tokenId ?? null;
66
+ const actor = activity.offerer ?? activity.fulfiller ?? (activity.type === "mint" ? activity.to : activity.from) ?? null;
67
+ const txLink = activity.txHash ? `${explorerUrl}/tx/${activity.txHash}` : null;
68
+ const tokenName = token?.name ?? (tokenId ? `#${tokenId}` : "\u2014");
69
+ const tokenImage = token?.image ? (0, import_ipfs.ipfsToHttp)(token.image) : null;
70
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: (0, import_cn.cn)("flex items-center gap-3 hover:bg-muted/30 transition-colors group", compact ? "pl-4 pr-5 py-2.5" : "pl-4 pr-5 py-3.5"), children: [
71
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: (0, import_cn.cn)("rounded-lg flex items-center justify-center shrink-0", config.bgClass, compact ? "h-7 w-7" : "h-8 w-8"), children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Icon, { className: (0, import_cn.cn)("shrink-0", config.colorClass, compact ? "h-3.5 w-3.5" : "h-4 w-4") }) }),
72
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: (0, import_cn.cn)("rounded-md overflow-hidden shrink-0 bg-muted", compact ? "h-7 w-7" : "h-9 w-9"), children: tokenImage ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_image.default, { src: tokenImage, alt: tokenName, width: compact ? 28 : 36, height: compact ? 28 : 36, className: "object-cover w-full h-full", unoptimized: true }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "w-full h-full bg-gradient-to-br from-muted-foreground/10 to-muted-foreground/5" }) }),
73
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex-1 min-w-0", children: [
74
+ contract && tokenId ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_link.default, { href: getAssetHref(contract, tokenId), className: "text-sm font-semibold hover:text-primary transition-colors truncate block leading-tight", children: tokenName }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-sm font-semibold text-muted-foreground", children: "\u2014" }),
75
+ showActor && actor && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_link.default, { href: getActorHref(actor), className: "text-xs text-muted-foreground hover:text-primary transition-colors font-mono leading-tight", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_address_display.AddressDisplay, { address: actor, chars: 4, showCopy: false }) })
76
+ ] }),
77
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-2.5 shrink-0", children: [
78
+ !compact && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: (0, import_cn.cn)("text-[10px] font-medium px-1.5 py-0.5 rounded hidden sm:inline-flex", config.bgClass, config.colorClass), children: config.label }),
79
+ activity.price?.formatted && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "text-right", children: [
80
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-sm font-bold tabular-nums leading-tight", children: (0, import_format.formatDisplayPrice)(activity.price.formatted) }),
81
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("p", { className: "text-[10px] text-muted-foreground leading-tight flex items-center justify-end gap-0.5", children: [
82
+ activity.price.currency && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_currency_icon.CurrencyIcon, { symbol: activity.price.currency, size: 10 }),
83
+ activity.price.currency
84
+ ] })
85
+ ] }),
86
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-[10px] text-muted-foreground tabular-nums hidden sm:block w-12 text-right", title: new Date(activity.timestamp).toLocaleString(), children: (0, import_time.timeAgo)(activity.timestamp) }),
87
+ showExplorer && txLink && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("a", { href: txLink, target: "_blank", rel: "noopener noreferrer", className: "inline-flex items-center justify-center h-6 w-6 rounded-md hover:bg-muted transition-colors opacity-0 group-hover:opacity-100 shrink-0", "aria-label": "View on explorer", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.ExternalLink, { className: "h-3 w-3 text-muted-foreground" }) })
88
+ ] })
89
+ ] });
90
+ }
91
+ // Annotate the CommonJS export names for ESM import in node:
92
+ 0 && (module.exports = {
93
+ ActivityRow
94
+ });
95
+ //# sourceMappingURL=activity-row.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/activity-row.tsx"],"sourcesContent":["\"use client\";\n\nimport Image from \"next/image\";\nimport Link from \"next/link\";\nimport { ExternalLink } from \"lucide-react\";\nimport { AddressDisplay } from \"./address-display.js\";\nimport { CurrencyIcon } from \"./currency-icon.js\";\nimport { ACTIVITY_TYPE_CONFIG } from \"../data/activity.js\";\nimport { ipfsToHttp } from \"../utils/ipfs.js\";\nimport { timeAgo } from \"../utils/time.js\";\nimport { formatDisplayPrice } from \"../utils/format.js\";\nimport { cn } from \"../utils/cn.js\";\nimport type { ApiActivity } from \"@medialane/sdk\";\n\nexport interface ActivityRowProps {\n activity: ApiActivity;\n /** Optional token enrichment — if absent shows #tokenId fallback. No internal useToken call. */\n token?: { name?: string; image?: string };\n showActor?: boolean;\n showExplorer?: boolean;\n compact?: boolean;\n explorerUrl?: string;\n getAssetHref?: (contract: string, tokenId: string) => string;\n getActorHref?: (address: string) => string;\n}\n\nexport function ActivityRow({\n activity,\n token,\n showActor = true,\n showExplorer = true,\n compact = false,\n explorerUrl = \"https://voyager.online\",\n getAssetHref = (c, t) => `/asset/${c}/${t}`,\n getActorHref = (a) => `/creator/${a}`,\n}: ActivityRowProps) {\n const config = ACTIVITY_TYPE_CONFIG[activity.type] ?? {\n label: activity.type,\n variant: \"outline\" as const,\n icon: ExternalLink,\n colorClass: \"text-muted-foreground\",\n bgClass: \"bg-muted\",\n };\n const Icon = config.icon;\n\n const contract = activity.nftContract ?? activity.contractAddress ?? null;\n const tokenId = activity.nftTokenId ?? activity.tokenId ?? null;\n const actor =\n activity.offerer ??\n activity.fulfiller ??\n ((activity.type as string) === \"mint\" ? activity.to : activity.from) ??\n null;\n const txLink = activity.txHash ? `${explorerUrl}/tx/${activity.txHash}` : null;\n\n const tokenName = token?.name ?? (tokenId ? `#${tokenId}` : \"—\");\n const tokenImage = token?.image ? ipfsToHttp(token.image) : null;\n\n return (\n <div className={cn(\"flex items-center gap-3 hover:bg-muted/30 transition-colors group\", compact ? \"pl-4 pr-5 py-2.5\" : \"pl-4 pr-5 py-3.5\")}>\n {/* Type icon */}\n <div className={cn(\"rounded-lg flex items-center justify-center shrink-0\", config.bgClass, compact ? \"h-7 w-7\" : \"h-8 w-8\")}>\n <Icon className={cn(\"shrink-0\", config.colorClass, compact ? \"h-3.5 w-3.5\" : \"h-4 w-4\")} />\n </div>\n\n {/* Token thumbnail */}\n <div className={cn(\"rounded-md overflow-hidden shrink-0 bg-muted\", compact ? \"h-7 w-7\" : \"h-9 w-9\")}>\n {tokenImage ? (\n <Image src={tokenImage} alt={tokenName} width={compact ? 28 : 36} height={compact ? 28 : 36} className=\"object-cover w-full h-full\" unoptimized />\n ) : (\n <div className=\"w-full h-full bg-gradient-to-br from-muted-foreground/10 to-muted-foreground/5\" />\n )}\n </div>\n\n {/* Asset name + actor */}\n <div className=\"flex-1 min-w-0\">\n {contract && tokenId ? (\n <Link href={getAssetHref(contract, tokenId)} className=\"text-sm font-semibold hover:text-primary transition-colors truncate block leading-tight\">\n {tokenName}\n </Link>\n ) : (\n <span className=\"text-sm font-semibold text-muted-foreground\">—</span>\n )}\n {showActor && actor && (\n <Link href={getActorHref(actor)} className=\"text-xs text-muted-foreground hover:text-primary transition-colors font-mono leading-tight\">\n <AddressDisplay address={actor} chars={4} showCopy={false} />\n </Link>\n )}\n </div>\n\n {/* Right: badge + price + time + explorer */}\n <div className=\"flex items-center gap-2.5 shrink-0\">\n {!compact && (\n <span className={cn(\"text-[10px] font-medium px-1.5 py-0.5 rounded hidden sm:inline-flex\", config.bgClass, config.colorClass)}>\n {config.label}\n </span>\n )}\n\n {activity.price?.formatted && (\n <div className=\"text-right\">\n <p className=\"text-sm font-bold tabular-nums leading-tight\">{formatDisplayPrice(activity.price.formatted)}</p>\n <p className=\"text-[10px] text-muted-foreground leading-tight flex items-center justify-end gap-0.5\">\n {activity.price.currency && <CurrencyIcon symbol={activity.price.currency} size={10} />}\n {activity.price.currency}\n </p>\n </div>\n )}\n\n <span className=\"text-[10px] text-muted-foreground tabular-nums hidden sm:block w-12 text-right\" title={new Date(activity.timestamp).toLocaleString()}>\n {timeAgo(activity.timestamp)}\n </span>\n\n {showExplorer && txLink && (\n <a href={txLink} target=\"_blank\" rel=\"noopener noreferrer\" className=\"inline-flex items-center justify-center h-6 w-6 rounded-md hover:bg-muted transition-colors opacity-0 group-hover:opacity-100 shrink-0\" aria-label=\"View on explorer\">\n <ExternalLink className=\"h-3 w-3 text-muted-foreground\" />\n </a>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":["Image","Link"]}
@@ -0,0 +1,20 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ApiActivity } from '@medialane/sdk';
3
+
4
+ interface ActivityRowProps {
5
+ activity: ApiActivity;
6
+ /** Optional token enrichment — if absent shows #tokenId fallback. No internal useToken call. */
7
+ token?: {
8
+ name?: string;
9
+ image?: string;
10
+ };
11
+ showActor?: boolean;
12
+ showExplorer?: boolean;
13
+ compact?: boolean;
14
+ explorerUrl?: string;
15
+ getAssetHref?: (contract: string, tokenId: string) => string;
16
+ getActorHref?: (address: string) => string;
17
+ }
18
+ declare function ActivityRow({ activity, token, showActor, showExplorer, compact, explorerUrl, getAssetHref, getActorHref, }: ActivityRowProps): react_jsx_runtime.JSX.Element;
19
+
20
+ export { ActivityRow, type ActivityRowProps };
@@ -0,0 +1,20 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ApiActivity } from '@medialane/sdk';
3
+
4
+ interface ActivityRowProps {
5
+ activity: ApiActivity;
6
+ /** Optional token enrichment — if absent shows #tokenId fallback. No internal useToken call. */
7
+ token?: {
8
+ name?: string;
9
+ image?: string;
10
+ };
11
+ showActor?: boolean;
12
+ showExplorer?: boolean;
13
+ compact?: boolean;
14
+ explorerUrl?: string;
15
+ getAssetHref?: (contract: string, tokenId: string) => string;
16
+ getActorHref?: (address: string) => string;
17
+ }
18
+ declare function ActivityRow({ activity, token, showActor, showExplorer, compact, explorerUrl, getAssetHref, getActorHref, }: ActivityRowProps): react_jsx_runtime.JSX.Element;
19
+
20
+ export { ActivityRow, type ActivityRowProps };
@@ -0,0 +1,61 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import Image from "next/image";
4
+ import Link from "next/link";
5
+ import { ExternalLink } from "lucide-react";
6
+ import { AddressDisplay } from "./address-display.js";
7
+ import { CurrencyIcon } from "./currency-icon.js";
8
+ import { ACTIVITY_TYPE_CONFIG } from "../data/activity.js";
9
+ import { ipfsToHttp } from "../utils/ipfs.js";
10
+ import { timeAgo } from "../utils/time.js";
11
+ import { formatDisplayPrice } from "../utils/format.js";
12
+ import { cn } from "../utils/cn.js";
13
+ function ActivityRow({
14
+ activity,
15
+ token,
16
+ showActor = true,
17
+ showExplorer = true,
18
+ compact = false,
19
+ explorerUrl = "https://voyager.online",
20
+ getAssetHref = (c, t) => `/asset/${c}/${t}`,
21
+ getActorHref = (a) => `/creator/${a}`
22
+ }) {
23
+ const config = ACTIVITY_TYPE_CONFIG[activity.type] ?? {
24
+ label: activity.type,
25
+ variant: "outline",
26
+ icon: ExternalLink,
27
+ colorClass: "text-muted-foreground",
28
+ bgClass: "bg-muted"
29
+ };
30
+ const Icon = config.icon;
31
+ const contract = activity.nftContract ?? activity.contractAddress ?? null;
32
+ const tokenId = activity.nftTokenId ?? activity.tokenId ?? null;
33
+ const actor = activity.offerer ?? activity.fulfiller ?? (activity.type === "mint" ? activity.to : activity.from) ?? null;
34
+ const txLink = activity.txHash ? `${explorerUrl}/tx/${activity.txHash}` : null;
35
+ const tokenName = token?.name ?? (tokenId ? `#${tokenId}` : "\u2014");
36
+ const tokenImage = token?.image ? ipfsToHttp(token.image) : null;
37
+ return /* @__PURE__ */ jsxs("div", { className: cn("flex items-center gap-3 hover:bg-muted/30 transition-colors group", compact ? "pl-4 pr-5 py-2.5" : "pl-4 pr-5 py-3.5"), children: [
38
+ /* @__PURE__ */ jsx("div", { className: cn("rounded-lg flex items-center justify-center shrink-0", config.bgClass, compact ? "h-7 w-7" : "h-8 w-8"), children: /* @__PURE__ */ jsx(Icon, { className: cn("shrink-0", config.colorClass, compact ? "h-3.5 w-3.5" : "h-4 w-4") }) }),
39
+ /* @__PURE__ */ jsx("div", { className: cn("rounded-md overflow-hidden shrink-0 bg-muted", compact ? "h-7 w-7" : "h-9 w-9"), children: tokenImage ? /* @__PURE__ */ jsx(Image, { src: tokenImage, alt: tokenName, width: compact ? 28 : 36, height: compact ? 28 : 36, className: "object-cover w-full h-full", unoptimized: true }) : /* @__PURE__ */ jsx("div", { className: "w-full h-full bg-gradient-to-br from-muted-foreground/10 to-muted-foreground/5" }) }),
40
+ /* @__PURE__ */ jsxs("div", { className: "flex-1 min-w-0", children: [
41
+ contract && tokenId ? /* @__PURE__ */ jsx(Link, { href: getAssetHref(contract, tokenId), className: "text-sm font-semibold hover:text-primary transition-colors truncate block leading-tight", children: tokenName }) : /* @__PURE__ */ jsx("span", { className: "text-sm font-semibold text-muted-foreground", children: "\u2014" }),
42
+ showActor && actor && /* @__PURE__ */ jsx(Link, { href: getActorHref(actor), className: "text-xs text-muted-foreground hover:text-primary transition-colors font-mono leading-tight", children: /* @__PURE__ */ jsx(AddressDisplay, { address: actor, chars: 4, showCopy: false }) })
43
+ ] }),
44
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2.5 shrink-0", children: [
45
+ !compact && /* @__PURE__ */ jsx("span", { className: cn("text-[10px] font-medium px-1.5 py-0.5 rounded hidden sm:inline-flex", config.bgClass, config.colorClass), children: config.label }),
46
+ activity.price?.formatted && /* @__PURE__ */ jsxs("div", { className: "text-right", children: [
47
+ /* @__PURE__ */ jsx("p", { className: "text-sm font-bold tabular-nums leading-tight", children: formatDisplayPrice(activity.price.formatted) }),
48
+ /* @__PURE__ */ jsxs("p", { className: "text-[10px] text-muted-foreground leading-tight flex items-center justify-end gap-0.5", children: [
49
+ activity.price.currency && /* @__PURE__ */ jsx(CurrencyIcon, { symbol: activity.price.currency, size: 10 }),
50
+ activity.price.currency
51
+ ] })
52
+ ] }),
53
+ /* @__PURE__ */ jsx("span", { className: "text-[10px] text-muted-foreground tabular-nums hidden sm:block w-12 text-right", title: new Date(activity.timestamp).toLocaleString(), children: timeAgo(activity.timestamp) }),
54
+ showExplorer && txLink && /* @__PURE__ */ jsx("a", { href: txLink, target: "_blank", rel: "noopener noreferrer", className: "inline-flex items-center justify-center h-6 w-6 rounded-md hover:bg-muted transition-colors opacity-0 group-hover:opacity-100 shrink-0", "aria-label": "View on explorer", children: /* @__PURE__ */ jsx(ExternalLink, { className: "h-3 w-3 text-muted-foreground" }) })
55
+ ] })
56
+ ] });
57
+ }
58
+ export {
59
+ ActivityRow
60
+ };
61
+ //# sourceMappingURL=activity-row.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/activity-row.tsx"],"sourcesContent":["\"use client\";\n\nimport Image from \"next/image\";\nimport Link from \"next/link\";\nimport { ExternalLink } from \"lucide-react\";\nimport { AddressDisplay } from \"./address-display.js\";\nimport { CurrencyIcon } from \"./currency-icon.js\";\nimport { ACTIVITY_TYPE_CONFIG } from \"../data/activity.js\";\nimport { ipfsToHttp } from \"../utils/ipfs.js\";\nimport { timeAgo } from \"../utils/time.js\";\nimport { formatDisplayPrice } from \"../utils/format.js\";\nimport { cn } from \"../utils/cn.js\";\nimport type { ApiActivity } from \"@medialane/sdk\";\n\nexport interface ActivityRowProps {\n activity: ApiActivity;\n /** Optional token enrichment — if absent shows #tokenId fallback. No internal useToken call. */\n token?: { name?: string; image?: string };\n showActor?: boolean;\n showExplorer?: boolean;\n compact?: boolean;\n explorerUrl?: string;\n getAssetHref?: (contract: string, tokenId: string) => string;\n getActorHref?: (address: string) => string;\n}\n\nexport function ActivityRow({\n activity,\n token,\n showActor = true,\n showExplorer = true,\n compact = false,\n explorerUrl = \"https://voyager.online\",\n getAssetHref = (c, t) => `/asset/${c}/${t}`,\n getActorHref = (a) => `/creator/${a}`,\n}: ActivityRowProps) {\n const config = ACTIVITY_TYPE_CONFIG[activity.type] ?? {\n label: activity.type,\n variant: \"outline\" as const,\n icon: ExternalLink,\n colorClass: \"text-muted-foreground\",\n bgClass: \"bg-muted\",\n };\n const Icon = config.icon;\n\n const contract = activity.nftContract ?? activity.contractAddress ?? null;\n const tokenId = activity.nftTokenId ?? activity.tokenId ?? null;\n const actor =\n activity.offerer ??\n activity.fulfiller ??\n ((activity.type as string) === \"mint\" ? activity.to : activity.from) ??\n null;\n const txLink = activity.txHash ? `${explorerUrl}/tx/${activity.txHash}` : null;\n\n const tokenName = token?.name ?? (tokenId ? `#${tokenId}` : \"—\");\n const tokenImage = token?.image ? ipfsToHttp(token.image) : null;\n\n return (\n <div className={cn(\"flex items-center gap-3 hover:bg-muted/30 transition-colors group\", compact ? \"pl-4 pr-5 py-2.5\" : \"pl-4 pr-5 py-3.5\")}>\n {/* Type icon */}\n <div className={cn(\"rounded-lg flex items-center justify-center shrink-0\", config.bgClass, compact ? \"h-7 w-7\" : \"h-8 w-8\")}>\n <Icon className={cn(\"shrink-0\", config.colorClass, compact ? \"h-3.5 w-3.5\" : \"h-4 w-4\")} />\n </div>\n\n {/* Token thumbnail */}\n <div className={cn(\"rounded-md overflow-hidden shrink-0 bg-muted\", compact ? \"h-7 w-7\" : \"h-9 w-9\")}>\n {tokenImage ? (\n <Image src={tokenImage} alt={tokenName} width={compact ? 28 : 36} height={compact ? 28 : 36} className=\"object-cover w-full h-full\" unoptimized />\n ) : (\n <div className=\"w-full h-full bg-gradient-to-br from-muted-foreground/10 to-muted-foreground/5\" />\n )}\n </div>\n\n {/* Asset name + actor */}\n <div className=\"flex-1 min-w-0\">\n {contract && tokenId ? (\n <Link href={getAssetHref(contract, tokenId)} className=\"text-sm font-semibold hover:text-primary transition-colors truncate block leading-tight\">\n {tokenName}\n </Link>\n ) : (\n <span className=\"text-sm font-semibold text-muted-foreground\">—</span>\n )}\n {showActor && actor && (\n <Link href={getActorHref(actor)} className=\"text-xs text-muted-foreground hover:text-primary transition-colors font-mono leading-tight\">\n <AddressDisplay address={actor} chars={4} showCopy={false} />\n </Link>\n )}\n </div>\n\n {/* Right: badge + price + time + explorer */}\n <div className=\"flex items-center gap-2.5 shrink-0\">\n {!compact && (\n <span className={cn(\"text-[10px] font-medium px-1.5 py-0.5 rounded hidden sm:inline-flex\", config.bgClass, config.colorClass)}>\n {config.label}\n </span>\n )}\n\n {activity.price?.formatted && (\n <div className=\"text-right\">\n <p className=\"text-sm font-bold tabular-nums leading-tight\">{formatDisplayPrice(activity.price.formatted)}</p>\n <p className=\"text-[10px] text-muted-foreground leading-tight flex items-center justify-end gap-0.5\">\n {activity.price.currency && <CurrencyIcon symbol={activity.price.currency} size={10} />}\n {activity.price.currency}\n </p>\n </div>\n )}\n\n <span className=\"text-[10px] text-muted-foreground tabular-nums hidden sm:block w-12 text-right\" title={new Date(activity.timestamp).toLocaleString()}>\n {timeAgo(activity.timestamp)}\n </span>\n\n {showExplorer && txLink && (\n <a href={txLink} target=\"_blank\" rel=\"noopener noreferrer\" className=\"inline-flex items-center justify-center h-6 w-6 rounded-md hover:bg-muted transition-colors opacity-0 group-hover:opacity-100 shrink-0\" aria-label=\"View on explorer\">\n <ExternalLink className=\"h-3 w-3 text-muted-foreground\" />\n </a>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ "use client";
3
+ var __create = Object.create;
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getProtoOf = Object.getPrototypeOf;
8
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __export = (target, all) => {
10
+ for (var name in all)
11
+ __defProp(target, name, { get: all[name], enumerable: true });
12
+ };
13
+ var __copyProps = (to, from, except, desc) => {
14
+ if (from && typeof from === "object" || typeof from === "function") {
15
+ for (let key of __getOwnPropNames(from))
16
+ if (!__hasOwnProp.call(to, key) && key !== except)
17
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
18
+ }
19
+ return to;
20
+ };
21
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
22
+ // If the importer is in node compatibility mode or this is not an ESM
23
+ // file that has been converted to a CommonJS file using a Babel-
24
+ // compatible transform (i.e. "__esModule" has not been set), then set
25
+ // "default" to the CommonJS "module.exports" for node compatibility.
26
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
27
+ mod
28
+ ));
29
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
30
+ var activity_ticker_exports = {};
31
+ __export(activity_ticker_exports, {
32
+ ActivityTicker: () => ActivityTicker
33
+ });
34
+ module.exports = __toCommonJS(activity_ticker_exports);
35
+ var import_jsx_runtime = require("react/jsx-runtime");
36
+ var import_react = require("react");
37
+ var import_link = __toESM(require("next/link"), 1);
38
+ var import_currency_icon = require("./currency-icon.js");
39
+ var import_format = require("../utils/format.js");
40
+ var import_ipfs = require("../utils/ipfs.js");
41
+ var import_cn = require("../utils/cn.js");
42
+ function ActivityPill({ listing, getHref }) {
43
+ const [imgError, setImgError] = (0, import_react.useState)(false);
44
+ const image = listing.token?.image && !imgError ? (0, import_ipfs.ipfsToHttp)(listing.token.image) : null;
45
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
46
+ import_link.default,
47
+ {
48
+ href: getHref(listing),
49
+ className: "flex-shrink-0 flex items-center gap-2 rounded-xl border border-border bg-card px-3 py-2 hover:bg-muted/60 active:scale-[0.98] transition-all duration-150 group",
50
+ children: [
51
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "h-8 w-8 rounded-lg overflow-hidden bg-muted shrink-0", children: image ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
52
+ "img",
53
+ {
54
+ src: image,
55
+ alt: "",
56
+ loading: "lazy",
57
+ className: "w-full h-full object-cover group-hover:scale-105 transition-transform duration-300",
58
+ onError: () => setImgError(true)
59
+ }
60
+ ) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "w-full h-full bg-gradient-to-br from-brand-purple/20 to-brand-blue/20" }) }),
61
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "min-w-0", children: [
62
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-xs font-medium whitespace-nowrap max-w-[100px] truncate", children: listing.token?.name ?? `#${listing.nftTokenId}` }),
63
+ listing.price?.formatted && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("p", { className: "text-[10px] font-bold text-brand-orange whitespace-nowrap flex items-center gap-0.5", children: [
64
+ listing.price.currency && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_currency_icon.CurrencyIcon, { symbol: listing.price.currency, size: 10 }),
65
+ (0, import_format.formatDisplayPrice)(listing.price.formatted),
66
+ " ",
67
+ listing.price.currency
68
+ ] })
69
+ ] })
70
+ ]
71
+ }
72
+ );
73
+ }
74
+ function ActivityTicker({ orders, minItems = 3, className }) {
75
+ if (orders.length < minItems) return null;
76
+ const getHref = (order) => `/asset/${order.nftContract}/${order.nftTokenId}`;
77
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: (0, import_cn.cn)(className), children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "relative overflow-hidden py-2.5", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
78
+ "div",
79
+ {
80
+ className: "flex gap-2 w-max px-2",
81
+ style: { animation: "scroll-strip 50s linear infinite" },
82
+ onMouseEnter: (e) => e.currentTarget.style.animationPlayState = "paused",
83
+ onMouseLeave: (e) => e.currentTarget.style.animationPlayState = "running",
84
+ children: [...orders, ...orders].map((listing, i) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ActivityPill, { listing, getHref }, `${listing.orderHash}-${i}`))
85
+ }
86
+ ) }) });
87
+ }
88
+ // Annotate the CommonJS export names for ESM import in node:
89
+ 0 && (module.exports = {
90
+ ActivityTicker
91
+ });
92
+ //# sourceMappingURL=activity-ticker.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/activity-ticker.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport Link from \"next/link\";\nimport { CurrencyIcon } from \"./currency-icon.js\";\nimport { formatDisplayPrice } from \"../utils/format.js\";\nimport { ipfsToHttp } from \"../utils/ipfs.js\";\nimport { cn } from \"../utils/cn.js\";\nimport type { ApiOrder } from \"@medialane/sdk\";\n\nexport interface ActivityTickerProps {\n orders: ApiOrder[];\n /** Hide ticker if fewer items than this threshold. Default: 3 */\n minItems?: number;\n className?: string;\n}\n\nfunction ActivityPill({ listing, getHref }: { listing: ApiOrder; getHref: (order: ApiOrder) => string }) {\n const [imgError, setImgError] = useState(false);\n const image = listing.token?.image && !imgError ? ipfsToHttp(listing.token.image) : null;\n\n return (\n <Link\n href={getHref(listing)}\n className=\"flex-shrink-0 flex items-center gap-2 rounded-xl border border-border bg-card px-3 py-2 hover:bg-muted/60 active:scale-[0.98] transition-all duration-150 group\"\n >\n <div className=\"h-8 w-8 rounded-lg overflow-hidden bg-muted shrink-0\">\n {image ? (\n <img\n src={image}\n alt=\"\"\n loading=\"lazy\"\n className=\"w-full h-full object-cover group-hover:scale-105 transition-transform duration-300\"\n onError={() => setImgError(true)}\n />\n ) : (\n <div className=\"w-full h-full bg-gradient-to-br from-brand-purple/20 to-brand-blue/20\" />\n )}\n </div>\n <div className=\"min-w-0\">\n <p className=\"text-xs font-medium whitespace-nowrap max-w-[100px] truncate\">\n {listing.token?.name ?? `#${listing.nftTokenId}`}\n </p>\n {listing.price?.formatted && (\n <p className=\"text-[10px] font-bold text-brand-orange whitespace-nowrap flex items-center gap-0.5\">\n {listing.price.currency && <CurrencyIcon symbol={listing.price.currency} size={10} />}\n {formatDisplayPrice(listing.price.formatted)} {listing.price.currency}\n </p>\n )}\n </div>\n </Link>\n );\n}\n\nexport function ActivityTicker({ orders, minItems = 3, className }: ActivityTickerProps) {\n if (orders.length < minItems) return null;\n\n const getHref = (order: ApiOrder) => `/asset/${order.nftContract}/${order.nftTokenId}`;\n\n return (\n <div className={cn(className)}>\n <div className=\"relative overflow-hidden py-2.5\">\n <div\n className=\"flex gap-2 w-max px-2\"\n style={{ animation: \"scroll-strip 50s linear infinite\" }}\n onMouseEnter={(e) => (e.currentTarget.style.animationPlayState = \"paused\")}\n onMouseLeave={(e) => (e.currentTarget.style.animationPlayState = \"running\")}\n >\n {[...orders, ...orders].map((listing, i) => (\n <ActivityPill key={`${listing.orderHash}-${i}`} listing={listing} getHref={getHref} />\n ))}\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA4BU;AA1BV,mBAAyB;AACzB,kBAAiB;AACjB,2BAA6B;AAC7B,oBAAmC;AACnC,kBAA2B;AAC3B,gBAAmB;AAUnB,SAAS,aAAa,EAAE,SAAS,QAAQ,GAAgE;AACvG,QAAM,CAAC,UAAU,WAAW,QAAI,uBAAS,KAAK;AAC9C,QAAM,QAAQ,QAAQ,OAAO,SAAS,CAAC,eAAW,wBAAW,QAAQ,MAAM,KAAK,IAAI;AAEpF,SACE;AAAA,IAAC,YAAAA;AAAA,IAAA;AAAA,MACC,MAAM,QAAQ,OAAO;AAAA,MACrB,WAAU;AAAA,MAEV;AAAA,oDAAC,SAAI,WAAU,wDACZ,kBACC;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,KAAI;AAAA,YACJ,SAAQ;AAAA,YACR,WAAU;AAAA,YACV,SAAS,MAAM,YAAY,IAAI;AAAA;AAAA,QACjC,IAEA,4CAAC,SAAI,WAAU,yEAAwE,GAE3F;AAAA,QACA,6CAAC,SAAI,WAAU,WACb;AAAA,sDAAC,OAAE,WAAU,gEACV,kBAAQ,OAAO,QAAQ,IAAI,QAAQ,UAAU,IAChD;AAAA,UACC,QAAQ,OAAO,aACd,6CAAC,OAAE,WAAU,uFACV;AAAA,oBAAQ,MAAM,YAAY,4CAAC,qCAAa,QAAQ,QAAQ,MAAM,UAAU,MAAM,IAAI;AAAA,gBAClF,kCAAmB,QAAQ,MAAM,SAAS;AAAA,YAAE;AAAA,YAAE,QAAQ,MAAM;AAAA,aAC/D;AAAA,WAEJ;AAAA;AAAA;AAAA,EACF;AAEJ;AAEO,SAAS,eAAe,EAAE,QAAQ,WAAW,GAAG,UAAU,GAAwB;AACvF,MAAI,OAAO,SAAS,SAAU,QAAO;AAErC,QAAM,UAAU,CAAC,UAAoB,UAAU,MAAM,WAAW,IAAI,MAAM,UAAU;AAEpF,SACE,4CAAC,SAAI,eAAW,cAAG,SAAS,GAC1B,sDAAC,SAAI,WAAU,mCACb;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAO,EAAE,WAAW,mCAAmC;AAAA,MACvD,cAAc,CAAC,MAAO,EAAE,cAAc,MAAM,qBAAqB;AAAA,MACjE,cAAc,CAAC,MAAO,EAAE,cAAc,MAAM,qBAAqB;AAAA,MAEhE,WAAC,GAAG,QAAQ,GAAG,MAAM,EAAE,IAAI,CAAC,SAAS,MACpC,4CAAC,gBAA+C,SAAkB,WAA/C,GAAG,QAAQ,SAAS,IAAI,CAAC,EAAwC,CACrF;AAAA;AAAA,EACH,GACF,GACF;AAEJ;","names":["Link"]}
@@ -0,0 +1,12 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ApiOrder } from '@medialane/sdk';
3
+
4
+ interface ActivityTickerProps {
5
+ orders: ApiOrder[];
6
+ /** Hide ticker if fewer items than this threshold. Default: 3 */
7
+ minItems?: number;
8
+ className?: string;
9
+ }
10
+ declare function ActivityTicker({ orders, minItems, className }: ActivityTickerProps): react_jsx_runtime.JSX.Element | null;
11
+
12
+ export { ActivityTicker, type ActivityTickerProps };
@@ -0,0 +1,12 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ApiOrder } from '@medialane/sdk';
3
+
4
+ interface ActivityTickerProps {
5
+ orders: ApiOrder[];
6
+ /** Hide ticker if fewer items than this threshold. Default: 3 */
7
+ minItems?: number;
8
+ className?: string;
9
+ }
10
+ declare function ActivityTicker({ orders, minItems, className }: ActivityTickerProps): react_jsx_runtime.JSX.Element | null;
11
+
12
+ export { ActivityTicker, type ActivityTickerProps };