@medialane/ui 0.128.7 → 0.130.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.
- package/dist/components/activity-row.cjs +138 -24
- package/dist/components/activity-row.cjs.map +1 -1
- package/dist/components/activity-row.d.cts +3 -6
- package/dist/components/activity-row.d.ts +3 -6
- package/dist/components/activity-row.js +139 -25
- package/dist/components/activity-row.js.map +1 -1
- package/dist/components/activity-timeline-row.cjs +100 -0
- package/dist/components/activity-timeline-row.cjs.map +1 -0
- package/dist/components/activity-timeline-row.d.cts +11 -0
- package/dist/components/activity-timeline-row.d.ts +11 -0
- package/dist/components/activity-timeline-row.js +72 -0
- package/dist/components/activity-timeline-row.js.map +1 -0
- package/dist/components/notification-row.cjs +117 -0
- package/dist/components/notification-row.cjs.map +1 -0
- package/dist/components/notification-row.d.cts +11 -0
- package/dist/components/notification-row.d.ts +11 -0
- package/dist/components/notification-row.js +83 -0
- package/dist/components/notification-row.js.map +1 -0
- package/dist/data/notification-meta.cjs +66 -0
- package/dist/data/notification-meta.cjs.map +1 -0
- package/dist/data/notification-meta.d.cts +7 -0
- package/dist/data/notification-meta.d.ts +7 -0
- package/dist/data/notification-meta.js +50 -0
- package/dist/data/notification-meta.js.map +1 -0
- package/dist/index.cjs +11 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,100 @@
|
|
|
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_timeline_row_exports = {};
|
|
31
|
+
__export(activity_timeline_row_exports, {
|
|
32
|
+
ActivityTimelineRow: () => ActivityTimelineRow
|
|
33
|
+
});
|
|
34
|
+
module.exports = __toCommonJS(activity_timeline_row_exports);
|
|
35
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
36
|
+
var import_link = __toESM(require("./link.js"), 1);
|
|
37
|
+
var import_lucide_react = require("lucide-react");
|
|
38
|
+
var import_time = require("../utils/time.js");
|
|
39
|
+
var import_format = require("../utils/format.js");
|
|
40
|
+
var import_cn = require("../utils/cn.js");
|
|
41
|
+
const ACTIVITY_META = {
|
|
42
|
+
mint: { label: "Minted", textColor: "text-yellow-400", bg: "bg-yellow-500/8 border-yellow-500/15" },
|
|
43
|
+
listing: { label: "Listed", textColor: "text-violet-400", bg: "bg-violet-500/8 border-violet-500/15" },
|
|
44
|
+
sale: { label: "Sold", textColor: "text-emerald-400", bg: "bg-emerald-500/8 border-emerald-500/15" },
|
|
45
|
+
offer: { label: "Offer", textColor: "text-amber-400", bg: "bg-amber-500/8 border-amber-500/15" },
|
|
46
|
+
transfer: { label: "Transfer", textColor: "text-blue-400", bg: "bg-blue-500/8 border-blue-500/15" },
|
|
47
|
+
cancelled: { label: "Cancelled", textColor: "text-muted-foreground", bg: "bg-muted/30 border-border" }
|
|
48
|
+
};
|
|
49
|
+
const ACTIVITY_ICONS = {
|
|
50
|
+
mint: import_lucide_react.Sparkles,
|
|
51
|
+
listing: import_lucide_react.Tag,
|
|
52
|
+
sale: import_lucide_react.Handshake,
|
|
53
|
+
offer: import_lucide_react.TrendingUp,
|
|
54
|
+
transfer: import_lucide_react.ArrowRightLeft,
|
|
55
|
+
cancelled: import_lucide_react.ArrowRightLeft
|
|
56
|
+
};
|
|
57
|
+
function ActivityTimelineRow({
|
|
58
|
+
event,
|
|
59
|
+
isLast,
|
|
60
|
+
getAssetHref = (contract, tokenId) => `/asset/STARKNET/${contract}/${tokenId}`
|
|
61
|
+
}) {
|
|
62
|
+
const meta = ACTIVITY_META[event.type] ?? ACTIVITY_META.transfer;
|
|
63
|
+
const Icon = ACTIVITY_ICONS[event.type] ?? import_lucide_react.ArrowRightLeft;
|
|
64
|
+
const tokenId = event.nftTokenId ?? event.tokenId;
|
|
65
|
+
const contract = event.nftContract ?? event.contractAddress;
|
|
66
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex gap-4 group", children: [
|
|
67
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex flex-col items-center shrink-0 w-9", children: [
|
|
68
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: (0, import_cn.cn)("h-9 w-9 rounded-xl border flex items-center justify-center shrink-0", meta.bg), children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Icon, { className: (0, import_cn.cn)("h-3.5 w-3.5", meta.textColor) }) }),
|
|
69
|
+
!isLast && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "flex-1 w-px bg-border/50 mt-1.5 min-h-4" })
|
|
70
|
+
] }),
|
|
71
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "flex-1 pb-5 min-w-0 pt-1", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-start justify-between gap-3", children: [
|
|
72
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "min-w-0", children: [
|
|
73
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-2 flex-wrap", children: [
|
|
74
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: (0, import_cn.cn)("text-[11px] font-bold", meta.textColor), children: meta.label }),
|
|
75
|
+
contract && tokenId ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_link.default, { href: getAssetHref(contract, tokenId), className: "text-xs text-muted-foreground tabular-nums hover:text-foreground transition-colors", children: [
|
|
76
|
+
"Token #",
|
|
77
|
+
tokenId
|
|
78
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "text-xs text-muted-foreground tabular-nums", children: [
|
|
79
|
+
"Token #",
|
|
80
|
+
tokenId ?? "\u2014"
|
|
81
|
+
] })
|
|
82
|
+
] }),
|
|
83
|
+
contract && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("p", { className: "text-[11px] text-muted-foreground/60 tabular-nums mt-0.5 truncate", children: [
|
|
84
|
+
contract.slice(0, 10),
|
|
85
|
+
"\u2026",
|
|
86
|
+
contract.slice(-6)
|
|
87
|
+
] })
|
|
88
|
+
] }),
|
|
89
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "text-right shrink-0", children: [
|
|
90
|
+
event.price?.formatted && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-sm font-semibold price-value leading-none", children: (0, import_format.formatDisplayPrice)(event.price.formatted) }),
|
|
91
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-[10px] text-muted-foreground mt-1", children: (0, import_time.timeAgo)(event.timestamp) })
|
|
92
|
+
] })
|
|
93
|
+
] }) })
|
|
94
|
+
] });
|
|
95
|
+
}
|
|
96
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
97
|
+
0 && (module.exports = {
|
|
98
|
+
ActivityTimelineRow
|
|
99
|
+
});
|
|
100
|
+
//# sourceMappingURL=activity-timeline-row.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/activity-timeline-row.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"./link.js\";\nimport {\n Tag, Handshake, TrendingUp, ArrowRightLeft, Sparkles,\n} from \"lucide-react\";\nimport { timeAgo } from \"../utils/time.js\";\nimport { formatDisplayPrice } from \"../utils/format.js\";\nimport type { ApiActivity } from \"@medialane/sdk\";\nimport { cn } from \"../utils/cn.js\";\n\n\nconst ACTIVITY_META: Record<string, { label: string; textColor: string; bg: string }> = {\n mint: { label: \"Minted\", textColor: \"text-yellow-400\", bg: \"bg-yellow-500/8 border-yellow-500/15\" },\n listing: { label: \"Listed\", textColor: \"text-violet-400\", bg: \"bg-violet-500/8 border-violet-500/15\" },\n sale: { label: \"Sold\", textColor: \"text-emerald-400\", bg: \"bg-emerald-500/8 border-emerald-500/15\" },\n offer: { label: \"Offer\", textColor: \"text-amber-400\", bg: \"bg-amber-500/8 border-amber-500/15\" },\n transfer: { label: \"Transfer\", textColor: \"text-blue-400\", bg: \"bg-blue-500/8 border-blue-500/15\" },\n cancelled: { label: \"Cancelled\", textColor: \"text-muted-foreground\", bg: \"bg-muted/30 border-border\" },\n};\n\nconst ACTIVITY_ICONS: Record<string, React.ElementType> = {\n mint: Sparkles,\n listing: Tag,\n sale: Handshake,\n offer: TrendingUp,\n transfer: ArrowRightLeft,\n cancelled: ArrowRightLeft,\n};\n\nexport interface ActivityTimelineRowProps {\n event: ApiActivity;\n isLast: boolean;\n getAssetHref?: (contract: string, tokenId: string) => string;\n}\n\nexport function ActivityTimelineRow({\n event,\n isLast,\n getAssetHref = (contract, tokenId) => `/asset/STARKNET/${contract}/${tokenId}`,\n}: ActivityTimelineRowProps) {\n const meta = ACTIVITY_META[event.type] ?? ACTIVITY_META.transfer;\n const Icon = ACTIVITY_ICONS[event.type] ?? ArrowRightLeft;\n const tokenId = event.nftTokenId ?? event.tokenId;\n const contract = event.nftContract ?? event.contractAddress;\n\n return (\n <div className=\"flex gap-4 group\">\n <div className=\"flex flex-col items-center shrink-0 w-9\">\n <div className={cn(\"h-9 w-9 rounded-xl border flex items-center justify-center shrink-0\", meta.bg)}>\n <Icon className={cn(\"h-3.5 w-3.5\", meta.textColor)} />\n </div>\n {!isLast && <div className=\"flex-1 w-px bg-border/50 mt-1.5 min-h-4\" />}\n </div>\n <div className=\"flex-1 pb-5 min-w-0 pt-1\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <div className=\"flex items-center gap-2 flex-wrap\">\n <span className={cn(\"text-[11px] font-bold\", meta.textColor)}>\n {meta.label}\n </span>\n {contract && tokenId ? (\n <Link href={getAssetHref(contract, tokenId)} className=\"text-xs text-muted-foreground tabular-nums hover:text-foreground transition-colors\">\n Token #{tokenId}\n </Link>\n ) : (\n <span className=\"text-xs text-muted-foreground tabular-nums\">Token #{tokenId ?? \"—\"}</span>\n )}\n </div>\n {contract && (\n <p className=\"text-[11px] text-muted-foreground/60 tabular-nums mt-0.5 truncate\">\n {contract.slice(0, 10)}…{contract.slice(-6)}\n </p>\n )}\n </div>\n <div className=\"text-right shrink-0\">\n {event.price?.formatted && (\n <p className=\"text-sm font-semibold price-value leading-none\">\n {formatDisplayPrice(event.price.formatted)}\n </p>\n )}\n <p className=\"text-[10px] text-muted-foreground mt-1\">{timeAgo(event.timestamp)}</p>\n </div>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAgDM;AA9CN,kBAAiB;AACjB,0BAEO;AACP,kBAAwB;AACxB,oBAAmC;AAEnC,gBAAmB;AAGnB,MAAM,gBAAkF;AAAA,EACtF,MAAW,EAAE,OAAO,UAAa,WAAW,mBAAoB,IAAI,uCAAuC;AAAA,EAC3G,SAAW,EAAE,OAAO,UAAa,WAAW,mBAAoB,IAAI,uCAAuC;AAAA,EAC3G,MAAW,EAAE,OAAO,QAAa,WAAW,oBAAoB,IAAI,yCAAyC;AAAA,EAC7G,OAAW,EAAE,OAAO,SAAa,WAAW,kBAAoB,IAAI,qCAAqC;AAAA,EACzG,UAAW,EAAE,OAAO,YAAa,WAAW,iBAAoB,IAAI,mCAAmC;AAAA,EACvG,WAAW,EAAE,OAAO,aAAa,WAAW,yBAAyB,IAAI,4BAA4B;AACvG;AAEA,MAAM,iBAAoD;AAAA,EACxD,MAAW;AAAA,EACX,SAAW;AAAA,EACX,MAAW;AAAA,EACX,OAAW;AAAA,EACX,UAAW;AAAA,EACX,WAAW;AACb;AAQO,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AAAA,EACA,eAAe,CAAC,UAAU,YAAY,mBAAmB,QAAQ,IAAI,OAAO;AAC9E,GAA6B;AAC3B,QAAM,OAAO,cAAc,MAAM,IAAI,KAAK,cAAc;AACxD,QAAM,OAAO,eAAe,MAAM,IAAI,KAAK;AAC3C,QAAM,UAAU,MAAM,cAAc,MAAM;AAC1C,QAAM,WAAW,MAAM,eAAe,MAAM;AAE5C,SACE,6CAAC,SAAI,WAAU,oBACb;AAAA,iDAAC,SAAI,WAAU,2CACb;AAAA,kDAAC,SAAI,eAAW,cAAG,uEAAuE,KAAK,EAAE,GAC/F,sDAAC,QAAK,eAAW,cAAG,eAAe,KAAK,SAAS,GAAG,GACtD;AAAA,MACC,CAAC,UAAU,4CAAC,SAAI,WAAU,2CAA0C;AAAA,OACvE;AAAA,IACA,4CAAC,SAAI,WAAU,4BACb,uDAAC,SAAI,WAAU,0CACb;AAAA,mDAAC,SAAI,WAAU,WACb;AAAA,qDAAC,SAAI,WAAU,qCACb;AAAA,sDAAC,UAAK,eAAW,cAAG,yBAAyB,KAAK,SAAS,GACxD,eAAK,OACR;AAAA,UACC,YAAY,UACX,6CAAC,YAAAA,SAAA,EAAK,MAAM,aAAa,UAAU,OAAO,GAAG,WAAU,sFAAqF;AAAA;AAAA,YAClI;AAAA,aACV,IAEA,6CAAC,UAAK,WAAU,8CAA6C;AAAA;AAAA,YAAQ,WAAW;AAAA,aAAI;AAAA,WAExF;AAAA,QACC,YACC,6CAAC,OAAE,WAAU,qEACV;AAAA,mBAAS,MAAM,GAAG,EAAE;AAAA,UAAE;AAAA,UAAE,SAAS,MAAM,EAAE;AAAA,WAC5C;AAAA,SAEJ;AAAA,MACA,6CAAC,SAAI,WAAU,uBACZ;AAAA,cAAM,OAAO,aACZ,4CAAC,OAAE,WAAU,kDACV,gDAAmB,MAAM,MAAM,SAAS,GAC3C;AAAA,QAEF,4CAAC,OAAE,WAAU,0CAA0C,mCAAQ,MAAM,SAAS,GAAE;AAAA,SAClF;AAAA,OACF,GACF;AAAA,KACF;AAEJ;","names":["Link"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { ApiActivity } from '@medialane/sdk';
|
|
3
|
+
|
|
4
|
+
interface ActivityTimelineRowProps {
|
|
5
|
+
event: ApiActivity;
|
|
6
|
+
isLast: boolean;
|
|
7
|
+
getAssetHref?: (contract: string, tokenId: string) => string;
|
|
8
|
+
}
|
|
9
|
+
declare function ActivityTimelineRow({ event, isLast, getAssetHref, }: ActivityTimelineRowProps): react_jsx_runtime.JSX.Element;
|
|
10
|
+
|
|
11
|
+
export { ActivityTimelineRow, type ActivityTimelineRowProps };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { ApiActivity } from '@medialane/sdk';
|
|
3
|
+
|
|
4
|
+
interface ActivityTimelineRowProps {
|
|
5
|
+
event: ApiActivity;
|
|
6
|
+
isLast: boolean;
|
|
7
|
+
getAssetHref?: (contract: string, tokenId: string) => string;
|
|
8
|
+
}
|
|
9
|
+
declare function ActivityTimelineRow({ event, isLast, getAssetHref, }: ActivityTimelineRowProps): react_jsx_runtime.JSX.Element;
|
|
10
|
+
|
|
11
|
+
export { ActivityTimelineRow, type ActivityTimelineRowProps };
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import Link from "./link.js";
|
|
4
|
+
import {
|
|
5
|
+
Tag,
|
|
6
|
+
Handshake,
|
|
7
|
+
TrendingUp,
|
|
8
|
+
ArrowRightLeft,
|
|
9
|
+
Sparkles
|
|
10
|
+
} from "lucide-react";
|
|
11
|
+
import { timeAgo } from "../utils/time.js";
|
|
12
|
+
import { formatDisplayPrice } from "../utils/format.js";
|
|
13
|
+
import { cn } from "../utils/cn.js";
|
|
14
|
+
const ACTIVITY_META = {
|
|
15
|
+
mint: { label: "Minted", textColor: "text-yellow-400", bg: "bg-yellow-500/8 border-yellow-500/15" },
|
|
16
|
+
listing: { label: "Listed", textColor: "text-violet-400", bg: "bg-violet-500/8 border-violet-500/15" },
|
|
17
|
+
sale: { label: "Sold", textColor: "text-emerald-400", bg: "bg-emerald-500/8 border-emerald-500/15" },
|
|
18
|
+
offer: { label: "Offer", textColor: "text-amber-400", bg: "bg-amber-500/8 border-amber-500/15" },
|
|
19
|
+
transfer: { label: "Transfer", textColor: "text-blue-400", bg: "bg-blue-500/8 border-blue-500/15" },
|
|
20
|
+
cancelled: { label: "Cancelled", textColor: "text-muted-foreground", bg: "bg-muted/30 border-border" }
|
|
21
|
+
};
|
|
22
|
+
const ACTIVITY_ICONS = {
|
|
23
|
+
mint: Sparkles,
|
|
24
|
+
listing: Tag,
|
|
25
|
+
sale: Handshake,
|
|
26
|
+
offer: TrendingUp,
|
|
27
|
+
transfer: ArrowRightLeft,
|
|
28
|
+
cancelled: ArrowRightLeft
|
|
29
|
+
};
|
|
30
|
+
function ActivityTimelineRow({
|
|
31
|
+
event,
|
|
32
|
+
isLast,
|
|
33
|
+
getAssetHref = (contract, tokenId) => `/asset/STARKNET/${contract}/${tokenId}`
|
|
34
|
+
}) {
|
|
35
|
+
const meta = ACTIVITY_META[event.type] ?? ACTIVITY_META.transfer;
|
|
36
|
+
const Icon = ACTIVITY_ICONS[event.type] ?? ArrowRightLeft;
|
|
37
|
+
const tokenId = event.nftTokenId ?? event.tokenId;
|
|
38
|
+
const contract = event.nftContract ?? event.contractAddress;
|
|
39
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex gap-4 group", children: [
|
|
40
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center shrink-0 w-9", children: [
|
|
41
|
+
/* @__PURE__ */ jsx("div", { className: cn("h-9 w-9 rounded-xl border flex items-center justify-center shrink-0", meta.bg), children: /* @__PURE__ */ jsx(Icon, { className: cn("h-3.5 w-3.5", meta.textColor) }) }),
|
|
42
|
+
!isLast && /* @__PURE__ */ jsx("div", { className: "flex-1 w-px bg-border/50 mt-1.5 min-h-4" })
|
|
43
|
+
] }),
|
|
44
|
+
/* @__PURE__ */ jsx("div", { className: "flex-1 pb-5 min-w-0 pt-1", children: /* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between gap-3", children: [
|
|
45
|
+
/* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
|
|
46
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 flex-wrap", children: [
|
|
47
|
+
/* @__PURE__ */ jsx("span", { className: cn("text-[11px] font-bold", meta.textColor), children: meta.label }),
|
|
48
|
+
contract && tokenId ? /* @__PURE__ */ jsxs(Link, { href: getAssetHref(contract, tokenId), className: "text-xs text-muted-foreground tabular-nums hover:text-foreground transition-colors", children: [
|
|
49
|
+
"Token #",
|
|
50
|
+
tokenId
|
|
51
|
+
] }) : /* @__PURE__ */ jsxs("span", { className: "text-xs text-muted-foreground tabular-nums", children: [
|
|
52
|
+
"Token #",
|
|
53
|
+
tokenId ?? "\u2014"
|
|
54
|
+
] })
|
|
55
|
+
] }),
|
|
56
|
+
contract && /* @__PURE__ */ jsxs("p", { className: "text-[11px] text-muted-foreground/60 tabular-nums mt-0.5 truncate", children: [
|
|
57
|
+
contract.slice(0, 10),
|
|
58
|
+
"\u2026",
|
|
59
|
+
contract.slice(-6)
|
|
60
|
+
] })
|
|
61
|
+
] }),
|
|
62
|
+
/* @__PURE__ */ jsxs("div", { className: "text-right shrink-0", children: [
|
|
63
|
+
event.price?.formatted && /* @__PURE__ */ jsx("p", { className: "text-sm font-semibold price-value leading-none", children: formatDisplayPrice(event.price.formatted) }),
|
|
64
|
+
/* @__PURE__ */ jsx("p", { className: "text-[10px] text-muted-foreground mt-1", children: timeAgo(event.timestamp) })
|
|
65
|
+
] })
|
|
66
|
+
] }) })
|
|
67
|
+
] });
|
|
68
|
+
}
|
|
69
|
+
export {
|
|
70
|
+
ActivityTimelineRow
|
|
71
|
+
};
|
|
72
|
+
//# sourceMappingURL=activity-timeline-row.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/activity-timeline-row.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"./link.js\";\nimport {\n Tag, Handshake, TrendingUp, ArrowRightLeft, Sparkles,\n} from \"lucide-react\";\nimport { timeAgo } from \"../utils/time.js\";\nimport { formatDisplayPrice } from \"../utils/format.js\";\nimport type { ApiActivity } from \"@medialane/sdk\";\nimport { cn } from \"../utils/cn.js\";\n\n\nconst ACTIVITY_META: Record<string, { label: string; textColor: string; bg: string }> = {\n mint: { label: \"Minted\", textColor: \"text-yellow-400\", bg: \"bg-yellow-500/8 border-yellow-500/15\" },\n listing: { label: \"Listed\", textColor: \"text-violet-400\", bg: \"bg-violet-500/8 border-violet-500/15\" },\n sale: { label: \"Sold\", textColor: \"text-emerald-400\", bg: \"bg-emerald-500/8 border-emerald-500/15\" },\n offer: { label: \"Offer\", textColor: \"text-amber-400\", bg: \"bg-amber-500/8 border-amber-500/15\" },\n transfer: { label: \"Transfer\", textColor: \"text-blue-400\", bg: \"bg-blue-500/8 border-blue-500/15\" },\n cancelled: { label: \"Cancelled\", textColor: \"text-muted-foreground\", bg: \"bg-muted/30 border-border\" },\n};\n\nconst ACTIVITY_ICONS: Record<string, React.ElementType> = {\n mint: Sparkles,\n listing: Tag,\n sale: Handshake,\n offer: TrendingUp,\n transfer: ArrowRightLeft,\n cancelled: ArrowRightLeft,\n};\n\nexport interface ActivityTimelineRowProps {\n event: ApiActivity;\n isLast: boolean;\n getAssetHref?: (contract: string, tokenId: string) => string;\n}\n\nexport function ActivityTimelineRow({\n event,\n isLast,\n getAssetHref = (contract, tokenId) => `/asset/STARKNET/${contract}/${tokenId}`,\n}: ActivityTimelineRowProps) {\n const meta = ACTIVITY_META[event.type] ?? ACTIVITY_META.transfer;\n const Icon = ACTIVITY_ICONS[event.type] ?? ArrowRightLeft;\n const tokenId = event.nftTokenId ?? event.tokenId;\n const contract = event.nftContract ?? event.contractAddress;\n\n return (\n <div className=\"flex gap-4 group\">\n <div className=\"flex flex-col items-center shrink-0 w-9\">\n <div className={cn(\"h-9 w-9 rounded-xl border flex items-center justify-center shrink-0\", meta.bg)}>\n <Icon className={cn(\"h-3.5 w-3.5\", meta.textColor)} />\n </div>\n {!isLast && <div className=\"flex-1 w-px bg-border/50 mt-1.5 min-h-4\" />}\n </div>\n <div className=\"flex-1 pb-5 min-w-0 pt-1\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <div className=\"flex items-center gap-2 flex-wrap\">\n <span className={cn(\"text-[11px] font-bold\", meta.textColor)}>\n {meta.label}\n </span>\n {contract && tokenId ? (\n <Link href={getAssetHref(contract, tokenId)} className=\"text-xs text-muted-foreground tabular-nums hover:text-foreground transition-colors\">\n Token #{tokenId}\n </Link>\n ) : (\n <span className=\"text-xs text-muted-foreground tabular-nums\">Token #{tokenId ?? \"—\"}</span>\n )}\n </div>\n {contract && (\n <p className=\"text-[11px] text-muted-foreground/60 tabular-nums mt-0.5 truncate\">\n {contract.slice(0, 10)}…{contract.slice(-6)}\n </p>\n )}\n </div>\n <div className=\"text-right shrink-0\">\n {event.price?.formatted && (\n <p className=\"text-sm font-semibold price-value leading-none\">\n {formatDisplayPrice(event.price.formatted)}\n </p>\n )}\n <p className=\"text-[10px] text-muted-foreground mt-1\">{timeAgo(event.timestamp)}</p>\n </div>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":";AAgDM,SAEI,KAFJ;AA9CN,OAAO,UAAU;AACjB;AAAA,EACE;AAAA,EAAK;AAAA,EAAW;AAAA,EAAY;AAAA,EAAgB;AAAA,OACvC;AACP,SAAS,eAAe;AACxB,SAAS,0BAA0B;AAEnC,SAAS,UAAU;AAGnB,MAAM,gBAAkF;AAAA,EACtF,MAAW,EAAE,OAAO,UAAa,WAAW,mBAAoB,IAAI,uCAAuC;AAAA,EAC3G,SAAW,EAAE,OAAO,UAAa,WAAW,mBAAoB,IAAI,uCAAuC;AAAA,EAC3G,MAAW,EAAE,OAAO,QAAa,WAAW,oBAAoB,IAAI,yCAAyC;AAAA,EAC7G,OAAW,EAAE,OAAO,SAAa,WAAW,kBAAoB,IAAI,qCAAqC;AAAA,EACzG,UAAW,EAAE,OAAO,YAAa,WAAW,iBAAoB,IAAI,mCAAmC;AAAA,EACvG,WAAW,EAAE,OAAO,aAAa,WAAW,yBAAyB,IAAI,4BAA4B;AACvG;AAEA,MAAM,iBAAoD;AAAA,EACxD,MAAW;AAAA,EACX,SAAW;AAAA,EACX,MAAW;AAAA,EACX,OAAW;AAAA,EACX,UAAW;AAAA,EACX,WAAW;AACb;AAQO,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AAAA,EACA,eAAe,CAAC,UAAU,YAAY,mBAAmB,QAAQ,IAAI,OAAO;AAC9E,GAA6B;AAC3B,QAAM,OAAO,cAAc,MAAM,IAAI,KAAK,cAAc;AACxD,QAAM,OAAO,eAAe,MAAM,IAAI,KAAK;AAC3C,QAAM,UAAU,MAAM,cAAc,MAAM;AAC1C,QAAM,WAAW,MAAM,eAAe,MAAM;AAE5C,SACE,qBAAC,SAAI,WAAU,oBACb;AAAA,yBAAC,SAAI,WAAU,2CACb;AAAA,0BAAC,SAAI,WAAW,GAAG,uEAAuE,KAAK,EAAE,GAC/F,8BAAC,QAAK,WAAW,GAAG,eAAe,KAAK,SAAS,GAAG,GACtD;AAAA,MACC,CAAC,UAAU,oBAAC,SAAI,WAAU,2CAA0C;AAAA,OACvE;AAAA,IACA,oBAAC,SAAI,WAAU,4BACb,+BAAC,SAAI,WAAU,0CACb;AAAA,2BAAC,SAAI,WAAU,WACb;AAAA,6BAAC,SAAI,WAAU,qCACb;AAAA,8BAAC,UAAK,WAAW,GAAG,yBAAyB,KAAK,SAAS,GACxD,eAAK,OACR;AAAA,UACC,YAAY,UACX,qBAAC,QAAK,MAAM,aAAa,UAAU,OAAO,GAAG,WAAU,sFAAqF;AAAA;AAAA,YAClI;AAAA,aACV,IAEA,qBAAC,UAAK,WAAU,8CAA6C;AAAA;AAAA,YAAQ,WAAW;AAAA,aAAI;AAAA,WAExF;AAAA,QACC,YACC,qBAAC,OAAE,WAAU,qEACV;AAAA,mBAAS,MAAM,GAAG,EAAE;AAAA,UAAE;AAAA,UAAE,SAAS,MAAM,EAAE;AAAA,WAC5C;AAAA,SAEJ;AAAA,MACA,qBAAC,SAAI,WAAU,uBACZ;AAAA,cAAM,OAAO,aACZ,oBAAC,OAAE,WAAU,kDACV,6BAAmB,MAAM,MAAM,SAAS,GAC3C;AAAA,QAEF,oBAAC,OAAE,WAAU,0CAA0C,kBAAQ,MAAM,SAAS,GAAE;AAAA,SAClF;AAAA,OACF,GACF;AAAA,KACF;AAEJ;","names":[]}
|
|
@@ -0,0 +1,117 @@
|
|
|
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 notification_row_exports = {};
|
|
31
|
+
__export(notification_row_exports, {
|
|
32
|
+
NotificationRow: () => NotificationRow
|
|
33
|
+
});
|
|
34
|
+
module.exports = __toCommonJS(notification_row_exports);
|
|
35
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
36
|
+
var import_link = __toESM(require("./link.js"), 1);
|
|
37
|
+
var import_image = __toESM(require("./image.js"), 1);
|
|
38
|
+
var import_lucide_react = require("lucide-react");
|
|
39
|
+
var import_time = require("../utils/time.js");
|
|
40
|
+
var import_cn = require("../utils/cn.js");
|
|
41
|
+
var import_notification_meta = require("../data/notification-meta.js");
|
|
42
|
+
function NotificationRow({
|
|
43
|
+
notification,
|
|
44
|
+
onNavigate,
|
|
45
|
+
compact = false
|
|
46
|
+
}) {
|
|
47
|
+
const { type, title, description, image, href, timestamp, isUnread } = notification;
|
|
48
|
+
const Icon = import_notification_meta.NOTIFICATION_ICON[type] ?? import_lucide_react.Bell;
|
|
49
|
+
const colorClass = import_notification_meta.NOTIFICATION_COLOR[type] ?? "text-muted-foreground bg-muted/40";
|
|
50
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
51
|
+
import_link.default,
|
|
52
|
+
{
|
|
53
|
+
href,
|
|
54
|
+
onClick: onNavigate,
|
|
55
|
+
className: (0, import_cn.cn)(
|
|
56
|
+
"flex items-start gap-3 px-4 transition-colors group",
|
|
57
|
+
compact ? "py-3" : "py-4",
|
|
58
|
+
isUnread && "bg-primary/[0.03]",
|
|
59
|
+
"hover:bg-muted/40"
|
|
60
|
+
),
|
|
61
|
+
children: [
|
|
62
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "relative shrink-0 mt-0.5", children: image ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
|
|
63
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "h-10 w-10 rounded-xl overflow-hidden bg-muted ring-1 ring-border/40", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
64
|
+
import_image.default,
|
|
65
|
+
{
|
|
66
|
+
src: image,
|
|
67
|
+
alt: "",
|
|
68
|
+
width: 40,
|
|
69
|
+
height: 40,
|
|
70
|
+
className: "object-cover w-full h-full",
|
|
71
|
+
unoptimized: true
|
|
72
|
+
}
|
|
73
|
+
) }),
|
|
74
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
75
|
+
"div",
|
|
76
|
+
{
|
|
77
|
+
className: (0, import_cn.cn)(
|
|
78
|
+
"absolute -bottom-1 -right-1 h-5 w-5 rounded-full border-2 border-background flex items-center justify-center",
|
|
79
|
+
colorClass
|
|
80
|
+
),
|
|
81
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Icon, { className: "h-2.5 w-2.5" })
|
|
82
|
+
}
|
|
83
|
+
)
|
|
84
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
85
|
+
"div",
|
|
86
|
+
{
|
|
87
|
+
className: (0, import_cn.cn)(
|
|
88
|
+
"h-10 w-10 rounded-xl flex items-center justify-center ring-1 ring-border/20",
|
|
89
|
+
colorClass
|
|
90
|
+
),
|
|
91
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Icon, { className: "h-4 w-4" })
|
|
92
|
+
}
|
|
93
|
+
) }),
|
|
94
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex-1 min-w-0 space-y-0.5", children: [
|
|
95
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
96
|
+
"p",
|
|
97
|
+
{
|
|
98
|
+
className: (0, import_cn.cn)(
|
|
99
|
+
"text-sm leading-snug truncate",
|
|
100
|
+
isUnread ? "font-semibold text-foreground" : "font-medium text-foreground/90"
|
|
101
|
+
),
|
|
102
|
+
children: title
|
|
103
|
+
}
|
|
104
|
+
),
|
|
105
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-xs text-muted-foreground truncate", children: description }),
|
|
106
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-[10px] text-muted-foreground/50 pt-0.5", children: (0, import_time.timeAgo)(timestamp) })
|
|
107
|
+
] }),
|
|
108
|
+
isUnread && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "h-2 w-2 rounded-full bg-primary shrink-0 mt-2" })
|
|
109
|
+
]
|
|
110
|
+
}
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
114
|
+
0 && (module.exports = {
|
|
115
|
+
NotificationRow
|
|
116
|
+
});
|
|
117
|
+
//# sourceMappingURL=notification-row.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/notification-row.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"./link.js\";\nimport Image from \"./image.js\";\nimport { Bell } from \"lucide-react\";\nimport { timeAgo } from \"../utils/time.js\";\nimport { cn } from \"../utils/cn.js\";\nimport { NOTIFICATION_ICON, NOTIFICATION_COLOR } from \"../data/notification-meta.js\";\nimport type { Notification } from \"../data/notification.js\";\n\nexport interface NotificationRowProps {\n notification: Notification;\n onNavigate?: () => void;\n compact?: boolean;\n}\n\nexport function NotificationRow({\n notification,\n onNavigate,\n compact = false,\n}: NotificationRowProps) {\n const { type, title, description, image, href, timestamp, isUnread } = notification;\n const Icon = NOTIFICATION_ICON[type] ?? Bell;\n const colorClass = NOTIFICATION_COLOR[type] ?? \"text-muted-foreground bg-muted/40\";\n\n return (\n <Link\n href={href}\n onClick={onNavigate}\n className={cn(\n \"flex items-start gap-3 px-4 transition-colors group\",\n compact ? \"py-3\" : \"py-4\",\n isUnread && \"bg-primary/[0.03]\",\n \"hover:bg-muted/40\"\n )}\n >\n\n <div className=\"relative shrink-0 mt-0.5\">\n {image ? (\n <>\n <div className=\"h-10 w-10 rounded-xl overflow-hidden bg-muted ring-1 ring-border/40\">\n <Image\n src={image}\n alt=\"\"\n width={40}\n height={40}\n className=\"object-cover w-full h-full\"\n unoptimized\n />\n </div>\n <div\n className={cn(\n \"absolute -bottom-1 -right-1 h-5 w-5 rounded-full border-2 border-background flex items-center justify-center\",\n colorClass\n )}\n >\n <Icon className=\"h-2.5 w-2.5\" />\n </div>\n </>\n ) : (\n <div\n className={cn(\n \"h-10 w-10 rounded-xl flex items-center justify-center ring-1 ring-border/20\",\n colorClass\n )}\n >\n <Icon className=\"h-4 w-4\" />\n </div>\n )}\n </div>\n\n <div className=\"flex-1 min-w-0 space-y-0.5\">\n <p\n className={cn(\n \"text-sm leading-snug truncate\",\n isUnread ? \"font-semibold text-foreground\" : \"font-medium text-foreground/90\"\n )}\n >\n {title}\n </p>\n <p className=\"text-xs text-muted-foreground truncate\">{description}</p>\n <p className=\"text-[10px] text-muted-foreground/50 pt-0.5\">{timeAgo(timestamp)}</p>\n </div>\n\n {isUnread && (\n <div className=\"h-2 w-2 rounded-full bg-primary shrink-0 mt-2\" />\n )}\n </Link>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAuCU;AArCV,kBAAiB;AACjB,mBAAkB;AAClB,0BAAqB;AACrB,kBAAwB;AACxB,gBAAmB;AACnB,+BAAsD;AAS/C,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA,UAAU;AACZ,GAAyB;AACvB,QAAM,EAAE,MAAM,OAAO,aAAa,OAAO,MAAM,WAAW,SAAS,IAAI;AACvE,QAAM,OAAO,2CAAkB,IAAI,KAAK;AACxC,QAAM,aAAa,4CAAmB,IAAI,KAAK;AAE/C,SACE;AAAA,IAAC,YAAAA;AAAA,IAAA;AAAA,MACC;AAAA,MACA,SAAS;AAAA,MACT,eAAW;AAAA,QACT;AAAA,QACA,UAAU,SAAS;AAAA,QACnB,YAAY;AAAA,QACZ;AAAA,MACF;AAAA,MAGA;AAAA,oDAAC,SAAI,WAAU,4BACZ,kBACC,4EACE;AAAA,sDAAC,SAAI,WAAU,uEACb;AAAA,YAAC,aAAAC;AAAA,YAAA;AAAA,cACC,KAAK;AAAA,cACL,KAAI;AAAA,cACJ,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,WAAU;AAAA,cACV,aAAW;AAAA;AAAA,UACb,GACF;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,eAAW;AAAA,gBACT;AAAA,gBACA;AAAA,cACF;AAAA,cAEA,sDAAC,QAAK,WAAU,eAAc;AAAA;AAAA,UAChC;AAAA,WACF,IAEA;AAAA,UAAC;AAAA;AAAA,YACC,eAAW;AAAA,cACT;AAAA,cACA;AAAA,YACF;AAAA,YAEA,sDAAC,QAAK,WAAU,WAAU;AAAA;AAAA,QAC5B,GAEJ;AAAA,QAEA,6CAAC,SAAI,WAAU,8BACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,eAAW;AAAA,gBACT;AAAA,gBACA,WAAW,kCAAkC;AAAA,cAC/C;AAAA,cAEC;AAAA;AAAA,UACH;AAAA,UACA,4CAAC,OAAE,WAAU,0CAA0C,uBAAY;AAAA,UACnE,4CAAC,OAAE,WAAU,+CAA+C,mCAAQ,SAAS,GAAE;AAAA,WACjF;AAAA,QAEC,YACC,4CAAC,SAAI,WAAU,iDAAgD;AAAA;AAAA;AAAA,EAEnE;AAEJ;","names":["Link","Image"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { Notification } from '../data/notification.cjs';
|
|
3
|
+
|
|
4
|
+
interface NotificationRowProps {
|
|
5
|
+
notification: Notification;
|
|
6
|
+
onNavigate?: () => void;
|
|
7
|
+
compact?: boolean;
|
|
8
|
+
}
|
|
9
|
+
declare function NotificationRow({ notification, onNavigate, compact, }: NotificationRowProps): react_jsx_runtime.JSX.Element;
|
|
10
|
+
|
|
11
|
+
export { NotificationRow, type NotificationRowProps };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { Notification } from '../data/notification.js';
|
|
3
|
+
|
|
4
|
+
interface NotificationRowProps {
|
|
5
|
+
notification: Notification;
|
|
6
|
+
onNavigate?: () => void;
|
|
7
|
+
compact?: boolean;
|
|
8
|
+
}
|
|
9
|
+
declare function NotificationRow({ notification, onNavigate, compact, }: NotificationRowProps): react_jsx_runtime.JSX.Element;
|
|
10
|
+
|
|
11
|
+
export { NotificationRow, type NotificationRowProps };
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import Link from "./link.js";
|
|
4
|
+
import Image from "./image.js";
|
|
5
|
+
import { Bell } from "lucide-react";
|
|
6
|
+
import { timeAgo } from "../utils/time.js";
|
|
7
|
+
import { cn } from "../utils/cn.js";
|
|
8
|
+
import { NOTIFICATION_ICON, NOTIFICATION_COLOR } from "../data/notification-meta.js";
|
|
9
|
+
function NotificationRow({
|
|
10
|
+
notification,
|
|
11
|
+
onNavigate,
|
|
12
|
+
compact = false
|
|
13
|
+
}) {
|
|
14
|
+
const { type, title, description, image, href, timestamp, isUnread } = notification;
|
|
15
|
+
const Icon = NOTIFICATION_ICON[type] ?? Bell;
|
|
16
|
+
const colorClass = NOTIFICATION_COLOR[type] ?? "text-muted-foreground bg-muted/40";
|
|
17
|
+
return /* @__PURE__ */ jsxs(
|
|
18
|
+
Link,
|
|
19
|
+
{
|
|
20
|
+
href,
|
|
21
|
+
onClick: onNavigate,
|
|
22
|
+
className: cn(
|
|
23
|
+
"flex items-start gap-3 px-4 transition-colors group",
|
|
24
|
+
compact ? "py-3" : "py-4",
|
|
25
|
+
isUnread && "bg-primary/[0.03]",
|
|
26
|
+
"hover:bg-muted/40"
|
|
27
|
+
),
|
|
28
|
+
children: [
|
|
29
|
+
/* @__PURE__ */ jsx("div", { className: "relative shrink-0 mt-0.5", children: image ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
30
|
+
/* @__PURE__ */ jsx("div", { className: "h-10 w-10 rounded-xl overflow-hidden bg-muted ring-1 ring-border/40", children: /* @__PURE__ */ jsx(
|
|
31
|
+
Image,
|
|
32
|
+
{
|
|
33
|
+
src: image,
|
|
34
|
+
alt: "",
|
|
35
|
+
width: 40,
|
|
36
|
+
height: 40,
|
|
37
|
+
className: "object-cover w-full h-full",
|
|
38
|
+
unoptimized: true
|
|
39
|
+
}
|
|
40
|
+
) }),
|
|
41
|
+
/* @__PURE__ */ jsx(
|
|
42
|
+
"div",
|
|
43
|
+
{
|
|
44
|
+
className: cn(
|
|
45
|
+
"absolute -bottom-1 -right-1 h-5 w-5 rounded-full border-2 border-background flex items-center justify-center",
|
|
46
|
+
colorClass
|
|
47
|
+
),
|
|
48
|
+
children: /* @__PURE__ */ jsx(Icon, { className: "h-2.5 w-2.5" })
|
|
49
|
+
}
|
|
50
|
+
)
|
|
51
|
+
] }) : /* @__PURE__ */ jsx(
|
|
52
|
+
"div",
|
|
53
|
+
{
|
|
54
|
+
className: cn(
|
|
55
|
+
"h-10 w-10 rounded-xl flex items-center justify-center ring-1 ring-border/20",
|
|
56
|
+
colorClass
|
|
57
|
+
),
|
|
58
|
+
children: /* @__PURE__ */ jsx(Icon, { className: "h-4 w-4" })
|
|
59
|
+
}
|
|
60
|
+
) }),
|
|
61
|
+
/* @__PURE__ */ jsxs("div", { className: "flex-1 min-w-0 space-y-0.5", children: [
|
|
62
|
+
/* @__PURE__ */ jsx(
|
|
63
|
+
"p",
|
|
64
|
+
{
|
|
65
|
+
className: cn(
|
|
66
|
+
"text-sm leading-snug truncate",
|
|
67
|
+
isUnread ? "font-semibold text-foreground" : "font-medium text-foreground/90"
|
|
68
|
+
),
|
|
69
|
+
children: title
|
|
70
|
+
}
|
|
71
|
+
),
|
|
72
|
+
/* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground truncate", children: description }),
|
|
73
|
+
/* @__PURE__ */ jsx("p", { className: "text-[10px] text-muted-foreground/50 pt-0.5", children: timeAgo(timestamp) })
|
|
74
|
+
] }),
|
|
75
|
+
isUnread && /* @__PURE__ */ jsx("div", { className: "h-2 w-2 rounded-full bg-primary shrink-0 mt-2" })
|
|
76
|
+
]
|
|
77
|
+
}
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
export {
|
|
81
|
+
NotificationRow
|
|
82
|
+
};
|
|
83
|
+
//# sourceMappingURL=notification-row.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/notification-row.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"./link.js\";\nimport Image from \"./image.js\";\nimport { Bell } from \"lucide-react\";\nimport { timeAgo } from \"../utils/time.js\";\nimport { cn } from \"../utils/cn.js\";\nimport { NOTIFICATION_ICON, NOTIFICATION_COLOR } from \"../data/notification-meta.js\";\nimport type { Notification } from \"../data/notification.js\";\n\nexport interface NotificationRowProps {\n notification: Notification;\n onNavigate?: () => void;\n compact?: boolean;\n}\n\nexport function NotificationRow({\n notification,\n onNavigate,\n compact = false,\n}: NotificationRowProps) {\n const { type, title, description, image, href, timestamp, isUnread } = notification;\n const Icon = NOTIFICATION_ICON[type] ?? Bell;\n const colorClass = NOTIFICATION_COLOR[type] ?? \"text-muted-foreground bg-muted/40\";\n\n return (\n <Link\n href={href}\n onClick={onNavigate}\n className={cn(\n \"flex items-start gap-3 px-4 transition-colors group\",\n compact ? \"py-3\" : \"py-4\",\n isUnread && \"bg-primary/[0.03]\",\n \"hover:bg-muted/40\"\n )}\n >\n\n <div className=\"relative shrink-0 mt-0.5\">\n {image ? (\n <>\n <div className=\"h-10 w-10 rounded-xl overflow-hidden bg-muted ring-1 ring-border/40\">\n <Image\n src={image}\n alt=\"\"\n width={40}\n height={40}\n className=\"object-cover w-full h-full\"\n unoptimized\n />\n </div>\n <div\n className={cn(\n \"absolute -bottom-1 -right-1 h-5 w-5 rounded-full border-2 border-background flex items-center justify-center\",\n colorClass\n )}\n >\n <Icon className=\"h-2.5 w-2.5\" />\n </div>\n </>\n ) : (\n <div\n className={cn(\n \"h-10 w-10 rounded-xl flex items-center justify-center ring-1 ring-border/20\",\n colorClass\n )}\n >\n <Icon className=\"h-4 w-4\" />\n </div>\n )}\n </div>\n\n <div className=\"flex-1 min-w-0 space-y-0.5\">\n <p\n className={cn(\n \"text-sm leading-snug truncate\",\n isUnread ? \"font-semibold text-foreground\" : \"font-medium text-foreground/90\"\n )}\n >\n {title}\n </p>\n <p className=\"text-xs text-muted-foreground truncate\">{description}</p>\n <p className=\"text-[10px] text-muted-foreground/50 pt-0.5\">{timeAgo(timestamp)}</p>\n </div>\n\n {isUnread && (\n <div className=\"h-2 w-2 rounded-full bg-primary shrink-0 mt-2\" />\n )}\n </Link>\n );\n}\n"],"mappings":";AAuCU,mBAEI,KAFJ;AArCV,OAAO,UAAU;AACjB,OAAO,WAAW;AAClB,SAAS,YAAY;AACrB,SAAS,eAAe;AACxB,SAAS,UAAU;AACnB,SAAS,mBAAmB,0BAA0B;AAS/C,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA,UAAU;AACZ,GAAyB;AACvB,QAAM,EAAE,MAAM,OAAO,aAAa,OAAO,MAAM,WAAW,SAAS,IAAI;AACvE,QAAM,OAAO,kBAAkB,IAAI,KAAK;AACxC,QAAM,aAAa,mBAAmB,IAAI,KAAK;AAE/C,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,SAAS;AAAA,MACT,WAAW;AAAA,QACT;AAAA,QACA,UAAU,SAAS;AAAA,QACnB,YAAY;AAAA,QACZ;AAAA,MACF;AAAA,MAGA;AAAA,4BAAC,SAAI,WAAU,4BACZ,kBACC,iCACE;AAAA,8BAAC,SAAI,WAAU,uEACb;AAAA,YAAC;AAAA;AAAA,cACC,KAAK;AAAA,cACL,KAAI;AAAA,cACJ,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,WAAU;AAAA,cACV,aAAW;AAAA;AAAA,UACb,GACF;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,WAAW;AAAA,gBACT;AAAA,gBACA;AAAA,cACF;AAAA,cAEA,8BAAC,QAAK,WAAU,eAAc;AAAA;AAAA,UAChC;AAAA,WACF,IAEA;AAAA,UAAC;AAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA;AAAA,YACF;AAAA,YAEA,8BAAC,QAAK,WAAU,WAAU;AAAA;AAAA,QAC5B,GAEJ;AAAA,QAEA,qBAAC,SAAI,WAAU,8BACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,WAAW;AAAA,gBACT;AAAA,gBACA,WAAW,kCAAkC;AAAA,cAC/C;AAAA,cAEC;AAAA;AAAA,UACH;AAAA,UACA,oBAAC,OAAE,WAAU,0CAA0C,uBAAY;AAAA,UACnE,oBAAC,OAAE,WAAU,+CAA+C,kBAAQ,SAAS,GAAE;AAAA,WACjF;AAAA,QAEC,YACC,oBAAC,SAAI,WAAU,iDAAgD;AAAA;AAAA;AAAA,EAEnE;AAEJ;","names":[]}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var notification_meta_exports = {};
|
|
20
|
+
__export(notification_meta_exports, {
|
|
21
|
+
NOTIFICATION_COLOR: () => NOTIFICATION_COLOR,
|
|
22
|
+
NOTIFICATION_ICON: () => NOTIFICATION_ICON,
|
|
23
|
+
NOTIFICATION_LABEL: () => NOTIFICATION_LABEL
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(notification_meta_exports);
|
|
26
|
+
var import_lucide_react = require("lucide-react");
|
|
27
|
+
const NOTIFICATION_ICON = {
|
|
28
|
+
offer_accepted: import_lucide_react.CheckCircle2,
|
|
29
|
+
asset_received: import_lucide_react.Gift,
|
|
30
|
+
offer: import_lucide_react.HandCoins,
|
|
31
|
+
sale: import_lucide_react.Zap,
|
|
32
|
+
listing: import_lucide_react.Tag,
|
|
33
|
+
mint: import_lucide_react.Sparkles,
|
|
34
|
+
transfer: import_lucide_react.ArrowRightLeft,
|
|
35
|
+
cancelled: import_lucide_react.X,
|
|
36
|
+
announcement: import_lucide_react.Megaphone
|
|
37
|
+
};
|
|
38
|
+
const NOTIFICATION_COLOR = {
|
|
39
|
+
offer_accepted: "text-emerald-400 bg-emerald-500/10",
|
|
40
|
+
asset_received: "text-teal-400 bg-teal-500/10",
|
|
41
|
+
offer: "text-amber-400 bg-amber-500/10",
|
|
42
|
+
sale: "text-violet-400 bg-violet-500/10",
|
|
43
|
+
listing: "text-sky-400 bg-sky-500/10",
|
|
44
|
+
mint: "text-emerald-400 bg-emerald-500/10",
|
|
45
|
+
transfer: "text-slate-400 bg-slate-500/10",
|
|
46
|
+
cancelled: "text-rose-400 bg-rose-500/10",
|
|
47
|
+
announcement: "text-purple-400 bg-purple-500/10"
|
|
48
|
+
};
|
|
49
|
+
const NOTIFICATION_LABEL = {
|
|
50
|
+
offer_accepted: "Offer accepted",
|
|
51
|
+
asset_received: "Asset received",
|
|
52
|
+
offer: "New offer",
|
|
53
|
+
sale: "Sale",
|
|
54
|
+
listing: "Listing",
|
|
55
|
+
mint: "Mint",
|
|
56
|
+
transfer: "Transfer",
|
|
57
|
+
cancelled: "Cancelled",
|
|
58
|
+
announcement: "Announcement"
|
|
59
|
+
};
|
|
60
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
61
|
+
0 && (module.exports = {
|
|
62
|
+
NOTIFICATION_COLOR,
|
|
63
|
+
NOTIFICATION_ICON,
|
|
64
|
+
NOTIFICATION_LABEL
|
|
65
|
+
});
|
|
66
|
+
//# sourceMappingURL=notification-meta.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/data/notification-meta.ts"],"sourcesContent":["import {\n CheckCircle2, Gift, HandCoins, Megaphone, Zap, Tag, Sparkles, ArrowRightLeft, X,\n} from \"lucide-react\";\nimport type { NotificationType } from \"./notification.js\";\n\nexport const NOTIFICATION_ICON: Record<NotificationType, React.ElementType> = {\n offer_accepted: CheckCircle2,\n asset_received: Gift,\n offer: HandCoins,\n sale: Zap,\n listing: Tag,\n mint: Sparkles,\n transfer: ArrowRightLeft,\n cancelled: X,\n announcement: Megaphone,\n};\n\nexport const NOTIFICATION_COLOR: Record<NotificationType, string> = {\n offer_accepted: \"text-emerald-400 bg-emerald-500/10\",\n asset_received: \"text-teal-400 bg-teal-500/10\",\n offer: \"text-amber-400 bg-amber-500/10\",\n sale: \"text-violet-400 bg-violet-500/10\",\n listing: \"text-sky-400 bg-sky-500/10\",\n mint: \"text-emerald-400 bg-emerald-500/10\",\n transfer: \"text-slate-400 bg-slate-500/10\",\n cancelled: \"text-rose-400 bg-rose-500/10\",\n announcement: \"text-purple-400 bg-purple-500/10\",\n};\n\nexport const NOTIFICATION_LABEL: Record<NotificationType, string> = {\n offer_accepted: \"Offer accepted\",\n asset_received: \"Asset received\",\n offer: \"New offer\",\n sale: \"Sale\",\n listing: \"Listing\",\n mint: \"Mint\",\n transfer: \"Transfer\",\n cancelled: \"Cancelled\",\n announcement: \"Announcement\",\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAEO;AAGA,MAAM,oBAAiE;AAAA,EAC5E,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,OAAgB;AAAA,EAChB,MAAgB;AAAA,EAChB,SAAgB;AAAA,EAChB,MAAgB;AAAA,EAChB,UAAgB;AAAA,EAChB,WAAgB;AAAA,EAChB,cAAgB;AAClB;AAEO,MAAM,qBAAuD;AAAA,EAClE,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,OAAgB;AAAA,EAChB,MAAgB;AAAA,EAChB,SAAgB;AAAA,EAChB,MAAgB;AAAA,EAChB,UAAgB;AAAA,EAChB,WAAgB;AAAA,EAChB,cAAgB;AAClB;AAEO,MAAM,qBAAuD;AAAA,EAClE,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,OAAgB;AAAA,EAChB,MAAgB;AAAA,EAChB,SAAgB;AAAA,EAChB,MAAgB;AAAA,EAChB,UAAgB;AAAA,EAChB,WAAgB;AAAA,EAChB,cAAgB;AAClB;","names":[]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { NotificationType } from './notification.cjs';
|
|
2
|
+
|
|
3
|
+
declare const NOTIFICATION_ICON: Record<NotificationType, React.ElementType>;
|
|
4
|
+
declare const NOTIFICATION_COLOR: Record<NotificationType, string>;
|
|
5
|
+
declare const NOTIFICATION_LABEL: Record<NotificationType, string>;
|
|
6
|
+
|
|
7
|
+
export { NOTIFICATION_COLOR, NOTIFICATION_ICON, NOTIFICATION_LABEL };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { NotificationType } from './notification.js';
|
|
2
|
+
|
|
3
|
+
declare const NOTIFICATION_ICON: Record<NotificationType, React.ElementType>;
|
|
4
|
+
declare const NOTIFICATION_COLOR: Record<NotificationType, string>;
|
|
5
|
+
declare const NOTIFICATION_LABEL: Record<NotificationType, string>;
|
|
6
|
+
|
|
7
|
+
export { NOTIFICATION_COLOR, NOTIFICATION_ICON, NOTIFICATION_LABEL };
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import {
|
|
2
|
+
CheckCircle2,
|
|
3
|
+
Gift,
|
|
4
|
+
HandCoins,
|
|
5
|
+
Megaphone,
|
|
6
|
+
Zap,
|
|
7
|
+
Tag,
|
|
8
|
+
Sparkles,
|
|
9
|
+
ArrowRightLeft,
|
|
10
|
+
X
|
|
11
|
+
} from "lucide-react";
|
|
12
|
+
const NOTIFICATION_ICON = {
|
|
13
|
+
offer_accepted: CheckCircle2,
|
|
14
|
+
asset_received: Gift,
|
|
15
|
+
offer: HandCoins,
|
|
16
|
+
sale: Zap,
|
|
17
|
+
listing: Tag,
|
|
18
|
+
mint: Sparkles,
|
|
19
|
+
transfer: ArrowRightLeft,
|
|
20
|
+
cancelled: X,
|
|
21
|
+
announcement: Megaphone
|
|
22
|
+
};
|
|
23
|
+
const NOTIFICATION_COLOR = {
|
|
24
|
+
offer_accepted: "text-emerald-400 bg-emerald-500/10",
|
|
25
|
+
asset_received: "text-teal-400 bg-teal-500/10",
|
|
26
|
+
offer: "text-amber-400 bg-amber-500/10",
|
|
27
|
+
sale: "text-violet-400 bg-violet-500/10",
|
|
28
|
+
listing: "text-sky-400 bg-sky-500/10",
|
|
29
|
+
mint: "text-emerald-400 bg-emerald-500/10",
|
|
30
|
+
transfer: "text-slate-400 bg-slate-500/10",
|
|
31
|
+
cancelled: "text-rose-400 bg-rose-500/10",
|
|
32
|
+
announcement: "text-purple-400 bg-purple-500/10"
|
|
33
|
+
};
|
|
34
|
+
const NOTIFICATION_LABEL = {
|
|
35
|
+
offer_accepted: "Offer accepted",
|
|
36
|
+
asset_received: "Asset received",
|
|
37
|
+
offer: "New offer",
|
|
38
|
+
sale: "Sale",
|
|
39
|
+
listing: "Listing",
|
|
40
|
+
mint: "Mint",
|
|
41
|
+
transfer: "Transfer",
|
|
42
|
+
cancelled: "Cancelled",
|
|
43
|
+
announcement: "Announcement"
|
|
44
|
+
};
|
|
45
|
+
export {
|
|
46
|
+
NOTIFICATION_COLOR,
|
|
47
|
+
NOTIFICATION_ICON,
|
|
48
|
+
NOTIFICATION_LABEL
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=notification-meta.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/data/notification-meta.ts"],"sourcesContent":["import {\n CheckCircle2, Gift, HandCoins, Megaphone, Zap, Tag, Sparkles, ArrowRightLeft, X,\n} from \"lucide-react\";\nimport type { NotificationType } from \"./notification.js\";\n\nexport const NOTIFICATION_ICON: Record<NotificationType, React.ElementType> = {\n offer_accepted: CheckCircle2,\n asset_received: Gift,\n offer: HandCoins,\n sale: Zap,\n listing: Tag,\n mint: Sparkles,\n transfer: ArrowRightLeft,\n cancelled: X,\n announcement: Megaphone,\n};\n\nexport const NOTIFICATION_COLOR: Record<NotificationType, string> = {\n offer_accepted: \"text-emerald-400 bg-emerald-500/10\",\n asset_received: \"text-teal-400 bg-teal-500/10\",\n offer: \"text-amber-400 bg-amber-500/10\",\n sale: \"text-violet-400 bg-violet-500/10\",\n listing: \"text-sky-400 bg-sky-500/10\",\n mint: \"text-emerald-400 bg-emerald-500/10\",\n transfer: \"text-slate-400 bg-slate-500/10\",\n cancelled: \"text-rose-400 bg-rose-500/10\",\n announcement: \"text-purple-400 bg-purple-500/10\",\n};\n\nexport const NOTIFICATION_LABEL: Record<NotificationType, string> = {\n offer_accepted: \"Offer accepted\",\n asset_received: \"Asset received\",\n offer: \"New offer\",\n sale: \"Sale\",\n listing: \"Listing\",\n mint: \"Mint\",\n transfer: \"Transfer\",\n cancelled: \"Cancelled\",\n announcement: \"Announcement\",\n};\n"],"mappings":"AAAA;AAAA,EACE;AAAA,EAAc;AAAA,EAAM;AAAA,EAAW;AAAA,EAAW;AAAA,EAAK;AAAA,EAAK;AAAA,EAAU;AAAA,EAAgB;AAAA,OACzE;AAGA,MAAM,oBAAiE;AAAA,EAC5E,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,OAAgB;AAAA,EAChB,MAAgB;AAAA,EAChB,SAAgB;AAAA,EAChB,MAAgB;AAAA,EAChB,UAAgB;AAAA,EAChB,WAAgB;AAAA,EAChB,cAAgB;AAClB;AAEO,MAAM,qBAAuD;AAAA,EAClE,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,OAAgB;AAAA,EAChB,MAAgB;AAAA,EAChB,SAAgB;AAAA,EAChB,MAAgB;AAAA,EAChB,UAAgB;AAAA,EAChB,WAAgB;AAAA,EAChB,cAAgB;AAClB;AAEO,MAAM,qBAAuD;AAAA,EAClE,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,OAAgB;AAAA,EAChB,MAAgB;AAAA,EAChB,SAAgB;AAAA,EAChB,MAAgB;AAAA,EAChB,UAAgB;AAAA,EAChB,WAAgB;AAAA,EAChB,cAAgB;AAClB;","names":[]}
|